Sign in Join
Wiki copytemporary

AVR Embedded Tutorial - I²C EEPROM/de: what changed

Revision 0 to 1. Removed lines have a minus sign; added lines have a plus sign.

Title: AVR Embedded Tutorial - I²C EEPROM/de

OldNewLine
1+# I²C EEPROM (24LC256)
2+
3+## Vorwort
4+
5+Dieser Code ist für einen **Atmega328/Arduino** mit **16MHz** und **24LC256**.\
6+Es können auch andere **24LCxx** angesteuert werden.
7+
8+Die folgende Funktionen, sind in folgenden Tutorials beschrieben:
9+
10+- [[AVR Embedded Tutorial - Delays/de|Delay]]
11+- [[AVR Embedded Tutorial - UART/de|UART, Serielle Schnittstelle]]
12+- [[AVR Embedded Tutorial - I²C, TWI/de|I²C-Bus ansteuern]] oder [[AVR Embedded Tutorial - Software I2C, TWI/de]]
13+
14+## Beschreibung
15+
16+Dieses Beispiel zeigt, wie man einen externen EEPROM (24LC256) ansteuert, welcher am **I²C-Bus** hängt.
17+
18+**PulUp**-Widerstände sind **nötig**, der EEPROM enthält **keine**.
19+
20+## Funktionen für die EEPROM (24LC256) Ansteuerung.
21+
22+### Konstanten
23+
24+``` pascal
25+const
26+ TWI_Write = 0;
27+ TWI_Read = 1;
28+```
29+
30+### Funktionen
31+
32+**Hinweis:** Bei einem ShortString ist ist das Längen-Byte in ShortString**\[0\]**.
33+
34+Aufrufparameter:
35+
36+- **addr** Geräteadresse am I²C-Bus
37+- **pos** Speicherstelle im EEPROM
38+- **value** Zu schreibendes Byte
39+
40+Funktionen zum schreiben und lesen eines Bytes:
41+
42+``` pascal
43+// Schreibt ein Zeichen
44+procedure I2C_EEPROM_Write(addr, pos: Int16; value: Byte);
45+begin
46+ TWIStart((addr shl 1) or TWI_Write);
47+ TWIWrite(pos shr 8);
48+ TWIWrite(pos and $FF);
49+ TWIWrite(value);
50+ TWIStop;
51+ delay_ms(10);
52+end;
53+
54+// Liest ein Zeichen
55+function I2C_EEPROM_Read(addr, pos: Int16):Byte;
56+begin
57+ TWIStart((addr shl 1) or TWI_Write);
58+ TWIWrite(pos shr 8);
59+ TWIWrite(pos and $FF);
60+ TWIStop;
61+
62+ TWIStart((addr shl 1) or TWI_Read);
63+ Result := TWIReadNACK;
64+ TWIStop;
65+end;
66+```
67+
68+Bei einem String, oder sonstigen Puffer, wird Zeichen für Zeichen geschrieben/gelesen.
69+
70+``` pascal
71+// Schreibt einen String, inklusive LängenByte.
72+procedure I2C_EEPROM_WriteString(addr, pos: Int16; s: ShortString);
73+var
74+ i:Byte;
75+begin
76+ for i := 0 to Length(s) do begin
77+ I2C_EEPROM_Write(addr, pos + i, Byte(s[i]));
78+ end;
79+end;
80+
81+// Liest eine String aus, inklusive LängenByte.
82+function I2C_EEPROM_ReadString(addr, pos: Int16):ShortString;
83+var
84+ i, l:Byte;
85+begin
86+ l := I2C_EEPROM_Read(addr, pos); // Länge des Strings auslesen.
87+ SetLength(Result, l);
88+ for i := 1 to l do begin
89+ Result[i] := Char(I2C_EEPROM_Read(addr, pos + i));
90+ end;
91+end;
92+```
93+
94+## Beispiel
95+
96+### Konstanten und Variablen
97+
98+``` pascal
99+const
100+ I2Caddr = $54; // Adresse des 24LC256 am I²C-Bus
101+ s1 = 'Hello World !';
102+ s2 = 'AVR mit Lazarus ist so schön';
103+
104+var
105+ s: ShortString;
106+```
107+
108+### Hauptprogramm
109+
110+Da ein **ShortString** 256Byte lang ist, wird der zweite String an der Adresse \$100(256) im EEPROM gespeichert.
111+
112+``` pascal
113+begin
114+ UARTInit; // UART inizialisieren
115+ TWIInit; // I²C inizialisieren
116+ asm Sei end;
117+
118+ // Die beiden Strings speichern
119+ I2C_EEPROM_WriteString(I2Caddr, 0, s1); // Erster String
120+ I2C_EEPROM_WriteString(I2Caddr, $100, s2); // Zweiter String
121+
122+ // Die Strings zur Überprüfung wieder laden.
123+ repeat
124+ s := I2C_EEPROM_ReadString(I2Caddr, 0);
125+ UARTSendString('s1: ');
126+ UARTSendString(s);
127+ UARTSendString(#13#10);
128+
129+ s := I2C_EEPROM_ReadString(I2Caddr, $100);
130+ UARTSendString('s2: ');
131+ UARTSendString(s);
132+ UARTSendString(#13#10);
133+ until 1 = 2;
134+end.
135+```
136+
137+Wen man es nicht glaubt, das der String im EEPROM ist, der kann die zwei Zeilen mit WriteString(... ausklammern und so nochmals testen.
138+
139+## Siehe auch
140+
141+- Übersichtseite [[AVR Embedded Tutorial/de|AVR Embedded Tutorial]]
142+
143+Autor: Mathias
144+
145+---
146+*From the Free Pascal wiki, page "AVR Embedded Tutorial - I²C EEPROM/de", as it stood on 2020-03-08 after a change by Trev, out of the wiki's dump of 2024-05-26. Copyright stays with the author who wrote it, according to the old wiki's [[Licensing]] page. If you have concerns about this material, [message the admin](/wiki-contact).*

Back to history