mikrocontroller.net

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


Autor: Christian (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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
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

Autor: ... (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ADIW Z, -1

Autor: ... (Gast)
Datum:

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

Autor: Spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

Wie wäre es mit SBIW

MfG Spess

Autor: Christian (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
mit SBIW habe ich es schon ausprobiert, also zb.:
SBIW ZH:ZL, 1
lpm temp, Z
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?

Autor: Christian (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Sebastian (Gast)
Datum:

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

Sebastian

Autor: Rene Zimmermann (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

bei SBIW muß das Lowregister angegeben werden.

So gehts:

SBIW ZL, 1
lpm
out PORTC, r0

Gruß Rene

Autor: Christian (Gast)
Datum:

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

Autor: zero_gravity (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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 :)

Autor: Sebastian (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Jochen Müller (taschenbuch)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: 6644 (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

:-)

Autor: Johannes M. (johnny-m)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Hauke Sattler (hauke)
Datum:

Bewertung
0 lesenswert
nicht 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:
sbiw r31:r30,1
oder mit
.equ zh=r31
.equ zl=r30

evt hilft das.

cu
Hauke

Autor: Christian (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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...

Autor: 6644 (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Hannes Lux (hannes)
Datum:

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

.inc "m16def.inc"

...

Autor: Christian (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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...

Autor: Michael U. (amiga)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Christian (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
nicht kompatibel womit?

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

Autor: Michael U. (amiga)
Datum:

Bewertung
0 lesenswert
nicht 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

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.