Pocas consultas sobre cómo configurar el valor del reloj en tiempo real en DS1307

0

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);
}
    
pregunta user007

1 respuesta

1

El 51 49 tiene perfecto sentido. Son los códigos ASCII para 3 y 1 , resp. ¿Por qué el orden inverso? Comenzó seleccionando el mordisco de orden bajo, en lugar del mordisco de orden alto.

¿Cómo enviar el personaje en lugar de su código ASCII?
Use "% c" como cadena de formato en lugar de "% d" (que da formato a un número decimal).

    
respondido por el Joris Groosman

Lea otras preguntas en las etiquetas