Hallo!
Ein Problem mit dem Befehl LPM rd, Z+ auf einem ATtiny26 treibt mich in den Wahnsinn. Offenbar lädt der AVR irgendetwas aus dem Programmspeicher in das Zielregister, nur nicht die Daten, auf die Z zeigt.
--- Beispiel --------------------------------------------------- LDI ZLO, 0x00 LDI ZHI, 0x04
LDI COUNT, 80 bitmappixel: LPM TEMP, Z+ ; (*1) OUT PORTA, TEMP ; ADIW ZLO, 0x01 ; (*2)
DEC COUNT BRNE bitmappixel
----------------------------------------------------------------
Dieses Programm soll in einer Schleife nacheinander 80 Bytes, die im Flash ab 0x200 liegen, an Port A ausgeben. Allerdings erscheinen dort irgendwelche Bytes aus völlig anderen Teilen des Flash-Speichers.
Testweise habe ich den Befehl (*1) mal durch ein LPM rd, Z ersetzt und selbst per ADIW (*2) dafür gesorgt, das Z korrekt hochgezählt wird. Auf diese Weise funktioniert das Programm wie gewünscht. Allerdings verbraucht die Schleife so 2 Takte mehr pro Durchlauf, was bei meinem Projekt nicht tolerierbar ist.
Auf der Suche nach dem Fehler habe ich das Programm mal im AVR Studio simuliert: dort verhält sich LPM rd, Z+ "normal" und zählt Z korrekt hoch.
Ist in diesem Zusammenhang ein Bug des ATtiny26 bekannt? Google brachte nichts sinnvolles, und ich bin mit meinem Latein am Ende. BTW: der µC läuft mit einem externen Quarz bei 16MHz, und mein Programm macht Gebrauch von Timer, Interrupt und Sleep-Mode, falls das irgendwie von Bedeutung ist. Der betreffende Programmteil wird jedoch nicht von Interrupts unterbrochen.
Gruß, Till.