PIC Assembler: Daten im Programmspeicher ablegen

OP #3655236
Lesenswert?

Hallo Zusammen,

ich möchte gerne Daten im Speicher des PIC16F616 ablegen und diese 
später im Programm abrufen. Ich habe diesbezüglich schon zwei Varianten 
ausprobiert:

Tabelle

   IDATA
   db    0xFA
   db    0xFB

oder
  retlw  0xFA
  retlw  0xFB


In beiden Varianten stehen die Werte zwar dann im HEX File aber immer 
gefolgt von einer 0x34. Was hat dieser Wert zu bedeuten?

Vielen Dank,

Ernie
Gast #3655328
Lesenswert?

Es gibt program memory und data memory.Program memory ist wo das program 
abgelegt wird und es ist nicht veränderbar wärend des program läuft.
Deswegen kannst du nur deine daten im EEPPOM oder im Arbeisspeicher 
ablegen, alerdings werden sie im Arbeisspeicher nach dem ausschalten 
gelöscht.
#3655330
Lesenswert?

Sascha T. schrieb:
>
> Ich wollte mir eigentlich im Programm die Adresse berechnen und jetzt
> müsste ich ja den OPCODE berücksichtigen!

Bei Verwendung von RETLW data gibts es nichts zu berücksichtigen.

Bei direkten Zugriff auf den Flashspeicher via PMADRL:PMADRH etc. muss 
auch nichts berechnet werden. Es wird immer der Inhalt der Flashadresse 
in ganzer Breite (je nach PIC 12/14/....Bit) gelesen und in 
PMDATH:PMDATL zurückgegeben. Die Daten stehen dann in PMDATL, der Inhalt 
von PMDATH ist bei den "kleinen" PIC unbrauchbar weil nur 4 bzw. 6 Bit 
physikalisch implementiert sind.
OP #3655364
Lesenswert?

Vielen Dank, ich habe jetzt auch mal viel bei SPRUT gelesen und die 
Tabelle folgendermaßen angelegt:

TABELLE

    addwf PCL,f
    retlw 0x5F
    retlw 0x1F
    retlw 0x5F
    retlw 0x1F
    retlw 0x5F

Jetzt müsste ich doch den Aufruf im Programm folgendermaßen machen:

   movlw   3
   call    TABELLE
   movwf   Temp

Damit würde ich dann den dritten Wert der Tabelle erhalten und Temp 
speichern, oder?
#3655397
Lesenswert?

Nein den 4.
Unmittelbar nach Lesen des Befehls <addwf PCL,f> wird der PC um 1 erhöht 
und zu diesem Wert wird der Inhalt von W addiert. Zählung also wie 
"Üblich" bei 0 beginnend.

Hier noch ein Link wo die ganzen Fallen und deren Umgehung (Page 
boundaries) beschrieben sind, wie auch "berechnete" GOTO und CALL 
Anweisungen.
http://ww1.microchip.com/downloads/en/AppNotes/00556e.pdf
#6168547
Lesenswert?

Zusammenfassung: Daten in (hier: 14-Bit) Flash-Speicher ablegen:
1
 de  "ABCÄÖÜ"        ; legt UTF-8 in die Low-Bytes ab, Nullen in die High-Bytes (wenn Quelltext in UTF-8 vorliegt)
2
 dt  "ABCÄÖÜ"        ; wie oben, aber 0x34 ins High-Byte = retlw
3
;de  L"ABCÄÖÜ"       ; Syntaxfehler
4
 de  0x1234          ; legt 0x0034 ab
5
 da  0x1234          ; legt 0x1234 ab
6
 da  '1','2','3','4' ; legt effektiv UTF-16 ab, aber nicht bei Umlauten!
7
;da  '12'            ; Syntaxfehler
8
;da  L'1',L'2',L'Ä'  ; Syntaxfehler
9
 da  "1","2","3","4" ; Legt jedes Zeichen 7-Bit in den High-Teil ab, also '1'<<7, '2'<<7 usw.
10
 da  "1234"          ; Legt '1'<<7|'2' und '3'<<7|'4' ab
11
 dw  1234            ; legt - wie da - 0x1234 ab
12
 db  0x12,0x34       ; legt 0x12 in das High-Byte(!), 0x34 in das Low-Byte
Leider keine Möglichkeit, UTF-16 (<0x4000) abzulegen! Würde für alle 
Buchstabenschriften reichen.

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