Mahlzeit.
Ich habe folgendes Programm geschrieben um mir selbst die
Funktionsweise des Timer0 näherzubringen.
Nun funktioniert dieses Programm anscheinend nicht.
Wo habe ich den Fehler gemacht? Ich wäre echt für ein wenig Hilfe
dankbar.
.include "m8def.inc"
.def temp=r16
.def T0IFLAG=r20
.equ TimerStart=256-244 ;244*1024 ca 250000 Taktzyklen (@10MHz)
.org 0x0000 ;Einsprung für das Programm
rjmp main ;Reset Handler
.org OVF0addr
rjmp tim0ovf
main:
ldi temp, LOW(RAMEND) ; LOW-Byte der obersten RAM-Adresse
out SPL, temp
ldi temp, HIGH(RAMEND) ; HIGH-Byte der obersten
RAM-Adresse
out SPH, temp
rcall init
ausgabe: ;Endlosschleife Blinker
cpi T0IFLAG,1 ;I-Flag gesetzt???
brne weiter ;Nein. Ist nicht gesetzt
ldi T0IFLAG,0 ;I-Flag quittieren
inc r18 ;r18 hochzählen
cpi r18,0x27 ;Sekunde erreicht?
brne weiter ;nein
ldi r18,0
inc r19 ;Sekundenzähler incrementieren
mov r21,r19
com r21
out PORTC,r21
weiter:
rjmp ausgabe
tim0ovf:
ldi r17,TimerStart ;Zeitzähler für 25ms vorladen
out TCNT0,r17
ldi T0IFLAG,1 ;Timer0 I-Flag setzen
reti ;Rücksprung aus der Interruptroutine
init:
ldi r17,0xff ;
out DDRC,r17 ;Port C auf Ausgabe schalten
ldi r17,0x00 ;Alle Lampen aus
out PORTC,r17
ldi r17,TimerStart ;Zeitzähler für 25ms
out TCNT0,r17
in r17,TIMSK
ori r17,0x02
out TIMSK,r17
ldi r18,0
ldi r19,0 ;Sekundenzähler
ldi T0IFLAG,0
ldi r17,0x05 ;Vorteiler für Timer0 Clock/1024
out TCCR0,r17
sei ;Interrupts freigeben
ret ;Rücksprung ins Hauptprogramm
Oh. Sorry. Die Einstellung der Interruptmaske des Timers funktioniert (bei mir) so nicht. in r17,TIMSK ori r17,0x02 out TIMSK,r17 Mit folgender Änderung funzt es. ldi r17,1<<TOIE0 out TIMSK,r17
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.