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
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!
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.
:
Bearbeitet durch User
Mit DA kannst du deine Daten in ein gesamtes Wort legen. http://www.sprut.de/electronic/pic/assemble/pseudo.html#da
:
Bearbeitet durch User
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 | 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
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.
:
Bearbeitet durch User
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.