Ich mach das mit 2 Anzeigen, eine für Stunden, eine für Minuten.
Skala für Stunden: 0..12 ( 1er Schritte )
Skala für Minuten: 0..60 ( 10er Schritte )
Warum 12 als Maximum?
Weil ich bei den Stunden die Minuten mit einfließen lassen möchte, daher würde auch der Bereich 11..12 genutzt. Erst bei exakt 12:00 respektive 0:00 gibts den Sprung auf 0.
Bei Minuten ähnlich, wegen der Einteilung.
Ich habe mich für 0..12 entschieden da die Anzeige sonst zu unleserlich wäre würde sie 24h anzeigen. Man sollte normalerweise auch davon ausgehen können dass Spezies Humanoid weiß ob es AM oder PM ist
Für die Uhr selbst ist es ja egal, ein Wecker soll es auch nicht werden.
Wie wird es umgesetzt?
Durch ein bisschen Mathe und ein paar Konstanten im EEPROM.
Der Timer rennt von 0..65535. Gespeichert wird der Startwert (Wert der Zahl 0, meistens 0x000F) zu dem x Mal der Step Wert addiert wird (*).
Bei Stunden wäre das PWM = Start + (Stunden * Step * 60) + (Minuten * Step)
Und bei Minuten: PWM = Start + (Minuten * Step)
Code:
.ESEG
EE_HoursPWM:
.DW 0x000F, 0x005B // Minimum, Step value (1 each minute)
;.DW 0x0003, 0x1555 // Minimum, Step value (1 each hour)
EE_MinutesPWM:
.DW 0x000F, 0x0444 // Minimum, Step value (1 each minute)
(*): Tatsache, im Quelltext addiere ich noch, in einer Schleife. Sehr unschön.
Hardware Multiplikation kann ich so nicht nehmen, da es nur 8x8Bit=16Bit ist.
Ich habe auch schon eine Alternative gesucht und gefunden, Aber zwischen
finden und
verstehen damit man es umsetzen kann, das ist so eine Sache für sich...
http://www.avr-asm-tutorial.net/avr_en/calc/HARDMULT.html#mult16by8