mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik pic assembler aus program memory laden


Autor: tib (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich habe einen Pic18 und arbeite mit C18. Ich habe in C eine Variable im 
ROM definiert und eine im RAM:
rom unsigned char var_1[] = {0x13, 0x22, 0x20};
unsigned char var_2[3];

Mein Assembler code soll nun die Bytes aus var_1 nach var_2 kopieren:
...
extern var_1
extern var_2

code
asm_copy
movff var_1, TBLPTR ; Adresse von var_1 in Tablepointer kopieren
tblrd* ; laden
movff TABLAT, var_2 ; nach var_2 kopieren

return
end

Nur leider funktioniert das so nicht. Was mache ich hier falsch?

Autor: tib (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Es scheint als ob die Adresse von var_1 aus dem Rom nicht richtig 
übergeben wird. Muss man Variablen, die in C im Rom definiert anders im 
Assembler deklarieren als mit extern?

Autor: Chris __ (_chris_)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Soweit ich mich errinnere, mußt du explizit einen const declarieren,
sonst wird das rom ins ram kopiert gleich beim Init.
Theoretisch ist deine declaration gleichwetig mit
static unsigned char var_1[] = {0x13, 0x22, 0x20};

Einfach mal das lst oder map file ansehen, welche Adresse da steht.

Autor: Master Snowman (snowman)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
wenn du C18 verwendest, wieso schreibst du das nicht in C und guckst dir 
den assembler-code an?

Autor: tib (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Muss auch beide Bytes der Adresse in den Tablepointer laden:
movff   HIGH(var_1), W
movwf   TBLPTRH
movff   LOW(var_1), W
movwf   TBLPTRL
tblrd*
movff   TABLAT, W
movwf   var_2

...

return
end

Die Adresse zeigt an die richtige stelle, nur wenn ich wie oben vorgehe, 
steht im Tablepointer eine andere Adresse.

Autor: Dieter Werner (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> movff   HIGH(var_1), W
> movwf   TBLPTRH
> movff   LOW(var_1), W
> movwf   TBLPTRL

Mit movff wird doch der Inhalt einer Speicherzelle angesprochen.


Für die Adresse sollte es imho so aussehen

movlw   HIGH(var_1), W
movwf   TBLPTRH
movlw   LOW(var_1), W
movwf   TBLPTRL

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.