Hi Leute, will bei meinem PIC18F458 das EEPROM beschreiben und lesen. Hab dazu folgende Funktionen im Internet gefunden: unsigned char eeprom_read(unsigned char uint8_adress) { while (EECON1bits.WR); // Wait if READ/WRITE/..... EECON1bits.EEPGD = 0; // Select EEPROM Memory EECON1bits.CFGS = 0; // Select Memory - not Config_Word EEADR = uint8_adress; // Select EEPROM Cell EECON1bits.RD = 1; // Start Reading return EEDATA; // Return Cell_Value } void eeprom_write(unsigned char uint8_adress, unsigned char uint8_data) { unsigned char uint8_gieh_backup; unsigned char uint8_giel_backup; while (EECON1bits.WR); // Wait if READ/WRITE/..... EECON1bits.EEPGD = 0; // Select EEPROM Memory EECON1bits.CFGS = 0; // Select Memory - not Config_Word EEADR = uint8_adress; // Select EEPROM Cell EEDATA = uint8_data; uint8_gieh_backup = INTCONbits.GIEH; uint8_giel_backup = INTCONbits.GIEL; INTCONbits.GIEH = 0; // Disable Interrupts INTCONbits.GIEL = 0; EECON1bits.WREN = 1; // Authorize EEPROM_writing EECON2 = 0x55; EECON2 = 0xaa; EECON1bits.WR = 1; // Start EEPROM_writing EECON1bits.WREN = 0; // Deactivate EEPROM_writing INTCONbits.GIEH = uint8_gieh_backup; INTCONbits.GIEL = uint8_giel_backup; } Wenn ich meinen PIC starte, die Funktionen ausführe und danach mit picKit2 das eeprom auslese, steht leider nix drin. Wollte fragen, ob hier ein PIC-Kenner schonmal was ins EEPROM geschrieben hat. Wenn ja, sind meine FUnktionen falsch oder muss ich sonst noch irgendwas beachten? Wie lange dauert so ein Schreibvorgang? Gruß Olli
HHhhhmmmmm - ich habs immer noch nich raus und leider keinen Ansprechpartner. Könnt ihr mir helfen?
>Wie lange dauert so ein Schreibvorgang?
Steht bestimmt im Datenblatt, z. B. auf Seite 61:
At the completion of the write cycle, the WR bit is
cleared in hardware and the EEPROM Write Complete
Interrupt Flag bit (EEIF) is set. The user may either
enable this interrupt or roll this bit. EEIF must be
cleared by software.
OK, die Schreibdauer könnte ich mir also berechnen bzw. ausgeben lassen. Mein Problem ist aber ja, dass das EEPROM schreiben gar nicht funktioniert. Hat mir da jmd mit Erfahrung einen Tip?
> EECON1bits.WREN = 1; // Authorize EEPROM_writing > EECON2 = 0x55; > EECON2 = 0xaa; > EECON1bits.WR = 1; // Start EEPROM_writing > EECON1bits.WREN = 0; // Deactivate EEPROM_writing > > INTCONbits.GIEH = uint8_gieh_backup; > INTCONbits.GIEL = uint8_giel_backup; Das könnte unter Umständen daran liegen, dass du den Schreibvorgang startest und dann gleich das WREN-Bit zurücksetzt. Besser ist, wenn du an dieser Stelle erst wartest, bis der Schreibvorgang abgeschlossen ist, also
1 | while(!PIR2bits.EEIF); |
Hallo Olli ich denke, dass das so gar nicht geht. EECON1bits.WREN = 1; // Authorize EEPROM_writing > EECON2 = 0x55; > EECON2 = 0xaa; > EECON1bits.WR = 1; Beim Schreiben auf das EECON2 register muss in bestimmtesTiming eingehalten werden, das beim Programmieren unter C nicht funktioniert. Ich hab das schon mal dür einen PIC30 versucht und bin gescheitert. Aber es gibt dafür - zumindest beim PIC30 - ne Assemblerfunktion, wo das dann umgesetzt wird. Ich weiss nicht mit welchem Compiler du arbitest, aber evtl ist da ja was dabei. Gerhard
Hallo Olli in meinem C18-Compiler-Verzeichnis hab ich ein Beispiel gefunden. Also, es sollte doch in C funktionieren. Das ist ein Ausschnitt: button (void) { /* * Store the new direction in EEDATA. * Note that since we are already * in the high priority interrupt, we do * not need to explicitly enable/disable * interrupts around the write cycle */ EECON1bits.EEPGD = 0; /* WRITE step #1 */ EECON1bits.WREN = 1; /* WRITE step #2 */ EEADR = 0; /* WRITE step #3 */ EEDATA = direction; /* WRITE step #4 */ EECON2 = 0x55; /* WRITE step #5 */ EECON2 = 0xaa; /* WRITE step #6 */ EECON1bits.WR = 1; /* WRITE step #7 */ while (!PIR2bits.EEIF) /* WRITE step #8 */ ; PIR2bits.EEIF = 0; /* WRITE step #9 */ /* clear the interrupt flag */ INTCONbits.INT0IF = 0; } Gerhard
hi, du kannst nicht eeprom daten aulesen und wieder überschreiben. Das ist so zusagen ein sicherheit. Wenn das möglich wäre hättest du vielles anstellen könne. Also es ist nicht möglich. sogar wenn du dass EEPROM mit nicht protected brennst liest pick kit drei immer null. soso mfg
> Wie lange dauert so ein Schreibvorgang?
Das Datenblatt sagt auf S. 339: typ. 4 msec, das passt auch zu den
üblichen externen EEPROMS, da sind es auch meist 3-5 msec
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.