also bei deiner frage fehlen entscheidende infos zum helfen, aber die fragen stelle ich mal hinterher und konzentrieren wir uns auf deinen code
du hast den timer also initialisiert in irgend einem modus mit einem prescale wert und einem wert den du in den timer counter schreibst (könntest du den modus mal herleiten eventuell?)
zum einen solletst du den prescale wert ERST DANN ÄNDERN wenn dein timer initialisiert ist, denn sobald du den prescale wert jenseits 0 setzt, startet der timer SOFORT und du hast schon keinen zuverlässigen timer mehr
also MERKE: timer prescaler = 0 > timer gestoppt, timer prescaler != 0 > Timer läuft! Und änderungen am timer sollte man nur machen wenn er steht!
außerdem macht das preloaden des timer counter keinen sinn, sobald der timer überläuft wird er auf TOP zurückgesetzt und TOp entscheidet sich je nachdem welchen WGM du programmierst
aber ich geh mal nach dem datenblatt:
WGM modus 0 (update on TOP, TOP = 0xFFFF, normal up counting)
frequenz 62.5kHz
preload TCNT mit 3036
zeit zum überlauf = (TOP - 3036) * (1/62.5kHz) = 62499 * 16nS = 999,984mS
da scheint also schon was mit der berechnung falsch zu sein, das ist nicht mal annähernd 9mS
außerdem wäre ein ansatz bei dem du den timer immer neu programmierst nach jeder änderung sehr unpräzise da das umprogrammieren des timer eine undefinierte zeit braucht!
Vorgeschlagene Lösung daher:
programmier den timer auf einen WGM und einen prescaler damit er mit der kleinsten notwendigen zeiteinheit überläuft
angenommen 1mS auflösung reicht: WGM=14 (Fast PWM, TOP = ICR1 Register, normal up counting) und CS02 also Prescaler auf 256 => 62500Hz
ICR1 = 62500; (wenn TCNT = 62500 = TOP = ICR1 erreicht, klappt er auf 0 und macht einen Overflow Interrupt, somit einen overflow pro millisekunde)
und im interrupt lässt du dann eine timer variable hochzählen und kannst anhand des timer wert dann deine LEDs bedienen
Bei deiner beschreibung schreibst du trivial Atmega128, aber es gibt verschiedene derivate mit unterschiedlichen timern und andern peripherie funktionen, du solltest also wenn möglich den genauen atmega typen angeben!
Außerdem hat der Atmega garkeine LEDs draufm, ich gehe davon aus dass du das Board meinst auf dem der Stmega128 sitzt !?
Lesezeichen