Hi,
früher konnte man bei den PICs den UserID Bereich mit IDLOC Pragmas
schreiben. Bei dem PCI18 geht das nicht mehr
Ich bin mit dem Datenblatt zu folgender Routine gekommen, welche aber
leider nicht funktioniert.
WRTC ist auf off, so dass der Schreibschutz deaktiviert sein müßte
Wenn ich mir die enstprechenden Speicherstellen anschaue (siehe Bild)
dann steht da auch mein letzter Wert mit 2 an Stelle 0x200003 drin.
Lese ich den Bereich aber wieder aus in MPLAX steht alles auf 0xFF
1 | void prog_user_id(uint32_t adr, uint8_t value){
|
2 | unsigned char irq_state = INTCONbits.GIE;
|
3 | NVMCON1bits.NVMREG = 0x01; // select userid memory
|
4 | NVMCON1bits.WREN = 1; // enable write access
|
5 |
|
6 | TBLPTRUbits.ACSS = 0x01; // enable write
|
7 | TBLPTRUbits.TBLPTRU = (adr >> 16) & 0xFF;
|
8 | TBLPTRH = (adr >> 8) & 0xFF;
|
9 | TBLPTRL = adr & 0xFF;
|
10 | TABLAT = value;
|
11 |
|
12 | // nvm unlock sequence
|
13 | INTCONbits.GIE = 0; // Disable interrupts
|
14 | NVMCON2 = 0x55; // start nvm unlock sequence
|
15 | NVMCON2 = 0xAA;
|
16 | NVMCON1bits.WR = 1;
|
17 | while (NVMCON1bits.WR){} // Wait for write to complete
|
18 | NVMCON1bits.WREN = 0; // disable write access
|
19 | INTCONbits.GIE = irq_state; // restore interrupt enable
|
20 | }
|
21 |
|
22 | prog_user_id( 0x200000, 0);
|
23 | prog_user_id( 0x200001, 1);
|
24 | prog_user_id( 0x200002, 0);
|
25 | prog_user_id( 0x200003, 2);
|
Hat jemand eine Idee was ich da falsch mache?
Gruß