AVR Embedded Tutorial - I²C EEPROM/de

From Free Pascal wiki
Revision as of 19:08, 24 March 2018 by Mathias (talk | contribs) (Created page with " {{Translate}} =I²C / TWI= ==Vorwort== Dieser Code ist für einen Atmega328/Arduino mit 16MHz. Wie man das Delay macht, siehe hier: * AVR Embedded Tutorial - Delays/de|De...")
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)
Jump to navigationJump to search

Template:Translate

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.

Light bulb  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

Autor: Mathias