Forum: Mikrocontroller und Digitale Elektronik PIC Assembler: Daten im Programmspeicher ablegen


von Sascha T. (ernie1973)


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

von Chris B. (dekatz)


Lesenswert?

Das ist der Opcode für RETLW.

von Sascha T. (ernie1973)


Lesenswert?

OK, vielen Dank! Kann ich die Daten denn auch einfach so nacheinander in 
den Programmspeicher laden und nachher indirekt herauslesen.

Ich wollte mir eigentlich im Programm die Adresse berechnen und jetzt 
müsste ich ja den OPCODE berücksichtigen!

von Fachmann (Gast)


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.

von Chris B. (dekatz)


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.

von (prx) A. K. (prx)


Lesenswert?

Sascha T. schrieb:
> OK, vielen Dank! Kann ich die Daten denn auch einfach so nacheinander in
> den Programmspeicher laden und nachher indirekt herauslesen.

Wobei die kleineren PICs traditionell nicht wirklich indirekt aus dem 
Programmspeicher auslesen, sondern indirekt dort hin springen und dort 
einen RETLW-Befehl mit dem entsprechenden Byte darin steht.

: Bearbeitet durch User
von Max H. (hartl192)


Lesenswert?

Mit DA kannst du deine Daten in ein gesamtes Wort legen.
http://www.sprut.de/electronic/pic/assemble/pseudo.html#da

: Bearbeitet durch User
von Sascha T. (ernie1973)


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?

von Chris B. (dekatz)


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

von Max H. (hartl192)


Lesenswert?

Die neueren PIC12/16 (Enhanced Mid-Range) haben einen BRW Befehl, mit 
dem Funktioniert das mit dem RETLW auch über die Page-Grenzen.
1
BRW             ;Add Index in W to program counter to select data
2
RETLW DATA0     ;Index0 data
3
RETLW DATA1     ;Index1 data
4
RETLW DATA2
5
RETLW DATA3

: Bearbeitet durch User
von Sascha T. (ernie1973)


Lesenswert?

Stimmt natürlich mit der Berechnung! Vielen Dank und es funktioniert 
auch wunderbar.

Gibt es denn noch eine "bessere" Methode die Daten abzulegen und 
abzurufen?

von (prx) A. K. (prx)


Lesenswert?

Sascha T. schrieb:
> Gibt es denn noch eine "bessere" Methode die Daten abzulegen und
> abzurufen?

Bei den PIC18 kann der Programmspeicher mit TBLRD indirekt gelesen 
werden, ohne auf oben beschriebene RETLW-Methode zurückgreifen zu 
müssen.

Die "Enhanced Mid-Range" PIC16 können indirekt über die FSR Register auf 
den Programmspeicher zugreifen.

: Bearbeitet durch User
von Henrik H. (henrik_h)


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.

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.