LK-RTC: Unterschied zwischen den Versionen

Aus Linkerkit.de

Wechseln zu: Navigation, Suche
(Codebeispiel Raspberry)
Zeile 1: Zeile 1:
 
==Bild==
 
==Bild==
[[Datei:LK-RTC.png|358x358px|none]]
+
[[Datei:LK-RTC.png|none|358x358px]]
  
 
==Technische Daten / Kurzbeschreibung==
 
==Technische Daten / Kurzbeschreibung==
Zeile 116: Zeile 116:
  
 
==Raspberry Installation==
 
==Raspberry Installation==
 
 
Zunächst muss die Echtzeituhr an den I2C-Port des Raspberry-Linkerkit-Shields angeschlossen werden.
 
Zunächst muss die Echtzeituhr an den I2C-Port des Raspberry-Linkerkit-Shields angeschlossen werden.
Als nächstes muss über die Kommandozeile das I2C-System installiert werden:
+
 
 +
 Als nächstes muss über die Kommandozeile das I2C-System installiert werden:
  
 
<pre class="brush:bash">sudo apt-get install i2c-tools
 
<pre class="brush:bash">sudo apt-get install i2c-tools
sudo bash
 
 
</pre>
 
</pre>
  
 
Nun muss festgelegt werden, dass die benötigten Module auch beim Systemstart geladen werden:
 
Nun muss festgelegt werden, dass die benötigten Module auch beim Systemstart geladen werden:
  
<pre class="brush:bash">nano /etc/modules</pre>
+
<pre class="brush:bash">sudo nano /etc/modules</pre>
 
+
 
Hier tragen wir folgende Module ein:
 
Hier tragen wir folgende Module ein:
''snd-bcm2835''
 
''spi-bcm2708''
 
''i2c-bcm2708''
 
''i2c-dev''
 
''rtc-ds1307''
 
  
Folgende Module müssen nun aktiviert werden:
+
<pre class="brush:bash"><em>i2c-dev (Dieses Modul kann schon eingetragen sein)<br />snd-bcm2835<br />snd-bcm2837<br />spi-bcm2708<br />i2c-bcm2708</em><br /><em>rtc-ds1307</em></pre>
 +
Speichern Sie die Änderungen mit STRG + O ab. Anschließend Drücken Sie STRG + X um die Bearbeitung der Datei zu verlassen.
  
<pre class="brush:bash">modprobe i2c_bcm2708
+
 
modprobe i2c_dev
+
Nun müssen folgende Module aktiviert werden, geben Sie diese Befehle einfach in der Konsole ein:
modprobe rtc_ds1307</pre>
+
 
 +
<pre class="brush:bash">sudo modprobe i2c_bcm2708
 +
sudo modprobe i2c_dev
 +
sudo modprobe rtc_ds1307</pre>
  
 
Nun lassen wir das System nach einem I2C-Gerät suchen.
 
Nun lassen wir das System nach einem I2C-Gerät suchen.
 +
 
<pre class="brush:bash">i2cdetect -y 1</pre>
 
<pre class="brush:bash">i2cdetect -y 1</pre>
  
 
Das Ergebnis sollte so aussehen:
 
Das Ergebnis sollte so aussehen:
 +
 
<pre class="code">     
 
<pre class="code">     
 
0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f
 
0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f
Zeile 158: Zeile 157:
 
Dies bedeutet, das die Uhr unter der Adresse 68 gefunden wurde.
 
Dies bedeutet, das die Uhr unter der Adresse 68 gefunden wurde.
  
Die Uhr kann nun in das System eingebunden werden.
 
<pre class="brush:bash">echo ds1307 0x68 > /sys/class/i2c-adapter/i2c-1/new_device</pre>
 
  
Mit folgendem Befehl kann die aktuelle Uhrzeit ausgelesen werden:
+
Nun müssen wir noch die Datei rc.local bearbeiten:
<pre class="brush:bash">hwclock -r</pre>
+
  
Und mit diesem Befehl kann die aktuelle Systemzeit in die Echtzeituhr gespeichert werden:
+
<pre class="brush:bash">sudo nano /etc/rc.local</pre>
<pre class="brush:bash">hwclock -w</pre>
+
Damit die Uhrzeit bei jedem Neustart vom LK-RTC Modul ausgelesen wird, müssen wir folgende Zeilen in der rc.local Datei hinzufügen:
 +
 
 +
