Necesito integrar DS1307 RTC
en mi proyecto. De alguna manera, he logrado escribir el código I2C y lo he conectado con PIC32. Necesito crear una lógica para que muestre los valores en tiempo real en UART
. Ahora para mostrarlo en UART, los valores deben convertirse en ASCII
. Entonces, digamos que si configuro 13
en su registro seconds
, entonces obtengo este valor en I2C2RCV register
pero en el terminal está mostrando algún carácter ASCII aleatorio.
Después de convertir este valor a ASCII, recibo 51 49
en el terminal. Estoy usando la siguiente lógica para la conversión:
//i2cbyte : Received values from I2C
char i2cbyte;
unsigned char x,y,p1,p2;
char value1[10] ;
char value2[10] ;
x = i2cbyte & 0x0F;
p1 = x | 0x30;
y = i2cbyte & 0xF0;
y = y >> 4;
p2 = y | 0x30;
sprintf(value1,"%d",p1);
sprintf(value2,"%d",p2);
putsUART1(value1);
putsUART1(value2);
Así que configuré 13
y recibí 51 49
. Entonces, ¿qué valor debo configurar en mi código para obtener un valor en tiempo real en UART? ¿Es posible obtener valores en UART porque dentro del código obtengo el valor en tiempo real pero para mostrarlo fuera del código, los valores deben convertirse, lo que se convierte en otra cosa? ¿Cómo puedo resolver esto?
Después de configurar los valores en el registro de RTC
, ¿necesito usar alguna lógica para actualizarlo? La hoja de datos indica que los registros se actualizan automáticamente. Pero lo que sucede durante la programación es que estoy configurando valores en registros y luego los leo, pero los valores no se están actualizando. Siempre estoy recibiendo lo que estoy escribiendo.
Cómo establecer valores
Por favor ayuda.!
CÓDIGO:
int main(void)
{
OpenUART1( UART_EN | UART_NO_PAR_8BIT | UART_1STOPBIT , UART_RX_ENABLE | UART_TX_ENABLE, (FPB/16/BAUDRATE)-1 );
I2C2BRG = 0xA3; //I2C Baudrate
I2CEnable(EEPROM_I2C_BUS, TRUE); //I2C module On
StartTransfer(FALSE); //I2C Start
TransmitOneByte(0xD0); //slave address
TransmitOneByte(0x00); //register pointer pointing to first register (seconds)
TransmitOneByte(0x13); //seconds register value
StopTransfer(); //I2C Stop
IdleI2C2(); //I2C wait
while(1)
{
RTC_read();
putsUART1(value2);
putsUART1(value1);
putsUART1("\n");
DelayMs(1000);
}
}
//RTC_read function:
void RTC_read()
{
StartTransfer(FALSE); //I2C Start
TransmitOneByte(0xD0); //I2C slave address
TransmitOneByte(0x00); //Register address
StopTransfer(); //I2C Stop
IdleI2C2(); //i2C Stop
StartTransfer(TRUE); //I2C Restart
TransmitOneByte(0xD1); //Slave address to read
//Reading from I2C slave
if(I2CReceiverEnable(EEPROM_I2C_BUS, TRUE) == I2C_RECEIVE_OVERFLOW)
{
putsUART1("Error: I2C Receive Overflow\n");
}
else
{
while(!I2CReceivedDataIsAvailable(EEPROM_I2C_BUS));
sec = I2CGetByte(EEPROM_I2C_BUS); //storing seconds into sec variable
}
StopTransfer(); //I2C Stop
//converting sec to ASCII
x1 = sec & 0x0F;
p1 = x1 | 0x30;
y1 = sec & 0xF0;
y1 = y1 >> 4;
p2 = y1 | 0x30;
sprintf(value1,"%c",p1);
sprintf(value2,"%c",p2);
}