Hallo Thomas,
Daß Dein Programm noch nicht ganz Perfekt ist, ist auch kein Wunder,
überleg mal seit wann Du im Assembler programmierst?

Jetzt nicht traurig sein, es war nicht böse gemeint!

Hauptsache ist, daß es funktioniert, und verbessern kann man es immer noch.

Ich persönlich hätte es fast nur in den Interrupt Routinen gelöst.
Ob es besser oder schlechter als Deine Lösung ist, möchte ich hier nicht urteilen,
ich bin selber kein Profi, sondern genauso wie Du und die meisten hier ein Freak,
der von der Technik fasziniert ist.

Ich schreibe Dir meinen Ansatz, wie ich mir daß vorstelle, ok ?
Du kannst versuchen, das in einem Programm umzusetzen,
abe tue mir ein Gefallen, schreib bitte ein neues Programm, sonst kommt
wieder ein durcheinander dabei raus

Also:
ein Register, wo dein Tonwert gespeichert wird.
wie gehabt ein universallregister.

in loop zuerst mit lpm den ersten Ton in Tonwert einlesen, und den Timer0 damit laden.
als nächstes den Timer1 laden, (könnte auch in reset stehen denke mir)
und zum Schluß eine Endlosschleife.

die Timer0 Interruptroutine, ist sehr einfach, nur mit Tonwert neu laden und raus.
Timer1 Interruptroutine muß natürlich jetzt alles enthalten, was bis jetzt in Deinem Main:
gestanden hat, also
1. mit adiw den Z zeiger um eins erhöhen,
2. Schauen ob Du schon den letzten Ton hattest, wenn ja noch in der routine Timer stopen
und raus, sonst mit lpm Wert in den Register Tonwert schieben, Timer0 neu laden, und auch Interrupt verlassen.

Nach Tekeli Version kommt unter 2 dann halt Wert einlesen, nach 0 prüfen und dann entsprechend verzweigen.

Ob es schöner ist weiß ich nicht, aber es müßte auch so klappen (habe es nicht ausprobiert) , zum üben natürlich sehr gut geeignet.

Wenn Du,Ihr Lust habt dann könnt Ihr es versuchen.

Ich hoffe, daß ich es gut beschrieben habe, und vor allem, daß es so funktioniert

Gruß Sebastian