Hallo,
ich habe folgenden Code:
1 | int main(void)
|
2 | {
|
3 | TCCR0A = (1 << WGM01); //CTC-Mode
|
4 | TCCR0B |= (1 << CS00) | (1 << CS02); //Prescaler 1024
|
5 | OCR0A = 78-1; //0 bis 77 --> 78 Tiks=knapp 10ms --> 9,984ms
|
6 | TIMSK |= (1 << OCIE0A); //Interrupt an
|
7 | sei(); //Globale Interrupts an
|
8 | while(1) {
|
9 | }
|
10 | }
|
11 | ISR(TIMER0_COMPA_vect)
|
12 | {
|
13 | if (status==1) {
|
14 | LEDan();
|
15 | status=0;
|
16 | }
|
17 | else {
|
18 | LEDaus();
|
19 | status=1;
|
20 | }
|
Allerdings sehe ich es immer noch blinken.
Ein zusätzlicher Counter um das mal mit einer Sekunde vergleichen zu
können zeigte auch, dass es bei weitem zu langsam ist.
Die Register habe ich nun schon mehrmals im Datenblatt durchgeschaut.
Das müsste eigentlich passen...
Ich finde den Fehler einfach nicht.
1Sekunde/8MHz=0,000000125s/Takt
0,000000125s/Takt * 1024 Prescaler=0,000128s/Countererhöhung
0,000128s/Countererhöhung * 78 Schritte bis Overflow
(CTC)=0,009984s/Overflow
--> theoretisch ca. alle 10ms (0,01s) ein Aufruf der Interruptroutine
Praktisch läuft das ganze wesentlich langsamer ab