Forum: Compiler & IDEs String aus ROM lesen mit GNU Assembler für ATmega8


von Hue \. (hue)


Lesenswert?

Hallo

ich habe einen String im Flash mit folgender Anweisung assembliert:
1
temp:      .ascii    "Temperatur"
Nun möchte ich ihn zeichenweise in ein Register laden bis zum Ende.

Wie kann ich auf diesen String zugreifen?

Vielen Dank für Eure Mühe.


HUE

von Flo (Gast)


Lesenswert?

ldi ZH, High(temp *2)   ;Byteadresse
ldi ZL, Low(temp*2)
lesen:
lpm r0, Z+              ;in register r0 einlesen
                ;tu irgendwas damit
                ;allerdings sollte der wert noch erhalten bleiben, da er
                ;noch abgefragt wird
tst r0
brne lesen              ;wenn nicht null-Byte, widerholen

...

von Ch D. (chrisu) Benutzerseite


Lesenswert?

Flo schrieb:
> ldi ZH, High(temp *2)   ;Byteadresse

Warum muss man denn hier temp  * 2 rechnen? warum nicht einfach nur 
(temp) ?

von Flo (Gast)


Lesenswert?

Für AVR oder?

ein AVR hat 16bit breite Befehle, also ist der Flash 16 bit breit 
organisiert.
Um jetzt auf einzelne Bytes im Flash zuzugreifen, erwartet der Befehl 
lpm (load program memory) eine Byteadresse statt einer Wortadresse.
Also Adresse mal 2.
Hoffe es war verständlich :-)

von Hue \. (hue)


Lesenswert?

Hallo,

vielen Dank für die schnelle Antwort, doch die Konvertierung von temp in 
eine Byteadresse funktioniert nicht mit avr-as (GNU Assembler). Sonst 
ist die Idee nicht schlecht.

Hat jemand noch einen Tip für die Umwandlung in eine Byteadresse?

Vielen Dank für Eure Mühen.

HUE

von Flo (Gast)


Lesenswert?

ich kenns halt mit dem AVR-Studio als

temp:
.db "Temperatur"

also mit define byte(s) anstatt des .ascii
So funktionierts bei mir.

von Harald M. (mare_crisium)


Lesenswert?

FLO,

mit

lpm r0,z+

wird zh:zl aber nur um eins incrementiert. Der nächste Character steht 
aber bei z+2. Deshalb mein Vorschlag:

ldi ZH, High(temp *2)   ;Byteadresse
ldi ZL, Low(temp*2)
lesen:
  lpm r0,z+
  adiw zh:zl,0x0001
  tst r0
  brne lesen

Was hältst Du davon?

mare_crisium

von Hue \. (hue)


Lesenswert?

Hallo,

ich komme mit den obigen Beispielen nicht weiter, da die Multiplikation 
von temp mit 2 der Assembler ablehnt. Hat jemand für den GNU avr-as noch 
eine Idee?

MfG

HUE

von Karl H. (kbuchegg)


Lesenswert?

Ich frage mich warum du überhaupt avr-as benutzt und nicht den von Atmel 
zur Verfügung gestellten Assembler.
Stringverarbeitung ist auch in C nichts weltbewegend kompliziertes, 
sodass es auch aus dieser Sicht wenig Sinn macht, eine C-Funktion durch 
eine Assembler Funktion zu ersetzen.

von Hue \. (hue)


Lesenswert?

Hallo,

ich habe folgende Situation:

Mit den Ports vom ATmega8 steuere ich einen Nadeldrucker an um Werte 
auszugeben. Damit ich nicht jedes einzelne Zeichen nacheinander in ein 
Register lade und dann ausgebe, wollte ich die Strings wie "Temperatur" 
oder "Speicher" im FLASH ablegen und dann mittels hochzählenden Adressen 
auslesen und dann an den Drucker senden.

Die ursprüngliche Version klappt problemlos, doch die oben angeführten 
Beispiele sind nicht GNU avr-as kompatibel.

Es muß doch eine ähnliche Lösung für den GNU Assembler gehen, oder?

MfG

HUE

von Stefan E. (sternst)


Lesenswert?

1
temp:      .ascii    "Temperatur"
Hier musst du an zwei Dinge denken:
1) keine "automatische" Null-Terminierung des Strings
2) an das Alignen, denn der avr-as arbeitet Byte-orientiert(*)

Wegen (*) brauchst du auch kein "*2".
1
#define ZL  r30
2
#define ZH  r31
3
...
4
ldi ZL, lo8(temp)
5
ldi ZH, hi8(temp)

von Hue \. (hue)


Lesenswert?

Hallo,


vieeeeeeeelen Dank für Eure Hilfe. Es hat endlich geklappt, ich freue 
mich sehr.

Einen schönen Abend noch...

MfG

HUE

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.