Gast
#1621426
.include<m8def.inc>
.cseg
.org 0x000
rjmp reset
.org 0x008
rjmp tim1_ovf
.org 0x009
rjmp tim0_ovf
;***********************************************************************
**
.org 0x020
reset:
ldi r16,LOW(RAMEND)
out spl,r16
ldi r16,HIGH(RAMEND)
out sph,r16
ldi r16,0x00
out ddrc,r16
ldi r16,0xff
out ddrb,r16
out ddrd,r16
out portc,r16
ldi r16,0b00000011
out tccr0,r16 ;interner Takt Timer0 - Frequenz CLK/64
ldi r16,0000000001
out tccr1b,r16 ;interner Takt - kein Vorteiler
ldi r17,0xf1 ;timer highbyte zuerst initialisieren
ldi r18,0xb4 ;timer lowbyte initialisieren
out tcnt1h,r17
out tcnt1l,r18
ldi r16,0b00000001
out timsk,r16 ;timer0 interrupt ermöglichen
ldi zl,0x60 ;zeiger auf ausgabewerte
ldi zh,0x00
ldi r16,0x00
sts stelle,r16 ;stellenzähler
ldi r16,0x00
sts einer,r16
ldi r16,0x00
sts zehner,r16
ldi r16,0x00
sts hunderter,r16
ldi r16,0x00
sts tausender,r16
ldi r20,0x00
sei
start:
sbis pinc,0
rjmp start
st1:
ldi r16,0x00
sts stelle,r16 ; stellenzähler
sts einer,r16 ; `0` ---> einer
sts zehner,r16 ; `0` ---> zehner
sts hunderter,r16 ; `0` ---> hunderter
sts tausender,r16 ; `0` ---> tausender
ldi r16,0b00000101 ; timer 1\0 interrupt ermöglichen
out timsk,r16
st2:
;rcall zeit
sbic pinc,0
rjmp st2
st3:
ldi r16,0b00000001 ;timer0 interuppt ermöglichen
out timsk,r16
sbis pinc,0
;rcall zeit
rjmp start
tim0_ovf:
sei ;interrupts zulassen
push r16 ;register retten
push r17
push r18
push r19
in r16,sreg ;statusregister sichern
ld r18,z+ ;ausgabewert holen
lds r19,stelle ;stelle holen
swap r19 ;nibbles tauschen
out portb,r18 ;wert ausgeben
out portd,r19 ;stelle ausgeben
swap r19 ;stelle zurücktauschen
inc r19
sts stelle,r19 ;und sichern
cpi r19,0x04
brlo t0_1
ldi zl,0x60
ldi zh,0x00
ldi r19,0x00
sts stelle,r19
t0_1:
out sreg,r16 ;statusregister wieder herstellen
pop r19 ;register wieder herstellen
pop r18
pop r17
pop r16
reti
tim1_ovf:
push r16
push r17
push r18
in r16,sreg
lds r16,einer ;einerstelle holen
inc r16 ;und inkrementieren
cpi r16,0x0a
brsh s2 ;wenn einer > 9
sts einer,r16 ;sonst einer sichern
rjmp t1_end ;und wiederholen
s2: ldi r16,0x00
sts einer,r16 ;einer zurücksetzen
lds r16,zehner
inc r16 ;zehner inkrementieren
cpi r16,0x0a
brsh s3 ;wenn zehner > 9
sts zehner,r16 ;sonst zehner sichern
rjmp t1_end ;und wiederholen
s3: ldi r16,0x00
sts zehner,r16 ;zehner zurück setzen
lds r16,hunderter
inc r16 ;hunderter inkrementieren
cpi r16,0x0a
brsh s4 ;wenn hunderter > 9
sts hunderter,r16 ;sonst hunderter sichern
rjmp t1_end ;und wiederholen
s4: ldi r16,0x00
sts hunderter,r16 ;hunderter zurücksetzen
lds r16,tausender
inc r16 ;tausender inkrementieren
cpi r16,0x0a
brsh s5 ;wenn tausender > 9
sts tausender,r16 ;tausender sichern
rjmp t1_end ;und wiederholen
s5: ldi r16,0x00
sts tausender,r16 ;tausender zurücksetzen
t1_end:
ldi r17,0xf1
ldi r18,0xb4
out tcnt1h,r17 ;timerwert zurücksetzen
out tcnt1l,r18
out sreg,r16 ;statusregister wiederherstellen
pop r18
pop r17
pop r16
reti
zeit: push r16
push r17
push r18
lds r16,sreg
push r16
ldi r16,0xf0
zeit1: ldi r17,0xff
zeit2: ldi r18,0x1d
zeit3: dec r18
brne zeit3
dec r17
brne zeit2
dec r16
brne zeit1
pop r16
sts sreg,r16
pop r18
pop r17
pop r16
ret
.dseg
einer: .byte 1
zehner: .byte 1
hunderter: .byte 1
tausender: .byte 1
stelle: .byte 1
Möchte gern die herausgegebene Zeit ausgeben lassen hierbei wird es nur
wieder auf null gesetzt kann mir bitte jemand helfen