Hallo!
Ich hab gerade Probleme mit meinem Sekundentakt. Ich hab eine
Interruptroutine, die eigentlich mit genau 1Hz aufgerufen werden sollte.
Zum Vergleich, hab ich mittels der _delay_ms Funktion ein Blinken einer
anderen LED in die Hauptschleife geschrieben.
1 | #include <avr/io.h>
|
2 | #include <avr/interrupt.h>
|
3 |
|
4 | #define F_CPU 1000000UL
|
5 | #include <util/delay.h>
|
6 |
|
7 | volatile int second = 0;
|
8 |
|
9 | void init_timers()
|
10 | {
|
11 | //Timer 1 auf Sekunden-Takt einstellen
|
12 | // 1Mhz/(64*15625) = 1 Hz
|
13 | OCR1A= 15625;
|
14 | TIMSK |= (1<<OCIE1A);
|
15 | TCCR1A = 0x00;
|
16 | TCCR1B |= (1<<WGM12)|(1<<CS11)|(1<<CS10); // CTC mode; 64 prescale
|
17 | }
|
18 |
|
19 | ISR(TIMER1_COMPA_vect)
|
20 | {
|
21 | //toggle led
|
22 | if( PORTB & (1<<LED_SEC) )
|
23 | {
|
24 | LED_SEC_ON;
|
25 | }
|
26 | else
|
27 | {
|
28 | LED_SEC_OFF;
|
29 | }
|
30 |
|
31 | second++;
|
32 | }
|
33 |
|
34 |
|
35 | int main()
|
36 | {
|
37 | init_timers();
|
38 |
|
39 | sei();
|
40 |
|
41 | while (1)
|
42 | {
|
43 | LED_MESSURE_ON
|
44 | _delay_ms(1000);
|
45 | LED_MESSURE_OFF
|
46 | _delay_ms(1000);
|
47 | }
|
48 | }
|
Theoretisch sollten die LEDs doch fast gleichschnell blinken. (In der
Hauptschleife ganz minimal langsamer).
Aber leider blinkt die timergesteuerte LED in einer Minute ca. 29 mal.
Die LED in der Hauptschleife blinkt (ausreichend genau) 30 mal.
Könnte mit jemand ein Fehler im Code zeigen, oder bestätigen, dass der
so richtig ist? Der ORC1A Wert is doch richtig berechnet, oder? Danke
schonmal!
P.S.: Der Einfluss der Ungenauigkeit des internen RC-Oszillators sollte
sich ja auch beide LEDs gleich auswirken und somit keinen Einfluss auf
die unterschiedliche Blinkgeschwindigkeit haben.