Code:
.nolist
.include"m16def.inc"
.equ xtal = 8000000
.equ debounce = 256
.equ remainder = xtal - xtal / debounce * debounce
.def isreg = r15
.def wr0 = r16
.def iwr0 = r17
.def prescaler = r18
.def sekunde = r19
.def sekunde2 = r20
.def minute = r21
.def stunde = r22
.list
rjmp init
.org OC1Aaddr
rjmp OC1Aint
;-------------------------------------------------------------------------
OC1Aint:
in isreg, sreg
ldi iwr0, high( xtal / debounce - 1 )
out ocr1ah, iwr0
ldi iwr0, low( xtal / debounce - 1 )
out ocr1al, iwr0
dec prescaler
brne _oci1
ldi prescaler, debounce
inc sekunde
ldi iwr0, high( xtal / debounce + remainder - 1 )
out ocr1ah, iwr0
ldi iwr0, low( xtal / debounce + remainder - 1 )
out ocr1al, iwr0
_oci1:
out sreg, isreg
reti
;-------------------------------------------------------------------------
init:
ldi wr0, 0x0
out ddra, wr0
out ddrb, wr0
out ddrc, wr0
ldi sekunde, 0
ldi wr0, high( ramend )
out sph, wr0
ldi wr0, low( ramend )
out spl, wr0
ldi wr0, 1<<WGM12^1<<CS10
out TCCR1B, wr0
ldi wr0, high( xtal / debounce - 1 )
out ocr1ah, wr0
ldi wr0, low( xtal / debounce - 1 )
out ocr1al, wr0
out tcnt1l, wr0
ldi prescaler, debounce
ldi wr0, 1<<OCIE1A
out TIMSK, wr0
sei
main:
ldi sekunde, 0
sekunden:
cpi sekunde, 60
breq minuten
rcall bcd
out ddra, sekunde
rjmp sekunden
bcd:
ser sekunde2
to_bcd:
inc sekunde2
subi sekunde, -10
brpl to_bcd
swap sekunde2
subi sekunde, -10
or sekunde, sekunde2
ret
minuten:
inc minute
cpi minute, 60
breq stunden
out ddrb, minute
rjmp main
stunden:
ldi minute, 0
out ddrb, minute
inc stunde
cpi stunde, 24
breq tag
out ddrc, stunde
rjmp main
tag:
ldi stunde, 0
out ddrc, stunde
rjmp main
Lesezeichen