Jag skriver ett program till en PIC18F6628 och har några variabler som används för kalibrering som jag vill spara undan och kunna läsa av efter ett strömavbrott. Jag tänkte att EEPROM skulle lösa problemet men läste då att det är till för frekvent uppdaterad data och att kalibrerings data och annan data som inte uppdateras så ofta bör läggas i flash.
Jag har läst på en del om flash och tror mig veta hur jag ska skriva till och läsa från det, men hur vet jag var i minnet jag kan skriva?
Kan jag allokera en viss bit av minnet till dessa variabler så jag inte riskerar att skriva över min programkod?
Nja, det där är en sanning med modifikation. Jag skulle säga medelfrekvent uppdaterad information i EEPROM. Skall man ha riktigt frekvent lagrad permanent information så är det batteri-RAM som gäller, eller någon av dom nya minnesteknologierna FRAM eller MRAM. EEPROM-teknologin har fortfarande en begränsning i antal omskrivningar, även om det ofta är lite fler ggr än för flash.
Kan jag allokera en viss bit av minnet till dessa variabler så jag inte riskerar att skriva över min programkod?
Visst kan du det. Gör ett eget segment av det i länkfilen.
Variablerna kommer inte att sparas undan precis när strömmen bryts utan man kommer trycka på en knapp för att starta en kalibrering och när den är klar sparas värdet undan. När sedan PIC:en startar kommer den använda de undansparade värdena tills man gör en ny kalibrering.
Frågan är bara hur jag allokerar minne till dessa variabler. Den Memory Map som jag hittat på sidan 66 i databladet visar inte adresser för alla minnen utan bara flash. Hur vet jag på vilka adresser EEPROM ligger? Utifrån linker scriptet skulle jag ju gissa på 0xF00000 men det hade varit bra att få det verifierat...
Allt står i databladet och du behöver inte "allokera" något det eepromminne som finns det finns och kan inte användas till annat.
Det kräver dock lite kod att få det att fungera men som sagt läs databladet där står även detta, jag fick det att fungera på första försöket och då måste ju något vara rätt iaf
Man kan även skicka med data från tex MPLAB man anger då bara att detta ska in i EEPROM och så skrivs det in i hexfilen (tror jag) och följer så att säga bara med när man programmerar kretsen (kan ju vara bra med någon slags grundinställning liksom).
Jag tror jag förstår var problemet är och såhär löser man det:
EEPROM'en kan man läsa & skriva en byta åt gången.
Jag gör då alltid så att jag definierar en variabel i RAM, oftast en struct som heter "Config", som innehåller alla dessa värden som kan justeras.
Sedan sparar jag vid att kopiera Config in byte för byte och läser tillbaka på samma sätt, byte för byte.
Och som skrivit: det kan mycket väl finnas färdiga rutiner till detta.
v-g skrev:Det jag menar är att man detekterar strömslut och DÅ sparar undan.
Min spontana reaktion är "Är det så smart?". Jag tänker då strömmen hinner försvinna innan all data sparats helt och hållet. Vill man ha halvkorrupt data?
Det beror ju på hur man löser hårvaran. Om detekteringen känner av direkt när matningen försvinner så sitter det ju oftast en hyffsat stor ellyt som ger spänning en liten stund till. Och det tar ju inte så lång tid att spara datat.
Men som sagt var, handlar det om kalibreringsvärden så är ju de mer eller mindre "read only" utom just då man kalibrerar. Så där behöver ju inget sparas när strömmen försvinner, det är ju bara att läsa in varje gång man bootar.
Bos: Det fungerar utmärkt om man håller koll på hur mycket data som maximalt får skrivas samt ser till att ha en tillräcklig spänningsreserv i form av kondensatorer. Maximal tid för skrivning till Flash/EEprom hittar man ju i databladen...