Forum: Mikrocontroller und Digitale Elektronik Schreiben in EEPROM eines AT89C51ED2


von Marko Wagner (Gast)


Lesenswert?

Hallo Leute,
was mach ich falsch? Ich versuche zwei Bytes ins EEPROM eines AT89C51ED2 
zu schreiben. Ich benutze Keil µVision 3 und schreibe meinen Quellcode 
in C.
Laut Datenblatt muss ich zum Schreiben warten bis EEBusy cleared. Dann 
disable ich alle Intterupts und setze EECON=02h. Dann kommt der 
ineressante Teil. In Assembler: DPTR=Adresse;ACC=Data;MOVX@DPTR,A;
Danach dann EECON=00h und Enable all Interrupts. Hab ich den 
Assembler-Code richtig in C übersetzt?
Hier mein C-Code:


// eeprom-variables at memory-addresses
unsigned char xdata *xdata p_eeprom_coldsite_adjust_lowbyte at 0x0000;
unsigned char xdata *xdata p_eeprom_coldsite_adjust_highbyte _ at 
0x0002;


/* write coldsite temperature adjust value to eeprom */
void v_eeprom_write_cold_site_adjust(unsigned short adjust_temp_write){
  xdata unsigned char dummy1,dummy2=0;

  dummy1=(adjust_temp_write & 0x00FF);
    dummy2=((adjust_temp_write>>8)&0x00FF);

   //write data to eeprom
    while((EECON & 0x01)==1); // wait while EEBUSY
   EA = 0;        // disable all interrupts
    EECON = 0x02;      // Set EE bit of EECON
    *p_eeprom_coldsite_adjust_lowbyte = dummy1;
    EECON = 0x00;
   EA = 1;        // enable all interrupts

  for(i=0;i<100;i++);

  while((EECON & 0x01)==1); //wait while EEBUSY
   EA = 0;        // disable all interrupts
    EECON = 0x02;      // Set EE bit of EECON
    *p_eeprom_coldsite_adjust_highbyte = dummy2;
    EECON = 0x00;
    EA = 1;
}

Das Lesen scheint zu funktionieren, da ich immer 0xFF und 0xFF in dummy3 
und dummy4 bekomme, welches ja der Default-Wert eines EEPROMs ist.

/* load coldsite temperature adjust value from eeprom */
unsigned short us_eeprom_load_cold_site_adjust(void){
  xdata unsigned short adjust_temp_load=0;
  xdata unsigned char dummy3,dummy4=0;

   //load data from eeprom
  while((EECON & 0x01)==1); //wait while EEBUSY
   EA = 0;
    EECON = 0x02; //EEE
  dummy3 = *p_eeprom_coldsite_adjust_lowbyte;
  dummy4 = *p_eeprom_coldsite_adjust_highbyte;
    EECON = 0x00;
  EA = 1;

    adjust_temp_load = ((dummy4<<8) & 0xFF00);
    adjust_temp_load = (adjust_temp_load|dummy3);
    return(adjust_temp_load);
}

von Marko Wagner (Gast)


Lesenswert?

Was genau ist casten?

von Ralf (Gast)


Angehängte Dateien:

Lesenswert?

Casten bedeutet, einen Datentyp zwingend in einen anderen zu wandeln, 
selbst wenn der Wert eigentlich nicht in den neuen Datentyp reinpasst.

Bzgl. deines EEPROM Problems - guckst du in den Anhang.

Ralf

von Marko Wagner (Gast)


Lesenswert?

Perfekt - Super - Danke vielmals

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.