www.mikrocontroller.net

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


Autor: Hue \a (hue)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo

ich habe einen String im Flash mit folgender Anweisung assembliert:

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

Autor: Flo (Gast)
Datum:

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

...

Autor: Ch D. (chrisu) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Flo schrieb:
> ldi ZH, High(temp *2)   ;Byteadresse

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

Autor: Flo (Gast)
Datum:

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

Autor: Hue \a (hue)
Datum:

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

Autor: Flo (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ich kenns halt mit dem AVR-Studio als

temp:
.db "Temperatur"

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

Autor: Harald M. (mare_crisium)
Datum:

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

Autor: Hue \a (hue)
Datum:

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

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

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

Autor: Hue \a (hue)
Datum:

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

Autor: Stefan Ernst (sternst)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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".
#define ZL  r30
#define ZH  r31
...
ldi ZL, lo8(temp)
ldi ZH, hi8(temp)

Autor: Hue \a (hue)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,


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

Einen schönen Abend noch...

MfG

HUE

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.