<pre class="brush:bash">echo ds1307 0x68 > /sys/class/i2c-adapter/i2c-1/new_device<br />hwclock -w</pre>
 +
 
 +
Mit folgendem Befehl in der Konsole kann die aktuelle Uhrzeit ausgelesen werden:
 +
 
 +
<pre class="brush:bash">hwclock -r</pre>
  
 
==Downloads==
 
==Downloads==

Version vom 22. Februar 2017, 13:45 Uhr

Bild

LK-RTC.png

Technische Daten / Kurzbeschreibung

Linker Kit Platine mit RTC (Echtzeituhr), ohne Batterie. Das RTC Modul basiert auf dem Uhr-Chip DS1307, welches das I2C Protokoll unterstützt. Für eine genaue Anzeige benötigt man eine Lithium Zellen Batterie(CR1225). Die Uhr liefert Sekunden, Minuten, Stunden, Tage, Monat und Jahr. Das Modul liefert das richtige Datum trotz Monate die weniger als 31 Tage haben, zusätzlich werden Schaltjahre berücksichtigt. Die Uhr arbeitet im 24 Stunden oder im 12 Stunden Format mit einer AM/PM Anzeige. Und sie ist gültig bis 2100. Wenn das Modul nur mit der primären Stromversorgung versorgt wird, funktioniert das Modul nicht richtig, weil der Kristall nicht schwingen kann.

Spezifikation

Maße: 42,1 × 24,2 × 10,6mm
Gewicht: 3,8g
IO Struktur: SCL,SDA,VCC,GND
ROHS: Ja
Vcc:4,5 ~ 5,5V
Logik High Level Eingang:2,2 - Vcc+0,3V
Logik Low Level Eingang:-0,3 - +0,8V
Batterie Spannung:2,0 - 3,5V

Codebeispiel Arduino

#include  "Wire.h"
#define  DS1307_I2C_ADDRESS  0x68 // Das ist die I2C Adresse
// Globale Variablen
int command = 0; // Das ist der Befehl char, in ascii Form, aus dm seriellen Port gesendet 
byte zero=0; 
byte second, minute, hour, dayOfWeek, dayOfMonth, month, year;
byte test;
 
byte decToBcd(byte val) 
{
   return ( (val/10*16) + (val%10) );
}
// Konventiert BCD-Code Zahlen zu normalen Dezimalzahlen
byte bcdToDec(byte val) 
{
  return ( (val/16*10) + (val%16) );
}
 
void setDateDs1307(void)
{
  second = (byte) ((Serial.read() - 48) * 10 + (Serial.read() - 48)); 
  minute = (byte) ((Serial.read() - 48) *10 +  (Serial.read() - 48));
  hour  = (byte) ((Serial.read() - 48) *10 +  (Serial.read() - 48));
  dayOfWeek = (byte) (Serial.read() - 48);
  dayOfMonth = (byte) ((Serial.read() - 48) *10 +  (Serial.read() - 48));
  month = (byte) ((Serial.read() - 48) *10 +  (Serial.read() - 48));
  year= (byte) ((Serial.read() - 48) *10 +  (Serial.read() - 48));
  Wire.beginTransmission(DS1307_I2C_ADDRESS);
  Wire.write(zero);
  Wire.write(decToBcd(second));    // 0 bis bit 7 startet die Uhr
  Wire.write(decToBcd(minute));
  Wire.write(decToBcd(hour));      // Wenn Sie eine 12 Stunden Uhr (am/pm) haben wollen, müssen Sie
                                  // Bit 6 setzten (Es muss readDateDS1307 verändert werden)
  Wire.write(decToBcd(dayOfWeek));
  Wire.write(decToBcd(dayOfMonth));
  Wire.write(decToBcd(month));
  Wire.write(decToBcd(year));
  Wire.endTransmission();
}
 
 // Ruft das Datum und die Uhrzeit aus dem DS1307 
