Difference between revisions of "AVR Embedded Tutorial - I²C External-Clock/de"

From Free Pascal wiki
Jump to navigationJump to search
(Fixed template loop; syntax highlighting; modded categories to German; added language category)
Line 1: Line 1:
{{Translate}}
+
{{LanguageBar}}
 +
 
 
=I²C Externe Uhr DS3231=
 
=I²C Externe Uhr DS3231=
  
 
==Vorwort==
 
==Vorwort==
  
Dieser Code ist für einen '''Atmega328/Arduino''' mit '''16MHz''' und einem Uhrenbaustein '''DS3231'''.<br>
+
Dieser Code ist für einen '''Atmega328/Arduino''' mit '''16MHz''' und einem Uhrenbaustein '''DS3231'''.
  
 
Die folgende Funktionen, sind in folgenden Tutorials beschrieben:
 
Die folgende Funktionen, sind in folgenden Tutorials beschrieben:
 +
 
* [[AVR Embedded Tutorial - Delays/de|Delay]]
 
* [[AVR Embedded Tutorial - Delays/de|Delay]]
 
* [[AVR Embedded Tutorial - UART/de|UART, Serielle Schnittstelle]]
 
* [[AVR Embedded Tutorial - UART/de|UART, Serielle Schnittstelle]]
Line 12: Line 14:
  
 
==Beschreibung==
 
==Beschreibung==
 +
 
Dieses Beispiel zeigt, wie man den Uhrenbaustein DS3231 anspricht, welcher am '''I²C-Bus''' hängt.
 
Dieses Beispiel zeigt, wie man den Uhrenbaustein DS3231 anspricht, welcher am '''I²C-Bus''' hängt.
  
Line 17: Line 20:
  
 
== Funktionen für die DS3131 Ansteuerung. ==
 
== Funktionen für die DS3131 Ansteuerung. ==
 +
 
=== Konstanten ===
 
=== Konstanten ===
<syntaxhighlight>
+
 
 +
<syntaxhighlight lang="pascal">
 
const
 
const
 
   I2CAddr  = $68; // Defaultadresse des DS3131.
 
   I2CAddr  = $68; // Defaultadresse des DS3131.
Line 36: Line 41:
 
</syntaxhighlight>
 
</syntaxhighlight>
  
 +
===Funktionen===
 +
 +
Umwandlung von BCD --> BIN, BIN --> BCD.
  
===Funktionen===
 
Umwandlung von BCD --> BIN, BIN --> BCD.<br>
 
 
Dies wird benötigt, das der im BCD-Format angesprochen wird.
 
Dies wird benötigt, das der im BCD-Format angesprochen wird.
<syntaxhighlight>
+
 
 +
<syntaxhighlight lang="pascal">
 
   function bcd2bin(val: uint8): uint8;
 
   function bcd2bin(val: uint8): uint8;
 
   begin
 
   begin
Line 54: Line 61:
 
Baustein mit einer Zeit beschreiben. Dabei sieht man, das man das Format umwandeln muss.
 
Baustein mit einer Zeit beschreiben. Dabei sieht man, das man das Format umwandeln muss.
  
<syntaxhighlight>
+
<syntaxhighlight lang="pascal">
 
   procedure WriteDS3231(addr: UInt16);
 
   procedure WriteDS3231(addr: UInt16);
 
   begin
 
   begin
Line 71: Line 78:
  
 
Die Zeit aus dem Baustein auslesen.
 
Die Zeit aus dem Baustein auslesen.
<syntaxhighlight>
+
 
 +
<syntaxhighlight lang="pascal">
 
   procedure ReadDS3231(addr: UInt16);
 
   procedure ReadDS3231(addr: UInt16);
 
   begin
 
   begin
Line 92: Line 100:
 
   end;
 
   end;
 
</syntaxhighlight>
 
</syntaxhighlight>
 
  
 
== Beispiel ==
 
== Beispiel ==
  
 
=== Variablen ===
 
=== Variablen ===
<syntaxhighlight>
+
 
 +
<syntaxhighlight lang="pascal">
 
var
 
var
 
   s: ShortString;   
 
   s: ShortString;   
Line 103: Line 111:
  
 
=== Hauptprogramm ===
 
=== Hauptprogramm ===
 +
 
Die Zeit muss man nur in den DS3231 schreiben, wen man die Uhr richten will.
 
Die Zeit muss man nur in den DS3231 schreiben, wen man die Uhr richten will.
<syntaxhighlight>
+
 
 +
<syntaxhighlight lang="pascal">
 
begin
 
begin
 
   UARTInit;    // UART inizialisieren
 
   UARTInit;    // UART inizialisieren
Line 133: Line 143:
  
 
== Siehe auch ==
 
== Siehe auch ==
 +
 
* Übersichtseite [[AVR Embedded Tutorial/de|AVR Embedded Tutorial]]
 
* Übersichtseite [[AVR Embedded Tutorial/de|AVR Embedded Tutorial]]
  
 
Autor: [[User:Mathias|Mathias]]
 
Autor: [[User:Mathias|Mathias]]
  
[[Category:Embedded]]
+
[[Category:AVR/de]]
[[Category:AVR]]
+
[[Category:Arduino/de]]
[[Category:Arduino]]
+
[[Category:Embedded/de]]
 +
[[Category:Tutorials/de]]
 +
{{AutoCategory}}

Revision as of 06:14, 26 January 2020

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

Autor: Mathias