/* * rtc1308.cpp * * Created on: Nov 4, 2014 * Author: Alan Aguilar Sologuren */ #include #include /*! * \fn initialization * \brief Inicializacion del modulo que controlara al RTC DS1308. */ bool te_rtc_initialization(void) { pinMode(CLKIN,OUTPUT); attachInterrupt(PPS,ISR_gnss_pps, RISING); } /*! * \fn configure * \brief Configura el IC DS1308 para operacion con un PPS de GNSS como tick. * \param rtc estructura que contien informacion de configuracion. * \see rtc_config_struct */ bool te_rtc_configure(rtc_config_struct &rtc) { uint8_t *ctl_byte = (uint8_t*)&rtc.ctl_byte; uint8_t *clk_halt = (uint8_t*)&rtc.clk_halt; Wire.beginTransmission(DS1308_CTRL_ID); Wire.write(DS1308_CTL_ADD); Wire.write(*clk_halt); Wire.endTransmission(); Wire.beginTransmission(DS1308_CTRL_ID); Wire.write(DS1308_CTL_ADD); // CLKIN com 1Hz de entrada (1PPS) Wire.write(*ctl_byte); //Wire.write(1< 0 ) { Wire.beginTransmission(DS1308_CTRL_ID); Wire.write(regaddr); Wire.endTransmission(); Wire.requestFrom((uint8_t)DS1308_CTRL_ID, cnt); while(Wire.available() && (cnt > 0) ) { pbuf[nread] = Wire.read(); nread++; cnt--; regaddr++; } /* while */ } return (nread); } /*! * \fn write_ram * \brief Escribe el contenido de un buffer de cnt elementos en la memoria * RAM interna del RTC DS1308, en la direccion especificada. * \param addr direccion relativa a la RAM (0 es la primera) del inicio del * buffer en DS1308. * \param pbuf direccion del buffer a copiar en la RAM del DS1308. * \param cnt Numero de elementos a copiar. * \return estatus * 0 success * 2 error: address send, nack received * 3 error: data send, nack received * 4 other twi error */ uint8_t te_rtc_write_reg(uint8_t regaddr,uint8_t *pbuf,uint8_t cnt) { uint8_t nbytes, rc=0; while (cnt > 0) { nbytes = cnt; Wire.beginTransmission(DS1308_CTRL_ID); Wire.write(regaddr); Wire.write((uint8_t*)pbuf, nbytes); rc = Wire.endTransmission(); cnt -=nbytes; regaddr+=nbytes; pbuf +=nbytes; } return rc; } // Convert Decimal to Binary Coded Decimal (BCD). 2 digits only inline uint8_t dec2bcd(uint8_t val) { return val + 6 * (val / 10); } inline uint8_t bcd2dec(uint8_t val){ return (val>>4)*10 + (val&0x0f); }