2. Programm zum
Setzen von Zeit und Datum bei der Echtzeituhr PCF8583
/*
Echtzeituhr
PCF 8583 - Zeit einstellen
======================================
In
Ermangelung einer Tastatur werden die gewünschte Zeit und
das Datum in diesem Programm eingetragen,
welches
diese Daten dann zur Echtzeituhr überträgt. Das Jahr
wird 4stellig als gepackte BCD-Angabe in
den
zwei freien RAM-Speichern 0x10 und 0x11 gespeichert. Die
Jahreskennzahl 0-3 wird vom Programm
berechnet.
Die
Kennzahl des Tages tagNr= 0..6 muß angegeben werden.
Ohne
Initialisierung des Control-Bytes arbeitet der Chip PCF 8583 als
Uhr im 24std-Format.
Seine
8Bit I2C-Adresse 0xA0 wird bei einer Verkürzung auf 7Bit zu
0x50
*/
//
Achtung: Die zu übertragenden Werte müssen hier
wie gezeigt eingetragen werden. Es findet im Programm
//
keine Kontrolle
der Gültigkeit statt.
//
------------------------------------------------------------------------------------------------------
String
zeit = "02:29:07";
// Die zu übertragende Startzeit der
Uhr
// .. die Werte müssen 2stellig sein
..
// Da die Übertragung des Programms
und dessen Start
// etwas Zeit benötigen, sollte ein
Vorlauf von etwa
// 7 Sekunden eingeplant werden.
String
datum = "22.04.2018";
// Die zu übertragenden Datumsangaben
// .. die Werte müssen 2 bzw. 4stellig
sein ..
byte
tagNr = 0;
// .. Nummer des Tages:
// .. 0=So, 1=Mo, 2=Di, 3=Mi, 4=Do, 5=Fr,
6=Sa
//
------------------------------------------------------------------------------------------------------
#include
<Wire.h>
// Einbinden der Wire-Bibliothek des
Arduino
byte
I2CadrRTC = 0xA0>>1;
// Basisadresse der RTC PCF8583, da Pin
A0=GND
void
setup() {
byte
jaNr;
Serial.begin
(9600);
// serielle Übertragungsrate 9600 Baud
Wire.begin
();
// Initialisierung der
Wire-Bibliothek
Wire.setClock
(100000L);
// I2C-Bus mit 100kHz
set_Control(0x00);
// Control-Register setzen
set_Clock(zeit);
// zu setzende Zeit st, mi, se
jaNr
= set_Date (tagNr, datum);
// zu setzende Tagesnummer und Datum
Serial.println
("Zeit und Datum gesetzt");
Serial.print
("Tagesnummer-Datum: ");
Serial.print
(tagNr);
Serial.print
(" - ");
Serial.println
(datum);
Serial.print
("Jahresnummer-Zeit: ");
Serial.print
(jaNr);
Serial.print
(" - ");
Serial.print
(zeit);
}
//
wird die Funktion loop() entfernt, erscheint die Meldung:
//
Fehler beim Kompilieren für das Board
Arduino Nano
//
---------------------------------------------------------
void
loop() {
// nix
}
//
Datumspeicher 0x05-0x06 setzen
//
sowie die 4stellige Jahreszahl in 0x10-0x11
//
-------------------------------------------
byte
set_Date (byte tagNr, String
datum) {
if
(tagNr > 6) tagNr = 6;
// falsche Tagesnummer, da gößer
6
byte
tag,mon,jah,jal;
// werden aus der Datumsangabe berechnet
byte
jaNr;
// wird aus der Jahreszahl berechnet
//
Jahreskennummer 0 bis 3 berechnen .. 0=Schaltjahr
jaNr
= ((datum[6] & 0x0F)
* 1000 + (datum[7]
& 0x0F) * 100
+ (datum[8] & 0x0F)
* 10 + (datum[9]
& 0x0F)) % 4;
//
Bit 7,6 Jahresnummer - Bit 5,4 BCD, 10stellen Tag - Bit 3-0
1stellen Tag
tag
= (((datum[0] & 0x0F)
<< 4) + (datum[1]
& 0x0F)) | (jaNr << 6);
//
Bit 7,6,5 TagNummer - Bit 4 BCD, 10stellen Monat - Bit 3-0
1stellen Monat
mon
= (((datum[3] & 0x0F)
<< 4) + (datum[4]
& 0x0F)) | (tagNr << 5);
//
Jahresangabe zu 2 gepackten BCD-Zahlen wandeln
jah
= ((datum[6] & 0x0F)
<< 4) + (datum[7]
& 0x0F);
jal
= ((datum[8] & 0x0F)
<< 4) + (datum[9]
& 0x0F);
Wire.beginTransmission
(I2CadrRTC);
Wire.write
(0x05);
// interne Adressen 0x05 und 0x06
beschreiben
Wire.write
(tag);
// .. 0x05 JahresNummer und BCD-Werte für
Tag
Wire.write
(mon);
// .. 0x06 TagesNummer und BCD-Werte für
Monat
Wire.endTransmission
();
Wire.beginTransmission
(I2CadrRTC);
Wire.write
(0x10);
// interne Adressen 0x10 und 0x11 im freien RAM
Wire.write
(jah);
// .. BCD-Werte für das Jahr
Wire.write
(jal);
Wire.endTransmission
();
return
jaNr;
}
//
Uhrspeicher 0x02-0x04 setzen
//
nur 24-StundenFormat
//
----------------------------
void
set_Clock(String zeit)
{
byte
st,mi,se;
// Speicher der gepackten BCD-Werte von
st,mi,se
st=
((zeit[0] & 0x0F)
<< 4) + (zeit[1]
& 0x0F); //
je zwei ASCII zu gepacktem BCD wandeln
mi=
((zeit[3] & 0x0F)
<< 4) + (zeit[4]
& 0x0F);
se=
((zeit[6] & 0x0F)
<< 4) + (zeit[7]
& 0x0F);
Wire.beginTransmission
(I2CadrRTC);
Wire.write
(0x02);
// interne Adresse 0x02,0x03 und 0x04
beschreiben
Wire.write
(se);
// .. BCD-Werte für Sekunden
Wire.write
(mi);
// .. BCD-Werte für Minuten
Wire.write
(st);
// .. BCD-Werte für Stunden
Wire.endTransmission
();
}
//
setzt das Control-Register 0x00
//
-------------------------------
void
set_Control(byte set) {
Wire.beginTransmission
(I2CadrRTC);
Wire.write
(0x00);
// 0x00 Control-Register
Wire.write
(set);
// .. zu setzender Wert
Wire.endTransmission
();
}
|