Étape 2: Bibliothèque DS1302.cpp
/*
DS1302.cpp - soutien bibliothèque Arduino pour la puce de chronométrage de courant de Charge de DS1302
Copyright (C) 2010 Henning Karlsen. Tous droits réservés
Vous pouvez trouver la dernière version de la bibliothèque à
http://www.henningkarlsen.com/Electronics
Cette bibliothèque a été déposée auprès de l’interface facilement et utiliser le RTC DS1302 avec
l’Arduino.
Si vous apportez des modifications ou des améliorations au code, je vous serais reconnaissant
que vous partagez le code avec moi afin que je pourrais inclure dans la prochaine version.
Je peux être contacté par le biais de http://www.henningkarlsen.com/electronics/contact.php
Cette bibliothèque est un logiciel libre ; vous pouvez le redistribuer et/ou
modifier selon les termes de la GNU Lesser Grand Public
License telle que publiée par la Free Software Foundation ; ou l’autre
version 2.1 de la licence, ou (à votre choix) toute version ultérieure.
Cette bibliothèque est distribuée dans l’espoir qu’il sera utile,
mais sans aucune garantie ; sans même la garantie implicite de
Qualité marchande ou ADEQUATION a un usage particulier. Voir la GNU
Lesser General Public License pour plus de détails.
Vous devriez avoir reçu une copie de la GNU Lesser Grand Public
License along with this library ; Si tel n’est pas le cas, écrivez à la Free Software
Foundation, Inc., 51 Franklin St, 5ème étage, Boston, MA 02110-1301 USA
*/
#include « DS1302.h »
#define REG_SEC 0
#define REG_MIN 1
#define REG_HOUR 2
#define REG_DATE 3
#define REG_MON 4
#define REG_DOW 5
#define REG_YEAR 6
#define REG_WP 7
#define REG_TCR 8
/ * Public * /
Temps:: Time()
{
This -> année = 2010 ;
This -> LUN = 1 ;
cette date-> = 1 ;
This -> heure = 0 ;
This -> min = 0 ;
This -> s = 0 ;
This -> dow = 5 ;
}
DS1302_RAM::DS1302_RAM()
{
pour (int i = 0; i < 31; i ++)
cellule [i] = 0 ;
}
DS1302::DS1302 (uint8_t ce_pin, uint8_t data_pin, uint8_t sclk_pin)
{
_ce_pin = ce_pin ;
_data_pin = data_pin ;
_sclk_pin = sclk_pin ;
pinMode (_ce_pin, sortie) ;
pinMode (_sclk_pin, sortie) ;
}
Temps DS1302::getTime()
{
Temps t ;
_burstRead() ;
t.sec = _decode(_burstArray[0]) ;
t.min = _decode(_burstArray[1]) ;
t.Hour = _decodeH(_burstArray[2]) ;
t.date = _decode(_burstArray[3]) ;
t.mon = _decode(_burstArray[4]) ;
t.Dow = _burstArray [5] ;
t.Year = _decodeY (_burstArray [6]) + 2000 ;
retour t ;
}
void DS1302::setTime (uint8_t heure, min uint8_t, uint8_t s)
{
Si (((h > = 0) & & (heure < 24)) & & ((min > = 0) & & (min < 60)) & & ((s > = 0) & & (s < 60)))
{
_writeRegister (REG_HOUR, _encode(hour)) ;
_writeRegister (REG_MIN, _encode(min)) ;
_writeRegister (REG_SEC, _encode(sec)) ;
}
}
void DS1302::setDate (uint8_t date, uint8_t Lun, uint16_t année)
{
Si (((date>0) & & (date < = 31)) & & ((mon>0) & & (LUN < = 12)) & & ((année > = 2000) & & (an < 3000)))
{
an-= 2000 ;
_writeRegister (REG_YEAR, _encode(year)) ;
_writeRegister (REG_MON, _encode(mon)) ;
_writeRegister (REG_DATE, _encode(date)) ;
}
}
Sub DS1302::setDOW(uint8_t dow)
{
Si ((dow>0) & & (dow < 8))
_writeRegister (REG_DOW, dow) ;
}
char * DS1302::getTimeStr(uint8_t format)
{
char * sortie = « xxxxxxxx » ;
Temps t ;
t=getTime() ;
Si (t.hour < 10)
sortie [0] = 48 ;
d’autre
sortie [0] = char ((t.hour / 10) + 48) ;
sortie [1] = char ((t.hour % 10) + 48) ;
sortie [2] = 58 ;
Si (t.min < 10)
sortie [3] = 48 ;
d’autre
sortie [3] = char ((t.min / 10) + 48) ;
sortie [4] = char ((t.min % 10) + 48) ;
sortie [5] = 58 ;
Si (format == FORMAT_SHORT)
sortie [5] = 0 ;
d’autre
{
Si (t.sec < 10)
sortie [6] = 48 ;
d’autre
sortie [6] = char ((t.sec / 10) + 48) ;
sortie [7] = char ((t.sec % 10) + 48) ;
sortie [8] = 0 ;
}
retour de sortie ;
}
char * DS1302::getDateStr(uint8_t slformat, uint8_t eformat, char divider)
{
char * sortie = « xxxxxxxxxx » ;
int yr, offset ;
Temps t ;
t=getTime() ;
Switch (eformat)
{
affaire FORMAT_LITTLEENDIAN :
Si (t.date < 10)
sortie [0] = 48 ;
d’autre
sortie [0] = char ((t.date / 10) + 48) ;
sortie [1] = char ((t.date % 10) + 48) ;
sortie [2] = diviseur ;
Si (t.mon < 10)
sortie [3] = 48 ;
d’autre
sortie [3] = char ((t.mon / 10) + 48) ;
sortie [4] = char ((t.mon % 10) + 48) ;
sortie [5] = diviseur ;
Si (slformat == FORMAT_SHORT)
{
YR=t.Year-2000 ;
Si (an < 10)
sortie [6] = 48 ;
d’autre
sortie [6] = char ((yr / 10) + 48) ;
sortie [7] = char ((yr % 10) + 48) ;
sortie [8] = 0 ;
}
d’autre
{
YR=t.Year ;
sortie [6] = char ((yr / 1000) + 48) ;
sortie [7] = char (((yr % 1000) / 100) + 48) ;
sortie [8] = char (((yr % 100) / 10) + 48) ;
[9] de sortie = char ((yr % 10) + 48) ;
sortie [10] = 0 ;
}
rupture ;
affaire FORMAT_BIGENDIAN :
Si (slformat == FORMAT_SHORT)
offset = 0 ;
d’autre
offset = 2 ;
Si (slformat == FORMAT_SHORT)
{
YR=t.Year-2000 ;
Si (an < 10)
sortie [0] = 48 ;
d’autre
sortie [0] = char ((yr / 10) + 48) ;
sortie [1] = char ((yr % 10) + 48) ;
sortie [2] = diviseur ;
}
d’autre
{
YR=t.Year ;
sortie [0] = char ((yr / 1000) + 48) ;
sortie [1] = char (((yr % 1000) / 100) + 48) ;
sortie [2] = char (((yr % 100) / 10) + 48) ;
sortie [3] = char ((yr % 10) + 48) ;
sortie [4] = diviseur ;
}
Si (t.mon < 10)
sortie [3 + décalage] = 48 ;
d’autre
sortie [3 + décalage] = char ((t.mon / 10) + 48) ;
sortie [4 + décalage] = char ((t.mon % 10) + 48) ;
sortie [5 + décalage] = diviseur ;
Si (t.date < 10)
sortie [offset 6 +] = 48 ;
d’autre
sortie [6 + décalage] = char ((t.date / 10) + 48) ;
sortie [7 + décalage] = char ((t.date % 10) + 48) ;
sortie [8 + décalage] = 0 ;
rupture ;
affaire FORMAT_MIDDLEENDIAN :
Si (t.mon < 10)
sortie [0] = 48 ;
d’autre
sortie [0] = char ((t.mon / 10) + 48) ;
sortie [1] = char ((t.mon % 10) + 48) ;
sortie [2] = diviseur ;
Si (t.date < 10)
sortie [3] = 48 ;
d’autre
sortie [3] = char ((t.date / 10) + 48) ;
sortie [4] = char ((t.date % 10) + 48) ;
sortie [5] = diviseur ;
Si (slformat == FORMAT_SHORT)
{
YR=t.Year-2000 ;
Si (an < 10)
sortie [6] = 48 ;
d’autre
sortie [6] = char ((yr / 10) + 48) ;
sortie [7] = char ((yr % 10) + 48) ;
sortie [8] = 0 ;
}
d’autre
{
YR=t.Year ;
sortie [6] = char ((yr / 1000) + 48) ;
sortie [7] = char (((yr % 1000) / 100) + 48) ;
sortie [8] = char (((yr % 100) / 10) + 48) ;
[9] de sortie = char ((yr % 10) + 48) ;
sortie [10] = 0 ;
}
rupture ;
}
retour de sortie ;
}
char * DS1302::getDOWStr(uint8_t format)
{
char * sortie = « xxxxxxxxx » ;
Temps t ;
t=getTime() ;
Switch (t.dow)
{
décision lundi :
sortie = « Lundi » ;
rupture ;
décision mardi :
sortie = « Mardi » ;
rupture ;
cas mercredi :
sortie = « Mercredi » ;
rupture ;
décision jeudi :
sortie = « Jeudi » ;
rupture ;
cas vendredi :
sortie = « Vendredi » ;
rupture ;
cas de samedi :
sortie = « Samedi » ;
rupture ;
cas de dimanche :
sortie = « Dimanche » ;
rupture ;
}
Si (format == FORMAT_SHORT)
sortie [3] = 0 ;
retour de sortie ;
}
char * DS1302::getMonthStr(uint8_t format)
{
char * sortie = « xxxxxxxxx » ;
Temps t ;
t=getTime() ;
Switch (t.mon)
{
cas 1 :
sortie = « Janvier » ;
rupture ;
cas 2 :
sortie = « Février » ;
rupture ;
cas 3 :
sortie = « Mars » ;
rupture ;
cas 4 :
sortie = « Avril » ;
rupture ;
cas no 5 :
sortie = « Mai » ;
rupture ;
cas 6 :
sortie = « Juin » ;
rupture ;
cas 7 :
sortie = « Juillet » ;
rupture ;
cas 8 :
sortie = « Août » ;
rupture ;
cas 9 :
sortie = « Septembre » ;
rupture ;
cas no 10 :
sortie = « Octobre » ;
rupture ;
cas no 11 :
sortie = « Novembre » ;
rupture ;
cas 12 :
sortie = « Décembre » ;
rupture ;
}
Si (format == FORMAT_SHORT)
sortie [3] = 0 ;
retour de sortie ;
}
void DS1302::halt (Boolean enable)
{
uint8_t _reg = _readRegister(REG_SEC) ;
_reg & = ~ (1 << 7) ;
_reg | = (activez << 7) ;
_writeRegister (REG_SEC, _reg) ;
}
void DS1302::writeProtect (Boolean enable)
{
uint8_t _reg = (activez << 7) ;
_writeRegister (REG_WP, _reg) ;
}
void DS1302::setTCR (valeur uint8_t)
{
_writeRegister (REG_TCR, valeur) ;
}
/ * Privé * /
uint8_t DS1302::_readByte()
{
pinMode (_data_pin, entrée) ;
valeur d’uint8_t = 0 ;
uint8_t currentBit = 0 ;
pour (int i = 0; i < 8; ++ j’ai)
{
currentBit = digitalRead(_data_pin) ;
valeur | = (currentBit << j’ai) ;
digitalWrite (_sclk_pin, HIGH) ;
delayMicroseconds(1) ;
digitalWrite (_sclk_pin, basse) ;
}
retourne la valeur ;
}
void DS1302::_writeByte (valeur uint8_t)
{
pinMode (_data_pin, sortie) ;
shiftOut (_data_pin, _sclk_pin, LSBFIRST, valeur) ;
}
uint8_t DS1302::_readRegister (uint8_t reg)
{
uint8_t cmdByte = 129 ;
cmdByte | = (reg << 1) ;
uint8_t readValue ;
digitalWrite (_sclk_pin, basse) ;
digitalWrite (_ce_pin, HIGH) ;
_writeByte(cmdByte) ;
readValue = _readByte() ;
digitalWrite (_ce_pin, basse) ;
retour readValue ;
}
void DS1302::_writeRegister (uint8_t reg, uint8_t value)
{
uint8_t cmdByte = (128 | (reg << 1)) ;
digitalWrite (_sclk_pin, basse) ;
digitalWrite (_ce_pin, HIGH) ;
_writeByte(cmdByte) ;
_writeByte(value) ;
digitalWrite (_ce_pin, basse) ;
}
Sub DS1302::_burstRead()
{
digitalWrite (_sclk_pin, basse) ;
digitalWrite (_ce_pin, HIGH) ;
_writeByte(191) ;
pour (int i = 0; i < 8; i ++)
{
_burstArray [i] = _readByte() ;
}
digitalWrite (_ce_pin, basse) ;
}
uint8_t DS1302::_decode (valeur uint8_t)
{
uint8_t décodé = valeur & 127 ;
décodés = (décodé & 15) + 10 * ((décodé & (15 << 4)) >> 4) ;
retour décodé ;
}
uint8_t DS1302::_decodeH (valeur uint8_t)
{
Si (valeur & 128)
valeur = (valeur & 15) + (12 * ((value & 32) >> 5)) ;
d’autre
valeur = (valeur & 15) + (10 * ((value & 48) >> 4)) ;
retourne la valeur ;
}
uint8_t DS1302::_decodeY (valeur uint8_t)
{
uint8_t décodé = (valeur & 15) + 10 * ((valeur & (15 << 4)) >> 4) ;
retour décodé ;
}
uint8_t DS1302::_encode (valeur uint8_t)
{
uint8_t encodé = ((value / 10) << 4) + (10 % valeur) ;
retour codée ;
}
void DS1302::writeBuffer (DS1302_RAM r)
{
digitalWrite (_sclk_pin, basse) ;
digitalWrite (_ce_pin, HIGH) ;
_writeByte(254) ;
pour (int i = 0; i < 31; i ++)
{
_writeByte(r.Cell[i]) ;
}
digitalWrite (_ce_pin, basse) ;
}
DS1302_RAM DS1302::readBuffer()
{
DS1302_RAM r ;
digitalWrite (_sclk_pin, basse) ;
digitalWrite (_ce_pin, HIGH) ;
_writeByte(255) ;
pour (int i = 0; i < 31; i ++)
{
r.Cell[i] = _readByte() ;
}
digitalWrite (_ce_pin, basse) ;
Return r ;
}
void DS1302::poke (uint8_t addr, uint8_t value)
{
Si ((addr > = 0) & & (addr < = 30))
{
addr = (addr * 2) + 192 ;
digitalWrite (_sclk_pin, basse) ;
digitalWrite (_ce_pin, HIGH) ;
_writeByte(addr) ;
_writeByte(value) ;
digitalWrite (_ce_pin, basse) ;
}
}
uint8_t DS1302::peek (uint8_t addr)
{
Si ((addr > = 0) & & (addr < = 30))
{
addr = (addr * 2) + 193 ;
uint8_t readValue ;
digitalWrite (_sclk_pin, basse) ;
digitalWrite (_ce_pin, HIGH) ;
_writeByte(addr) ;
readValue = _readByte() ;
digitalWrite (_ce_pin, basse) ;
retour readValue ;
}
d’autre
return 0 ;
}