AVR Embedded Tutorial - I²C EEPROM/de
From Free Pascal wiki
Jump to navigationJump to search
I²C / TWI
Vorwort
Dieser Code ist für einen Atmega328/Arduino mit 16MHz. Wie man das Delay macht, siehe hier:
Wie man die UART ansteuert, steht hier:
- UART UARTInit und UARTSendString(...
Wie man den I²C-Bus ansteuert, steht hier:
Beschreibung
Dieses Beispiel zeigt, wie man externe EEPROM (24LC256) ansteuert, welche am I²C-Bus hängen.
PulUp-Widerstände sind nötig, der EEPROM enthält keine.
Hinweis: Anmerkung: Wenn die Slave-Adresse falsch ist, bleibt das Programm in der TWIRead-Funktion hängen !
Funktionen für 24LC256 Ansteuerung.
procedure I2C_EEPROM_Write(addr, pos: Int16; b:Byte);
begin
TWIStart((addr shl 1) or TWI_Write);
TWIWrite(pos shr 8);
TWIWrite(pos and $FF);
TWIWrite(b);
TWIStop;
delay_ms(10);
end;
procedure I2C_EEPROM_WriteString(addr, pos: Int16; s:ShortString);
var
i:Byte;
begin
for i := 0 to Length(s) do begin
I2C_EEPROM_Write(addr, pos + i, Byte(s[i]));
end;
end;
function I2C_EEPROM_Read(addr, pos: Int16):Byte;
begin
TWIStart((addr shl 1) or TWI_Write);
TWIWrite(pos shr 8);
TWIWrite(pos and $FF);
TWIStart((addr shl 1) or TWI_Read);
Result := TWIReadNACK;
TWIStop;
end;
function I2C_EEPROM_ReadString(addr, pos: Int16):ShortString;
var
i, l:Byte;
begin
l := I2C_EEPROM_Read(addr, pos);
SetLength(Result, l);
for i := 1 to l do begin
Result[i] := Char(I2C_EEPROM_Read(addr, pos + i));
end;
end;
Beispiel
Konstanten
const
I2Caddr = $54; // Adresse des 24LC256
TWI_Write = 0;
TWI_Read = 1;
s1 = 'Hello World !';
s2 = 'AVR mit Lazarus ist so schön';
24LC256 spezifischen Code
const
TWI_Write = 0;
TWI_Read = 1;
procedure I2C_EEPROM_Write(addr, pos: Int16; b:Byte);
begin
TWIStart((addr shl 1) or TWI_Write);
TWIWrite(pos shr 8);
TWIWrite(pos and $FF);
TWIWrite(b);
TWIStop;
delay_ms(10);
end;
procedure I2C_EEPROM_WriteString(addr, pos: Int16; s:ShortString);
var
i:Byte;
begin
for i := 0 to Length(s) do begin
I2C_EEPROM_Write(addr, pos + i, Byte(s[i]));
end;
end;
function I2C_EEPROM_Read(addr, pos: Int16):Byte;
begin
TWIStart((addr shl 1) or TWI_Write);
TWIWrite(pos shr 8);
TWIWrite(pos and $FF);
TWIStart((addr shl 1) or TWI_Read);
Result := TWIReadNACK;
TWIStop;
end;
function I2C_EEPROM_ReadString(addr, pos: Int16):ShortString;
var
i, l:Byte;
begin
l := I2C_EEPROM_Read(addr, pos);
SetLength(Result, l);
for i := 1 to l do begin
Result[i] := Char(I2C_EEPROM_Read(addr, pos + i));
end;
end;
Beispiel
const
s1 = 'Hello World !';
s2 = 'AVR mit Lazarus ist so schön';
var
s: ShortString;
begin
asm
Cli
end;
UARTInit;
TWIInit;
asm
Sei
end;
I2C_EEPROM_WriteString(I2Caddr, 0, s1);
I2C_EEPROM_WriteString(I2Caddr, $100, s2);
repeat
s := I2C_EEPROM_ReadString(I2Caddr, 0);
UARTSendString('s1: ');
UARTSendString(s);
UARTSendString(s + #13#10);
s := I2C_EEPROM_ReadString(I2Caddr, $100);
UARTSendString('s2: ');
UARTSendString(s);
UARTSendString(s + #13#10);
until 1 = 2;
end.
Siehe auch
- Übersichtseite AVR Embedded Tutorial/de
Autor: Mathias