Hallo zusammen, ich möchte Daten im nicht-flüchtigen Teil des o.g. Prozessors speichern und auch beim Brennen hier ablegen. Dies brauche ich um Einstellungswerte festhalten zu können, die nach einem Neustart des Prozessors wieder abgefragt werden können. Dabei verwende ich einen Sprut-Brenner und den Compiler CC5X. Ich fürchte ich habe es sogar schon mal gemacht - aber leider nicht richtig dokumentiert. Soweit ich weiß gibt es ein paar Bytes, die ohne Probleme hierfür genutzt werden können, ohne große Speicher-Prozeduren. Aber ich weiß nicht mehr wie ich es angestellt habe und werde nicht mehr aus dem Datenblatt schlau. Vielleicht hat ja jemand eine Lösung parat - würde mich sehr freun. Viele Grüße Olaf
Es gibt dort nur den großen Flash-Speicher, an dem Du Dir ein Plätzchen für Deine Daten auswählen kannst, z.B. ganz am Ende. Wirklich zu bevorzugende Adressen gibt es nicht, aber falls Du während der Laufzeit schreiben möchtest, solltest Du aufpassen, dass die Adresse außerhalb der konfigurierten self-write protection liegt.
Wenn du die Daten nur beim Start brauchst und nicht verändern willst kannst du es einfach so machen.
1 | molw 0x?? ;1. Konstante |
2 | movwf konstante1 |
3 | molw 0x?? ;2. Konstante |
4 | movwf konstante2 |
5 | ... |
Wenn du sie auch im Programm verändern willst findest du im Kapitel 11.0 FLASH PROGRAM MEMORY CONTROL wie du Daten aus dem Flash lesen und schreiben kannst. Auf dieser Seite wird das lesen/schreiben in den Flash/EEPROM behandelt: http://www.sprut.de/electronic/pic/grund/eeprom.htm Und EEPROM hat dein PIC keines. Edit: Ich sehe erst jetzt, dass du C verwendest, ich habe Sprut gelesen und automatisch an ASM gedacht. Spricht was dagegen es einfach so zu machen:
1 | int konstante1=1234, konstante2=4567, ...; |
:
Bearbeitet durch User
gruser schrieb: >> Ich fürchte ich habe es sogar schon mal gemacht - aber leider nicht > richtig dokumentiert. Soweit ich weiß gibt es ein paar Bytes, die ohne > Probleme hierfür genutzt werden können, ohne große Speicher-Prozeduren. Ein paar Bytes???? Also wenn es nicht mehr als 4 Bytes wären, dann kannst du die im "User-ID-Bereich" ablegen, bei den PIC16F151x ist das der Bereich 0x8000...0x8003. Ist genauso wie der normale Flashbereich über TBLRD und TBLWRT zugänglich.
Hi, in der XC18 Peripheral library gibt es Flash Funktionen - PIC18_plib.pdf im dokumente Ordner des Compilers: ReadFlash(), EraseFlash()... Ist nicht für PIC16 sonder PIC18, aber probieren kann man es mal. Eventuell kannst du wenigstens abkucken wie es dort gemacht wird Ansonsten noch in der Hilfe für den Compiler nach folgendem suchen: EPROM_READ(address) und ähliche sollen für viele 8Bitter gehen. Zuletzt gibt es noch eine Appnote für eine Bootloader, da könnte man auch mal reinschauen: http://ww1.microchip.com/downloads/en/AppNotes/01310a.pdf Noch wichtig: Flash kann man nur pageweise löschen, daher beim löschen etwas aufpassen. Am besten eine ganze Page im Linker ausnehmen (die letzte ist am einfachsten), damit da kein Programmcode oder gar Config bits drinnen stehen.
Chris B. schrieb: > Ist genauso wie der normale Flashbereich über TBLRD und TBLWRT > zugänglich. Nicht beim PIC16. Die Befhle TBLRD und TBLWRT hat von den 8bittern nur der PIC18. Humpfdidumpf schrieb: > Ist nicht für PIC16 sonder PIC18 Dann wird sie vermutlich mit TBLRD und TBLWRT und diese Befehle gibt es beim PIC16 nicht. Geht es nur mit so, oder habt ihr auch nicht genau verstanden was der TO genau vor hat? Wenn die Konstanten nur beim Flashen geändert werden sollten könnte er auch ein einfaches #define verwenden. Wenn du die Werte auch mit dem PIC Programm ändern willst geht das so: Siehe Anhang (Auszug aus dem Datenblatt S. 100 und 105). Wie du die Konstante beim Flashen in eine Adresse schreibst weiß ich nur in ASM:
1 | ORG 0x1800 ; Beispiel für die Adresse |
2 | DA 0x35AD ; Zahl 1 (0x35AD) wird in der Adresse 0x1800 abgelegt |
3 | DA 0x125F ; Zahl 2 (0x125F) wird in der Adresse 0x1801 abgelegt |
:
Bearbeitet durch User
Stimmt, beim PIC16 geht es nur etwas umständlicher. Was der TE genau vor hat??? Keine Ahnung. "......Soweit ich weiß gibt es ein paar Bytes, die ohne Probleme hierfür genutzt werden können, ohne große Speicher-Prozeduren...." Ein "paar Bytes" ohne auf die Belegung des Programm-Flash achten zu müssen und ohne Linkerscript Anpassungen, sind eben nur die "paar Bytes" der User-ID. Dort kann er auch beim Flashen schon was ablegen.
Humpfdidumpf schrieb: > in der XC18 Peripheral library Einen XC18 gibt es nicht. Es gibt den C18 (nur für PIC18) und den XC8 (für alle 8bit PICs). Welchen meinst du?
Eine absolut zuverlässige und recht preiswerte Methode findest Du hier: http://www.microchip.com/pagehandler/en-us/products/memory/serialEEPROM/home.html
R2D2 schrieb: > Eine absolut zuverlässige und recht preiswerte Methode findest Du hier: > > http://www.microchip.com/pagehandler/en-us/products/memory/serialEEPROM/home.html Um das Problem hardwaremäßig zu vereinfachen, könnte man auch einen PIC mit integriertem EEPROM verwenden.
Max H. schrieb: > Um das Problem hardwaremäßig zu vereinfachen, könnte man auch einen PIC > mit integriertem EEPROM verwenden. Das klappt aber nur, wenn Du beim Programmieren die internen EEPROM-Daten nicht aus Versehen überschreibst.
Marcus schrieb: > Es gibt dort nur den großen Flash-Speicher, an dem Du Dir ein Plätzchen > für Deine Daten auswählen kannst, z.B. ganz am Ende. Wirklich zu > bevorzugende Adressen gibt es nicht, aber falls Du während der Laufzeit > schreiben möchtest, solltest Du aufpassen, dass die Adresse außerhalb > der konfigurierten self-write protection liegt. Würdest du 100k garantierte Schreibzyklen (die letzten 128 Byte des Flash 0x1f80..0x1fff, siehe DS40001452D, S.17) nicht 10k Schreibzyklen vorziehen? ;) Der Tipp mit der Self-Write-Protection ist natürlich trotzdem richtig.
Humpfdidumpf schrieb: > Noch wichtig: Flash kann man nur pageweise löschen, daher beim löschen > etwas aufpassen. Nicht Page- sondern Reihenweise. Eine Reihe ist dabei 32 Byte lang. > Am besten eine ganze Page im Linker ausnehmen (die letzte ist am > einfachsten), damit da kein Programmcode oder gar Config bits drinnen > stehen. Die Configuration Bits haben eine absolute Adresse und werden nicht vom Linker irgendwo hin platziert.
gruser schrieb: > beim Brennen hier ablegen. Das wird mit dem SPI/I2C EEPROM kompliziert. Abgesehen vom Preis (30ct. laut Microchip param. Suchen) und der Anzahl de ADC-Kanäle (28 vs. 14) hätte der PIC16F1937 nur vorteile (z.B. internes 256byte EEPROM) gegenüber dem PIC16F1517
:
Bearbeitet durch User
Meister Eder schrieb: > die letzten 128 Byte > Eine Reihe ist dabei 32 Byte lang. Entschuldigung, ich meine natürlich 14-Bit Speicherworte, nicht Byte. Allerdings können die FSRx Zeiger nur die 8 lsb adressieren (zum lesen, schreiben sowieso nicht). Wenn man den vollen Bereich nutzen möchte, geht das nur über die PM-Register (PMCONx,PMDAT,PMADR) und entsprechender Schreib/Lese-Prozedur.
Jetzt fällt mir ein. Ich habe mal auf einem PIC12 (in ASM) eine 10bit Lookup Table in Flash erstellt. Das auslesen war einfach. Verändert habe ich sie nur beim Flashen mit dem Programmer. Falls du mit dem Code was anfangen kannst:
1 | LUT_10bit: |
2 | BANKSEL PMADRL |
3 | |
4 | MOVWF PMADRL |
5 | MOVLW high 0x300 |
6 | MOVWF PMADRH |
7 | |
8 | BCF PMCON1,CFGS ;Do not select Configuration Space |
9 | BSF PMCON1,RD ;Initiate read |
10 | NOP ;Ignored |
11 | NOP ;Ignored |
12 | |
13 | movf PMDATL,w |
14 | movwf PWM_h |
15 | movf PMDATH,w |
16 | movwf PWM_l |
17 | |
18 | return |
In C könnte das ungefähr so aussehen:
1 | unsigned int read(unsigned int address) |
2 | {
|
3 | unsigned int data; |
4 | PMADRL=address&0xFF; |
5 | PMADRH=(address>>8)&0xFF; |
6 | |
7 | PMCON1bits.CFGS=0; |
8 | PMCON1bits.RD=1; |
9 | Nop(); |
10 | Nop(); |
11 | |
12 | data=PMDATH; |
13 | data=(data<<8)|PMDATL; |
14 | return data; |
15 | }
|
Jetzt brauchst du nur noch eine Funktion fürs Schreiben, wenn du die Werte ändern willst.
Chris B. schrieb: > Ein "paar Bytes" ohne auf die Belegung des Programm-Flash achten zu > müssen und ohne Linkerscript Anpassungen, sind eben nur die "paar > Bytes" der User-ID. Dort kann er auch beim Flashen schon was ablegen. Ein paar Bytes würden mir reichen. Wie kann ich es denn anstellen, dass ich die Werte für meine "Grundeinstellungen" bzw. ersten Werte beim Brennen hinterlegen kann?
Willst du die Werte eigentlich vom Programm ändern lassen? gruser schrieb: > Wie kann ich es denn anstellen, dass > ich die Werte für meine "Grundeinstellungen" bzw. ersten Werte beim > Brennen hinterlegen kann? In ASM geht das so, wenn du keine lösung in C findest, kannst du ja immer noch inline asm verwenden. > ORG 0x1800 ; Beispiel für die Adresse > DA 0x35AD ; Zahl 1 (0x35AD) wird in der Adresse 0x1800 abgelegt > DA 0x125F ; Zahl 2 (0x125F) wird in der Adresse 0x1801 abgelegt
:
Bearbeitet durch User
Vielleicht noch kurz zum Hintergrund: Ich habe ein Display angeschlossen und möchte darüber den Anwender Einstellungen auswählen lassen. Beim allerersten Start z.B. soll die Bedienoberfläche in Deutsch sein, der User kann aber eine andere Sprache auswählen. Nach einem Reset soll der IC dann mit der ausgewählten Sprache wieder starten. Insofern muss ich nur ein paar Flags brennen bzw. permanent speichern können. In den Beiträgen waren ja einige Anregungen dabei - ich übe mal ein wenig und melde mich noch mal. Vielen Dank auf jeden Fall jetzt schon einmal für die super Unterstützung!
gruser schrieb: > Insofern muss ich nur ein paar Flags brennen bzw. permanent speichern > können. Du musst die Daten also im Programm ändern können. Dann denke ich ist die einfachste Lösung einen PIC zu suchen, der ein EEPROM hat. In MPLAB IDE kannst du unter View --> EEPOM/Programm Memory nach dem Compilern die Daten, die dann beim Programmieren in den Flash und ins EEPROM geschrieben werden, ansehen und ändern. Hier findest du wie du Daten über den Quellcode in den Flash (S.29) und EEPROM (S.99) schreiben kannst: http://www.bknd.com/doc/cc5x-34.pdf
:
Bearbeitet durch User
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.