Program nie działa.

To forum jest dla wszystkich pasjonatów mikrokontrolerów AVR Atmela. Wymiana doświadczeń i pomoc dla początkujących w pisaniu programów zarówno w C, Asemblerze jak i BASCOM. Zapraszam znawców tematu, aby pomogli wszystkim początkującym!
ODPOWIEDZ
andrzej1_1
-
Posty: 39
Rejestracja: 28 lip 2010, 14:42
Lokalizacja: Stróże

Program nie działa.

Post autor: andrzej1_1 » 19 paź 2010, 15:30

Mam taki kod:

Kod: Zaznacz cały

#include <avr/io.h>                // dostęp do rejestrów
#include <avr/interrupt.h>  
#include <util/delay.h>
int a;
int main(void)
{
  DDRB=255;
  PORTB=0;
  for(;;)
  {
    PORTB|=_BV(0);
    _delay_ms(250);
    _delay_ms(250);
    PORTB=0;
    czekaj();
  }
return (0);
}



void czekaj(void)
{
  for(a=0;a<2400;a++)
  {
    _delay_ms(250);
  }
}
Urządzenie nie działa! Cały czas świeci się dioda. Dlaczego?

P.s Schemat urządzenia w załączniku
Załączniki
Nowy Obraz - mapa bitowa.JPG

Awatar użytkownika
Kulpina
Użytkownik
Posty: 2037
Rejestracja: 28 lip 2005, 16:57
Lokalizacja: Sanok
Kontakt:

Post autor: Kulpina » 19 paź 2010, 16:33

Z tego, co zrozumiałem (choć programistą najlepszym nie jestem), to funkcja czekaj(); zmusza program do czekania przez 5 min :mrgreen:
Może program działa, tylko jeszcze togo nie doczekałeś? :)

keruseykaryu

Post autor: keruseykaryu » 19 paź 2010, 17:38

A jak kolega w ogóle makefile ustawił? Jakie masz tam F_CPU wpisane? Jak masz ustawione fuski? I jak ci się udało skompilować kod jak czekaj() masz dopiero zdefiniowane po main()? I jeszcze po jakiego grzyba inkludujesz interrupt.h jak ni w ząb nie używasz przewań?

andrzej1_1
-
Posty: 39
Rejestracja: 28 lip 2010, 14:42
Lokalizacja: Stróże

Post autor: andrzej1_1 » 19 paź 2010, 18:07

Problem rozwiązany. Trzeba było użyć zwykłej diody, a nie małej.

P.s Kod się skompilował poprawnie i bez błędów

keruseykaryu

Post autor: keruseykaryu » 19 paź 2010, 18:19

andrzej1_1 pisze:Problem rozwiązany. Trzeba było użyć zwykłej diody, a nie małej.
Szkoda, że jej nie ma na schemacie...
andrzej1_1 pisze:P.s Kod się skompilował poprawnie i bez błędów
Jeśli kompilator się w ogóle na to co pokazałeś nie odezwał to masz go naprawdę źle skonfigurowanego.

andrzej1_1
-
Posty: 39
Rejestracja: 28 lip 2010, 14:42
Lokalizacja: Stróże

Post autor: andrzej1_1 » 19 paź 2010, 18:36

NIE DZIAŁA!!! mruga co 0,5 sekundy jak zmieniłem diode nie wiem czemu , a mikro jest niepotrzebny(wiem bo włożyłem pusty mikro i dalej mrugało)

Na początku rozwieje wątpliwości:

Kulpina napisał(a):
Z tego, co zrozumiałem (choć programistą najlepszym nie jestem), to funkcja czekaj(); zmusza program do czekania przez 5 min
Może program działa, tylko jeszcze togo nie doczekałeś?
Taki głupi to nie jestem. Na czas testu zmienił czekaj na 2x delay(250)

keruseykaryu napisał(a):
Szkoda, że jej nie ma na schemacie...
Jest pod nazwą urządzenie. Nazwa jest taka ponieważ tylko na próbe daje diodę, a tam ma być co innego.

keruseykaryu napisał(a):
A jak kolega w ogóle makefile ustawił? Jakie masz tam F_CPU wpisane? Jak masz ustawione fuski? I jak ci się udało skompilować kod jak czekaj() masz dopiero zdefiniowane po main()? I jeszcze po jakiego grzyba inkludujesz interrupt.h jak ni w ząb nie używasz przewań?
Jeśli kompilator się w ogóle na to co pokazałeś nie odezwał to masz go naprawdę źle skonfigurowanego.
Nie znam się na tym. Nic nie ustawiałem tylko dałem build. Możesz powiedzieć jak ma wyglądać poprawny kod programu???

