Como quiero visualizar el dato bit a bit con un LED recorro mi dato 16 veces para poder visualizarlo.
Y ahi es donde estas haciendolo mal...
void EUSART1_Write(char txData)
{
while(0 == PIR3bits.TX1IF)
{
}
TX1REG = txData; // Write the data byte to the USART.
}
unsigned char EUSART1_RX(){
return RC1REG; //Registro de Recepción
}
uint16_t UART_GetUInt16()
{
//Espero 2 datos
while(PIR3bits.RC1IF == 0);
uint8_t lo = EUSART1_RX(); //firstbyte
while(PIR3bits.RC1IF == 0);
uint8_t hi = EUSART1_RX(); //secondbyte
return (hi << 8 ) | lo;
}
void SYSTEM_Initialize(void)
{
PIN_MANAGER_Initialize();
OSCILLATOR_Initialize();
EUSART1_Initialize();
}
void main(void)
{
// initialize the device
SYSTEM_Initialize();
TRISAbits.TRISA0=0; //Limpio puerto para visualizar dato
TRISAbits.TRISA1=0; //Limpio puerto que me servirá como señalización
uint16_t dato = UART_GetUInt16();
for (int i=0; i<16; i++) { //Recorremos el arreglo para leer cada bit
PORTAbits.RA0 = dato; //Por aquí sale el dato bit a bit
dato >>= 1;
__delay_ms(1000); //Retardo para poder visaluzar el dato
}
PORTAbits.RA1=1; //LED que indica que se mostraron los 16 bits
while(1);
}
Por que cada ves que haces el for, estas pidiendo nuevamente lo que hay en RCREG, sea que llego algo nuevo o no...
Ahi lo modifique (de mala manera usando whiles) para que espere 2 datos, y luego de que llegue dos datos que los muestre con el FOR.
Otra cosa, esto quiere decir que:
El receptor debe ser el primero que tiene que estar prendiendo. Antes de activar el transmisor. Si los activas a los dos juntos sera una condicion de carrera, a no ser que le agregues un delay al transmisor.