PIC: Daten in Programmspeicher schreiben

Gast #1523173
Lesenswert?
• ▲
▼
Hallo.
Ich will Daten in den Programmspeicher eines PIC (18f4455) schreiben. 
Ich nutze den C18-Compiler und MPLAB, zum Debuggen den ICD2. Es gibt 
auch eine Funktion "memcpyram2pgm()", die in den Programmspeicher 
schreiben sollte, aber sie tut es eben nicht. D.h. der Programmspeicher 
bleibt unverändert. Auch mit der Blockgröße von 32 Bytes (Datenblatt) an 
geraden Adressen geht es nicht.
Wer hat hier eine Idee?

Viele Grüße,
Chris.
Gast #1524155
Lesenswert?
• ▲
▼
Chris schrieb:
> Ich will Daten in den Programmspeicher eines PIC (18f4455) schreiben.

Hallo Chris,

memcpyram2pgm() schreibt nicht in den Programmspeicher. Im 
Flash-Speicher muss man 64-Byte-Blöcke löschen und 8-Byte-Blöcke 
schreiben, bzw. je nach Prozessor. Wie steht im Datenblatt. Im Programm 
muss der beschriebene Algorithmus implementiert werden.

Gruss Reinhard
Gast #1526156
Lesenswert?
• ▲
▼
Hallo Reinhard,

erstmal danke. INzwischen habe ich die Vorgehensweise aus den Datenblatt 
implementiert. Allerdings bleibt das Problem bestehen.
Ich lösche zunächst 64Bytes
Dann schreibe ich 2 x 32 Bytes neue Daten (18f4455)
Dabei sollte alles korrekt sein. EECON1 stimmt, EECON 2 mit 55h, dann 
AAh geladen und mit EECON.WR-Bit die Prozedur ( Kopieren der Latches in 
den Flash ) gestartet.
Der INhalt kommt aber nicht an.

>>>
    TBLPTR = (unsigned short long)gPrg.pflh;
    EECON1bits.EEPGD  = 1;
    EECON1bits.CFGS   = 0;
    EECON1bits.WREN   = 1;
    EECON1bits.FREE   = 1;
    disInt();
    EECON2            = 0x55;
    EECON2            = 0xAA;
    EECON1bits.WR     = 1;
    enaInt();

    // write 2 Blocks of new data
    for ( i = 0; i < 2; i++ )
    {
      // latch the data in the 32 Holding Registers
      for ( j = 0; j < PRG_BLK_LEN; j++ )
      {
        TABLAT = buf[i * PRG_BLK_LEN + j];
        _asm TBLWTPOSTINC _endasm
      }

      // trigger Write to Program-Memory
      TBLPTR = (unsigned short long)gPrg.pflh;
      EECON1bits.EEPGD  = 1;
      EECON1bits.CFGS   = 0;
      EECON1bits.WREN   = 1;
      //EECON1bits.FREE   = 0;
      disInt();
      EECON2            = 0x55;
      EECON2            = 0xAA;
      EECON1bits.WR     = 1;
      enaInt();
      gPrg.pflh += PRG_BLK_LEN;
    }
    EECON1bits.WREN   = 0;
<<<
*)disInt und enaInt = enable/disable Ints.

Grüße und schönen 4. Advent

Chris.
Gast #1526415
Lesenswert?
• ▲
▼
Hallo,

Problem hat sich erledigt. Mein Fehler! Die Daten waren im Flash, aber 
beim Debuggen hab ich auf den Prog.-Mem. geschaut, der war aber nicht 
mehr aktuell, weil nicht neu eingelesen. Klar, die IDE kriegt das 
Table-Write ja auch nicht mit.
Gelöst....

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.