RTV forum PL | NewsGroups PL

Jak poprawić działanie timera 0 w programie AVR z kwarcem 3.2768MHz?

atmel

NOWY TEMAT

elektroda NewsGroups Forum Index - Elektronika Polska - Jak poprawić działanie timera 0 w programie AVR z kwarcem 3.2768MHz?

Goto page 1, 2  Next

Wojtek
Guest

Wed Sep 28, 2005 6:35 pm   



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 (;Wink
{
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

Andy
Guest

Wed Sep 28, 2005 6:51 pm   



Użytkownik "Wojtek" napisał w wiadomości

Quote:
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 (;Wink
{
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.


to chyba klasyczny problem
powinno byc:

volatile int sekunda=0;

--
Andrzej

Wojtek
Guest

Wed Sep 28, 2005 7:03 pm   



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

Wojtek
Guest

Wed Sep 28, 2005 7:51 pm   



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

Andy
Guest

Wed Sep 28, 2005 7:52 pm   



Użytkownik "Wojtek" napisał w wiadomości

Quote:
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 :)


Ja z kolei nie pisze zbyt duzo na PC'ta
ale chyba jesli siega sie do tych samych zasobow (np jakiejs zmiennej)
np z dwoch roznych watkow to zasob musi byc typu volatile.

W przeciwnym wypadku program moze dzialac ale nie musi
i to bedzie zalezalo od kompliatora oraz ustawien optymalizacji.

--
Andrzej

Andy
Guest

Wed Sep 28, 2005 7:53 pm   



Użytkownik "Wojtek" napisał w wiadomości

Quote:
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)


byc moze masz aktywny fuse od JTAG
a jesli tak to piny te sa zarezerwowane do komunikacji z JTAG'iem

--
Andrzej

Wojtek
Guest

Wed Sep 28, 2005 8:09 pm   



Andy wrote:

Quote:
Uytkownik "Wojtek" napisa w wiadomoci


a moe jeszcze kto wie dlaczego wszystkie diody wiec prawidowo
oprócz tych podczonych do pinów portu C: PC2(TCK) PC5(TDI)



byc moze masz aktywny fuse od JTAG
a jesli tak to piny te sa zarezerwowane do komunikacji z JTAG'iem

w rzeczy samej Smile


dzięki!


wojtek

Piotr Pitucha
Guest

Thu Sep 29, 2005 4:12 am   



Użytkownik "Wojtek" napisał w wiadomości

Quote:
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;


for (;Wink
{
PORTB=sekunda;
}


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



Według mnie dlatego że przypisujesz wartość int do PORTB a to jest byte
......
Zmień deklarację sekundy i powinno iść.
Pozdrawiam Piotr

Miłosz K.
Guest

Thu Sep 29, 2005 7:23 am   



Piotr Pitucha napisał(a):


Quote:
Według mnie dlatego że przypisujesz wartość int do PORTB a to jest byte
.....
Zmień deklarację sekundy i powinno iść.
Pozdrawiam Piotr


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.


--
Miłosz Kłosowicz

------------------------------------------------
AVR : ISP,JTAG,moduły prototypowe (USB,CAN)
TYPO3: projekty, webhosting, sklepy internetowe
-> http://www.miklobit.com
------------------------------------------------

A.Grodecki
Guest

Thu Sep 29, 2005 10:01 am   



Użytkownik Piotr Pitucha napisał:
.....
Quote:
pytanie brzmi: dlaczego to nie działa? Jak w procedurze obsługi
przerwania zamienię sekunda na PORTB to już jest ok.
.....
Według mnie dlatego że przypisujesz wartość int do PORTB a to jest byte
.....
Zmień deklarację sekundy i powinno iść.
......


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:
Smile))))))))))

--

Pozdrawiam,

A. Grodecki

Piotr Pitucha
Guest

Thu Sep 29, 2005 10:39 am   



Użytkownik "A.Grodecki" napisał w wiadomości


Quote:
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:
Smile))))))))))

Może i masz rację, ale zmiany w procesorach są większe niż w kompilatorach,

daję sobie jako tako radę a nie znam kompletnie asemblera żadnego z
procesorów którym się bawię Smile
Pozdrawiam

Adam Dybkowski
Guest

Thu Sep 29, 2005 6:04 pm   



Wojtek wrote:

Quote:
byc moze masz aktywny fuse od JTAG
a jesli tak to piny te sa zarezerwowane do komunikacji z JTAG'iem

w rzeczy samej Smile

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).

--
Adam Dybkowski
http://www.amwaw.edu.pl/~adybkows/

Uwaga: przed wysłaniem do mnie maila usuń "123" z adresu.

Jaroslaw Berezowski
Guest

Sat Oct 01, 2005 6:40 pm   



Dnia Wed, 28 Sep 2005 21:51:57 +0200, Andy napisał:

Quote:
sekunda++;
if (sekunda==60)
{
sekunda=0;
}
i=0;
}

to chyba klasyczny problem
powinno byc:

volatile int sekunda=0;
Do tego jeszcze mozna tak:

++sekunda %= 60;
:)

--
Jaroslaw "Jaros" Berezowski

Adam Dybkowski
Guest

Sat Oct 01, 2005 7:32 pm   



Jaroslaw Berezowski wrote:

Quote:
Do tego jeszcze mozna tak:
++sekunda %= 60;

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.

--
Adam Dybkowski
http://www.amwaw.edu.pl/~adybkows/

Uwaga: przed wysłaniem do mnie maila usuń "123" z adresu.

J.F.
Guest

Sat Oct 01, 2005 10:57 pm   



On Sat, 01 Oct 2005 21:40:10 +0200, Jaroslaw Berezowski wrote:
Quote:
Do tego jeszcze mozna tak:
++sekunda %= 60;
Smile

Eee - mozna tak ?

J.

Goto page 1, 2  Next

elektroda NewsGroups Forum Index - Elektronika Polska - Jak poprawić działanie timera 0 w programie AVR z kwarcem 3.2768MHz?

NOWY TEMAT

Regulamin - Zasady uzytkowania Polityka prywatnosci Kontakt RTV map News map