Das 'Uhrwerk' einer Uhr. (AT90s1200)
Zählt nach dem Einschalten ab 00:00:00 hoch.
Der Quarz mit 3.2768MHz wird hier über Vorteiler 1024
und Timer0 (0x80) auf 25 Interrupts pro Sekunde heruntergeteilt.
Diese werden über die Variable 'Puls' abgezählt.
Ist Puls=0, wird die Sekunde erhöht.
Die beiden mit (X) markierten Zeilen sind bei
anderem Quarz/Teileränderung anzupassen.
Die Zeit steht als gepackte BCD-Zahl in Stunde, Minute, Sekunde zur
Verfügung.
.def Temp = R16
.def Display = R17
.def Timer = R18
.def Puls = R19
.def Sekunde = R20
.def Minute = R21
.def Stunde = R22
RESET: ;Reset Label
clr Sekunde
clr Minute
clr Stunde
ldi Temp, 0x05 ;Timer0-Mode auf Vorteiler 1024
out TCCR0, Temp
ldi Timer, 0x80 ;Timer0 auf überlauf 25Hz.
out TCNT0, Timer
ldi Temp, 0x02 ;Timer0-Int. freigeben ( Für 90s8515 anpassen,
;TOIE0 muss aktiv sein)
out TIMSK, Temp
in Temp, SREG ;Interrupts generell freigeben
ori Temp, 0x80
out SREG, Temp
ldi Puls, 25 ;Timer0-Überlauf runterteilen (X)
TIMER0: ;Timer0-Einsprung.
out TCNT0, Timer ;Timer0 neu starten
dec Puls ;Überlauf-Teiler -1
cpi Puls,0 ;Null?
brne Not_Null ;Nein?, Dann raus.
ldi Puls, 25 ;Ja? Überlaufteiler setzen (X)
inc Sekunde ;Sekunde +1
mov Temp, Sekunde
andi Temp, 0x0f ;Oberes Nibble weg
cpi Temp, 0x0a ;Gösser 9?
brne Not_Null ;Nein? Dann raus
swap Sekunde ;Nibbles tauschen
andi Sekunde, 0x0f ;Unerwünschtes Nibble weg
inc Sekunde ;Sekundenzehner +1
swap Sekunde ;Nibbles tauschen
cpi Sekunde, 0x60 ;Grösser 59?
BRNE Not_Null ;Nein? Dann raus
clr Sekunde ;Ja? Sekunden auf null
inc Minute ;Ab hier, wie Sekunden
mov Temp, Minute
andi Temp, 0x0f
cpi Temp, 0x0a
brne Not_Null
swap Minute
andi Minute, 0x0f
inc Minute
swap Minute
cpi Minute, 0x60 ;Minute grösser 59
BRNE Not_Null ;Nein? Dann raus
ldi Minute, 0 ;Ja? Minuten auf null.
inc Stunde ;Ab hier wie Sekunde
mov Temp, Stunde
andi Temp, 0x0f
cpi Temp, 0x0a
brne Not_Null2
swap Stunde
andi Stunde, 0x0f
inc Stunde
swap Stunde
Not_Null2:
cpi Stunde, 0x24 ;Stunde grösser 23
BRLO Not_Null ;Nein? Dann raus
clr Sekunde ;Ja? Alles auf null
clr Minute
clr Stunde
Not_Null:
reti
Hoffe, das hilft.
Gruss
Jadeclaw.