Als erstes würde ich Dir vorschlagen, dass Du mal eine "Debug"-Funktion
mittels einer LED in die ISR einbaust.
Suche Dir einen freien PORT mit passendem PIN
und daran schliesst Du eine LED an. Vergiss nicht den Port als Ausgang
zu definieren.
Die ISR erweiterst Du wie folgt
1 | ISR(TIMER0_COMPA_vect)
|
2 | {
|
3 | PORTx ^= 0x80; // Bspw. an PORTx (der freie Port) mit dem Bit7 wackeln
|
4 | extraTime++;
|
5 | }
|
Dann siehst Du, ob Deine ISR überhaupt funktioniert.
D.h., die LED sollte flackern. Notfalls mal eine Scope anschliessen,
dann siehst Du auch die Taktrate Deines ISR. D.h., Du kannst am Scope
sehen, wieviel Zeit vergeht bis der ISR wieder aufgerufen wird.
Als weiteres würde ich die Variable extraTime als char bzw. uint8_t
definieren. Denn int ist 16-Bit. Damit gibt es immer Probleme, denn
ein AVR ist ein 8-bittiger Prozessor. Auch wenn sie als volatile
definiert ist.
Gewöhne Dir bitte an die Typdeklarationen zu benutzen die hier üblich
sind.
Also: nicht char sonder als int8_t bzw. unsigned char als uint8_t zu
deklarieren, usw.. Damit wird es Dir letzten Endes leicher und
verständlicher gemacht. Weil Du genau weisst, wieviel Bits deine
Variable definitiv hat.
Und als letzte Info: Nimm den #include <util/delay.h> raus und setze
die Optimierung auf -O0, sprich schalte sie aus.
Wenn alles läuft kannst Du später die Optimierung wieder aktivieren.