Forum: Mikrocontroller und Digitale Elektronik Daten im internen EEPROM des AT89C5131 ablegen


von Matze (Gast)


Lesenswert?

Hallo zusammen,

ich versuche in einen Einstellwert nachdem er eingestellt wurde, in das 
interne EEPROM des AT89C5131 abzulegen. Dazu habe ich folgendes 
Unterprogramm:
1
eeprom_speichern:
2
    mov  dptr,#00      ;Anfangsadresse EEPROM
3
waitEEPR1:  
4
    mov  a,eecon
5
    anl  a,#01h
6
    jnz  waitEEPR1    ;warten bis bereit
7
    
8
    clr  ea          ; Interrupts sperren
9
    mov  eecon,#02h    ;EEprom auswählen  
10
    mov a,hysterese  
11
    movx  @dptr,a      ;im EEPROM ablegen
12
    clr a
13
    mov  eecon,#0      ;nicht mehr auf EEPROM zugreifen
14
    setb  ea          ;Interupts wieder freigeben
15
  
16
ret

Zum aulesen habe ich folgendes Unterprogramm:
1
eeprom_lesen:  
2
    mov  dptr,#00      ;Anfangsadresse EEPROM
3
waitEEPR2:  
4
    mov  a,eecon
5
    anl  a,#01h
6
    jnz  waitEEPR2    ;warten bis bereit
7
    clr  ea          ; Interrupts sperren
8
    
9
    mov  r3,#255      ;Zähler Byte
10
    mov  eecon,#02h    ;EEprom auswählen    
11
    movx  a,@dptr      ;Wert holen
12
    mov  eecon,#0      ;nicht mehr auf EEPROM zugreifen
13
    setb  ea          ;Interupts wieder freigeben
14
    mov   hysterese,a
15
16
ret

Das Programm zum auslesen gibt mir den Wert 255 zurück. Laut 
Buffer-Ansicht des EEPROMs würde das ja passen, dort ist ja FF 
hinterlegt. Hat jemand eine Idee, warum das unterprogramm nicht 
abspeichert?

von Matze (Gast)


Lesenswert?

So, ich hab mich nochmal mit der Thematik beschäftigt, so funktioniert 
es nun:

1
eeprom_speichern:
2
    clr  ea          ; Interrupts sperren
3
    mov  eecon,#02h
4
    mov  dptr,#0001h      ;Anfangsadresse EEPROM
5
    
6
    mov a,hysterese  
7
    movx  @dptr,a      ; Daten in Column-Latch speichern
8
    
9
    
10
    mov eecon, #054h    ; Daten von Column-Lach in Eeprom speichern
11
    mov eecon, #0A4h
12
waitEEPR1:    
13
    mov  a,eecon
14
    anl  a,#01h
15
    jnz  waitEEPR1    ;warten bis bereit
16
    setb  ea          ;Interupts wieder freigeben
17
    
18
    
19
  
20
ret

von Bernhard S. (b_spitzer)


Lesenswert?

Schön, dass Du es hinbekommen hast (und auch hier schreibst).
Falls das jemand in C braucht:
1
#include <typedefs.h> // uC8 => unsigned char und so weiter...
2
#include <at89c5131.h>
3
4
uC8 EEPROM_rd(uC8 xdata *address)
5
{
6
  // Auf EEPROM umschalten, einzelnes Byte aus EEPROM lesen und im 
7
  // RAM (IDATA, nicht XDATA) lagern,
8
  // dann auf XDATA zurückschalten und von IDATA nach XDATA zurückgeben
9
  uC8 val;        // IDATA
10
  bit ea_save = EA;             // Interrupts speichern
11
  EA = 0;        // Interrupts ausschalten
12
  EECON = 0x02;      // XDATA > EEPROM schalten
13
  val   = *address;             // EEPROM > IDATA lesen
14
  EECON = 0x00;      // EEPROM > XDATA schalten
15
  EA = ea_save;      // Interrupts wiederherstellen
16
  return (val);      // IDATA > XDATA zurückgeben
17
}
18
19
void EEPROM_wr(uC8 xdata *address, uC8 val)
20
{
21
  bit ea_save = EA;           // Interruptstatus zwischenspeichern
22
  EA = 0;        // und ausschalten
23
  //WD_ACK();      // falls Watchdog verwendet wird, vorher ruhigstellen
24
  EECON = 0x02;      // auf EEPROM mappen
25
  *address = val;            // Pointer auf EEPROM beschreiben
26
  EECON = 0x52;      // Schreibsequenz einleiten (Datenblatt S.40)
27
  EECON = 0xA2;      // Schreibsequenz vollenden
28
  while (EECON & 0x01);         // warten bis EEPROM zu Ende geschrieben wurde...
29
  EECON = 0x00;             // EEPROM > XDATA schalten
30
  EA = ea_save;             // Interruptstatus wiederherstellen
31
}
32
33
void EEPROM_wr_block(uC8 xdata *address, uC8 data *daten, uC8 length)
34
{
35
  uC8 k;      // Zähler für Anzahl Datenbytes
36
  bit ea_save = EA;           // Interruptstatus zwischenspeichern
37
  EA = 0;        // und ausschalten
38
  EECON = 0x02;      // auf EEPROM mappen
39
  for (k=0; k < length; k++)
40
  {
41
    *address = daten[k];  // Pointer auf EEPROM beschreiben
42
    EECON = 0x52;    // Schreibsequenz einleiten (nicht wie Datenblatt S.40)
43
    EECON = 0xA2;    // Schreibsequenz vollenden
44
    while (EECON & 0x01); // warten bis EEPROM zuende geschrieben wurde...
45
      *address++;           // nächsten Wert vorbereiten
46
  }
47
  EECON = 0x00;     // EEPROM > XDATA schalten
48
  EA = ea_save;     // Interruptstatus wiederherstellen
49
}
50
51
void EEPROM_rd_block(uC8 xdata *address, uC8 data *daten, uC8 length)
52
{
53
  // Auf EEPROM umschalten, einzelnes Byte aus EEPROM lesen und im 
54
  // RAM (IDATA, nicht XDATA) lagern,
55
  // dann auf XDATA zurückschalten und von IDATA nach XDATA zurückgeben
56
  uC8 k;        // Zähler für Anzahl
57
  bit ea_save = EA;             // Interrupts speichern
58
  EA = 0;        // Interrupts ausschalten
59
  EECON = 0x02;      // XDATA > EEPROM schalten
60
  for (k=0; k < length; k++)
61
  {
62
    daten[k] = *address;  // Pointer auf EEPROM lesen
63
      *address++;           // nächsten Wert vorbereiten
64
  }
65
  EECON = 0x00;      // EEPROM > XDATA schalten
66
  EA = ea_save;      // Interrupts wiederherstellen
67
  return;      
68
}

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.