Hmm...bin kurz davor, dass es geht, aber irgendwie will es noch nicht. Teste die ganze Zeit im Simulator. Er macht aber nie den Timer aus, also er springt nie da rein, wo er den Timer0 abestellen soll.
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
sbrc tonleiterEnde, 0 ;Ist tonleiterEnde = 0?
rjmp subtrahiereZ ;Wenn tonleiter = 1, dann subtrahiere Z um 1
addiereZ:
adiw ZL, 1 ;Z um 1 erhöhen
rjmp pruefSek2 ;zu "pruefSek2:" springen
subtrahiereZ:
sbiw ZL, 1 ;Z um 1 erniedrigen
pruefSek2:
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 pruefTonaus ;zu "pruefTonaus:" springen
sbr tonleiterEnde, 1 ;Hilfsvariable.1 auf 1 setzen
pruefTonaus:
cp ZL, tmp ;Ist Anfang erreicht?
brne regwiederholen
ldi tmp, (0<<CS02) ;JA -> Timer0 abstellen
out TCCR0, tmp
regwiederholen:
pop tmp
out SREG, tmp ;SREG wiederholen
pop tmp ;tmp wiederholen
reti
Er müsste aber eigentlich reinspringen, denn irgendwann ist doch ZL wieder auf 0, oder?
Lesezeichen