Code:
.include "m8def.inc"
.equ time0_1 = 256-20 ;Damit wird der Timer0 vorgeladen
.equ time0_2 = 256-30
.equ time2 = 256-90 ;Damit wird der Timer2 vorgeladen
.equ Summer = PB2 ;Summer an B.2
.def tmp = r16 ;Mein Universallregister
.def statusreg = r17 ;Mein Statusregister
.def zaehlerSek = r18
.def statusSummer = r19 ;Mein Status-Summer-Register
.org 0x000
rjmp reset ;Interruptvektor "reset:"
.org OVF2addr
rjmp timerSek
.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 PORTB, Summer ;B.2 auf HIGH stellen
ldi statusSummer, 0b00000000 ;statusSummer auf 0 setzen
ldi zaehlerSek, 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 zaehlerSek, 0b00010100 ;Wenn Zählerregister != 40 ist
breq pruefSek ;dann zu "pruefSek:" springen
rjmp loop ;immer wieder zu "loop:" springen
pruefSek:
clr zaehlerSek ;Zählerregister auf 0 setzen
sbrs statusSummer, 0 ;überspringe, wenn PIN 0 = 1 ist
rjmp umschalten ;wenn PIN 0 = 0 ist, dann springe zu "umschalten:"
ldi statusSummer, 0b00000000;wenn PIN 0 = 1 ist, dann PIN 0 auf 0 setzen
rjmp loop ;wieder zurück zu loop
umschalten:
ldi statusSummer, 0b00000001;wenn PIN 0 = 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 timerSummer1 ;wenn B.2 = 0 ist, dann spring zu "umschalten1:"
cbi PORTB, Summer ;wenn B.2 = 1 ist, dann B.2 auf 0 setzen
rjmp timerSummer2 ;zu "umschalten2:" springen
timerSummer1:
sbi PORTB, Summer ;wenn B.2 = 0 ist, dann auf 1 setzen
timerSummer2:
sbrs statusSummer, 0 ;überspringe, wenn PIN 0 = 1 ist
rjmp timerSummer3 ;wenn PIN 0 = 0 ist, dann springe zu "timerSummer3:"
ldi tmp, time0_1 ;wenn B.5 = 1 ist, dann 1 KHz-Timer laden
out TCNT0, tmp
rjmp timerSummer4 ;zu "timerSummer4:" springen
timerSummer3:
ldi tmp, time0_2 ;wenn B.5 = 0 ist, dann 4KHz-Timer laden
out TCNT0, tmp
timerSummer4:
out SREG, statusreg ;SREG wiederholen
reti ;wieder zurück, wo du hergekommen bist
timerSek:
in statusreg, SREG ;SREG sichern
inc zaehlerSek ;Zählerregister um 1 erhöhen
ldi tmp, time2 ;Hier wird der Timer2 vorgeladen
out TCNT2, tmp
out SREG, statusreg ;SREG wiederholen
reti
Gruß
Lesezeichen