AVR Embedded Tutorial - I²C External-Clock/de

From Free Pascal wiki
Jump to navigationJump to search
The printable version is no longer supported and may have rendering errors. Please update your browser bookmarks and please use the default browser print function instead.

Deutsch (de) English (en)

I²C Externe Uhr DS3231

Vorwort

Dieser Code ist für einen Atmega328/Arduino mit 16MHz und einem Uhrenbaustein DS3231.

Die folgende Funktionen, sind in folgenden Tutorials beschrieben:

Beschreibung

Dieses Beispiel zeigt, wie man den Uhrenbaustein DS3231 anspricht, welcher am I²C-Bus hängt.

PulUp-Widerstände sind nötig, der DS3231 enthält keine.

Funktionen für die DS3231 Ansteuerung.

Konstanten

const
  I2CAddr   = $68; // Defaultadresse des DS3231.
  TWI_Write = 0;
  TWI_Read  = 1;

Record für die Zeitspeicherung.

type
  TDate = record
    year: uint16;
    month, day, hour, minute, second, dayOfTheWeek: uint8;
  end;
var
  Date: TDate;

Funktionen

Umwandlung von BCD --> BIN, BIN --> BCD.

Dies wird benötigt, das der im BCD-Format angesprochen wird.

  function bcd2bin(val: uint8): uint8;
  begin
    Result := val - 6 * (val shr 4);
  end;

  function bin2bcd(val: uint8): uint8;
  begin
    Result := val + 6 * (val div 10);
  end;

Baustein mit einer Zeit beschreiben. Dabei sieht man, das man das Format umwandeln muss.

  procedure WriteDS3231(addr: UInt16);
  begin
    TWIStart((addr shl 1) or TWI_Write);
    TWIWrite(0);
    TWIWrite(bin2bcd(Date.second));
    TWIWrite(bin2bcd(Date.minute));
    TWIWrite(bin2bcd(Date.hour));
    TWIWrite(bin2bcd(0));
    TWIWrite(bin2bcd(Date.day));
    TWIWrite(bin2bcd(Date.month));
    TWIWrite(bin2bcd(Date.year - 2000));
    TWIStop;
  end;

Die Zeit aus dem Baustein auslesen.

  procedure ReadDS3231(addr: UInt16);
  begin
    TWIStart((addr shl 1) or TWI_Write);
    TWIWrite(0);
    TWIStop;

    TWIStart((addr shl 1) or TWI_Read);
    Date.second := bcd2bin(TWIReadACK_Error and $7F);
    Date.minute := bcd2bin(TWIReadACK_Error);
    Date.hour   := bcd2bin(TWIReadACK_Error);

    TWIReadACK_Error;

    Date.day   := bcd2bin(TWIReadACK_Error);
    Date.month := bcd2bin(TWIReadACK_Error);
    Date.year  := bcd2bin(TWIReadNACK_Error) + 2000;

    TWIStop;
  end;

Beispiel

Variablen

var
  s: ShortString;

Hauptprogramm

Die Zeit muss man nur in den DS3231 schreiben, wen man die Uhr richten will.

begin
  UARTInit;     // UART inizialisieren
  TWIInit;      // I²C  inizialisieren
  asm Sei end;

  // Eine Zeit in den DS3231 schreiben.
  Date.second := 33;
  Date.minute := 22;
  Date.hour   := 11;
  WriteDS3231(I2CAddr);

  // Zeit auslesen und über UART ausgeben.
  repeat
    ReadDS3231(I2CAddr);

    str(Date.second: 6, s);
    UARTSendString('Sec: ' + s);
    str(Date.minute: 6, s);
    UARTSendString(' Minute: ' + s);
    str(Date.hour: 6, s);
    UARTSendString(' Stunden: ' + s);

    UARTSendString(#13#10);
  until 1 = 2;
end.

Siehe auch

Autor: Mathias