AVR Embedded Tutorial - I²C External-Clock/de
From Free Pascal wiki
Jump to navigationJump to searchThe 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:
- 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