Difference between revisions of "AVR Embedded Tutorial - EEPROM/de"

From Free Pascal wiki
(Daten lesen)
(Beispiel)
 
(7 intermediate revisions by 2 users not shown)
Line 1: Line 1:
{{Translate}}
+
{{LanguageBar}}
  
 
=Daten in den EEPROM speichern und lesen.=
 
=Daten in den EEPROM speichern und lesen.=
Line 8: Line 8:
 
* [[AVR Embedded Tutorial - UART/de|UART]] ''UARTInit'' und ''UARTSendString(...''
 
* [[AVR Embedded Tutorial - UART/de|UART]] ''UARTInit'' und ''UARTSendString(...''
  
== Daten speichern ==
+
==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.
 
Die zwei Zeilen mit '''EECR''' müssen getrennt sein, ansonsten wird nicht geschrieben.
 
<syntaxhighlight lang="pascal">
 
<syntaxhighlight lang="pascal">
   procedure EEPROM_write(uiAddress: int16; ucData: byte);
+
   procedure EEPROM_write(Address: int16; Data: byte);
 
   begin
 
   begin
 
      
 
      
Line 18: Line 22:
 
     end;
 
     end;
  
     EEAR := uiAddress;
+
     EEAR := Address;
     EEDR := ucData;
+
     EEDR := Data;
     EECR := EECR or (1 shl EEMPE);
+
     EECR := EECR or (1 shl EEMPE); // Es müssen 2 Zeilen sein !
 
     EECR := EECR or (1 shl EEPE);
 
     EECR := EECR or (1 shl EEPE);
 
   end;
 
   end;
Line 26: Line 30:
 
{{Note|Die zwei Zeilen mit '''EECR''' müssen getrennt sein, ansonsten wird nichts geschrieben !}}
 
{{Note|Die zwei Zeilen mit '''EECR''' müssen getrennt sein, ansonsten wird nichts geschrieben !}}
  
== Daten lesen ==
+
=== Daten lesen ===
 
<syntaxhighlight lang="pascal">
 
<syntaxhighlight lang="pascal">
   function EEPROM_read(uiAddress: int16): byte;
+
   function EEPROM_read(Address: int16): byte;
 
   begin
 
   begin
  
Line 35: Line 39:
 
     end;
 
     end;
  
     EEAR := uiAddress;
+
     EEAR := Address;
 
     EECR := EECR or (1 shl EERE);
 
     EECR := EECR or (1 shl EERE);
     Result := EEDR;
+
     Result := EEDR; // Zeichen auslesen
 
   end;
 
   end;
 
</syntaxhighlight>
 
</syntaxhighlight>
Line 94: Line 98:
 
   until 1 = 2;
 
   until 1 = 2;
 
end.
 
end.
 +
</syntaxhighlight>
 +
 +
== Überprüfen mit AVRDude ==
 +
Die geschriebenen Daten können auch mit AVRDude überprüft werden.<br>
 +
Da sieht man das geschrieben '''Hello World !'''.<br>
 +
Bei mir funktioniert dies nicht über den USB vom Arduino, ich konnte es nur mit einem USBasp testen.
 +
 +
 +
<syntaxhighlight lang="text">
 +
$ 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>
 
</syntaxhighlight>
 
</syntaxhighlight>
  
 
== Siehe auch ==
 
== Siehe auch ==
* Übersichtseite [[AVR Embedded Tutorial/de]]
+
* Übersichtseite [[AVR Embedded Tutorial/de|AVR Embedded Tutorial]]
 +
 
 +
Autor: [[User:Mathias|Mathias]]
  
[[Category:Embedded]]
 
 
[[Category:AVR]]
 
[[Category:AVR]]
 
[[Category:Arduino]]
 
[[Category:Arduino]]
 +
[[Category:Embedded]]
 +
[[Category:Tutorials]]
 +
{{AutoCategory}}

Latest revision as of 16:14, 10 June 2020

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;
Note-icon.png

Hinweis: Die zwei Zeilen mit EECR müssen getrennt sein, ansonsten wird nichts geschrieben !

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

Autor: Mathias