CCS C Software and Maintenance Offers
FAQFAQ   FAQForum Help   FAQOfficial CCS Support   SearchSearch  RegisterRegister 

ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in 

CCS does not monitor this forum on a regular basis.

Please do not post bug reports on this forum. Send them to support@ccsinfo.com

[Solved] DS3231 and PIC16f628A

 
Post new topic   Reply to topic    CCS Forum Index -> General CCS C Discussion
View previous topic :: View next topic  
Author Message
robo_z



Joined: 11 Dec 2014
Posts: 5

View user's profile Send private message

[Solved] DS3231 and PIC16f628A
PostPosted: Wed Jun 14, 2023 1:28 pm     Reply with quote

Hello i want show the time and date from a RTC DS3231, but i have problems for show correctly.

this is my code:
Code:

#include <16F628A.h>

#FUSES NOWDT
#FUSES PUT      //Power Up Timer
#FUSES NOMCLR   //Master Clear pin enabled
#FUSES BROWNOUT   //Reset when brownout detected
#FUSES NOLVP   //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#FUSES CPD      //Data EEPROM Code Protected
#FUSES PROTECT   //Code protected from reads

#use delay(internal=4MHz)

#use fast_io(A)
#use fast_io(B)


#define DS3231_INT   PIN_B0
#define DS3231_SDA   PIN_B1
#define DS3231_SCL   PIN_B2
#define PIN_TXD      PIN_B7

#use rs232(baud=9600, parity=N, xmit=PIN_TXD, rcv=0, bits=8, DISABLE_INTS, FORCE_SW, stream=SERIE)
#use i2c(MASTER, SDA=DS3231_SDA, SCL=DS3231_SCL, FAST=100000, STREAM=BUS_I2C)

const unsigned int DirDS3231 = 0xD0;
unsigned int Segundo, Minuto, Hora, Dia, Mes, Anio, Alarma1_Min, Alarma1_Hora, Alarma2_Min, Alarma2_Hora, Temperatura;


unsigned int Bcd2Dec(unsigned int MiBCD)
{
   return ( (MiBCD >> 4) * 10 + (MiBCD & 0x0F) );
}

unsigned int Dec2Bcd(unsigned int MiDEC)
{
   return ( ((MiDEC / 10) << 4) + (MiDEC % 10) );
}
   
void LeerDS3231(unsigned int DirReloj)
{
   i2c_start(BUS_I2C);                        // Inicia la Comunicaion I2C
     i2c_write(BUS_I2C, DirReloj);               // Escribimos la Direccion del DS3231
     i2c_write(BUS_I2C, 0x00);                  // Send register address (Registro Segundos)
     i2c_stop(BUS_I2C);                        // Detiene la Comunicaion I2C
     i2c_start(BUS_I2C);                        // Reiniciamos la Comunicacion I2C
     i2c_write(BUS_I2C, DirReloj | 0x01);         // Iniciamos la Lectura
     Segundo = Bcd2Dec(i2c_read(BUS_I2C, 1));      // Leemos Segundos Del Registro 0
     Minuto = Bcd2Dec(i2c_read(BUS_I2C, 1));         // Leemos Minutos Del Registro 1
     Hora = Bcd2Dec(i2c_read(BUS_I2C, 1));         // Leemos Hora Del Registro 2
     i2c_read(BUS_I2C, 1);                     // Saltamos el Registro 3 (Dia de la Semana)
     Dia = Bcd2Dec(i2c_read(BUS_I2C, 1));          // Leemos Fecha Del Registro 4
     Mes = Bcd2Dec(i2c_read(BUS_I2C, 1));         // Leemos Mes Del Registro 5
     Anio = Bcd2Dec(i2c_read(BUS_I2C, 1));         // Leemos Anio Del Registro 6
     i2c_read(BUS_I2C, 1);                     // Saltamos el Registro 7 (Alarma 1 Segundos)
     Alarma1_Min = Bcd2Dec(i2c_read(BUS_I2C, 1));   // Leemos Alarma 1 Minutos Del Registro 8
     Alarma1_Hora = Bcd2Dec(i2c_read(BUS_I2C, 1));   // Leemos Alarma 1 Horas Del Registro 9
     i2c_read(BUS_I2C, 1);                     // Saltamos el Registro 10 (Alarma 1 Fecha)
     Alarma2_Min = Bcd2Dec(i2c_read(BUS_I2C, 1));   // Leemos Alarma 2 Minutos Del Registro 11
     Alarma2_Hora = Bcd2Dec(i2c_read(BUS_I2C, 1));   // Leemos Alarma 2 Horas Del Registro 12
     i2c_read(BUS_I2C, 1);                     // Saltamos el Registro 13 (Alarma 2 Fecha)
     i2c_read(BUS_I2C, 1);                     // Saltamos el Registro 14 (Control)
     i2c_read(BUS_I2C, 1);                     // Saltamos el Registro 15 (Status)
     i2c_read(BUS_I2C, 1);                     // Saltamos el Registro 16 (Anging Offset)
     Temperatura = i2c_read(BUS_I2C, 1);            // Leemos Temperatura MSB Del Registro 17
     i2c_stop(BUS_I2C);                        // Detiene la Comunicaion I2C
}



