pic assembler aus program memory laden

Gast #1808382
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?
#1808476
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.
Gast #1808496
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.
Gast #1808565
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

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren