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
|
Forum: Compiler & IDEs String aus ROM lesen mit GNU Assembler für ATmega8Hallo ich habe einen String im Flash mit folgender Anweisung assembliert:
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 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 ... Flo schrieb:
> ldi ZH, High(temp *2) ;Byteadresse
Warum muss man denn hier temp * 2 rechnen? warum nicht einfach nur
(temp) ?
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 :-) 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 ich kenns halt mit dem AVR-Studio als temp: .db "Temperatur" also mit define byte(s) anstatt des .ascii So funktionierts bei mir. 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 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 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. 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
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".
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.
|
|