Hallo Ich habe hier ein Problem bei eigentlich einer Kleinigkeit. Ich will in das interne EEPROM des PIC18F252 schreiben. Im Anhang ist ein Codeschnipsel dazu. In der Simulation läuft alles so, wie es soll. An Adresse 5 im internen EEPROM wird der Wert 5 (dezimal) abgelegt. Danach wird er nach etwas warten sofort wieder ausgelesen. Ich erhalte bei jeder EEPROM-Adresse aber immer den Wert Null. Ich verwende einen standard-tait-brenner und spruts pic18 software (www.sprut.de). -Ist der Codeschnipsel funktionsfähig? -Muss ich den Fehler in der Hardware suchen, da ja die Simulation funktioniert? evtl. in Config-Bytes? -Wie würde die Config-Zeile im Quellcode lauten, die das schreiben auf das int. EEPROM erlaubt? mfg Wolfram Hildebrandt
Hallo zusammen Geht mir gleich. Kennt von Euch vielleicht jemand das Problem? Anbei der Code zum Lesen und Schreiben auf einen PIC18F452. Beim Lesen erhält man aus jeder Speicherzellen den letzen Wert - hier 3 void main(void) { .. eeprom_write (0,1); eeprom_write (1,2); eeprom_write (2,3); eeprom_write (3,4); eeprom_write (4,5); Data = my_eeprom_read(0x00); // liefert den Wert 5 ... Data = my_eeprom_read(0x01); // liefert den Wert 5 ... } Beste Grüsse und vielen Dank für Eure Hinweise Geri void eeprom_write(unsigned char addr, unsigned char value) { char giel_temp; char gieh_temp; EECON1bits.EEPGD=0; //write to EEPROM, not data memory if (INTCONbits.GIEH) {INTCONbits.GIEH = 0; gieh_temp = 1;} if (INTCONbits.GIEL) {INTCONbits.GIEL = 0; giel_temp = 1;} EEADR=(unsigned char)(addr); EEDATA=(unsigned char)(value); EECON1bits.WREN=1; //enable writes EECON2=0x55; EECON2=0xAA; EECON1bits.WR=1; while (EECON1bits.WR!=0) { //do nothing - wait WR to be cleared in hardware } if (gieh_temp != 0) INTCONbits.GIEH=1; //restore GIE if (giel_temp != 0) INTCONbits.GIEL=1; EECON1bits.WREN=1; //enable writes } unsigned char eeprom_read(unsigned char addr) { EECON1bits.EEPGD=0; EEADR=(unsigned char)addr; EECON1bits.RD=1; return (unsigned char)EEDATA; }
Vielleicht EECON1bits.CFGS nicht auf Null ? Ansonsten sieht das identisch mit meinen (Assembler-) Schreib und Leseroutinen aus. Nur gebe ich die INTs vor der Warteschleife while (EECON1bits.WR!=0) wieder frei. Dieter
Hallo Dieter Vielen Dank für Deine Rückmeldung und die Hinweise. Habe Habe nun mit ... EEDATA = _data; EEADR = address; // start write sequence as described in datasheet, page 91 EECON1bits.EEPGD = 0; EECON1bits.CFGS = 0; EECON1bits.WREN = 1; // enable writes to data EEPROM ... geht auch nicht?? Die Abbrage von: if(EECON1bits.WRERR){ printf("ERROR: writing to EEPROM failed!\n"); } liefert auch keinen Fehler Beste Grüsse Geri
Ach ja, ich habe es gerade mir dem ICD2 geprüft. Die Schreibroutine funktioniert. Die Daten stehen im EEPROM Irgendwie muss beim Lesen demnach etwas faul sein. Beste Grüsse Geri
Ältere 18F242, 442, 252 und 452 - so ca. bis Ende 2003 - hatten mal Schwierigkeiten beim Lesen des EEPROM: Auszug aus dem errata sheet, microchip doc Nr. DS80150C Module: Data EEPROM When reading the data EEPROM, the contents of the EEDATA register may become corrupted in the second instruction cycle after the RD bit (EECON1<0>) is set. The actual contents of the EEPROM remains unaffected. Work around To ensure the integrity of the contents of EEDATA, the register must be read in the instruction immediately following the setting of the RD bit. Use the MOVF or MOVFF instructions to do this (see Example 1). Additionally, all interrupts must be disabled prior to the read instruction sequence. Interruptions of the sequence may have the same result of altering the contents of EEDATA. Example 1 BCF INTCON,GIEH ;disable interrupts if using interrupts BSF EECON1,RD ;start the read operation MOVF EEDATA,W ;move the data out of EEDATA BSF INTCON,GIEH ;enable interrupts if using interrupts Dieter
Hallo Dieter Super!! Vielen Dank, dass du dir die Mühe gemacht hast die Passage herauszusuchen! Ja, lesen bildet halt:) Nun habe ich noch ein weiteres sehr dubioses Problem - ersichtlich im beigefügten Beispiel. Entweder ich habe heute einen schlechten Tag oder der Compiler. Beste Grüsse Geri gcoolfire@yahoo.de
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.