P.s Nie mam pojęcia o fuse bitach

keruseykaryu

Post autor: keruseykaryu » 19 paź 2010, 20:10

Poprawny kod? Wyrzucić ten include, o którym mówiłem. Zmienną a zadeklarować nie jako global tylko lokalną w czekaj() - wtedy kompilator może ją sobie zrobić jako register. Funkcję czekaj() przenieść przed main(). Dla ciekawych: Program w obecnej postaci daje 150 bajtów kodu, a wyżej wymienione modyfikacje redukują kod do 128 bajtów (WinAVR-20100110). Nie używać _BV(0) bo to się samo nie komentuje, lepiej napisać (1<<PB0) albo _BV(PB0) bo prędzej wiadomo o co chodzi.
Makefile. Jak procesor sklepowy, a fuski nie ruszane, to F_CPU ustawić jako 1200000 (tak, tak 1,2MHz! a nie 1MHz).

[ Dodano: 2010-10-19, 21:22 ]
Kulpina pisze:Z tego, co zrozumiałem (choć programistą najlepszym nie jestem), to funkcja czekaj(); zmusza program do czekania przez 5 min
2400 * 250ms to raczej nie jest 5minut.

andrzej1_1
-
Posty: 39
Rejestracja: 28 lip 2010, 14:42
Lokalizacja: Stróże

Post autor: andrzej1_1 » 20 paź 2010, 6:17

Zrobiłem co powiedziałeś. Ko wygląda tak:

Kod: Zaznacz cały

#include <avr/io.h>
#include <util/delay.h>
#define F_CPU 1200000

void czekaj(void)
{
  int a;
  for(a=0;a<2400;a++)
  {
    _delay_ms(250);
  }
}

int main(void)
{
  DDRB=255;
  PORTB=0;
  for(;;)
  {
    PORTB|=_BV(PB0);
    _delay_ms(250);
    _delay_ms(250);
    PORTB=0;
    czekaj();
  }
return (0);
}
Czy dobrze?


P.s Kulpina, 2400 * 250ms to 10min



Już wiem dlaczego dioda mrugała. Wziąłem diodę mrugającą! Jak zmieniłem na normalną to świeci się cały czas.

keruseykaryu

Post autor: keruseykaryu » 20 paź 2010, 16:57

Czy dobrze?
A działa chociaż?

andrzej1_1
-
Posty: 39
Rejestracja: 28 lip 2010, 14:42
Lokalizacja: Stróże

Post autor: andrzej1_1 » 20 paź 2010, 17:37

Działa ale nie tak jak powinno. Gdy włoże pusty mikro to cały czas świeci, a gdy dam z tym kodem co podałem to tak jakby szybko mruga.

keruseykaryu

Post autor: keruseykaryu » 21 paź 2010, 5:29

Co rozumiesz pod pojęciem "szybko mruga"? Program zapala diodę na czas 0,5sekundy, a potem czeka 10minut na następne mrugnięcie. Całe jego działanie.

andrzej1_1
-
Posty: 39
Rejestracja: 28 lip 2010, 14:42
Lokalizacja: Stróże

Post autor: andrzej1_1 » 21 paź 2010, 5:40

Właśnie tak nie działa. Mruga tak szybko, że prawie niewidocznie.

Mógłbyś napisać dobry kod bo ten ma błędy?

Kod: Zaznacz cały

c:/winavr-20100110/lib/gcc/../../avr/include/util/delay.h:85:3: warning: #warning "F_CPU not defined for <util/delay.h>"
../rtr.c:3:1: warning: "F_CPU" redefined
c:/winavr-20100110/lib/gcc/../../avr/include/util/delay.h:86:1: warning: this is the location of the previous definition

keruseykaryu

Post autor: keruseykaryu » 21 paź 2010, 20:18

A jednak są błędy. No proszę.
Przenieś definicję F_CPU przed include.

andrzej1_1
-
Posty: 39
Rejestracja: 28 lip 2010, 14:42
Lokalizacja: Stróże

Post autor: andrzej1_1 » 22 paź 2010, 13:41

Tak lekko mrugało bo coś mikro nie łączył. Jak się dociśnie to cały czas świeci niezależnie od kodu. Po przeniesieniu F_CPU nie było błędów, ale dioda i tak cały czas świeci

P.s Możesz wyjaśnić:
PORTB|=_BV(PB0);
PORTB=0;
DDRB=255;
???

ODPOWIEDZ