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
Das ist der Opcode für RETLW.
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!
Gast
#3655328
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.
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.
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.
Mit DA kannst du deine Daten in ein gesamtes Wort legen. http://www.sprut.de/electronic/pic/assemble/pseudo.html#da
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?
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
Die neueren PIC12/16 (Enhanced Mid-Range) haben einen BRW Befehl, mit dem Funktioniert das mit dem RETLW auch über die Page-Grenzen.
1 | |
2 | |
3 | |
4 | |
5 | |
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?
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.
Zusammenfassung: Daten in (hier: 14-Bit) Flash-Speicher ablegen:
1 | |
2 | |
3 | |
4 | |
5 | |
6 | |
7 | |
8 | |
9 | |
10 | |
11 | |
12 | |
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.