-         

Ergebnis 1 bis 6 von 6

Thema: PIC18F258 FLASH auslesen

  1. #1
    Thomasxxl1234567
    Gast

    PIC18F258 FLASH auslesen

    Anzeige

    SMARTPHONES & TABLETS-bis zu 77% RABATT-Kostenlose Lieferung-Aktuell | Cool | Unentbehrlich
    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.

  2. #2
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    07.12.2005
    Ort
    Euskirchen-Großbüllesheim
    Alter
    67
    Beiträge
    2.063
    Hallo,
    schau Dir mal die PIC Assembler-Beispiele an.
    MfG Karl-Heinz
    HobbyElektronik hier klicken ....

  3. #3
    Neuer Benutzer Öfters hier
    Registriert seit
    20.12.2005
    Beiträge
    11
    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.

  4. #4
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    15.10.2004
    Ort
    Nordschwarzwald
    Alter
    34
    Beiträge
    506
    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...

  5. #5
    Neuer Benutzer Öfters hier
    Registriert seit
    20.12.2005
    Beiträge
    11
    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

  6. #6
    Neuer Benutzer Öfters hier
    Registriert seit
    20.12.2005
    Beiträge
    11
    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;
    }

Benutzer, die dieses Thema gelesen haben: 0

Derzeit gibt es keine Benutzer zum Anzeigen.

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •