HI,

die Werte müssten stimmen, das hab ich geprüft.
Hatte das Neuladen von Timer0 vorher auch in der Interruptroutine drinne, änder es ja ständig, langsam blick ich auch nicht mehr durch meinen Code durch.
Ich schau mir dann nochmal pruefTon an, obwohl ich das ja auch mittlerweile schon wieder geändert habe *g*

Gruß
Thomas

[edit]
Um euch auf dem Laufenden zu halten, hier mein aktuelle 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 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.