Problem Med att läsa FLASH minne i en 16F628A

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
dangraf
Inlägg: 530
Blev medlem: 9 juni 2003, 15:30:56
Ort: göteborg

Problem Med att läsa FLASH minne i en 16F628A

Inlägg av dangraf »

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
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg av sodjan »

> 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.
dangraf
Inlägg: 530
Blev medlem: 9 juni 2003, 15:30:56
Ort: göteborg

Inlägg av dangraf »

med kommandot RETLW, flyttar man inte då data från ramminnet till W registret, eller missförstår jag allt nu igen?
dangraf
Inlägg: 530
Blev medlem: 9 juni 2003, 15:30:56
Ort: göteborg

Inlägg av dangraf »

Jag missförstod, men nu har jag en annan fråga angående RETLW.

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?
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg av sodjan »

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... :-)
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg av sodjan »

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...
dangraf
Inlägg: 530
Blev medlem: 9 juni 2003, 15:30:56
Ort: göteborg

Inlägg av dangraf »

Nä, det är inte mitt processorval. Chefen har valt processorn eftersom den var billig och nu har jag fått uppdraget att skriva en funktion som hämtar serienummret från flashminnet. Det går inte att byta processor eftersom den redan sitter i produkterna.

Men det löser sig säkert på nått sätt.
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg av sodjan »

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).
Användarvisningsbild
vfr
EF Sponsor
Inlägg: 3515
Blev medlem: 31 mars 2005, 17:55:45
Ort: Kungsbacka

Inlägg av vfr »

Om nu serienumret verkligen är två _byte_ och inte programord, så verkar det ju inte helt otroligt att den verkligen lägger in det som retlw. Det verkar ju ändå uppta två programord i minnet. Har du kollat så att det faktiskt inte är så?
dangraf
Inlägg: 530
Blev medlem: 9 juni 2003, 15:30:56
Ort: göteborg

Inlägg av dangraf »

Jag kollade med programmeraren och den använde sig faktiskt av RETLW funktionen.
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
men den här kompilatorn (om någn annan stackare använder den)
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
tack för hjälpen!
Användarvisningsbild
vfr
EF Sponsor
Inlägg: 3515
Blev medlem: 31 mars 2005, 17:55:45
Ort: Kungsbacka

Inlägg av vfr »

Går det inte att använda call i inline assembler?

Vad är det för C-kompilator.
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg av sodjan »

> Jag kollade med programmeraren och den använde sig faktiskt av RETLW funktionen.

Bara synd att du inte kollade det innan första inlägget...

> men den här kompilatorn (om någn annan stackare använder den)

Vilken kompilator ?
Skriv svar