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 zaehlerSek = r18 ;Mein Zählregister für die halbe Sekunde
.def statusSummer = r19 ;Mein Summerregister
.def zaehlerTon = r20 ;Mein Zählregister für den Ton
.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 zaehlerTon, 0b00000001 ;Wenn Zählregister für Ton = 1 ist
breq pruefFrequenz ;dann spring zu "pruefTon:"
cpi zaehlerSek, 0b00010100 ;Wenn Zählregister != 20 ist
brne loop ;dann spring wieder zurück zu "loop:"
zeitum0:
clr zaehlerSek ;Zählregister auf 0 setzen
rjmp loop
pruefFrequenz:
sbrs statusSummer, 0 ;überspringe, wenn Bit0 = 1 ist
sbr statusSummer, 0 ;wenn Bit0 = 0 ist, dann auf 1 setzen
sbrc statusSummer, 0 ;überspringen, wenn Bit0 = 0 ist
cbr statusSummer, 0 ;wenn Bit0 = 1 ist, dann auf 0 setzen
rjmp loop
pruefZaehler:
in statusreg, SREG ;SREG sichern
inc zaehlerSek ;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
inc zaehlerTon ;Zählregister um 1 erhöhen
sbrs statusSummer, 0 ;überspringe, wenn Bit0 = 1 ist
ldi tmp, time0_2 ;wenn Bit0 = 0 ist, dann Frequenz 2 (4KHz) laden
sbrc statusSummer, 0 ;überspring, wenn Bit0 = 0 ist
ldi tmp, time0_1 ;wenn Bit0 = 1 ist, dann Frequenz 1 (1KHz) laden
out TCNT0, tmp
out SREG, statusreg ;SREG wiederholen
reti ;wieder zurück, wo du hergekommen bist
Hab nun für Timer0 auch einen Zähler eingebaut, denk mal, den brauch ich. in pruefTon wird der Timer immer wieder neugeladen. Tjo, und den Rest find ich eigentlich logisch. Ich denk mal, der Fehler muss in pruefTon liegen, da er ja nur ein kurzes Knacken von sich gibt.
Lesezeichen