Sebastian: In 2 Wochen hast du Urlaub? In 2 Wochen muss ich arbeiten *gg*

Das mit mehr als 2 Bits setzen hab ich dann heut auch kennengelernt, da ich beim Timer 2 3 Bits auf 1 setzen musste, damit ich einen Prescaller von 1024 habe.
Von weiterkommen kann nicht ganz die Rede sein, ich glaub ich änder den Code immer nur um, aber ändern tut sich nichts. Am Anfang hört man kurz ein Knacken von Summer, und dann isses auch schon wieder vorbei. Hier erstmal bis jetzt der Code:
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