AVR Assembler: Z-Pointer dekrementieren?!

Gast #826558
Lesenswert?

Hallo, ich arbeite auf einem atmega16-board und möchte einen Zähler (von 
0-9) programmieren, der, solange Switch1 auf ON geschaltet ist, 
hochzählen soll, und wenn man sw1 auf OFF stellt, dann soll er 
runterzählen (und anzeige auf der 7-Segment-Anzeige).
Ich habe meine Bitmuster für die Zahlen als Array abgespeichert und 
greife über den z-Pointer darauf zu. Das Hochzählen klappt schon ohne 
Probleme, das mache ich einach mit
1
lpm temp, z+
, jedoch bereitet mir das Runterzählen, also das Dekrementieren des 
z-Pointers, mehr Probleme.

Hat jemand eine Idee oder einen Tipp für mich, wie ich das am besten 
Lösen könnte?

Vielen Dank, LG aus Salzburg
Christian
Gast #826567
Lesenswert?

mit SBIW habe ich es schon ausprobiert, also zb.:
1
SBIW ZH:ZL, 1
2
lpm temp, Z
3
out PORTC, temp

so stehts jedenfalls auch in meiner AVR-instruction... jedoch bekomme 
ich hier immer die Fehlermeldung: "register r24, r26, r28 or r30 
required". Mache ich etwas falsch?
Gast #826575
Lesenswert?

Ok, -Z geht mit lpm tatsächlich nicht.
ld bringt dir nichts, da du aus dem Programmspeicher laden willst und 
nicht (wie es ld tut) aus dem SRAM.

laut Hilfe sollte das hier funktionieren:

sbiw ZH:ZL, 1
lpm temp1, Z

hab ich so auch ohne Fehlermeldung für einen Mega64 assembliert.

Wenn garnichts mehr hilft kannst du ja eine Arbeitskopie der Bitmuster 
im SRAM ablegen. Zumindest wenn du noch genug platz hast.

Sebastian
#826656
Lesenswert?

Da du nicht geschrieben hast, welchen "Compiler" bzw. welche Version du 
nimmst vermute ich, das dein Assembler evt die Pointerregister nicht 
erkennt oder nicht alle 16 Bit Befehle kennt. Ich hatte mal einen 
Assembler der movw nicht erkannte.
Probiere es deshalb mal entweder mit:
1
sbiw r31:r30,1
oder mit
1
.equ zh=r31
2
.equ zl=r30

evt hilft das.

cu
Hauke
Gast #826732
Lesenswert?

ich weiß, laut meinem instruction manual sollte das so gehen, aber egal 
ob ich
sbiw r31:r30, 1 oder
sbiw ZH:ZL, 1 schreibe, ich bekomme dann immer die fehlermeldung: 
"register r24, r26, r28 or r30 required". ich benutze den AVR-AS. ich 
bin schon am verzweifeln, das hochzählen funktioniert ohne probleme...
#826767
Lesenswert?

Hallo,

naja, dann gib es ihm doch...

teste eben mit sbiw r30,1
wenn das geht (sollte es ja nach der Meldung) schau in den includes des 
mega16 nach, wie das definiert ist.
In den Original-Atmel-Files ist r30 mit ZL definiert, also sollte
sbiw ZL,1 gehen.

Was mich gerade verwirrt:
der AVR-Studio ASM schluckt auch sbiw Z,1, benutze ich auch immer.
Nur: wo ist eigentlich Z definiert??? Im m16def.inc habe ich nicht 
gesehen oder nur Tomaten auf den Augen?

Gruß aus Berlin
Michael
#826950
Lesenswert?

Hallo,

nicht 100% kompatibel mit den Vorgaben von Atmel.
Ein CPU-Hersteller beschreibt normalerweise  den Befehlssatz und die 
Mnemotik der Befehle, also das Substract Immediate Word mit sbiw 
abgekürzt wird.

Daran halten sich auch die Programmierer eines Assemblers.
Bei den Parametern ist die Freiheit da schon größer.
sbiw r30,1 sollte er verstehen.
sbiw ZL,1 schon nur noch, wenn er eine passende Definition dazu hat.
Der Programmierer kann sich da an die Includes von Atmel für die jeweile 
CPU halten, genaugenommen muß er das aber nicht.
Spätestens bei den Assembler-Direktiven (das sind Anweisungen an den 
Assembler, wie er zu übersetzen hat, z.B.
.org, .prog, .data, .equ, .db, .dw usw. usw. kann jeder machen, was er 
will.
Wird er normalerweise nicht, weil sich ein Quellcode von einem anderen 
Assembler dann nur mit großen Änderungen übersetzen lassen wird.
Ist aber manchmal trotzdem so, dann bleibt nur Beschreibung des 
Assemblers lesen und ändern oder den vom Programmierer des Quellcodes 
benutzten Assembler nehmen, wenn das geht.
Da AVR-Studio frei ist, benutzt die Mehrheit wohl den dort 
mitgelieferten Assembler.
Mir ist aus alten zeiten noch avra in Erinnerung, kommt aus der 
Linux-Welt und war damals komfortabler als der Atmel-ASM.

Gruß aus Berlin
Michael

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren