.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.