Difference between revisions of "AVR Embedded Tutorial - I²C External-Clock/de"
From Lazarus wiki
Jump to navigationJump to search (Created page with "{{Translate}} =I²C EEPROM (24LC256)= ==Vorwort== Dieser Code ist für einen '''Atmega328/Arduino''' mit '''16MHz''' und einem Uhrenbaustein '''DS3231'''.<br> Die folgende...") |
|||
Line 1: | Line 1: | ||
{{Translate}} | {{Translate}} | ||
− | =I²C | + | =I²C Externe Uhr DS3231= |
==Vorwort== | ==Vorwort== |
Revision as of 18:37, 28 October 2018
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 DS3131 Ansteuerung.
Konstanten
const
I2CAddr = $68; // Defaultadresse des DS3131.
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 DA3231 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