atmel

Witam,

mam program który zlicza czas za pomocą timer0 i generowanego przez niego przerwania (kwarc mam 3.2768MHz). Wygląda to w skrócie tak:

#include <inttypes.h>

#include <avr/io.h>

#include <avr/interrupt.h>

#include <avr/signal.h>

#include <avr/sfr_defs.h>

int sekunda=0;

SIGNAL(SIG_OVERFLOW0) { static int i=0; i++; if (i==50) { sekunda++; if (sekunda==60) { sekunda=0; } i=0; } }

int main (void) { sei(); DDRB=0xff; PORTB=0xff; TCCR0=4; TIMSK|=(1<<TOIE0); TCNT0=0;

for (;;) { PORTB=sekunda; }

return (0); }

pytanie brzmi: dlaczego to nie działa? Jak w procedurze obsługi przerwania zamienię sekunda na PORTB to już jest ok.

dziękuję z góry za pomoc Wojtek

Reply to
Wojtek
Loading thread data ...

dzięki, przyznam się że pisze w c juz ładnych kilka lat (PC) i nigdy jeszcze nie musiałem użyć volatile, dlatego taki pomysł nawet nie przyszedł mi do głowy :)

pozdrawiam Wojtek

Reply to
Wojtek

a może jeszcze ktoś wie dlaczego wszystkie diody świecą prawidłowo oprócz tych podłączonych do pinów portu C: PC2(TCK) PC5(TDI)

pozdrawiam wojtek

Reply to
Wojtek

w rzeczy samej :)

dzięki!

wojtek

Reply to
Wojtek

Piotr Pitucha napisał(a):

To akurat nie ma zadnego znaczenia, bo w przerwaniu sekunda zmienia się od 0 do 59 ( czyli w zakresie byte ), a w przypisaniu PORTB=sekunda kompilator sam zadba o konwersję typu.

Reply to
"Miłosz K."

Użytkownik Piotr Pitucha napisał: ....

....

.....

Tak się zastanawiam, czytając liczne wątki na temat C z zastosowaniach dla mikokontrolerów, na ile pisanie programu ma za cel wykonanie urządzenia o konkretnych funkcjach a na ile pokonywanie schodów leksykalnych języka i widzimisię mniej lub bardziej NIEDOROBIONEGO cross-kompilatora: :)))))))))))

Reply to
A.Grodecki

Szczesliwie w wielu ATmegach interfejs JTAG mozna wylaczyc programowo aby te piny wykorzystac do innych celow (tak jest m.in. z portem F w procesorze ATmega128).

Reply to
Adam Dybkowski

Dnia Wed, 28 Sep 2005 21:51:57 +0200, Andy snipped-for-privacy@ceti.pl napisał:

Do tego jeszcze mozna tak:

++sekunda %= 60; :)
Reply to
Jaroslaw Berezowski

Ja wole to samo dajacy a IMHO bardziej zrozumialy zapis: sekunda = (sekunda + 1) % 60;

Inna sprawa, ze wiekszosc malo rozgarnietych kompilatorow (w tym pewnie i gcc) zastosuje w tym miejscu czasochlonna operacje obliczania reszty z dzielenia. Rozwiazanie poczatkowe (z if'em) zadziala szybciej.

Reply to
Adam Dybkowski

Eee - mozna tak ?

J.

Reply to
J.F.

Dnia Sun, 02 Oct 2005 01:57:15 +0200, J.F. <jfox snipped-for-privacy@poczta.onet.pl> napisał:

Z punktu widzenia skladni i semantyki ANSII C - tak. Ale jak juz zauwazono, proc ktory moze do tego moze nie miec sprzetowego dzielenia bedzie sie biedzil dluzej.

Reply to
Jaroslaw Berezowski

Z punktu widzenia rozsadku - od biedy tak. Skladni i semantyki - nie, ++zmienna to juz nie jest l-value.

I gcc-avr protestuje..

J.

Reply to
J.F.

Dnia Sun, 02 Oct 2005 02:57:00 +0200, J.F. <jfox snipped-for-privacy@poczta.onet.pl> napisał:

Masz racje. I nie tylko -avr :)

Reply to
Jaroslaw Berezowski

ElectronDepot website is not affiliated with any of the manufacturers or service providers discussed here. All logos and trade names are the property of their respective owners.