Hallo,
ich habe einen Problem mit meinem Timer. Dieser dauer doppelt so lange
wie der eigentlich sollte
1 | ...
|
2 | // Timer 0
|
3 | TCCR0A = (1<<WGM01); // CTC Modus
|
4 | TCCR0B |= (1 << CS01); // prescaler 8
|
5 | OCR0A = 250-1;
|
6 |
|
7 | // Overflow Interrupt allow
|
8 | TIMSK |= (1 << OCIE0A);
|
9 |
|
10 | // Global Interrupts activate
|
11 | sei();
|
12 |
|
13 | ...
|
14 |
|
15 | ISR (TIMER0_COMPA_vect){
|
16 | static unsigned int millisekunde = 0;
|
17 | static unsigned int sekunde = 0;
|
18 |
|
19 | millisekunde++;
|
20 |
|
21 | if(millisekunde == 1000){
|
22 | millisekunde = 0;
|
23 | sekunde++;
|
24 | PORTD ^= (1<<PD5);
|
25 |
|
26 | if(sekunde == 60){
|
27 | sekunde = 0;
|
28 | }
|
29 | }
|
30 | }
|
Am Controller habe ich einen Quarz mit 8MHZ und die FUSES habe ich auf
L: 0x6C
H: 0x9F
E: 0xFF
gesetzt.
eigentlich sollte der Interrupt genau jede millisekunde ausgelöst
werden, sodass PD5 im sekundentakt toggelt. Dieses dauert aber fast 2
Sekunden (an PD5 ist eine LED angeschlossen).
8Mhz/4/prescaler = 250.000khz
-> 1 Takt = 0.004ms
OCR0A = 250 -> 250*0.004ms = 1ms