-
PIC18F258 FLASH auslesen
Hallo,
ich versuche einen Bootloader für den PIC18F258 in der Programmiersprache C zu schreiben.
Ich habe als erstes versucht aus dem PIC die Daten aus dem FLASH heraus zu lesen, doch dies funktioniert leider nicht.
Das Data Sheet von Microchip hilft da irgendwie nicht wirklich weiter,
es sind dort zu kurze Erklärungen und Funktionen die nicht in C verfügbar sind, auch wenn man diese als Assemblercode einfügt.
Bsp.:
void FLASHRD( void )
{
unsigned char *dataPointer;
TBLPTRU = 0x00; //Adresse
TBLPTRH = 0x00;
TBLPTRL = 0xC0;
EECON1bits.EEPGD=1;
EECON1bits.RD=1;
// _asm TBLRD*+; _endasm //Dieser Befehl funktioniert nicht
Nop();
Nop();
*dataPointer = TABLAT; // Hier stehen doch jetzt 8 Bit an Daten
Wenn ich mir dataPointer anschaue, dann steht da nicht das was im HEX file steht.
Was mache ich falsch? Muss man diese Prozedur in Assembler schreiben?
Kennt jemand vielleicht eine Seite, wo es vielleicht Hilfestellungen zu diesen Thema gibt.
-
Hallo,
schau Dir mal die PIC Assembler-Beispiele an.
-
Danke für die Seite.
In Assembler scheint es ja wohl zu funktionieren.
Leider habe ich mein ganzes Programm schon in C geschrieben und wollte das auch so weiter schreiben.
Microchip hat ja auch diese Beispiele aber wenn man diese in C
schreibt, dann geht leider nicht viel.
-
Grade für nen Bootloader gibt es doch von Microchip ein fertiges Application Note.
Wenn du mit C programmierst, wäre es vielleicht ganz interessant zu wissen, welchen C-Compiler du verwendest und ob du die passenden Bibliotheken eingebunden hast...
_asm TBLRD*+; _endasm
Das ist doch auch kein Assemblerbefehl...
zumindest nicht in der Syntax...
-
Ich benutze den MCC18 Compiler.
Habe es geschafft den Flash teils richtig auszulesen.
Ich sende die ausgelesenen Daten über CAN an mein Windows Programm, dort habe ich festgestellt, dass ich 4 mal Falsch und 1 mal richtig auslese. Woran es liegt weiß ich aber nicht.
void FlashLesen( unsigned long adr )
{
unsigned char *dat;
unsigned int i;
TBLPTR = adr;
INTCONbits.GIEH = 0;
EECON1bits.EEPGD = 1;
for(i = 0; i < 16; i++)
{
_asm TBLRD _endasm
TBLPTR++;
*dat = TABLAT;
dat++;
}
INTCONbits.GIEH = 1;
}
Muss ich, wenn ich jetzt das Programm aufspielen würde, die Interrupts auf eine neue Adresse bringen, habe da irgendetwas darüber im Internet gelesen, aber bin nicht daraus schlau geworden.
Wie sieht das mit dem Hexfile aus, ab welcher Adresse fange ich an in den Flash zu kopieren. Ab 0x0000? Und was bedeutet die 04?
:02 0000 04 0000FA
:0600000039EF1BF01200B5
:06000800D3EF19F0120015
:060018002CEF1AF01200AB
:06002A0001008E3600000B
:0800300091000000080000002F
:0400BC008E0E286E0E
:1000C0002E6A256A246A72EF00F08E0E286E27C011
Danke
-
ich habe den Fehler gefunden, es lag an '*dat'
so ist das richtig:
void FlashLesen( unsigned long adr )
{
unsigned char dat[16];
unsigned int i;
TBLPTR = adr;
INTCONbits.GIEH = 0;
EECON1bits.EEPGD = 1;
for(i = 0; i < 16; i++)
{
_asm TBLRD _endasm
dat[i] = TABLAT;
TBLPTR++;
}
INTCONbits.GIEH = 1;
}