Code:
.include "m8def.inc"
.equ time0_1 = 256-4 ;Damit wird der Timer2 vorgeladen - für 1KHz
.equ time0_2 = 256-1 ;Damit wird der Timer2 vorgeladen - für 4KHz
.equ time2 = 256-90 ;Damit wird der Timer0 vorgeladen
.equ Summer = PB2 ;Summer an B.2
.def tmp = r16 ;Mein Universallregister
.def statusreg = r17 ;Mein Statusregister
.def zaehler = r18 ;Mein Zählregister
.def statusSummer = r19 ;Mein Summerregister
.org 0x000
rjmp reset ;Interruptvektor "reset:"
.org OVF2addr
rjmp pruefZaehler ;Interruptvektor für Timer2 Überlauf, hier springt
;das Programm hin, wenn der Timer1 überläuft
.org OVF0addr ;Interruptvektor für Timer0 Überlauf, hier springt
rjmp pruefTon ;das Programm hin, wenn Timer0 ü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, 2 ;B.2 am Anfang aus 1 stellen, damit Ton rauskommt
ldi statusSummer, 0b00000000 ;Das erste Bit (Bit0) auf 0 setzen, damit er weiß,
;welchen Ton er abspielen soll. (0 = 1KHz - 1 = 2KHz)
;Timer Register werden belegt, hier Timer 2
ldi tmp, (1<<CS22) | (1<<CS21) | (1<<CS20) ;Prescaler ist 1024
out TCCR2, tmp ;Register TCCR2 ist für den Prescaller zuständig
ldi tmp, time2 ;Hier wird der Timer vorgeladen und zwar mit 256-90
out TCNT2, tmp
;Timer Register werden belegt, hier Timer0
ldi tmp, (1<<CS02) | (1<<CS00) ;Prescaler ist 1024
out TCCR0, tmp ;Register TCCR0 ist für den Prescaller zuständig
ldi tmp, time0_1 ;Hier wird der Timer vorgeladen und zwar mit 256-4
out TCNT0, tmp
ldi tmp, (1<<TOIE0) | (1<<TOIE2);Hier werden Interrupts nach Timer0 und Timer2 eingeschaltet
out TIMSK, tmp ;Register TISK ist dafür zuständig
sei ;Interrupts zulassen
loop:
cpi zaehler, 0b00010100 ;Wenn Zählregister != 20 ist
brne loop ;dann spring wieder zurück zu "loop:"
zeitum0:
clr zaehler ;Zählregister auf 0 setzen
sbrc statusSummer, 0 ;überspringe, wenn Bit0 = 0 ist
rjmp Ton2
Ton1:
ldi tmp, time0_1 ;wenn Bit0 = 0 ist, dann mach lad Frequenz 1KHz
out TCNT0, tmp
rjmp loop ;Wieder zurück zu "loop:"
Ton2:
ldi tmp, time0_2 ;wenn Bit0 = 1 ist, dann mach lad Frequenz 4KHz
out TCNT0, tmp
rjmp loop ;Wieder zurück zu "loop:"
pruefZaehler:
in statusreg, SREG ;SREG sichern
inc zaehler ;Zählregister um 1 erhöhen
ldi tmp, time2 ;Hier wird der Timer vorgelaen und zwar mit 255-90
out TCNT2, tmp ;Er läuft 90 mal durch, bevor ein Interrupt auftritt
out SREG, statusreg ;SREG wiederholen
reti ;wieder zurück, wo du hergekommen bist
pruefTon:
in statusreg, SREG ;SREG sichern
sbrs statusSummer, 0 ;überspringe, wenn Bit0 = 1 ist
sbr statusSummer, 0 ;wenn Bit0 = 0 ist, dann auf 1 setzen
sbrc statusSummer, 0 ;überspringe, wenn Bit0 = 0 ist
cbr statusSummer, 0 ;wenn Bit0 = 1 ist, dann auf 0 setzen
out SREG, statusreg
reti
Lesezeichen