Autor Tema: Transmitir y Leer 16 bits EUSART  (Leído 1837 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado FerRoman

  • PIC10
  • *
  • Mensajes: 4
Transmitir y Leer 16 bits EUSART
« en: 23 de Julio de 2020, 22:14:35 »
Hola buenas tardes. Estoy ocupando el módulo EUSART del PIC16F15325 para enviar y leer 16 bits. Estoy ocupando un micro para la transmisión y otro para la recepción. Mi problema es que cuando quiero visualizar el dato recibido solo tengo  el segundo byte (dos veces) y el primero nunca lo veo. Espero alguien pueda asistirme. Y una disculpa de antemano por la molestia.

Les dejo el Código del Tx y del Rx

TRANSMISOR
Código: [Seleccionar]
void EUSART1_TX(unsigned char txData)
{
    while(0 == PIR3bits.TX1IF)
    {
    }
    TX1REG = txData;    // Registro de Transmisión
}

char EUSART1_Rx()
{
 

    return RC1REG;    // Registro de recepcion
}

void SYSTEM_Initialize(void)
{
    PIN_MANAGER_Initialize();
    OSCILLATOR_Initialize();
    EUSART1_Initialize();
}

void main(void)
{
    // initialize the device
    SYSTEM_Initialize();
   
        uint8_t firstbyte = 0u;
        uint8_t secondbyte = 0u;
        uint16_t myint16 = 0x63C2; //25538
        firstbyte = myint16 & 0xFF;
        secondbyte =(myint16 >> 8 )& 0xFF;
       
        EUSART1_TX(firstbyte);
        EUSART1_TX(secondbyte);
}


RECEPTOR
Código: [Seleccionar]
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()
{
    uint16_t lo = EUSART1_RX(); //firstbyte
    uint16_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
    for (int i=0; i<16; i++) { //Recorremos el arreglo para leer cada bit
        PORTAbits.RA0=UART_GetUInt16()>>i; //Por aquí sale el dato bit a bit
        __delay_ms(1000); //Retardo para poder visaluzar el dato
        }
       PORTAbits.RA1=1; //LED que indica que se mostraron los 16 bits
       __delay_ms(1000);
}

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Transmitir y Leer 16 bits EUSART
« Respuesta #1 en: 23 de Julio de 2020, 22:42:08 »

Tu transmisor no tiene un loop infinito ---- Empecemos por ahi...


Código: C
  1. void main(void)
  2. {
  3.     // initialize the device
  4.     SYSTEM_Initialize();
  5.    
  6.         uint8_t firstbyte = 0u;
  7.         uint8_t secondbyte = 0u;
  8.         uint16_t myint16 = 0x63C2; //25538
  9.         firstbyte = myint16 & 0xFF;
  10.         secondbyte =(myint16 >> 8 )& 0xFF;
  11.        
  12.         EUSART1_TX(firstbyte);
  13.         EUSART1_TX(secondbyte);
  14.  
  15.         while(1);
  16. }

Citar
Mi problema es que cuando quiero visualizar el dato recibido solo tengo  el segundo byte (dos veces)

¿ Como lo ves ? Ya que el codigo no muestra nada.
Ademas no comprendo el porque realizarlo 16 veces.

El unico aviso que tenes por byte recibido es el bit RCxIF del registro PIR3.... Al ponerse en 1, significa que hay algo en la FIFO, se pondria en 0 cuando tiene todos los bytes que recibio.


Desconectado FerRoman

  • PIC10
  • *
  • Mensajes: 4
Re:Transmitir y Leer 16 bits EUSART
« Respuesta #2 en: 23 de Julio de 2020, 23:10:49 »
Citar
Tu transmisor no tiene un loop infinito ---- Empecemos por ahi...
Si, una disculpa por no ponerlo. Ya lo hice, pero obtengo el mismo resultado.

Citar
¿ Como lo ves ? Ya que el codigo no muestra nada.
Lo estoy armando físico. La salida de RA0 es por donde visualizo el dato con un maravilloso LED.

Citar
Ademas no comprendo el porque realizarlo 16 veces.
Como quiero visualizar el dato bit a bit con un LED recorro mi dato 16 veces para poder visualizarlo.


Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Transmitir y Leer 16 bits EUSART
« Respuesta #3 en: 23 de Julio de 2020, 23:24:18 »
Citar
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...


Código: C
  1. void EUSART1_Write(char txData)
  2. {
  3.     while(0 == PIR3bits.TX1IF)
  4.     {
  5.     }
  6.     TX1REG = txData;    // Write the data byte to the USART.
  7. }
  8.  
  9. unsigned char EUSART1_RX(){
  10.            
  11.     return RC1REG; //Registro de Recepción
  12. }
  13.  
  14.  
  15. uint16_t UART_GetUInt16()
  16. {
  17.     //Espero 2 datos
  18.     while(PIR3bits.RC1IF == 0);
  19.     uint8_t lo = EUSART1_RX(); //firstbyte
  20.     while(PIR3bits.RC1IF == 0);
  21.     uint8_t hi = EUSART1_RX(); //secondbyte
  22.     return (hi << 8 ) | lo;
  23. }
  24. void SYSTEM_Initialize(void)
  25. {
  26.     PIN_MANAGER_Initialize();
  27.     OSCILLATOR_Initialize();
  28.     EUSART1_Initialize();
  29. }
  30.  
  31. void main(void)
  32. {
  33.     // initialize the device
  34.     SYSTEM_Initialize();
  35.    
  36.     TRISAbits.TRISA0=0; //Limpio puerto para visualizar dato
  37.     TRISAbits.TRISA1=0; //Limpio puerto que me servirá como señalización
  38.  
  39.     uint16_t dato = UART_GetUInt16();
  40.  
  41.     for (int i=0; i<16; i++) { //Recorremos el arreglo para leer cada bit
  42.         PORTAbits.RA0 = dato; //Por aquí sale el dato bit a bit
  43.         dato >>= 1;
  44.         __delay_ms(1000); //Retardo para poder visaluzar el dato
  45.         }
  46.  
  47.      PORTAbits.RA1=1; //LED que indica que se mostraron los 16 bits
  48.      while(1);
  49. }


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.

Desconectado FerRoman

  • PIC10
  • *
  • Mensajes: 4
Re:Transmitir y Leer 16 bits EUSART
« Respuesta #4 en: 24 de Julio de 2020, 03:47:55 »
Muchas gracias por tu intervención KILLERJC. Tenías la razón en todo. El sistema funciona a la perfección.


 

anything