Archiv verlassen und diese Seite im Standarddesign anzeigen : PIC12F157x 128 byte non volatile data storage
Einen schönen guten Morgen,
ich bin auf der Suche nach den "speziellen" 128 Bytes...
Laut Datenblatt hat der Chip PIC12F1571/72 einen separaten 128 Byte grossen Flash Bereich:
----------------------------
3.0 MEMORY ORGANIZATION
High-Endurance Flash Data Memory (HEF)
-128 Bytes nonvolatile data storage
High-Endurance Flash:
This device has a 128-byte section of high-endurance
Program Flash Memory (PFM) in lieu of data
EEPROM. This area is especially well-suited for nonvolatile
data storage that is expected to be updated
frequently over the life of the end product.
----------------------------
aber wo im Speicher befindet er sich ? ich kann da leider nichts finden im Datenblatt,
oder habe ich etwas flasch verstanden ?
Wie der normale Flash zu programmieren ist, leuchte mir ein, hab ich schon öfters gemacht...
wobei im Datenblatt DS40001723D auf Seite 95 das Flussdiagramm für ERASE... falsch ist. Dort fehlt das Setzen des WR Bits :wink:
Siro
Hallo!
Das folgend Zitierte habe ich nur schnell im Datenblatt (DB) auf 15. Seite gefunden:
"3.2
High-Endurance Flash
This device has a 128-byte section of high-endurance Program Flash Memory (PFM) in lieu of data EEPROM. This area is especially well-suited for non-volatile data storage that is expected to be updated frequently over the life of the end product. See Section 10.2 “Flash Program Memory Overview” for more information on writing data to PFM. See Section 3.2.1.2 “Indirect Read with FSR” for more information about using the FSR registers to read byte data stored in PFM."
So wie ich das verstanden habe, hat der o.g. PIC "flash" als "EEPROM". ;)
Hallo PICture, genau so habe ich es auch verstanden, aber wo liegt dieser spezielle Bereich, wenn es ihn dann gibt im Flashspeicher ?
Wenn es der "normale" Flash Programmspeicher wäre, dann bräuchte man den ja nicht extra erwähnen. Zudem soll das ja ein Bereich
mit 128 Bytes sein. Die "ROWs" im Flash sind jeweils 16 Words (14 Bit breit) die ich als Block löschen und wieder beschreiben kann.
Siro
"3.2
High-Endurance Flash
This device has a 128-byte ....
Und gleich darunter ist die Tabelle 3.1 da stehen die Adressen. Es sind immer die letzten 128 Speicheradressen im Flash und davon das Low-Byte
MfG Klebwax
@ Siro
Verkürztes Zitat wie o.g. nur als Bestätigung:
"High-Endurance Flash Memory Address Range (1)
PIC12(L)F1571 -> 0380h-03FFh
PIC12(L)F1572 -> 0780h-07FFh
Note 1:
High-endurance Flash applies to the low byte of each address in the range."
Oh supi Klebwax, das hab ich wirklich übersehen :p
und auch nicht wirklich verstanden.
Jetzt geht mir aber grad ein Licht auf. :cool:
Es wurden "gute" und "schlechte" Flashspeicher verbaut.
Die "guten" mit wesentlich mehr Schreibzyklen wurden am Ende des gesamten Flashspeichers verbaut (nämlich die letzten 128 Bytes) und weiter vorne sind die "Schlechten" ;)
mit weniger garantierten Schreibzyklen....
Sieht man in den Memory Programming Specifications Table 26-5
Das ist ja ganz was Neues....
Auf jeden Fall vielen Dank Euch Beiden.
und ein schönes Wochenende
Siro
Ich erweitere mal meinen Thread, da es noch unmittelbar dazugehört.
zum Ablegen einer bestimmten Struktur oder Daten, hab ich folgendes probiert:
so kann ich an Speicherstelle 0x07F0 meine Struktur ablegen und auch
gleich initialisieren beim Programmieren des Chips
Ein MemoryDump (zumindest in der IDE) zeigt, dass meine Daten (Konstanten) tatsächlich auch dort gelandet sind
const struct
{
U16 CalAtmV;
U16 CalCount;
U8 SoftVersionPre;
U8 SoftVersionPost;
U8 HardVersionPre;
U8 HardVersionPost;
} myCalData @0x07F0 = /* an fester Adresse ablegen */
{ /* und gleich eine Initialisierung vornehmen */
4000,
1023,
1,
0,
1,
0
};
ich staune grad, ich kann so sogar direkt aus dem Array lesen:
x = myCalData.CalAtmV;
das funktioniert, der Compiler scheint dafür den richtigen Code zu machen....
muss das evtl. sogar volatile const sein ? tut zumindest nicht weh.
Ich erweitere mal meinen Thread, da es noch unmittelbar dazugehört.
zum Ablegen einer bestimmten Struktur oder Daten, hab ich folgendes probiert:
so kann ich an Speicherstelle 0x07F0 meine Struktur ablegen und auch
gleich initialisieren beim Programmieren des Chips
Ein MemoryDump (zumindest in der IDE) zeigt, dass meine Daten (Konstanten) tatsächlich auch dort gelandet sind
Mit const packt der Compiler (XC8 und XC16) Daten ins Flash, das ist normal. Das tut er auch, ohne daß du eine Adresse angibst. Du mußt nur aufpassen, daß er dir nicht von alleine irgendwelche andere Daten in diese 128 Byte packt.
ich staune grad, ich kann so sogar direkt aus dem Array lesen:
Das folgt aus dem gesagten.
muss das evtl. sogar volatile const sein ? tut zumindest nicht weh.
Doch tut es. Es verhindert, daß Zugriffe auf diese Variable optimiert werden. Und solange du die Daten nicht im Interrupt-Handler änderst, sind sie nicht volatile sondern das Gegenteil: const.
MfG Klebwax
Powered by vBulletin® Version 4.2.5 Copyright ©2025 Adduco Digital e.K. und vBulletin Solutions, Inc. Alle Rechte vorbehalten.