Hmm..irgendwas stimmt da noch nicht...Er läuft wie gehabt bis zum Ende durch, dann soll er aber wieder zurück laufen, also subtrahiere ich wieder 1. Aber beim nächsten Durchlauf addiert er ja wieder 1 und wir sind wieder beim letzten Ton. Also dacht ich mir, subtrahiere ich einfach 2. Dann liest er, sobald er den letzten Ton erreicht hat, bei der nächsten Sekunde den vorletzten Ton aus (klingt gut). Aber bei der nächsten Sekunde sagt er dann wieder, dass er noch nicht am Ende ist, stimmt ja auch, weil er beim vorletzten Ton wieder ist und nicht beim letzten.
Lange Rede, kurzer Sinn, hier mal der Code:
Code:
pruefSek:
	push tmp					;tmp sichern
	in tmp, SREG
	push tmp					;SREG sichern
		ldi tmp, HIGH(time1)	;Für den Timer1 (16Bit) benötigen
		out	TCNT1H, tmp			;wir 2 Register, in denen wir den Wert
		ldi tmp, LOW(time1)		;für die 1 Sekunde speichern ->
		out TCNT1L, tmp			;"TCNT1H" und TCNT2L"
			lpm                  		;Daten von tonleiter1: holen 
		   	adiw ZL,1            		;Z um 1 erhöhen, nächstes Byte 
		   	ldi tmp, LOW  ((tonleiter1 * 2) + daten_laenge)	;vergleiche LOW-Byte 
		   	cp ZL, tmp 
			ldi tmp, HIGH ((tonleiter1 * 2) + daten_laenge)	;vergleiche HIGH-Byte 
			cpc ZH, tmp 
			brne regwiederholen		;Ist Ende erreicht?
			;JA -> wieder zurückzählen
			lpm                  		;Daten von tonleiter1: holen 
		   	sbiw ZL,2            		;Z um 2 erniedrigen, vorheriges Byte 
		   	ldi tmp, LOW  ((tonleiter1 * 2) + daten_laenge)	;vergleiche LOW-Byte 
		   	cp ZL, tmp
			brne regwiederholen		;Ist Anfang erreicht?
			ldi tmp, (0<<CS02)      ;JA -> Timer0 abstellen
	   		out TCCR0, tmp

regwiederholen:
	pop tmp
	out SREG, tmp				;SREG wiederholen
	pop  tmp					;tmp wiederholen
	reti
Weiß nicht, ob ich überhaupt mit 2 subtrahieren muss oder ob es da eine ganz andere Möglichkeit gibt. Denn ich möcht das nun gerne ohne Hilfsvariable schaffen.