Nieprawidłowe generowanie przerwań w Timer0 AVR z dzielnikiem 1024 przy 14,7456 MHz

[AVR GCC] problem z Timer0





Poprzedni Następny
Wiadomość
Spis treści
From: "Paweł Kurzawa" <groups_at_nospam_kpw.qs.pl>
Subject: [AVR GCC] problem z Timer0
Date: Mon, 14 Jun 2004 11:42:53 +0200


timer0 w trybie overflow
ustawiam dzielnik na 1024
wartosc poczatkowa licznika 0x70

przy zegarze 14,7456 MHz

zegar powinien grnerowac przerwanie 100 razy na sek, ale mam wrazenie
ze jest generowane duzo szybciej ponizej uzasadnienie moich przypuszczen.
Pominolem duza czesc kodu, ale widac ze po 100 przerwaniach jest zwiekszana
zmienn time teoretycznie powinna byc zmieniana co okolo 1 sek, a zmienia sie 3 razy szybciej.

volatile u08 100Hz = 0;
volatile u08 time;

int main(void) {
while (1) {
rprintf ("%d", time );
}
}

void przerwanie100hz (void) {
100Hz ++;
if (100Hz >100 ) {
time ++;
100Hz = 0;
}
}

--

--
Best regards
K_at_nospam_pW from Poland

kpw(at)qs.pl
http://kpw.qs.pl
UIN: 8017753
GG: 1263183
---------------- end ----------------




========
Path: news-archive.icm.edu.pl!newsfeed.gazeta.pl!news.onet.pl!newsfeed.tpinternet.pl!atlantis.news.tpi.pl!news.tpi.pl!not-for-mai

Poprzedni Następny
Wiadomość
Spis treści
From: "BT" <kurciok_at_nospam_poczta.onet.pl>
Subject: Re: [AVR GCC] problem z Timer0
Date: Mon, 14 Jun 2004 12:04:53 +0200



przy zegarze 14,7456 MHz

zegar powinien grnerowac przerwanie 100 razy na sek, ale mam wrazenie
ze jest generowane duzo szybciej ponizej uzasadnienie moich przypuszczen.
Pominolem duza czesc kodu, ale widac ze po 100 przerwaniach jest
zwiekszana
zmienn time teoretycznie powinna byc zmieniana co okolo 1 sek, a zmienia
sie 3 razy szybciej.


volatile u08 100Hz = 0;
volatile u08 time;

int main(void) {
while (1) {
rprintf ("%d", time );
}
}

void przerwanie100hz (void) {
100Hz ++;
if (100Hz >100 ) {
time ++;
100Hz = 0;
}
}

Wszystko wygląda dobrze na pierwszy rzut oka. Także może coś ustawiłeś źle w
częstotliwości przerwania. A tak na marginesie to raczej nie stosował bym
nazw zmiennych zaczynających się o cyfry (w zwykłym C nie da się tego
zrobić). Druga sprawa to to że właściwie nic tu nie zamieściłeś co by miało
kogoś na coś naprowadzić bo problem raczej tkwi w inicjalizacji timera a
tego nie ma w tym kodzie.



========
Path: news-archive.icm.edu.pl!newsfeed.gazeta.pl!news.onet.pl!newsfeed.tpinternet.pl!atlantis.news.tpi.pl!news.tpi.pl!not-for-mai

Poprzedni Następny
Wiadomość
Spis treści
From: "Paweł Kurzawa" <groups_at_nospam_kpw.qs.pl>
Subject: Re: [AVR GCC] problem z Timer0
Date: Mon, 14 Jun 2004 12:45:32 +0200


Wszystko wygląda dobrze na pierwszy rzut oka. Także może coś ustawiłeś źle w
częstotliwości przerwania. A tak na marginesie to raczej nie stosował bym
nazw zmiennych zaczynających się o cyfry (w zwykłym C nie da się tego
zrobić).
Nazwa tylko przykladowo...

Druga sprawa to to że właściwie nic tu nie zamieściłeś co by miało
kogoś na coś naprowadzić bo problem raczej tkwi w inicjalizacji timera a
tego nie ma w tym kodzie.

kozystam z dodatkowej biblioteki timer128.h z avr-libc
inicjalizuje jak ponizej:

timerInit(); // initialize Timers
timer0SetPrescaler ( TIMER_CLK_DIV1024 );
timerAttach ( TIMER0OVERFLOW_INT, Sectic );
TCNT0 = 0x70; //ustawienie poczatkowe Timer0


--

--
Best regards
K_at_nospam_pW from Poland

kpw(at)qs.pl
http://kpw.qs.pl
UIN: 8017753
GG: 1263183
---------------- end ----------------




========
Path: news-archive.icm.edu.pl!newsfeed.gazeta.pl!news.internetia.pl!newsfeed.tpinternet.pl!atlantis.news.tpi.pl!news.tpi.pl!not-for-mai

Poprzedni Następny
Wiadomość
Spis treści
From: "Pavel" <pavel_at_nospam_polbox.com>
Subject: Re: [AVR GCC] problem z Timer0
Date: Mon, 14 Jun 2004 12:14:42 +0200


timer0 w trybie overflow
ustawiam dzielnik na 1024
wartosc poczatkowa licznika 0x70

przy zegarze 14,7456 MHz

Byc moze koniecznie musisz generowac przerwanie
w trybie overflow.
Niemniej, jesli zechcesz uzyc trybu compare...

Ten kawalek kodu uzywa Timer2, tryb compare.
ATmega16.

Czestotliwosc generowana przerwania wyznacza sie ze wzoru:
freq. = kwarc / (prescaler * (OCR2 + 1))

ASSR = 1 << AS2;
TCCR2 = (1 << WGM21) |
(1 << CS22) | (1 << CS21) | (1 << CS20); /* prescaler 1024 */
TIFR = 1 << OCF2;
TIMSK = 1 << OCIE2;
OCR2 = 143; /* 143 = 100 Hz, przy prescalerze 1024 i kwarcu 14745600 Hz */

while (ASSR & (1 << OCR2UB))
;

sei();



========
Path: news-archive.icm.edu.pl!news2.icm.edu.pl!newsfeed.tpinternet.pl!atlantis.news.tpi.pl!news.tpi.pl!not-for-mai