PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : PIC18F258 FLASH auslesen



Thomasxxl1234567
20.12.2005, 15:16
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.

kalledom
20.12.2005, 17:04
Hallo,
schau Dir mal die PIC Assembler-Beispiele (http://www.domnick-elektronik.de/picasm.htm) an.

Thomas1234567
20.12.2005, 21:08
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.

stegr
23.12.2005, 13:53
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...

Thomas1234567
03.01.2006, 10:49
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

Thomas1234567
03.01.2006, 16:27
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;
}