at89c5131A EEPROM

Gast #1052755
Lesenswert?

ja ich will das interne eeprom programmieren
so wie du mir das aufgeschrieben hast kenn ich es auch hatt aber nicht 
funktioniert

weil wie gesagt es mus erst in das columnlarch geschrieben werden ist 
ein RAM und von da aus ins eeprom
Gast #1052782
Lesenswert?

Also, in meinem Datenblatt steht drin, was zu tun ist:

10.2 Write Data in the Column Latches
Data is written by byte to the column latches as for an external RAM 
memory. Out of the 11
address bits of the data pointer, the 4 MSBs are used for page selection 
(row) and 7 are used for
byte selection. Between two EEPROM programming sessions, all the 
addresses in the column
latches must stay on the same page, meaning that the 4 MSB must not be 
changed.
The following procedure is used to write to the column latches:
• Set bit EEE of EECON register
• Load DPTR with the address to write
• Store A register with the data to be written
• Execute a MOVX @DPTR, A
• If needed, loop the three last instructions until the end of a 128 
bytes page

10.3 Programming
The EEPROM programming consists on the following actions:
• Writing one or more bytes of one page in the column latches. Normally, 
all bytes must belong
to the same page; if not, the first page address will be latched and the 
others discarded.
• Launching programming by writing the control sequence (52h followed by 
A2h) to the
EECON register.
• EEBUSY flag in EECON is then set by hardware to indicate that 
programming is in progress
and that the EEPROM segment is not available for reading.
• The end of programming is indicated by a hardware clear of the EEBUSY 
flag.

Ralf
Gast #1053089
Lesenswert?

Reicht Dir auch ne Routine in C? Hier mal ein Ausschnitt von meinen 
Projekten. Endlich jmd der sich auch noch an diesem sehr schönen 
Controller vergreift. Ich hab das übrigens nachher mit SDCC compiliert. 
Das ASM-Listing dazu kann ich Dir ggf. auch noch zukommen lassen wenn Du 
möchtest.

cu,
olly...

___________________________________________

Uchar EEPROM_rd(Uchar xdata *address)
{
  // Auf EEPROM umschalten, einzelnes Byte aus EEPROM lesen und im RAM 
(IDATA, nicht XDATA) lagern,
  // dann auf XDATA zurückschalten und von IDATA nach XDATA zurückgeben
  Uchar val;  // IDATA
  bit ea_save = EA;  // IDATA, Interrupts speichern
  EA = 0;  // Interrupts ausschalten
  EECON = 0x02;  // XDATA > EEPROM schalten
  val   = *address;  // EEPROM > IDATA lesen
  EECON = 0x00;  // EEPROM > XDATA schalten
  EA = ea_save;  // Interrupts wiederherstellen
  return (val);  // IDATA > XDATA zurückgeben
}

void EEPROM_wrt(Uchar xdata *address, Uchar val)
{
  int i;
  bit ea_save = EA;  // Interruptstatus zwischenspeichern
  EA = 0;  // und ausschalten
  WD_ACK();
  EECON = 0x02;  // auf EEPROM mappen
  *address = val;  // pointer auf EEPROM beschreiben
  EECON = 0x50;  // Schreibsequenz einleiten
  EECON = 0xA0;  // Schreibsequenz vollenden
  while (EECON & 0x01); // warten bis EEPROM zuende geschrieben wurde...
  for (i = 0; i < 500; i++);                      // Show-Effekt: 
Extra-Warteschleife um Schreibvorgang zu verlangsamen, nicht höher 
setzen weil HW-Watchdog sonst nicht bedient werden kann. Wenn das nicht 
drin ist, wird seltsamerweise auch nix gespeichert...
  EECON = 0x00;   // EEPROM > XDATA schalten
  EA = ea_save;   // Interruptstatus wiederherstellen
}

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren