AVR Embedded Tutorial - EEPROM/de
│ Deutsch (de) │ English (en) │
Daten in den EEPROM speichern und lesen.
Vorwort
Dieser Code ist für einen Atmega328/Arduino mit 16MHz. Wie man die UART ansteuert, steht hier:
- UART UARTInit und UARTSendString(...
Auf das EEPROM zugreifen
Über Address kann man auf jedes einzelne Byte im EEPROM zugreifen. Somit hat man die Möglichkeit jedes Zeichen einzeln zu lesen und schreiben.
Daten speichern
Die zwei Zeilen mit EECR müssen getrennt sein, ansonsten wird nicht geschrieben.
procedure EEPROM_write(Address: int16; Data: byte);
begin
// Prüfen, ob bereit zum schreiben.
while (EECR and (1 shl EEPE)) <> 0 do begin
end;
EEAR := Address;
EEDR := Data;
EECR := EECR or (1 shl EEMPE); // Es müssen 2 Zeilen sein !
EECR := EECR or (1 shl EEPE);
end;
Daten lesen
function EEPROM_read(Address: int16): byte;
begin
// Prüfen, ob bereit zum Lesen.
while (EECR and (1 shl EEPE)) <> 0 do begin
end;
EEAR := Address;
EECR := EECR or (1 shl EERE);
Result := EEDR; // Zeichen auslesen
end;
Beispiel
Beispielcode, der zeigt, wie man Daten schreibt und lest.
const
sc = 'Hello World !';
var
i: integer;
s: shortstring;
begin
UARTInit;
// String schreiben, inklusive Längenbyte.
for i := 0 to Length(sc) do begin
EEPROM_write(i, byte(sc[i]));
end;
// String lesen, inklusive Längenbyte.
SetLength(s, EEPROM_read(0)); // Länge auslesen.
for i := 1 to Length(s) do begin
s[i] := char(EEPROM_read(i));
end;
repeat
UARTSendString(s);
UARTSendString(#13#10);
until 1 = 2;
end.
Wen der erste Code einmal ausgeführt wurde, kann man mit dem zweiten Code gut sehen, das das Hello World ! im EEPROM gespeichert ist, auch wen man den ATmega in der Zwischenzeit vom Strom getrennt wurde.
var
i: integer;
s: shortstring;
begin
UARTInit;
// String lesen, inklusive Längenbyte.
SetLength(s, EEPROM_read(0)); // Länge auslesen.
for i := 1 to Length(s) do begin
s[i] := char(EEPROM_read(i));
end;
repeat
UARTSendString(s);
UARTSendString(#13#10);
until 1 = 2;
end.
Überprüfen mit AVRDude
Die geschriebenen Daten können auch mit AVRDude überprüft werden.
Da sieht man das geschrieben Hello World !.
Bei mir funktioniert dies nicht über den USB vom Arduino, ich konnte es nur mit einem USBasp testen.
$ avrdude -patmega328p -cusbasp -t
avrdude: warning: cannot set sck period. please check for usbasp firmware update.
avrdude: AVR device initialized and ready to accept instructions
Reading | ################################################## | 100% 0.00s
avrdude: Device signature = 0x1e950f (probably m328p)
avrdude> d ee
>>> d ee
0000 0d 48 65 6c 6c 6f 20 57 6f 72 6c 64 20 21 ff ff | Hello World !..|
0010 ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff |................|
0020 ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff |................|
0030 ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff |................|
avrdude>
Siehe auch
- Übersichtseite AVR Embedded Tutorial
Autor: Mathias