.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
was mir beim durchlesen aufgefallen ist: du schreibst in der ini ldi r16,0000000001 out tccr1b,r16 ;interner Takt - kein Vorteiler soll aber vermutlich 0b... heißen macht aber keine Änderung da 1 in Oktal in Binär immernoch 1 ist. im Interrupt tim1_ovf: du lädst SREG in R16 und am ende auch wieder zurück aber du veränderst in der Zwischenzeit den Inhalt von R16. Entweder du machst anschließend noch einmal push R16 oder du nimmst ein anderes Register. Im Unterprogramm Zeit machst du das richtig
Der Befehl STS ändert nicht den Wert im Register und du brauchst nicht jedesmal anschließend wieder einen neuen Wert zu laden wie in der INI: ldi r16,0x00 sts einer,r16 ldi r16,0x00 sts zehner,r16 ldi r16,0x00 ... und noch etwas wenn du Zeit auskommentierst dann kann es passieren das in st3 der rjmp Befehl übersprungen wird du schreibst das nur timer0 Interrupts machen darf brauchst aber auch für timer1 Interrupts. Register TIMSK
TCNT1 setzt man im Normalfall am Anfang des Timers, da je nach Umfang des Timerinterrupts ja nebenher schon hochgezählt wird.
Hi > sbis pinc,0 > ;rcall zeit > rjmp start > push r18 > in r16,sreg> > lds r16,einer ;einerstelle holen > ldi r16,0000000001 > out tccr1b,r16 ;interner Takt - kein Vorteiler alles böse Fallen. > ldi r16,0b00000011 > out tccr0,r16 ;interner Takt Timer0 - Frequenz CLK/64 Benutze bitte die Bitdefinitionen ldi r16,1<<CS11|1<<CS10 MfG Spess
Das Programm arbeitet er Zählt hoch aber es muss wenn der setz befehl wieder kommt muss die zeit wieder auf null aber dafür die zeit die als letztes angezeigt war angezeigt werden bis die neue zeit gestoppt wird
JAY schrieb: > Das Programm arbeitet er Zählt hoch aber es muss wenn der setz befehl > wieder kommt muss die zeit wieder auf null aber dafür die zeit die als > letztes angezeigt war angezeigt werden bis die neue zeit gestoppt wird Dann wirst du wohl 2 Sätze von Variablen brauchen In den einen wird gezählt, die anderen werden angezeigt. Und wenn du soweit bist wird die laufende Zeit umkopiert auf die Variablen von denen angezeigt wird.
Ja genau wie müsste ich das weiteer schreiben hab alles versucht aber dann zeigt er mir immer den selben wert an
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.