LPM liest immer nur 0xFF

Gast #320873
Lesenswert?
• ▲
▼
Hallo.
Bin gerade angefangen was mit yP zu machen...
habe jetz was geschrieben im AVR Studio 3.56. Eigentlich klappt alles
bis auf die Sache mit LPM.
Also. Ich wandle zuerst eine 10bit Binär Zahl in Dezimal um. Die
Routine dafür habe ich auch aus diesem Forum.

...
ldi decH, high(10000)
  ldi decL,  low(10000)
  rcall bin2digit
  ldi decH, high(1000)
  ldi decL,  low(1000)
  rcall bin2digit
... usw
kommt dem einen oder andern sicher bekannt vor.

So. jetz zu meinem Problem. Ich will die Werte die diese Routine
berechnet im SRAM speichern. Dazu mach ich folgendes

st Z+, digit   ;wobei in digit die jeweilige Dezimalziffer steht
Z hab ich vorher initialiesiert mit
ldi ZH, HIGH(0x60*2)
ldi ZL, LOW(0x60*2)    mal 2 wegen "ist einfach so"

im Simulator schreibt er auch brav nacheinander ab (0x60*2)=0x00C0 bis
0x00C3 den Wert von digit. In meinem Fall steht im Memory-Fenster das
hier:
0x00C0 01 00 02 01 00 00 00...usw

Dann will ich die Werte wieder lesen mit LPM. Und zwar so

ldi ZH, HIGH(0x60)
ldi ZL, LOW(0x60)
lpm
mov r16, r0
adiw ZL, 1
...
aber im Register-Fenster sieht man wie zuerst R0 auf 0x01 gesetzt wird
und danach auch r16 auf 0x01 geht. Auch Z-Register wird schön um 1
erhöht. Soweit so gut. Beim nächsten LPM steht aber 0xD0 in R0, danach
0x08. Also irgendwelche(?) Werte.
Was mach ich falsch???

Habe auch schon mal anstelle 0x60 überall 0x0060 geschrieben. auch
einfach mal mit (0x60*2) initialisieren probiert. immer das gleiche.
Nur die Werte ändern sich. zum beispiel 0xFF anstatt 0x01
Gast #320884
Lesenswert?
• ▲
▼
naja - von Compilern redet hier eigentlich keiner. Hier gehts um reine
Assembler-Programmiererei. Und wenn ich einen Compiler verwende, halte
zumindest ich mich völlig aus den absoluten Adressen heraus - soll sie
doch der Compiler die Variablen oder Konstanten hinlegen, wo er will.
Hauptsache, die Zuordnung ist eindeutig und fehlerfrei. Und das kann er
besser als ich.
Gast #320885
Lesenswert?
• ▲
▼
Jo. Danke ers mal für die ganzen Antworten. Hab also anscheinend den
falschen Befehl benutzt.
Werd ich zuhause mal testen.
Ich hab ers mal alles im Simulator gemacht und mit ner ATMega8 .inc
datei. Noch nix davon in die Praxis umgesetzt.
Gast #320886
Lesenswert?
• ▲
▼
LPM liest FLASH

LDS liest RAM (direkt)
STS schreibt RAM (direkt)
LD liest RAM (über Pointer)
ST schreibt RAM (über Pointer)

Die RAM Adresse wird immer direkt angegeben und nicht mit 2
multipliziert.

ATMEL hat ein schönes und ausführliches Dokument auf der Website,
welches die AVR-Instruktionen super übersichtlich erklärt.
#320889
Lesenswert?
• ▲
▼
>>>
Der Anfang des RAMs ist nicht zwingend die beste Wahl, wenn es daurum
geht dem Stack nicht in die Quere zu kommen.Es gibt nämlich auch
Compiler, die den Stack am Anfang des RAMs anlegen
<<<

Das ist dummpfsinn, sorry.

Der Stack expandiert auf Grund der Hardwaregegebenheiten auf dem AVR
und eigentlich auf allen CPUs die ich kenne von der höchsten
Speicherstelle zur niedrigeren, deswegen nennt man es ja auch Stack.

Da ändert ein Compiler nichts dran, und auch kein Assembler, es sei
denn man möchte ins Regfile schreiben.

Gruß Hagen

Antwort schreiben

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.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.