Sida 1 av 2

Spara variabler i flash

Postat: 24 september 2009, 09:50:03
av CyberLeffe
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?

Detta är min linker

Kod: Markera allt

// File: 18f6628i.lkr
// Sample ICD2 linker script for the PIC18F6628 processor

LIBPATH .

FILES c018i.o
FILES clib.lib
FILES p18f6628.lib

CODEPAGE   NAME=page       START=0x0               END=0x17D7F
CODEPAGE   NAME=debug      START=0x17D80           END=0x17FFF        PROTECTED
CODEPAGE   NAME=idlocs     START=0x200000          END=0x200007       PROTECTED
CODEPAGE   NAME=config     START=0x300000          END=0x30000D       PROTECTED
CODEPAGE   NAME=devid      START=0x3FFFFE          END=0x3FFFFF       PROTECTED
CODEPAGE   NAME=eedata     START=0xF00000          END=0xF003FF       PROTECTED

ACCESSBANK NAME=accessram  START=0x0            END=0x5F
DATABANK   NAME=gpr0       START=0x60           END=0xFF
DATABANK   NAME=gpr1       START=0x100          END=0x1FF
DATABANK   NAME=gpr2       START=0x200          END=0x2FF
DATABANK   NAME=gpr3       START=0x300          END=0x3FF
DATABANK   NAME=gpr4       START=0x400          END=0x4FF
DATABANK   NAME=gpr5       START=0x500          END=0x5FF
DATABANK   NAME=gpr6       START=0x600          END=0x6FF
DATABANK   NAME=gpr7       START=0x700          END=0x7FF
DATABANK   NAME=gpr8       START=0x800          END=0x8FF
DATABANK   NAME=gpr9       START=0x900          END=0x9FF
DATABANK   NAME=gpr10      START=0xA00          END=0xAFF
DATABANK   NAME=gpr11      START=0xB00          END=0xBFF
DATABANK   NAME=gpr12      START=0xC00          END=0xCFF
DATABANK   NAME=gpr13      START=0xD00          END=0xDFF
DATABANK   NAME=gpr14      START=0xE00          END=0xEF3
DATABANK   NAME=dbgspr     START=0xEF4          END=0xEFF          PROTECTED
DATABANK   NAME=gpr15      START=0xF00          END=0xF5F
ACCESSBANK NAME=accesssfr  START=0xF60          END=0xFFF          PROTECTED

SECTION    NAME=CONFIG     ROM=config

STACK SIZE=0x100 RAM=gpr13
Kan jag minska ner "page" och lägga min data efter denna?

Tex

Kod: Markera allt

CODEPAGE   NAME=page       START=0x0               END=0x17D3F		  // 0x17D7F
CODEPAGE   NAME=cali	    START=0x17D40           END=0x17D7F		  // Saved calibration values
CODEPAGE   NAME=debug      START=0x17D80           END=0x17FFF        PROTECTED
CODEPAGE   NAME=idlocs     START=0x200000          END=0x200007       PROTECTED
CODEPAGE   NAME=config     START=0x300000          END=0x30000D       PROTECTED
CODEPAGE   NAME=devid      START=0x3FFFFE          END=0x3FFFFF       PROTECTED
CODEPAGE   NAME=eedata     START=0xF00000          END=0xF003FF       PROTECTED

Re: Spara variabler i flash

Postat: 24 september 2009, 09:55:36
av v-g
Är det inte bättre att spara i EEPROM?

Re: Spara variabler i flash

Postat: 24 september 2009, 10:03:10
av vfr
är till för frekvent uppdaterad data

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.

Re: Spara variabler i flash

Postat: 24 september 2009, 10:05:43
av v-g
Det jag menar är att man detekterar strömslut och DÅ sparar undan. Spar man kontinuerligt så ryker minnet relativt snabbt.

Re: Spara variabler i flash

Postat: 24 september 2009, 10:12:14
av CyberLeffe
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.

Re: Spara variabler i flash

Postat: 24 september 2009, 10:20:46
av v-g
Då duger ju eeprom utmärkt. Enligt microchip så ska värdet ligga kvar i 40 år ;)

Re: Spara variabler i flash

Postat: 24 september 2009, 10:52:47
av CyberLeffe
Ja 40 ska nog räcka... :)

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...

Re: Spara variabler i flash

Postat: 24 september 2009, 11:16:50
av v-g
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).

P.S. Kolla sidan 111 och framåt ;)

Re: Spara variabler i flash

Postat: 24 september 2009, 11:19:48
av vfr
Ja, till den här typen av data så låter EEPROM som en utmärkt lösning. Det är precis den typ av data som det är tänkt för.

Re: Spara variabler i flash

Postat: 24 september 2009, 11:36:15
av Nerre
Om du programmerar i C så finns det väl färdiga funktioner för att skriva till och läsa från EEPROM?

Re: Spara variabler i flash

Postat: 24 september 2009, 12:11:07
av Icecap
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.

Re: Spara variabler i flash

Postat: 24 september 2009, 12:24:39
av Nerre
Smart lösning, gör ju dessutom att man slipper läsa från EEPROM varje gång.

Re: Spara variabler i flash

Postat: 24 september 2009, 13:39:56
av bos
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?

Re: Spara variabler i flash

Postat: 24 september 2009, 14:12:38
av Nerre
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.

Re: Spara variabler i flash

Postat: 24 september 2009, 14:14:19
av Schnegelwerfer
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...