void main()
{
   setup_comparator(NC_NC_NC_NC);
   
   port_b_pullups(0x0F);
   
   set_tris_a(0x30);
   set_tris_b(0x09);

   while(TRUE)
   {
         LeerDS3231(DirDS3231);
      fprintf(SERIE, "Fecha:%02u/%02u/%02u Hora:%02u:%02u:%02u Temperatura:%02u\r", Dia, Mes, Anio, Hora, Minuto, Segundo, Temperatura);              
   }
}


but i get irregular data:

Code:

Fecha:14/06/23 Hora:14:22:33 Temperatura:00
Fecha:165/165/165 Hora:165:165:03 Temperatura:255
Fecha:14/06/23 Hora:14:22:33 Temperatura:00
Fecha:165/165/165 Hora:165:165:03 Temperatura:255
Fecha:14/06/23 Hora:14:22:33 Temperatura:32
Fecha:165/165/165 Hora:165:165:03 Temperatura:255
Fecha:14/06/23 Hora:14:22:33 Temperatura:32
Fecha:165/165/165 Hora:165:165:03 Temperatura:255
Fecha:14/06/23 Hora:14:22:33 Temperatura:32
...



how to solve this problem.

thanks for you help.


Last edited by robo_z on Wed Jun 14, 2023 5:02 pm; edited 1 time in total
temtronic



Joined: 01 Jul 2010
Posts: 9120
Location: Greensville,Ontario

View user's profile Send private message

PostPosted: Wed Jun 14, 2023 4:34 pm     Reply with quote

hmm...what is the value of the I2C bus pullup resistors ?
do you have battery attached to the DS3231 ?

also add a 1 second delay in your loop..helps us humans to see better...
PCM programmer



Joined: 06 Sep 2003
Posts: 21708

View user's profile Send private message

PostPosted: Wed Jun 14, 2023 5:00 pm     Reply with quote

You need to do a NACK on the last i2c_read operation.
You are doing an ACK.

ACK = 1
NACK = 0
robo_z



Joined: 11 Dec 2014
Posts: 5

View user's profile Send private message

PostPosted: Wed Jun 14, 2023 5:01 pm     Reply with quote

temtronic wrote:
hmm...what is the value of the I2C bus pullup resistors ?
do you have battery attached to the DS3231 ?

also add a 1 second delay in your loop..helps us humans to see better...


thanks for you help

i solve add a not acknoledge at final of read.

Code:

i2c_read(BUS_I2C, 1);                     // Saltamos el Registro 15 (Status)
     i2c_read(BUS_I2C, 1);                     // Saltamos el Registro 16 (Aging Offset)
     Temperatura = i2c_read(BUS_I2C, 1);            // Leemos Temperatura MSB Del Registro 17
     i2c_read(BUS_I2C, 0);                     // Saltamos el Registro 18 (Temperatura LSB) y Cerramos con NOT ACK
     i2c_stop(BUS_I2C);                        // Detiene la Comunicaion I2C
Display posts from previous:   
Post new topic   Reply to topic    CCS Forum Index -> General CCS C Discussion All times are GMT - 6 Hours
Page 1 of 1

 
Jump to:  
You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot vote in polls in this forum


Powered by phpBB © 2001, 2005 phpBB Group