Paso 2: Biblioteca DS1302.cpp
/*
DS1302.cpp - soporte de biblioteca de Arduino para el Chip de cronometraje de carga DS1302
Copyright (C) 2010 Henning Karlsen. Todos los derechos reservados
Usted puede encontrar la versión más reciente de la biblioteca
http://www.henningkarlsen.com/Electronics
Esta biblioteca se ha hecho fácil interfaz y utilizar el DS1302 RTC con
el Arduino.
Si haces modificaciones ni mejoras en el código, te lo agradeceria
que compartes el código conmigo para que yo podría incluir en la próxima versión.
Yo puedo ser contactado a través de http://www.henningkarlsen.com/electronics/contact.php
Esta biblioteca es software libre; Usted puede redistribuirlo y/o
modificar bajo los términos de la GNU menor General pública
Licencia publicada por la Free Software Foundation; cualquiera de los dos
versión 2.1 de la licencia o (a su opción) cualquier versión posterior.
Esta biblioteca se distribuye con la esperanza de que sea útil,
pero sin ninguna garantía; ni siquiera la garantía implícita de
COMERCIABILIDAD o aptitud para un propósito PARTICULAR. Ver la GNU
Lesser General Public License para más detalles.
Usted debe han recibido una copia de la GNU menor General pública
Licencia junto con esta biblioteca; Si no, escriba a la Free Software
Foundation, Inc., 51 Franklin St, quinto piso, 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
/ * Público * /
Tiempo:: marca_de_tiempo
{
Esto -> año = 2010;
Esto -> mon = 1;
esta fecha de-> = 1;
Esto -> hora = 0;
Esto -> min = 0;
Esto -> seg = 0;
Esto -> dow = 5;
}
DS1302_RAM::DS1302_RAM()
{
para (int i = 0; i < 31; i ++)
Cell [i] = 0;
}
DS1302::DS1302 (ce_pin de uint8_t, uint8_t data_pin, uint8_t sclk_pin)
{
_ce_pin = ce_pin;
_data_pin = data_pin;
_sclk_pin = sclk_pin;
pinMode (_ce_pin, salida);
pinMode (_sclk_pin, salida);
}
Tiempo DS1302::getTime()
{
Tiempo 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;
devolver t;
}
void DS1302::setTime (uint8_t hora, uint8_t min, uint8_t seg)
{
Si (((hora > = 0) & & (hora < 24)) & & ((min > = 0) & & (min < 60)) & & ((s > = 0) & & (sec < 60)))
{
_writeRegister (REG_HOUR, _encode(hour));
_writeRegister (REG_MIN, _encode(min));
_writeRegister (REG_SEC, _encode(sec));
}
}
void DS1302::setDate (uint8_t fecha, uint8_t el Lun, uint16_t año)
{
Si (((date>0) & & (fecha < = 31)) & & ((mon>0) & & (mon < = 12)) & & ((año > = 2000) & & (año < 3000)))
{
año-= 2000;
_writeRegister (REG_YEAR, _encode(year));
_writeRegister (REG_MON, _encode(mon));
_writeRegister (REG_DATE, _encode(date));
}
}
void DS1302::setDOW(uint8_t dow)
{
Si ((dow>0) & & (dow < 8))
_writeRegister (REG_DOW, dow);
}
char * DS1302::getTimeStr(uint8_t format)
{
char * salida = "xxxxxxxx";
Tiempo t;
t=getTime();
Si (t.hour < 10)
salida [0] = 48;
otra cosa
salida [0] = char ((t.hour / 10) + 48);
salida [1] = char ((t.hour % 10) + 48);
salida [2] = 58;
Si (t.min < 10)
de salida [3] = 48;
otra cosa
de salida [3] = char ((t.min / 10) + 48);
de salida [4] = char ((t.min % 10) + 48);
salida [5] = 58;
Si (formato == FORMAT_SHORT)
salida [5] = 0;
otra cosa
{
Si (t.sec < 10)
salida [6] = 48;
otra cosa
salida [6] = char ((t.sec / 10) + 48);
salida [7] = char ((t.sec % 10) + 48);
salida [8] = 0;
}
regreso salida;
}
char * DS1302::getDateStr(uint8_t slformat, uint8_t eformat, char divider)
{
char * salida = "xxxxxxxxxx";
int año, offset;
Tiempo t;
t=getTime();
interruptor (eformat)
{
caso FORMAT_LITTLEENDIAN:
Si (t.date < 10)
salida [0] = 48;
otra cosa
salida [0] = char ((t.date / 10) + 48);
salida [1] = char ((t.date % 10) + 48);
salida [2] = divisor;
Si (t.mon < 10)
de salida [3] = 48;
otra cosa
de salida [3] = char ((t.mon / 10) + 48);
de salida [4] = char ((t.mon % 10) + 48);
salida [5] = divisor;
Si (slformat == FORMAT_SHORT)
{
Yr=t.Year-2000;
Si (año < 10)
salida [6] = 48;
otra cosa
salida [6] = char ((yr / 10) + 48);
salida [7] = char ((yr % 10) + 48);
salida [8] = 0;
}
otra cosa
{
Yr=t.Year;
salida [6] = char ((yr / 1000) + 48);
salida [7] = char (((yr % 1000) / 100) + 48);
salida [8] = char (((yr % 100) / 10) + 48);
salida [9] = char ((yr % 10) + 48);
salida [10] = 0;
}
rotura;
caso FORMAT_BIGENDIAN:
Si (slformat == FORMAT_SHORT)
desplazamiento = 0;
otra cosa
offset = 2;
Si (slformat == FORMAT_SHORT)
{
Yr=t.Year-2000;
Si (año < 10)
salida [0] = 48;
otra cosa
salida [0] = char ((yr / 10) + 48);
salida [1] = char ((yr % 10) + 48);
salida [2] = divisor;
}
otra cosa
{
Yr=t.Year;
salida [0] = char ((yr / 1000) + 48);
salida [1] = char (((yr % 1000) / 100) + 48);
salida [2] = char (((yr % 100) / 10) + 48);
de salida [3] = char ((yr % 10) + 48);
de salida [4] = divisor;
}
Si (t.mon < 10)
salida [3 + desplazamiento] = 48;
otra cosa
salida [3 + desplazamiento] = char ((t.mon / 10) + 48);
salida [4 + offset] = char ((t.mon % 10) + 48);
salida [5 + desplazamiento] = divisor;
Si (t.date < 10)
salida [6 + desplazamiento] = 48;
otra cosa
salida [6 + desplazamiento] = char ((t.date / 10) + 48);
salida [7 + desplazamiento] = char ((t.date % 10) + 48);
salida [8 + desplazamiento] = 0;
rotura;
caso FORMAT_MIDDLEENDIAN:
Si (t.mon < 10)
salida [0] = 48;
otra cosa
salida [0] = char ((t.mon / 10) + 48);
salida [1] = char ((t.mon % 10) + 48);
salida [2] = divisor;
Si (t.date < 10)
de salida [3] = 48;
otra cosa
de salida [3] = char ((t.date / 10) + 48);
de salida [4] = char ((t.date % 10) + 48);
salida [5] = divisor;
Si (slformat == FORMAT_SHORT)
{
Yr=t.Year-2000;
Si (año < 10)
salida [6] = 48;
otra cosa
salida [6] = char ((yr / 10) + 48);
salida [7] = char ((yr % 10) + 48);
salida [8] = 0;
}
otra cosa
{
Yr=t.Year;
salida [6] = char ((yr / 1000) + 48);
salida [7] = char (((yr % 1000) / 100) + 48);
salida [8] = char (((yr % 100) / 10) + 48);
salida [9] = char ((yr % 10) + 48);
salida [10] = 0;
}
rotura;
}
regreso salida;
}
char * DS1302::getDOWStr(uint8_t format)
{
char * salida = "xxxxxxxxx";
Tiempo t;
t=getTime();
interruptor (t.dow)
{
caso el lunes:
salida = "Lunes";
rotura;
caso del martes:
salida = "Martes";
rotura;
caso del miércoles:
salida = "Miércoles";
rotura;
caso el jueves:
salida = "Jueves";
rotura;
caso del viernes:
salida = "Viernes";
rotura;
caso el sábado:
salida = "Sábado";
rotura;
caso el domingo:
salida = 'Domingo';
rotura;
}
Si (formato == FORMAT_SHORT)
de salida [3] = 0;
regreso salida;
}
char * DS1302::getMonthStr(uint8_t format)
{
char * salida = "xxxxxxxxx";
Tiempo t;
t=getTime();
interruptor (t.mon)
{
caso 1:
salida = "Enero";
rotura;
caso 2:
salida = "Febrero";
rotura;
caso 3:
salida = "Marzo";
rotura;
caso 4:
salida = "Abril";
rotura;
caso 5:
salida = "Mayo";
rotura;
caso 6:
salida = "Junio";
rotura;
caso 7:
salida = "Julio";
rotura;
caso 8:
salida = "Agosto";
rotura;
caso 9:
salida = "Septiembre";
rotura;
caso 10:
salida = "Octubre";
rotura;
caso 11:
salida = "Noviembre";
rotura;
caso 12:
salida = "Diciembre";
rotura;
}
Si (formato == FORMAT_SHORT)
de salida [3] = 0;
regreso salida;
}
void DS1302::halt (bool habilitar)
{
uint8_t _reg = _readRegister(REG_SEC);
_reg & = ~ (1 << 7);
_reg | = (activar << 7);
_writeRegister (REG_SEC, _reg);
}
void DS1302::writeProtect (bool habilitar)
{
uint8_t _reg = (activar << 7);
_writeRegister (REG_WP, _reg);
}
void DS1302::setTCR (uint8_t valor)
{
_writeRegister (REG_TCR, valor);
}
/ * Privada * /
DS1302::_readByte() de uint8_t
{
pinMode (_data_pin, entrada);
valor de uint8_t = 0;
uint8_t currentBit = 0;
para (int i = 0; i < 8; ++ i)
{
currentBit = digitalRead(_data_pin);
valor | = (currentBit << i);
digitalWrite (_sclk_pin, HIGH);
delayMicroseconds(1);
digitalWrite (_sclk_pin, bajo);
}
devolver valor;
}
void DS1302::_writeByte (uint8_t valor)
{
pinMode (_data_pin, salida);
shiftOut (_data_pin, _sclk_pin, LSBFIRST, valor);
}
DS1302::_readRegister de uint8_t (uint8_t reg)
{
cmdByte de uint8_t = 129;
cmdByte | = (reg << 1);
readValue de uint8_t;
digitalWrite (_sclk_pin, bajo);
digitalWrite (_ce_pin, HIGH);
_writeByte(cmdByte);
readValue = _readByte();
digitalWrite (_ce_pin, bajo);
volver readValue;
}
void DS1302::_writeRegister (reg de uint8_t, uint8_t valor)
{
cmdByte de uint8_t = (128 | (reg << 1));
digitalWrite (_sclk_pin, bajo);
digitalWrite (_ce_pin, HIGH);
_writeByte(cmdByte);
_writeByte(Value);
digitalWrite (_ce_pin, bajo);
}
void DS1302::_burstRead()
{
digitalWrite (_sclk_pin, bajo);
digitalWrite (_ce_pin, HIGH);
_writeByte(191);
para (int i = 0; i < 8; i ++)
{
_burstArray [i] = _readByte();
}
digitalWrite (_ce_pin, bajo);
}
DS1302::_decode de uint8_t (uint8_t valor)
{
uint8_t decodificados = valor & 127;
descifrada = (decodificado y 15) + 10 * ((decodificada & (15 << 4)) >> 4);
volver decodificado;
}
DS1302::_decodeH de uint8_t (uint8_t valor)
{
Si (valor y 128)
valor = (valor & 15) + (12 * ((value & 32) >> 5));
otra cosa
valor = (valor & 15) + (10 * ((value & 48) >> 4));
devolver valor;
}
DS1302::_decodeY de uint8_t (uint8_t valor)
{
uint8_t decodificados = (valor & 15) + 10 * ((valor & (15 << 4)) >> 4);
volver decodificado;
}
DS1302::_encode de uint8_t (uint8_t valor)
{
uint8_t codificado = ((value / 10) << 4) + (valor % 10);
retorno codificado;
}
void DS1302::writeBuffer (DS1302_RAM r)
{
digitalWrite (_sclk_pin, bajo);
digitalWrite (_ce_pin, HIGH);
_writeByte(254);
para (int i = 0; i < 31; i ++)
{
_writeByte(r.Cell[i]);
}
digitalWrite (_ce_pin, bajo);
}
DS1302_RAM DS1302::readBuffer()
{
DS1302_RAM r;
digitalWrite (_sclk_pin, bajo);
digitalWrite (_ce_pin, HIGH);
_writeByte(255);
para (int i = 0; i < 31; i ++)
{
r.Cell[i] = _readByte();
}
digitalWrite (_ce_pin, bajo);
devolver r;
}
void DS1302::poke (uint8_t addr, uint8_t valor)
{
Si ((addr > = 0) & & (addr < = 30))
{
addr = (addr * 2) + 192;
digitalWrite (_sclk_pin, bajo);
digitalWrite (_ce_pin, HIGH);
_writeByte(ADDR);
_writeByte(Value);
digitalWrite (_ce_pin, bajo);
}
}
DS1302::peek de uint8_t (uint8_t addr)
{
Si ((addr > = 0) & & (addr < = 30))
{
addr = (addr * 2) + 193;
readValue de uint8_t;
digitalWrite (_sclk_pin, bajo);
digitalWrite (_ce_pin, HIGH);
_writeByte(ADDR);
readValue = _readByte();
digitalWrite (_ce_pin, bajo);
volver readValue;
}
otra cosa
return 0;
}