CALL problem (pic16f648A)
Postat: 21 september 2006, 09:49:12
Hej!
jag har ett liknande problem liknande tråden "Problem med PCL och PCLATH (16F767)"
Det hela gäller en liten kodsnutt för att läsa ut serienummer ur flashminnet.
Koden fungerar alldeles utmärkt för pic16f628. Den processorn har en mindre missenarea så jag misstänker att det är PCLATH som spökar till det för 16f648A processorn.
Koden är skriven i C för "bengt knudsen" kompilatorn och ser ut enligt följande:
#pragma cdata[4094] = 0x3444 // RETLV 0x44 på address 0xFFE;
#pragma cdata[4095] = 0x3455 // RETLV 0x55 på adress =0xFFF;
#define SERIAL_START_ADDR 0x0FFE
uns16 SERIAL_NUMBER;
page3 void vGetSerialNumber(void)
{
char temp;
char tempL;
tempL = PCLATH;
PCLATH = 0x08;
#asm
dw (SERIAL_START_ADDR + 0x2000) // CALL 0xFFE:
movwf temp
#endasm
SERIAL_NUMBER.low8 = temp;
PCLATH = 0x08;
#asm
dw ((SERIAL_START_ADDR+1)+0x2000) // CALL 0xFFF
movwf temp
#endasm
SERIAL_NUMBER.high8 = temp;
PCLATH = tempL;
}
void main (void)
{
vGetSerialNumber();
}
Koden skriven ovan fungerar i MPLab simulatorn, men inte på processorn.
Det finns fler rader i main funktionen egentligen, men det spelar egentligen ingen ströre roll för detta problemet, misstänker jag.
Om man försöker köra koden så hänger sig processorn i någon from av konstig loop.
Jag har läst både databladet för 16f648A och AN556 för att förstå vad som kan vara problemet, men lyckas inte lösa det.
Finns det någon som skulle kunna hjälpa mig?
// Mvh Daniel Grafström
jag har ett liknande problem liknande tråden "Problem med PCL och PCLATH (16F767)"
Det hela gäller en liten kodsnutt för att läsa ut serienummer ur flashminnet.
Koden fungerar alldeles utmärkt för pic16f628. Den processorn har en mindre missenarea så jag misstänker att det är PCLATH som spökar till det för 16f648A processorn.
Koden är skriven i C för "bengt knudsen" kompilatorn och ser ut enligt följande:
#pragma cdata[4094] = 0x3444 // RETLV 0x44 på address 0xFFE;
#pragma cdata[4095] = 0x3455 // RETLV 0x55 på adress =0xFFF;
#define SERIAL_START_ADDR 0x0FFE
uns16 SERIAL_NUMBER;
page3 void vGetSerialNumber(void)
{
char temp;
char tempL;
tempL = PCLATH;
PCLATH = 0x08;
#asm
dw (SERIAL_START_ADDR + 0x2000) // CALL 0xFFE:
movwf temp
#endasm
SERIAL_NUMBER.low8 = temp;
PCLATH = 0x08;
#asm
dw ((SERIAL_START_ADDR+1)+0x2000) // CALL 0xFFF
movwf temp
#endasm
SERIAL_NUMBER.high8 = temp;
PCLATH = tempL;
}
void main (void)
{
vGetSerialNumber();
}
Koden skriven ovan fungerar i MPLab simulatorn, men inte på processorn.
Det finns fler rader i main funktionen egentligen, men det spelar egentligen ingen ströre roll för detta problemet, misstänker jag.
Om man försöker köra koden så hänger sig processorn i någon from av konstig loop.
Jag har läst både databladet för 16f648A och AN556 för att förstå vad som kan vara problemet, men lyckas inte lösa det.
Finns det någon som skulle kunna hjälpa mig?
// Mvh Daniel Grafström