mikrocontroller.net

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


Autor: Chris (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Reinhard Kern (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Chris (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Chris (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
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.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.