Code:
.include "m8def.inc"
.equ time0_1 = 256-2 ;Damit wird der Timer0 vorgeladen
.equ time2 = 256-90 ;Damit wird der Timer2 vorgeladen
.equ Summer = PB2 ;Summer an B.2
.equ LED = PB5 ;LED an B.5
.def tmp = r16 ;Mein Universallregister
.def statusreg = r17 ;Mein Statusregister
.def zaehlerLED = r18 ;Mein Zählregister
.org 0x000
rjmp reset ;Interruptvektor "reset:"
.org OVF2addr
rjmp timerLED
.org OVF0addr
rjmp timerSummer ;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, Summer ;B.2 als Ausgang
sbi DDRB, LED ;B.5 als Ausgang
sbi PORTB, Summer ;B.2 auf HIGH stellen
sbi PORTB, LED ;B.5 auf HIGH stellen
ldi zaehlerLED, 0b00000000 ;Zähler auf 0 setzen
;Timer Register werden belegt, hier Timer 0
ldi tmp, (1<<CS02) ;Prescaler ist 512
out TCCR0, tmp ;Register TCCR0 ist für den Prescaller zuständig
ldi tmp, time0_1 ;Hier wird der Timer vorgeladen
out TCNT0, tmp
;Timer Register werden belegt, hier Timer 2
ldi tmp, (1<<CS22) | (1<<CS21) | (1<<CS20) ;Prescaler ist 1024
out TCCR2, tmp ;Register TCRR2 ist für den Prescaller zuständig
ldi tmp, time2 ;Hier wird der Timer vorgeladen
out TCNT2, tmp
ldi tmp, (1<<TOIE0) | (1<<TOIE2);Hier werden Interrupts nach Timer0 Überlauf eingeschaltet
out TIMSK, tmp ;Register TIMSK ist dafür zuständig
sei ;Interrupts zulassen
loop:
cpi zaehlerLED, 0b00101000 ;Wenn Zählerregister != 40 ist
breq pruefLED ;dann zu "pruefLED:" springen
rjmp loop ;immer wieder zu "loop:" springen
pruefLED:
clr zaehlerLED ;Zählerregister auf 0 setzen
sbis PORTB, LED ;überspring, wenn B.5 = 1 ist
rjmp umschaltenLED ;wenn B.5 = 0 ist, dann spring zu "umschaltenLED:"
cbi PORTB, LED ;wenn B.5 = 1 ist, dann B.2 auf 0 setzen
rjmp loop ;wieder zurück zu "loop:"
umschaltenLED:
sbi PORTB, LED ;wenn B.5 = 0 ist, dann auf 1 setzen
rjmp loop ;wieder zurück zu "loop:"
timerSummer:
in statusreg, SREG ;SREG sichern
sbis PINB, Summer ;überspringe, wenn B.2 = 1 ist
rjmp umschaltenSummer1 ;wenn B.2 = 0 ist, dann spring zu "umschalten1:"
cbi PORTB, Summer ;wenn B.2 = 1 ist, dann B.2 auf 0 setzen
rjmp umschaltenSummer2 ;zu "umschalten2:" springen
umschaltenSummer1:
sbi PORTB, Summer ;wenn B.2 = 0 ist, dann auf 1 setzen
umschaltenSummer2:
ldi tmp, time0_1 ;Hier wird der Timer vorgeladen
out TCNT0, tmp
out SREG, statusreg ;SREG wiederholen
reti ;wieder zurück, wo du hergekommen bist
timerLED:
in statusreg, SREG ;SREG sichern
inc zaehlerLED ;Zählerregister um 1 erhöhen
ldi tmp, time2 ;Hier wird der Timer2 vorgeladen
out TCNT2, tmp
out SREG, statusreg ;SREG wiederholen
reti
Nu werd ich erstmal was essen
Lesezeichen