void getDateDs1307() 
{
 // Registerzeiger wird zurückgesetzt
 Wire.beginTransmission(DS1307_I2C_ADDRESS);
 Wire.write(zero);
 Wire.endTransmission();
 Wire.requestFrom(DS1307_I2C_ADDRESS, 7);
 // Einige von diesen benötigen Masken, weil bestimmte Bits Steuerbits sind.
 second     = bcdToDec(Wire.read() & 0x7f);
 minute     = bcdToDec(Wire.read());
 hour       = bcdToDec(Wire.read() & 0x3f);  // Dies muss verändert werden,
                                             // wenn der 12Stunden Modus(am/pm) eingeschaltet ist
 dayOfWeek  = bcdToDec(Wire.read());
 dayOfMonth = bcdToDec(Wire.read());
 month      = bcdToDec(Wire.read());
 year       = bcdToDec(Wire.read());
 
 Serial.print(hour, DEC);
 Serial.print(":");
 Serial.print(minute, DEC);
 Serial.print(":");
 Serial.print(second, DEC);
 Serial.print("  ");
 Serial.print(month, DEC);
 Serial.print("/");
 Serial.print(dayOfMonth, DEC);
 Serial.print("/");
 Serial.print(year, DEC);
 Serial.println("  ");
}
 
void setup() 
{
  Wire.begin();
  Serial.begin(9600); 
} 
void loop()
{
  delay(2000);
  /*T(00-59)(00-59)(00-23)(1-7)(01-31)(01-12)(00-99) - T(sec)(min)(hour)(dayOfWeek)(dayOfMonth)(month)(year)
  - T stellt das Datum des RTC DS1307 Chip. 
   Beispiel zum setzten der Zeit für 02-DEC-10 @ 19:57:11 für den dritten Wochentag, senden Sie diesen Befehl
   - T1157193021210
  */
    if (Serial.available()) 
    {      // Wenn es festgestellt wurde, geben Sie char in der seriellen Warteschlange und Prozess
     command = Serial.read();
     if (command == 84)
     {      //Wenn command = "T" setze Datum
       setDateDs1307();
       getDateDs1307();
       Serial.println(" ");
     }
     while(1)
     {
       getDateDs1307();
       delay(1000);
     }
  }
}

Raspberry Installation

Zunächst muss die Echtzeituhr an den I2C-Port des Raspberry-Linkerkit-Shields angeschlossen werden.

 Als nächstes muss über die Kommandozeile das I2C-System installiert werden:

sudo apt-get install i2c-tools

Nun muss festgelegt werden, dass die benötigten Module auch beim Systemstart geladen werden:

sudo nano /etc/modules

Hier tragen wir folgende Module ein:

<em>i2c-dev (Dieses Modul kann schon eingetragen sein)<br />snd-bcm2835<br />snd-bcm2837<br />spi-bcm2708<br />i2c-bcm2708</em><br /><em>rtc-ds1307</em>

Speichern Sie die Änderungen mit STRG + O ab. Anschließend Drücken Sie STRG + X um die Bearbeitung der Datei zu verlassen.


Nun müssen folgende Module aktiviert werden, geben Sie diese Befehle einfach in der Konsole ein:

sudo modprobe i2c_bcm2708
sudo modprobe i2c_dev
sudo modprobe rtc_ds1307

Nun lassen wir das System nach einem I2C-Gerät suchen.

i2cdetect -y 1

Das Ergebnis sollte so aussehen:

     
0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f
00:          -- -- -- -- -- -- -- -- -- -- -- -- --
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
60: -- -- -- -- -- -- -- -- 68 -- -- -- -- -- -- --
70: -- -- -- -- -- -- -- --

Dies bedeutet, das die Uhr unter der Adresse 68 gefunden wurde.


Nun müssen wir noch die Datei rc.local bearbeiten:

sudo nano /etc/rc.local

Damit die Uhrzeit bei jedem Neustart vom LK-RTC Modul ausgelesen wird, müssen wir folgende Zeilen in der rc.local Datei hinzufügen:

echo ds1307 0x68 > /sys/class/i2c-adapter/i2c-1/new_device<br />hwclock -w

Mit folgendem Befehl in der Konsole kann die aktuelle Uhrzeit ausgelesen werden:

hwclock -r

Downloads

Infos:
Englisch: 001267860-da-01-en-linker_kit_platine_mit_rtc_echtzeituhr_.pdf

Schaltung: 001267860-sp-01-en-linker_kit_platine_mit_rtc_echtzeituhr_.pdf