Forum: Mikrocontroller und Digitale Elektronik AVR Assembler: Z-Pointer dekrementieren?!


von Christian (Gast)


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

von ... (Gast)


Lesenswert?

ADIW Z, -1

von ... (Gast)


Lesenswert?

Hm, schade, das mit dem ADIW geht wohl doch nicht.

von Spess53 (Gast)


Lesenswert?

Hi

Wie wäre es mit SBIW

MfG Spess

von Christian (Gast)


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?

von Christian (Gast)


Lesenswert?

und wenn ich NUR SBIW ZL,1 nehme, dann schreibt er mir zwar keine 
fehlermeldung, aber dann zählt er auch nicht runter sondern rauf und das 
noch falsch dazu.

von Sebastian (Gast)


Lesenswert?

ohne jetzt nachgeschaut zu haben: kann man nicht einfach
lpm temp, -Z
schreiben?

Sebastian

von Rene Zimmermann (Gast)


Lesenswert?

Hallo,

bei SBIW muß das Lowregister angegeben werden.

So gehts:

SBIW ZL, 1
lpm
out PORTC, r0

Gruß Rene

von Christian (Gast)


Lesenswert?

nein, es würde
ld temp, -z
funktionieren, aber das liefer irgendwie auch nicht das gewünschte 
ergebnis ;(

von zero_gravity (Gast)


Lesenswert?

bin mir da jetzt auch nich ganz so sicher, aber müsste nich

  subi ZL, 1
  sbci ZH, 0

auf jeden fall funktionieren?!?

lg
zero_gravity :)

von Sebastian (Gast)


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

von Jochen M. (taschenbuch)


Lesenswert?

Hallo,

sbiw zh:zl,1
lpm daten,z

ist auf jeden Fall richtig, das mache ich ständig so. Ist also 
hinreichend getestet und wäre auch ohne Test sonnenklar, weil es klar in 
der Beschreibung des Befehlssatzes steht. Wo ist das Problem?

Jochen Müller

von 6644 (Gast)


Lesenswert?

Das AVR Studio hat doch einen Simulator. Damit sollte man doch mit einer 
endlichen Anzahl Permutationen zum Ziel kommen... ah. Ja. Das AVR 
Instruction manual sollte man auch heruntergeladfen haben.

:-)

von Johannes M. (johnny-m)


Lesenswert?

6644 wrote:
> ah. Ja. Das AVR
> Instruction manual sollte man auch heruntergeladfen haben.
Wozu? Der komplette Inhalt des Instruction Set Manual ist in der Hilfe 
vom AVRStudio enthalten, zum durchklicken... Und F1 ist auch Dein 
Freund.

von Hauke S. (hauke)


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

von Christian (Gast)


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...

von 6644 (Gast)


Lesenswert?

Dann denke ich waere es an der Zeit dem AVR-AS bye-bye zu sagen. Nimm 
das AVR Studio, kostet nichts. Der Download ist allerdings etwas 
umstandlich, mit den Servicepacks.

von Hannes L. (hannes)


Lesenswert?

Kann es sein, dass Du die Portdefinitionen nicht eingwbunden hast?

.inc "m16def.inc"

...

von Christian (Gast)


Lesenswert?

nein, die habe ich eingebunden. wie gesagt, das programm funktioniert 
beim hochzählen mittels inrementieren des z-pointers wunderbar, nur das 
runterzählen funktioniert nicht...

von Michael U. (amiga)


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

von Peter D. (peda)


Lesenswert?

Christian wrote:
> ich benutze den AVR-AS.

Und warum sagst Du das nicht gleich?

Hier kann keiner hellsehen.

Wenn Du nichts angibst, wird natürlich davon ausgegangen, daß Du den 
AVRASSEMBLER2 von Atmel benutzt.

Dein Assembler scheint also nicht kompatibel zu sein.


Peter

von Christian (Gast)


Lesenswert?

nicht kompatibel womit?

sorry, ich wusste nicht, dass es da so große unterschiede gibt...

von Michael U. (amiga)


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

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.