Forum: Mikrocontroller und Digitale Elektronik dsPIC: Daten in Programmspeicher speichern


von Michel H. (michelk)


Lesenswert?

Hallo zusammen.
Ich will Daten in den Programmspeicher eines dsPic30F2020 schreiben.
Dabei nutze ich MPLABX, zum Debuggen den ICD3.
Die Daten möchte ich auf die letzte Adresse im Programmspeicher 
(0x001FF8) schreiben, leider tut sie es nicht.
Hat jemand eine Idee was ich falsch mache?
Besten Dank für eure Bemühungen
1
void WriteFlash(void)
2
{
3
4
    int i = 0;
5
    char Data[]={"A"};
6
    
7
    /* 1 Zeile im Flash Programmspeicher löschen */
8
    
9
    NVMCON = 0x4041;                // Flash Row Erase Code
10
11
                                    // Letzte Adresse im User Programm Flash Memory: 0x001FF8
12
    NVMADR = 0x1FF8;                // Unteren 16 Bits der Zieladresse schreiben
13
    NVMADRU = 0x00;                 // Oberen 8 Bits der Zieladresse schreiben
14
15
    disInt();                       // Interrupts deaktivieren
16
17
    NVMKEY = 0x55;                  // Code zum aktivieren des Löschvorgangs
18
    NVMKEY = 0xAA;
19
    NVMCONbits.WR = 1;
20
21
    enaInt();                       // Interrupts aktivieren
22
    
23
    
24
25
    /* 1 Zeile im Flash Programmspeicher schreiben */
26
27
    NVMCON = 0x4001;                // Flash Row Programm Code
28
29
    TBLPAG = NVMADR;                // Letzte Adresse im User Programm Flash Memory: 0x001FF8
30
                                    // an TBLPAG übergeben
31
    
32
    for (i=0; i < 32; i++)          // Daten schreiben
33
    {
34
        int Offset = 4;
35
       __builtin_tblwtl(Offset, Data[0]);
36
       __builtin_tblwth(Offset, Data[0]);
37
38
    }
39
40
    disInt();                       // Interrupts deaktivieren
41
42
    NVMKEY = 0x55;                  // Code zum aktivieren des Löschvorgangs
43
    NVMKEY = 0xAA;
44
    NVMCONbits.WR = 1;
45
46
    enaInt();                       // Interrupts aktivieren
47
48
}

von Bronco (Gast)


Lesenswert?

Michel Herren schrieb:
> Die Daten möchte ich auf die letzte Adresse im Programmspeicher
> (0x001FF8) schreiben, leider tut sie es nicht.

WAS tut denn nicht?
Was steht vorher drinn?
Was steht nachher drinn?

Ich denke, Du mußt nach dem Starten des Löschens das Bit #15 in NVMCON 
pollen, um zu warten, bis der Löschvorgang fertig ist. Ansonsten ist das 
Flash nicht nicht bereit für Deinen Schreibzugriff.

Das gleiche gilt auch nach dem Starten des Schreiben der Row/Page: auch 
hier wieder Bit #15 abwarten!
1
  asm("    push        TBLPAG      ");
2
  asm("    mov        W2,NVMCON   ");
3
  asm("    mov        w0,TBLPAG   ");           //; Init Pointer to page to be erased
4
  asm("    tblwtl      w1,[w1]     ");            //; Dummy write to select the row
5
  __builtin_write_NVM();
6
  asm("1:   btsc       NVMCON,#15  ");    //  ;Wait for write end
7
  asm("     bra        1b          ");
8
  asm("    pop         TBLPAG      ");

von michel herren (Gast)


Lesenswert?

Es geschieht leider nichts, die Werte auf der Zieladresse werden nicht 
verändert. Auf der Zieladresse steht ständig 0xFFFFFF.
Ich vermute dass etwas mit der Angabe der TBLPAG nicht stimmt, 
allerdings weiss ich nicht was genau.
Besten Dank für deinen Tipp, ich werde es morgen einmal versuchen.

von Arc N. (arc)


Lesenswert?

_erase_flash und _write_flash16 bzw. _write_flash24 aus der libpic30.h 
funktionieren auch nicht?

von Bronco (Gast)


Lesenswert?

Schau mal in diese Application Note:
http://www.microchip.com/stellent/idcplg?IdcService=SS_GET_PAGE&nodeId=1824&appnote=en530200

Da ist ein Bootloader-Code drinn, der ins Flash schreibt. Ist ein wenig 
angestaubt, aber funktioniert.
Der dsPIC30 ist ein wenig anders als der dsPIC33 und der PIC24, aber 
wird auch in dem Bootloader unterstützt.

von Michel H. (michelk)


Lesenswert?

Hallo Zusammen,

ich bin leider erst heute wieder dazu gekommen an meinem Projekt
weiter zu arbeiten.
Ich habe dass ganze nun einmal mit dem Bootloader-Code versucht und das 
hat wunderbar geklappt.

Besten Dank für eure Hilfe

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.