Du kannst auch Timer1 verwenden um die Zeit zu machen und Timer0 für die Anzeige. Jedanfalls ist das eine Lösung, wo du nicht viel oder nix in deiner Anzeigeroutine ändern musst.
Timer1 macht dir die Zeit, könnte sogar nur 1 Interrupt alle Sekunde machen (über Prescaler). Das reicht schon. Die Zeit schreibst du in Variablen: Sekunde, Minute, Stunde, Wochentag, was du anzeigen willst und benutz das in Timer0. Ob du sukzessive Interrupts erlaubst, kommt drauf an wie stark deine Echtzeitanforderung ist. Falls Timer0 den Timer1-Interrupt unterbrechen darf, könnte passieren, daß zwischen Minute hochzählen und Stunde zählen Timer0 zuschlägt. Nach 12:59 wird dann nicht 13:00 angezeigt sondern fälschlicherweise 12:00. Da gibt es 2 Möglichkeiten mit umzugehen:
- du ignorierst es. Die falsche Zeit wird nur sehr kurz angezeigt. Beim nächsten Umlauf stimmt wieder alles. Wahrscheinlich fällt das nicht mal auf.
- für die Zeit wo die Daten inkonsisten sind, deaktivierst du Timer0 Interrupt oder alle Interrupts. Danach werden die IRQs wieder freigegeben. IRQ gehen dabei keine verloren.
Lücken gibt es bei mir nicht. Meine Anzeige ist kein Rotor, aber ich muß auch fix sein, sonst flackert die Anzeige.
Du kannst auch alles in einer ISR machen. Erst die Anzeige setzen bzw die neue LED-Spalte. Danach machst du sonstiges Zeug das ansteht. Dadurch hast du die LED-Aktualisierung immer im gleichen Zeitraster. Daß die Zeit erst danach angepasst wird stört nicht. Wenn dein Rotor mit 50 U/s dreht und du in 7.2°-SChritten aktualisieren musst (1/50 Vollwinkel), brauchst du eine IRQ-Rate von 2.5kHz. Bei 16MHz MCU-Takt hast du 6400 Zyklen bis wieder ein IRQ kommt. Massig Zeit!
Lesezeichen