Stap 2: Bibliotheek DS1302.cpp
/*
DS1302.cpp - Arduino library ondersteuning voor de DS1302 Chip voor de tijdwaarneming van de Trickle gratis
Copyright (C) 2010 Henning Karlsen. Alle rechten voorbehouden
U vindt de nieuwste versie van de bibliotheek op
http://www.henningkarlsen.com/Electronics
Deze bibliotheek is geboekt gemakkelijk interface en gebruiken van de RTC DS1302 met
de Arduino.
Als u eventuele wijzigingen of verbeteringen aan de code, zou ik het waarderen
dat u de code met mij, deelt zodat ik in de volgende release opnemen kan.
Ik kan gecontacteerd worden via http://www.henningkarlsen.com/electronics/contact.php
Deze bibliotheek is vrije software; je kunt het herdistribueren en/of
aanpassen onder de voorwaarden van de GNU Lesser algemene openbare
Licentie zoals gepubliceerd door de Free Software Foundation; beide
versie 2.1 van de licentie, of (naar uw keuze) een latere versie.
Deze bibliotheek wordt verspreid in de hoop dat het bruikbaar,
maar zonder enige garantie; zelfs zonder de impliciete garantie van
VERKOOPBAARHEID of geschiktheid voor een bepaald doel. Zie GNU
Lesser General Public License voor meer details.
U moet hebt ontvangen een kopie van de GNU Lesser algemene openbare
License along with this library; Als dit niet het geval is, schrijven aan de Vrije Software
Foundation, Inc., 51 Franklin St, vijfde verdieping, 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
/ * Openbare * /
Tijd:: Time()
{
Dit jaar -> = 2010;
this -> mon = 1;
Deze-> datum = 1;
this -> uur = 0;
dit min -> = 0;
this -> sec = 0;
this -> dow = 5;
}
DS1302_RAM::DS1302_RAM()
{
for (int i = 0; ik < 31; i ++)
cel [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, OUTPUT);
pinMode (_sclk_pin, OUTPUT);
}
Tijd DS1302::getTime()
{
Tijd 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;
retourneren van t;
}
VOID DS1302::setTime (uint8_t uur, uint8_t min, uint8_t sec)
{
Als (((uur > = 0) & & (uur < 24)) & & ((min > = 0) & & (min < 60)) & & ((sec > = 0) & & (sec < 60)))
{
_writeRegister (REG_HOUR, _encode(hour));
_writeRegister (REG_MIN, _encode(min));
_writeRegister (REG_SEC, _encode(sec));
}
}
VOID DS1302::setDate (uint8_t date, uint8_t ma, uint16_t jaar)
{
Als (((date>0) & & (datum < = 31)) & & ((mon>0) & & (mon < = 12)) & & ((jaar > = 2000) & & (jaar < 3000)))
{
jaar-= 2000;
_writeRegister (REG_YEAR, _encode(year));
_writeRegister (REG_MON, _encode(mon));
_writeRegister (REG_DATE, _encode(date));
}
}
VOID DS1302::setDOW(uint8_t dow)
{
Als ((dow>0) & & (dow < 8))
_writeRegister (REG_DOW, dow);
}
char * DS1302::getTimeStr(uint8_t format)
{
char * output = "xxxxxxxx";
Tijd t;
t=getTime();
Als (t.hour < 10)
uitgang [0] = 48;
anders
uitgang [0] = char ((t.hour / 10) 48);
uitgang [1] = char ((t.hour % 10) 48);
uitgang [2] = 58;
Als (t.min < 10)
uitgang [3] = 48;
anders
uitgang [3] = char ((t.min / 10) 48);
uitgang [4] = char ((t.min % 10) 48);
uitgang [5] = 58;
Als (indeling == FORMAT_SHORT)
uitgang [5] = 0;
anders
{
Als (t.sec < 10)
uitgang [6] = 48;
anders
uitgang [6] = char ((t.sec / 10) 48);
uitgang [7] = char ((t.sec % 10) 48);
uitgang [8] = 0;
}
retourneren van de uitvoer;
}
char * DS1302::getDateStr(uint8_t slformat, uint8_t eformat, char divider)
{
char * output = "xxxxxxxxxx";
int yr, offset;
Tijd t;
t=getTime();
schakelaar (eformat)
{
Case FORMAT_LITTLEENDIAN:
Als (t.date < 10)
uitgang [0] = 48;
anders
uitgang [0] = char ((t.date / 10) 48);
uitgang [1] = char ((t.date % 10) 48);
uitgang [2] = scheidingslijn;
Als (t.mon < 10)
uitgang [3] = 48;
anders
uitgang [3] = char ((t.mon / 10) 48);
uitgang [4] = char ((t.mon % 10) 48);
uitgang [5] = scheidingslijn;
Als (slformat == FORMAT_SHORT)
{
yr=t.Year-2000;
Als (yr < 10)
uitgang [6] = 48;
anders
uitgang [6] = char ((yr / 10) 48);
uitgang [7] = char ((yr % 10) 48);
uitgang [8] = 0;
}
anders
{
yr=t.Year;
uitgang [6] = char ((yr / 1000) 48);
uitgang [7] = char (((yr % 1000) / 100) 48);
uitgang [8] = char (((yr % 100) / 10) 48);
uitgang [9] = char ((yr % 10) 48);
uitgang [10] = 0;
}
breken;
Case FORMAT_BIGENDIAN:
Als (slformat == FORMAT_SHORT)
offset = 0;
anders
offset = 2;
Als (slformat == FORMAT_SHORT)
{
yr=t.Year-2000;
Als (yr < 10)
uitgang [0] = 48;
anders
uitgang [0] = char ((yr / 10) 48);
uitgang [1] = char ((yr % 10) 48);
uitgang [2] = scheidingslijn;
}
anders
{
yr=t.Year;
uitgang [0] = char ((yr / 1000) 48);
uitgang [1] = char (((yr % 1000) / 100) 48);
uitgang [2] = char (((yr % 100) / 10) 48);
uitgang [3] = char ((yr % 10) 48);
uitgang [4] = scheidingslijn;
}
Als (t.mon < 10)
uitgang [3 + offset] = 48;
anders
uitgang [3 + offset] = char ((t.mon / 10) 48);
uitgang [4 + offset] = char ((t.mon % 10) 48);
uitgang [5 + offset] = scheidingslijn;
Als (t.date < 10)
uitgang [6 + offset] = 48;
anders
uitgang [6 + offset] = char ((t.date / 10) 48);
uitgang [7 + offset] = char ((t.date % 10) 48);
uitgang [8 + offset] = 0;
breken;
Case FORMAT_MIDDLEENDIAN:
Als (t.mon < 10)
uitgang [0] = 48;
anders
uitgang [0] = char ((t.mon / 10) 48);
uitgang [1] = char ((t.mon % 10) 48);
uitgang [2] = scheidingslijn;
Als (t.date < 10)
uitgang [3] = 48;
anders
uitgang [3] = char ((t.date / 10) 48);
uitgang [4] = char ((t.date % 10) 48);
uitgang [5] = scheidingslijn;
Als (slformat == FORMAT_SHORT)
{
yr=t.Year-2000;
Als (yr < 10)
uitgang [6] = 48;
anders
uitgang [6] = char ((yr / 10) 48);
uitgang [7] = char ((yr % 10) 48);
uitgang [8] = 0;
}
anders
{
yr=t.Year;
uitgang [6] = char ((yr / 1000) 48);
uitgang [7] = char (((yr % 1000) / 100) 48);
uitgang [8] = char (((yr % 100) / 10) 48);
uitgang [9] = char ((yr % 10) 48);
uitgang [10] = 0;
}
breken;
}
retourneren van de uitvoer;
}
char * DS1302::getDOWStr(uint8_t format)
{
char * output = "xxxxxxxxx";
Tijd t;
t=getTime();
schakelaar (t.dow)
{
Case maandag:
uitvoer = "Maandag";
breken;
Case dinsdag:
uitvoer = "Dinsdag";
breken;
Case woensdag:
uitvoer = "Woensdag";
breken;
Case donderdag:
uitvoer = "Donderdag";
breken;
Case vrijdag:
uitvoer = "Vrijdag";
breken;
Case zaterdag:
uitvoer = "Zaterdag";
breken;
Case zondag:
uitvoer = "Zondag";
breken;
}
Als (indeling == FORMAT_SHORT)
uitgang [3] = 0;
retourneren van de uitvoer;
}
char * DS1302::getMonthStr(uint8_t format)
{
char * output = "xxxxxxxxx";
Tijd t;
t=getTime();
schakelaar (t.mon)
{
Case 1:
uitvoer = 'Januari';
breken;
Case 2:
uitvoer = "Februari";
breken;
Case 3:
uitvoer = "March";
breken;
Case 4:
uitvoer = "April";
breken;
Case 5:
uitvoer = "Mei";
breken;
Case 6:
uitvoer = "Juni";
breken;
Case 7:
uitvoer = "Juli";
breken;
zaak 8:
uitvoer = "Augustus";
breken;
Case 9:
uitvoer = "September";
breken;
zaak 10:
uitvoer = "Oktober";
breken;
zaak 11:
uitvoer = "November";
breken;
zaak 12:
uitvoer = "December";
breken;
}
Als (indeling == FORMAT_SHORT)
uitgang [3] = 0;
retourneren van de uitvoer;
}
VOID DS1302::halt (bool inschakelen)
{
uint8_t _reg = _readRegister(REG_SEC);
_reg & = ~ (1 << 7);
_reg | = (inschakelen << 7);
_writeRegister (REG_SEC, _reg);
}
VOID DS1302::writeProtect (bool inschakelen)
{
uint8_t _reg = (inschakelen << 7);
_writeRegister (REG_WP, _reg);
}
VOID DS1302::setTCR (uint8_t waarde)
{
_writeRegister (REG_TCR, waarde);
}
/ * Particuliere * /
uint8_t DS1302::_readByte()
{
pinMode (_data_pin, INPUT);
uint8_t waarde = 0;
uint8_t currentBit = 0;
for (int i = 0; ik < 8; ++ ik)
{
currentBit = digitalRead(_data_pin);
waarde | = (currentBit << ik);
digitalWrite (_sclk_pin, hoge);
delayMicroseconds(1);
digitalWrite (_sclk_pin, laag);
}
retourwaarde;
}
VOID DS1302::_writeByte (uint8_t waarde)
{
pinMode (_data_pin, OUTPUT);
shiftOut (_data_pin, _sclk_pin, LSBFIRST, waarde);
}
uint8_t DS1302::_readRegister (uint8_t reg)
{
uint8_t cmdByte = 129;
cmdByte | = (reg << 1);
uint8_t readValue;
digitalWrite (_sclk_pin, laag);
digitalWrite (_ce_pin, hoge);
_writeByte(cmdByte);
readValue = _readByte();
digitalWrite (_ce_pin, laag);
Return readValue;
}
VOID DS1302::_writeRegister (uint8_t reg, uint8_t waarde)
{
uint8_t cmdByte = (128 | (reg << 1));
digitalWrite (_sclk_pin, laag);
digitalWrite (_ce_pin, hoge);
_writeByte(cmdByte);
_writeByte(Value);
digitalWrite (_ce_pin, laag);
}
VOID DS1302::_burstRead()
{
digitalWrite (_sclk_pin, laag);
digitalWrite (_ce_pin, hoge);
_writeByte(191);
for (int i = 0; ik < 8; i ++)
{
_burstArray [i] = _readByte();
}
digitalWrite (_ce_pin, laag);
}
uint8_t DS1302::_decode (uint8_t waarde)
{
uint8_t gedecodeerd = waarde & 127;
gedecodeerde = (gedecodeerde & 15) + 10 * ((gedecodeerd & (15 << 4)) >> 4);
retourneren gedecodeerde;
}
uint8_t DS1302::_decodeH (uint8_t waarde)
{
Als (waarde & 128)
waarde = (waarde & 15) + (12 * ((value & 32) >> 5));
anders
waarde = (waarde & 15) + (10 * ((value & 48) >> 4));
retourwaarde;
}
uint8_t DS1302::_decodeY (uint8_t waarde)
{
uint8_t gedecodeerd = (waarde & 15) + 10 * ((waarde & (15 << 4)) >> 4);
retourneren gedecodeerde;
}
uint8_t DS1302::_encode (uint8_t waarde)
{
uint8_t gecodeerd = ((value / 10) << 4) + (waarde 10%);
terugkeer gecodeerd;
}
VOID DS1302::writeBuffer (DS1302_RAM r)
{
digitalWrite (_sclk_pin, laag);
digitalWrite (_ce_pin, hoge);
_writeByte(254);
for (int i = 0; ik < 31; i ++)
{
_writeByte(r.Cell[i]);
}
digitalWrite (_ce_pin, laag);
}
DS1302_RAM DS1302::readBuffer()
{
DS1302_RAM r;
digitalWrite (_sclk_pin, laag);
digitalWrite (_ce_pin, hoge);
_writeByte(255);
for (int i = 0; ik < 31; i ++)
{
r.Cell[i] = _readByte();
}
digitalWrite (_ce_pin, laag);
retourneren van r;
}
VOID DS1302::poke (uint8_t addr, uint8_t waarde)
{
Als ((addr > = 0) & & (addr < = 30))
{
addr = (addr * 2) + 192;
digitalWrite (_sclk_pin, laag);
digitalWrite (_ce_pin, hoge);
_writeByte(addr);
_writeByte(Value);
digitalWrite (_ce_pin, laag);
}
}
uint8_t DS1302::peek (uint8_t addr)
{
Als ((addr > = 0) & & (addr < = 30))
{
addr = (addr * 2) + 193;
uint8_t readValue;
digitalWrite (_sclk_pin, laag);
digitalWrite (_ce_pin, hoge);
_writeByte(addr);
readValue = _readByte();
digitalWrite (_ce_pin, laag);
Return readValue;
}
anders
keren 0;
}