Forum: Mikrocontroller und Digitale Elektronik PIC: Daten in Programmspeicher schreiben


von Chris (Gast)


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.

von Reinhard Kern (Gast)


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

von Chris (Gast)


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.

von Chris (Gast)


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....

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.