Dean Winchester schrieb:
> Alles klar danke für den Hinweis - der atmega325 läuft nun mit 8MHz
> (nicht 16 - sry) hatte das CKDIV8 fusebit gesetzt gehabt.
>
> so, nun hab ich es soweit abgeändert, dass ich durch 64 Teile anstatt 8.
> Das Funktioniert nun aber ähnlich. d.h. die LEDs blinken immernoch im 2
> sekunden takt.
>
> warum wird das register einfach nicht beachtet? ich verstehs nicht :(
>
>
1 | > TCNT0 = 0;
|
2 | > TCCR0A = 0b0000011; //Prescaler 64
|
3 | > OCR0A = 125-1;
|
4 | > TIMSK0 = 0b00000010;
|
5 | >
|
Hör bitte mit dem Müll auf, da alle Angaben in Binärschreibweise zu
machen. Atmel hat dir in den Header Files entsprechende #defines
mitgegeben, so dass du zb schreiben kannst
TIMSK0 = ( 1 << OCIE0 );
Natürlich wird der beachtet. Sonst würde ja die ISR gar nicht aufgerufen
werden.
Aber: was erwartest du?
Du betreibst den Timer im ganz normalen Modus! d.h der zählt von 0 bis
255.
Schau:
Was du gemacht hast ist, du hast einen Compare Match aufgesetzt. Im
Prinzip hast du folgendes getan: Du hast eine Uhr genommen und an den
Sekundenzeiger einen Kontakt gepfriemelt. Wenn der Sekundenzeiger bei 20
steht, dann löst du eine Aktion aus. Aber: Das ändert ja nichts daran,
dass der Sekundenzeiger nach wie vor seine Runden dreht. Verschiebst du
den Kontakt auf 40, dann kommt das Signal zu einem anderen Zeitpunkt.
Aber es kommt noch wie vor alle 60 Sekunden. Denn solange braucht der
Zeiger für eine Runde.
Würdest du den Zeiger nach auslösen des Kontaktes sofort auf 0
zurückstellen, dann sieht die Sache anders aus. Dann würden die Signale
tatsächlich alle 20 bzw. 40 Sekunden kommen. Aber das tust du ja nicht.
Mittels
TCCR0A = 0b0000011; //Prescaler 64
stellst du einen ganz normalen Zählmomdus ein.
Du wolltest vielleicht den CTC-Modus benutzen. Du hast sogar damit
gerechnet. Aber du hast es nicht getan. Und durch die bescheuerte
Binärschreibweise muss man auch noch 3 mal ganz genau hinsehen, um das
zu sehen.