Das hier ist mein aktueller Code:
Code:
.include "m8def.inc"
.equ time = 255 -254 ;Damit wird der Timer vorgeladen
.equ sperre = 7
.equ LED = PB2 ;LED an B.2
.def tmp = r16 ;Mein Universallregister
.def status = r17 ;Mein Statusregister, ob LED an oder aus ist
.def zaehler = r18 ;Mein Zählregister
.org 0x000
rjmp reset ;Interruptvektor "reset:"
.org OVF0addr
rjmp pruefZaehler ;Interruptvektor für Timer0 Überlauf, hier springt
;das Programm hin, wenn der Timer überläuft
reset:
;Stack einrichten
ldi tmp, HIGH(RAMEND) ;HIGH-Byte der obersten RAM-Adresse
out SPH, tmp
ldi tmp, LOW(RAMEND) ;LOW-Byte der obersten RAM-Adresse
out SPL, tmp
sbi DDRB, LED ;B.2 als Ausgang
cbi PORTB, LED ;B.2 auf LOW stellen -> LED aus am Anfang
cbr status, (1<<sperre) ;Statusregister r17.7 = 0 setzen (LED aus)
;Timer Register werden belegt, hier Timer 0
ldi tmp, (1<<CS02) | (1<<CS00) ;prescaler ist 1024
out TCCR0, tmp ;Register TCCR0 ist für den Prescaller zuständig
ldi tmp, (1<<TOIE0) ;Hier werden Interrupts nach Timer0 Überlauf eingeschaltet
out TIMSK, tmp ;Register TIMSK ist dafür zuständig
ldi tmp, time ;Hier wird der Timmer vorgelaen und zwar mit 255-254
out TCNT0, tmp ;Er läuft 254 mal durch, bevor ein Interrupt auftritt
sei ;Interrupts zulassen
loop:
rjmp loop ;Immer wieder selbst aufrufen -> Endlosschleife
pruefZaehler:
inc zaehler ;Zählregister um 1 erhöhen
cpi zaehler, 0b01000001 ;Wenn Zählregister = 65 ist
breq zeitum ;spring zu "zeitum:" wenn zaehler = 65
reti
zeitum:
clr zaehler ;Zählregister auf 0 setzen
push tmp ;Rette Universallregister
in tmp, SREG ;Rette Statusregister
push tmp
sbrs status, sperre ;überspringe, wenn r17.7 = 1 ist (LED an?)
rjmp zeitum0 ;zu "zeitum0:" springen
sbrc status, sperre ;überspringe, wenn r17.7 = 0 ist (LED aus?)
rjmp zeitum1 ;zu "zeitum1:" springen
zeitum0:
sbr status, (1<<sperre) ;r17.7 = 1 setzen (LED an)
sbi PORTB, LED ;B.2 = 1 setzen -> LED an
rjmp zeitum2
zeitum1:
cbr status, (1<<sperre) ;r17.7 = 0 setzen (LED aus)
cbi PORTB, LED ;B.2 auf 0 setzen -> LED aus
rjmp zeitum2
zeitum2:
pop tmp ;stelle SREG wieder her
out SREG, tmp
pop tmp ;stelle Universalregister wieder her
reti ;die Interrupt-Routine wird verlassen
;und es wird weiter im Hauptprogramm gearbeitet
Hab nur das "reti" vorhin eingefügt.
Lesezeichen