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


von tib (Gast)


Lesenswert?

Hallo,

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

Mein Assembler code soll nun die Bytes aus var_1 nach var_2 kopieren:
1
...
2
extern var_1
3
extern var_2
4
5
code
6
asm_copy
7
movff var_1, TBLPTR ; Adresse von var_1 in Tablepointer kopieren
8
tblrd* ; laden
9
movff TABLAT, var_2 ; nach var_2 kopieren
10
11
return
12
end

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

von tib (Gast)


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?

von Chris _. (_chris_)


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.

von Master S. (snowman)


Lesenswert?

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

von tib (Gast)


Lesenswert?

Muss auch beide Bytes der Adresse in den Tablepointer laden:
1
movff   HIGH(var_1), W
2
movwf   TBLPTRH
3
movff   LOW(var_1), W
4
movwf   TBLPTRL
5
tblrd*
6
movff   TABLAT, W
7
movwf   var_2
8
9
...
10
11
return
12
end

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

von Dieter Werner (Gast)


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

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.