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:
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
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?
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
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
unsignedintread(unsignedintaddress)
2
{
3
unsignedintdata;
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
returndata;
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
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