T
Till Wollenberg
Guest
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.
--
e-mail: wollenberg (at) web (punkt) de
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.
--
e-mail: wollenberg (at) web (punkt) de