In dem Projekt der Uhr mit 12bit RGB-LED-Ring wurde ein fertiges RTC-Modul (DS1307) für den Arduino verwendet. Manche Anwendungen sind jedoch auf niedrigen Stromverbrauch getrimmt und benötigen daher bessere Lösungen. Hierbei ist der kleine PCF8563-Chip nützlich. In den folgenden Versuchen wird ohne jegliche Backup-Stromversorgung gearbeitet, d.h. sobald der Strom abgestellt ist, dann hört der PCF8563 auf zu zählen. Im späteren Betrieb empfiehlt sich jedoch eine Notstromversorgung des Moduls, damit dieses auch beim Stromausfall weiterzählen kann, z.B. in Form einer CR2032-Batterie.
Modul | IStandby | Iaktiv | Speicher (Bytes) | VCC | Laufzeit1 | Genauigkeit2 |
---|---|---|---|---|---|---|
DS1307 | 200 µA | 1500 µA | 56 | 4,5-5,5 V | 24d | 14 |
DS3231 | 685 µA | 200 µA | 0 | 2,3-5,5 V | 7d | 2 |
PCF8583 | 10-50 µA | 200 µA | 240 | 1-6 V | 166d | 20 |
PCF8563 | 0,5 µA | 200 µA | 0 | 1-5,5 V | 10000d | 20 |
1 in Tagen; gemessen an einer 120mAh-Batterie
2 in ppm (parts per million), z.B. 14ppm entspricht einer Abweichung von mehr als 7 Minuten pro Jahr
Nr. | Pin | Beschreibung |
---|---|---|
1 | OSCI | Eingang für Taktgeber (Oscillator = Quarz) |
2 | OSCO | Ausgang für Taktgeber (Oscillator = Quarz) |
3 | INT | Interrupt-Ausgang (active LOW) |
4 | VSS (GND) | Masse / 0V |
5 | SDA | Signal für serial data |
6 | SCL | Signal für serial clock |
7 | CLKOUT | Ausgang des Taktes |
8 | VDD (VCC) | Spannungsversorgung |
Zunächst kann man einen generellen Test des Moduls durchführen, indem man beispielsweise dessen Takt misst. Dafür baut man eine Schaltung nach dem folgenden Plan auf und misst entweder mit dem Multimeter (Frequenz/Hz) oder einem Oszilloskop die Frequenz, die am Pin 7 (CLKOUT) anliegt. Es sollten im Idealfall 32,768KHz messbar sein.
In diesem Versuch wird das Register CLKOUT_CONTROL
an der Adresse 0x0D
überschrieben, so dass ein Takt von 1Hz anliegt. Um dies zu visualisieren, wird eine LED (inkl. Vorwiderstand)
an den Pin 7 (CLKOUT) angeschlossen. Die folgenden Binärwerte ändern den Takt entsprechend am CLKOUT:
Wert | Frequenz |
---|---|
B10000000 | 32,768 kHz (default) |
B10000001 | 1024 Hz |
B10000010 | 32 Hz |
B10000011 | 1 Hz |
#include <Wire.h>
#define RTCAddWrite (0xA2 >> 1)
#define RTCAddRead 0xA3
void setup()
{
Wire.setClock(400000); // set the I²C SCL to 400kHz
Wire.begin();
delay(1000);
Wire.beginTransmission(RTCAddWrite);
Wire.write(0x0D); // point to the CLKOUT_CONTROL register
Wire.write(B10000011); // set CLKOUT_CONTROL to 1Hz
Wire.endTransmission();
}
void loop() {}
Um das Datum und die Uhrzeit im PCF8563 zu setzen bzw. wieder auszulesen, werden verschiedene Register abgefragt, die im Datenblatt des Chips nachgelesen werden können. Hier wird allerdings zum besseren Verständnis die Library PCF8563-Arduino verwendet.
siehe: Schreiben eines Registers
#include <PCF8563.h>
PCF8563 pcf;
void setup()
{
Serial.begin(9600);
pcf.init();
pcf.stopClock();
// set datetime to 2020-09-22 21:09:50
pcf.setYear(20);
pcf.setMonth(9);
pcf.setDay(22);
pcf.setHour(21);
pcf.setMinut(9);
pcf.setSecond(50);
pcf.startClock();
}
void loop()
{
Time nowTime = pcf.getTime();
Serial.print(nowTime.year);
Serial.print("-");
prnNum(nowTime.month);
Serial.print("-");
prnNum(nowTime.day);
Serial.print(" ");
prnNum(nowTime.hour);
Serial.print(":");
prnNum(nowTime.minute);
Serial.print(":");
prnNum(nowTime.second);
Serial.println("");
delay(1000);
}
void prnNum(int num)
{
if (num < 10) {
Serial.print("0");
}
Serial.print(num);
}