AVR Embedded Tutorial - I²C External-Clock/de
From Free Pascal wiki
Jump to navigationJump to search
│ 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:
- Delay
- UART, Serielle Schnittstelle
- I²C-Bus ansteuern oder AVR Embedded Tutorial - Software I2C, TWI/de
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
- Übersichtseite AVR Embedded Tutorial
Autor: Mathias