Hallo zusammen.
Ich versuche langsam die Timer des AVRs zu verstehen und zu programmieren. Klappt soweit auch wunderbar, nur bin ich jetzt an einer Stelle an der ich nicht alleine weiterkomme. Ich habe ein kleines Programm geschrieben, dass eine LED an- und ausschaltet. Dies soll im Sekundentakt geschehen.
Ich habe es in sofern realisiert, dass ich in einem definierten Zeitintervall immer wieder einen Interrupt auslöse, dort eine Variable um den Wert eins erhöhe und diese somit zu meinem Zeitmesser mache.
Jetzt habe ich aber einen Zeitunterschied, den ich mir nicht erklären kann: Wenn ich den Interrupt "seltener" auslöse, ist die Sekunde auch eine Sekunde lang (soweit ich das messen kann). Löse ich den Interrupt jedoch häufiger aus so ist meine definierte Sekunde keine Sekunde mehr lang.
Hier der Code:
Wär' nett, wenn jemand mal darüber schaut.Code:#include <stdlib.h> #include <avr/io.h> #include <avr/interrupt.h> volatile long x,i; void timerinit(void) { DDRC = 0xFF; PORTC = 0x00; TCCR1A=0; TCCR1B = (1<<CS10)|(0<<CS11)|(0<<CS12) ; // Teiler = 1 -> 16MHZ TIMSK |= (1<< TOIE1); sei(); } int main(void) { long j; timerinit(); for (;;) {} } //Sehr lange Sekunde, ca. 3 Sekunden: ISR (TIMER1_OVF_vect) { if (i>=1000000) i=0; //Wenn i=1000000 (entspricht einer Sekunde) dann fang eine neue Sekunde an if (i<= 500000) PORTC = (1<<PC0); //Mach 'ne halbe Sekunde die LED an else PORTC &= ~(1<<PC0); //Ne halbe Sekunde aus i++; TCNT1 = 0-16; //Zähl' bis 16 => 1000000 mal pro Sekunde ein Interrupt } /* //Durch mitzählen kein Fehler: ISR (TIMER1_OVF_vect) { if (i==1000) i=0; //Wenn i=1000 (entspricht einer Sekunde) dann fang eine neue Sekunde an if (i<= 500) PORTC = (1<<PC0); //Mach 'ne halbe Sekunde die LED an else PORTC &= ~(1<<PC0); //Ne halbe Sekunde aus i++; TCNT1 = 0-16000; //Zähl' bis 16000 => 1000 mal pro Sekunde ein Interrupt } */
Danke,
Stephan







Zitieren

Lesezeichen