Buenas, estoy haciendo un pequeño proyecto personal de un reloj despertador. Para ello utilizo un PIC16F887, un RTC: DS3232, y una pantalla LCD 16x2. Como no he logrado que cuente he reducido lo mas que he podido el código para encontrar el error. Este código que muestro aqui lo que busco que haga es simplemente escribir en el registro de segundos del RTC un valor "20" y luego leerlo y mostrarlo en la pantalla LCD. El problema es que en la simulación de proteos el LCD solo muestra "00" y nunca logra mostrar el "20" que yo estoy buscando que muestre. Obviamente puedo hacer que muestre 20 colocando ese valor directamente desde el PIC pero el punto es lograr que muestre ese valor utilizando la comunicación i2c que es lo que creo que esta fallando. A continuación les dejo el código y el esquema del proteus

C:
#include <pruebai2c.h>
#fuses XT,NOWDT,NOPROTECT,NOLVP
#use I2C(master, SDA=PIN_C4, SCL=PIN_C3, FAST)
#define LCD_ENABLE_PIN PIN_D0
#define LCD_RS_PIN PIN_D1
#define LCD_RW_PIN PIN_D2
#define LCD_DATA4 PIN_D4
#define LCD_DATA5 PIN_D5
#define LCD_DATA6 PIN_D6
#define LCD_DATA7 PIN_D7
#include "DS3232DEF.c"
#include <lcd.c>
void main()
{
delay_ms(1000);
lcd_init();
lcd_putc('\f');
seconds=20;
set_time();
delay_ms(200);
get_time();
printf(lcd_putc, "%02u", seconds);
delay_ms(1000);
}
C:
#include <stdint.h>
uint8_t seconds;
//uint8_t set_time;
//////////////////////////////////////
// functions //
uint8_t bcd_to_decimal(uint8_t number);
uint8_t decimal_to_bcd(uint8_t number);
//////////////////////////////////////
//////////////////////////////////////
//////////////////////////////////////
// converts BCD to decimal //
uint8_t bcd_to_decimal(uint8_t number)
{
return ( (number >> 4) * 10 + (number & 0x0F) );
}
// converts decimal to BCD //
uint8_t decimal_to_bcd(uint8_t number)
{
return ( ((number / 10) << 4) + (number % 10) );
}
///////////////////////////////////////
///////////////////////////////////////
///////////////////////////////////////
// sets time and date //
void set_time()
{
seconds = decimal_to_bcd(seconds);
// write data to the RTC chip //
i2c_start();
i2c_write(0xD0); //mando la direccion donde se encuentra el esclavo (ds3232)
i2c_write(0x00); //me posiciono en el registro del ds3232 correspondiente a los segundos
i2c_write(seconds); //cargo la informacion de la variable segundos, en el registro correspondiente a los segundos del ds3232, luego de haber hecho la conversion de decimal a bcd
i2c_stop(); //se finaliza la comunicacion con el ds3232, se supone que mi informacion que tenia en la variable segundos ya se ha cargado en el registro correspondiente a los segundos del DS
}
// reads time and date //
void get_time()
{
i2c_start();
i2c_write(0xD0); //mando la direccion donde se encuentra el esclavo (ds3232)
i2c_write(0x00); //me posiciono en el registro del ds3232 correspondiente a los segundos
i2c_start(); //reinicio, desconozco el proposito de este paso
i2c_write(0xD0 | 0x01); //realizo un OR para colocar el bit 0, correspondiente a la direccion del esclavo, en 1. Esto indica que voy a proceder a leer informacion, es decir que el esclavo me va a mandar informacion al maestro. Si solo coloco 0xD0 el maestro es el que envia informacion al esclavo.
seconds = i2c_read(0); //cargo mi variable "seconds" con el valor que tiene el registros de segundos del ds3232 al momento de realizar la lectura.
i2c_stop(); //se finaliza la comunicacion con el ds3232, se supone que ahora tengo cargado en mi variable "seconds" los valores que se encontraban en el registro de segundos del RS3232.
// convert BCD to decimal //
seconds = bcd_to_decimal(seconds); //con la comunicacion anterior cargamos el valor del registro de segundos del RS3232 en nuestra variable "seconds" pero ese valor se encuentra en BCD y debemos transformarlo a Decimales por eso realizamos este paso.(si mal no recuerdo esto es para mostrar de manera adecuada los valores en el lcd)
}
