Problem Med att läsa FLASH minne i en 16F628A
Problem Med att läsa FLASH minne i en 16F628A
Hallå igen!
Jag försöker läsa ur programm minnet i en pic 16f628A, vilket tydligen inte är lika lätt som till t.ex en 16f88.
Jag hittar ingen infromation i databladet om hur man ska läsa ur flashminnet (enbart ur eeprom minnet). Dessutom finns inte registerna EEADRH för att välja vilken adress man vill läsa från.
Hur gör man?
Det måste ju gå på nån vänster eftersom konstanta variabler och programmet ligger i flashminnet.
Jag skulle vilja läsa 2 bytes på adressen 0x7FE och 0x7FF (två sissta bytes i minnet)
Just nu skriver jag programmet i C-kod, men det går att skriva snuttar i assembler om man så vill.
Mvh/ Daniel Grafstrsöm
Jag försöker läsa ur programm minnet i en pic 16f628A, vilket tydligen inte är lika lätt som till t.ex en 16f88.
Jag hittar ingen infromation i databladet om hur man ska läsa ur flashminnet (enbart ur eeprom minnet). Dessutom finns inte registerna EEADRH för att välja vilken adress man vill läsa från.
Hur gör man?
Det måste ju gå på nån vänster eftersom konstanta variabler och programmet ligger i flashminnet.
Jag skulle vilja läsa 2 bytes på adressen 0x7FE och 0x7FF (två sissta bytes i minnet)
Just nu skriver jag programmet i C-kod, men det går att skriva snuttar i assembler om man så vill.
Mvh/ Daniel Grafstrsöm
> Jag hittar ingen infromation i databladet om hur man ska läsa ur flashminnet...
Nä, just det... Gissa varför du inte gör det !
> vilket tydligen inte är lika lätt som till t.ex en 16f88.
På en F88 går det, på en F628A går det inte.
> Jag skulle vilja läsa 2 bytes på adressen 0x7FE och 0x7FF (två sissta bytes i minnet)
"Words", inte "bytes"...
Kolla upp RETLW.
> Just nu skriver jag programmet i C-kod,
Inte mycket att göra åt, antar jag...
/Janne.
Nä, just det... Gissa varför du inte gör det !
> vilket tydligen inte är lika lätt som till t.ex en 16f88.
På en F88 går det, på en F628A går det inte.
> Jag skulle vilja läsa 2 bytes på adressen 0x7FE och 0x7FF (två sissta bytes i minnet)
"Words", inte "bytes"...
Kolla upp RETLW.
> Just nu skriver jag programmet i C-kod,
Inte mycket att göra åt, antar jag...

/Janne.
Jag missförstod, men nu har jag en annan fråga angående RETLW.
Enligt exemplet i databladet:
Enligt exemplet i databladet:
Kod: Markera allt
CALL TABLE;W contains table
;offset value
;W now has table value
ADDWF PC;W = offset
RETLW k1;Begin table
RETLW k2;
RETLW kn; End of table
[code/]
Här verkar det som att man i stort sätt gjort en subrutin som returnerar ett värde från en tabell. Problemet jag har nu är att programmeraren (PROMATE2) enbart lägger till serienummret på en given adress i FLASHEN. Det betyder att jag inte den inte lägger in någon Label eller "ADDWF PC;W = offset" innnan serienummret.
Jag tycker det verkar helt sjukt att man inte kan läsa i programminnet på
ett vettigt sätt *irriterad*
Det måste väl gå att komma runt detta på nått sätt?
RETLW är ungefär som en vanlig RETURN, med den skillnaden att W laddas med den värde som är lagrat/kodat i själva RETLW instruktionen. Inget läses/kopieras från RAM.
Men beskriv vilken del av beskrivningen av RETLW instruktionen som var oklar, så blir det lättare att förtydliga...
EDIT : Du han före...
Men beskriv vilken del av beskrivningen av RETLW instruktionen som var oklar, så blir det lättare att förtydliga...
EDIT : Du han före...

på vilket sätt lägger PROMATE in serie numret ?
Det är ganska vanligt att man gör det via RETLW instruktioner.
Eller lägger den bara rent binära värden (som alltså inte är giltiga instruktioner) ? I så fall kan du inte läsa dom via programmet, enbart via en extern programmerare.
Sjukt ? Det vet jag inte...
Det vettiga sättet *är* RETLW (på den PIC modell du har valt).
Senare procesorer har möjlighet til att direkt läsa (och skriva) programminnet, om man *måste* kunna det så är det väll bara att byta PIC modell...
Jag tycker inte att du kan klandra processorn för att du har gjort ett misstag i ditt processorval, det är ju faktiskt ditt ansvar...
Det är ganska vanligt att man gör det via RETLW instruktioner.
Eller lägger den bara rent binära värden (som alltså inte är giltiga instruktioner) ? I så fall kan du inte läsa dom via programmet, enbart via en extern programmerare.
Sjukt ? Det vet jag inte...
Det vettiga sättet *är* RETLW (på den PIC modell du har valt).
Senare procesorer har möjlighet til att direkt läsa (och skriva) programminnet, om man *måste* kunna det så är det väll bara att byta PIC modell...
Jag tycker inte att du kan klandra processorn för att du har gjort ett misstag i ditt processorval, det är ju faktiskt ditt ansvar...
Kolla om inte programmeraren kan lägga serienumret i eeprommet istället.
Annars vet jag inte vad "på något sätt" skulle kunna vara...
Rent generellt skulle det förvåna mig lite om inte Microchips egen "production programmer" har en lösning för detta, t.ex genom att koda serienumret i ett par RETLW instruktioner (vilket är det ända sättet att lösa det i flashen på en F628A).
Annars vet jag inte vad "på något sätt" skulle kunna vara...

Rent generellt skulle det förvåna mig lite om inte Microchips egen "production programmer" har en lösning för detta, t.ex genom att koda serienumret i ett par RETLW instruktioner (vilket är det ända sättet att lösa det i flashen på en F628A).
Jag kollade med programmeraren och den använde sig faktiskt av RETLW funktionen.
Så i asm skulle man egentligen skriva ungefär:
men den här kompilatorn (om någn annan stackare använder den)
får man gå runt det genom att skriva:
tack för hjälpen!
Så i asm skulle man egentligen skriva ungefär:
Kod: Markera allt
#define serial_addr 0x07fe
char serial_low
CALL serial_addr;
movwf serial_low
får man gå runt det genom att skriva:
Kod: Markera allt
#asm
DW (0x2000 | serial_addr) //vilket genererar opkoden CALL serial_addr
movwf serial_low
#endasm