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 | }
|