Autor Tema: EUSART + LCD  (Leído 1625 veces)

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

Desconectado FerRoman

  • PIC10
  • *
  • Mensajes: 4
EUSART + LCD
« en: 26 de Octubre de 2020, 05:52:18 »
Buenas estoy intentado enviar un arreglo de valores de formal serial haciendo uso del módulo EUSART del PIC16F15325 y visualizar los datos recibidos en un LCD. Mi problema es que solo recibo el primer dato, después recibo otro dato desconocido y después puros ceros. ¿Cuál es mi falla? Espero me puedan ayudar :(

Les dejo el código del Transmisor

Código: [Seleccionar]
//Transmisión
void EUSART1_TX(char txData){
 while(0 == PIR3bits.TX1IF){} //Espera a que el buffer este lleno
    TX1REG = txData;    //Almacena datos en el registro de transmisión
}

void main(void)
{
    Inicializar_oscilador_interno();
    Inicializacion_puertos();
    EUSART_Init();
   
   
    int16_t  datos[]={-1250,2,460,-438,372,270,142,0,0,142,270,-372,438}; //Valores a desplegar
    int limite =(sizeof(datos)/sizeof(datos[0])); //Cálculo el tamaño del vector para el ciclo for
   
    __delay_us(10); //Retardo para visualizar dato
   
    while(1){
       
    for (int i=0; i<limite; i++){ //Ciclo para desplegar los datos en el LCDA
       
        resul=datos[i];
       
        int8_t firstbyte = 0; //Declaro Primer Byte
        int8_t secondbyte = 0; //Declaro Seungdo Byte
        int16_t myint16 = resul;
       
        firstbyte = myint16 & 0xFF;
        secondbyte =(myint16 >> 8)& 0xFF;
       
        EUSART1_TX(firstbyte); //Envía el primer byte por TX
        EUSART1_TX(secondbyte); //Envía el segundo byte por TX
   
}
   
    }   
}

Y este es el código para el receptor junto con el LCD
Código: [Seleccionar]
//Recepción
unsigned char EUSART1_RX(){
    return RC1REG; //Registro de Recepción
}

int16_t UART_GetUInt16()
{
//Espero 2 datos
    int8_t low = EUSART1_RX(); //Primer Byte
    int8_t high = EUSART1_RX(); //Segundo Byte
    return (high << 8 ) | low; //Concatenamos
}

void main(void) {
    OSCILLATOR_Init(); //Inicializa Oscilador
    Inicializacion_puertos();
    EUSART_Init();
   
    Lcd_Init(); //Inicializo LCD
    Lcd_Cmd(LCD_CLEAR); //Limpio LCD
    Lcd_Cmd(LCD_SHIFT_LEFT); //Muevo a la izquierda
    Lcd_Cmd(LCD_CURSOR_OFF); //Apago cursor
 
    while(1){
   
    int16_t dato = UART_GetUInt16(); //Dato de 2 bytes almacenado.
   
    Lcd_Out(1,1,"Datos:");
    buf=ftoa(dato, &status); 
    sprintf(buf,"%d", dato);
    Lcd_Out2(2,1,buf);
    __delay_ms(500); //Retardo para visualizar dato
    Lcd_Out(2,1,"       ");
    }   
}


Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:EUSART + LCD
« Respuesta #1 en: 28 de Octubre de 2020, 10:25:02 »
Disculpa la demora... Veo unos problemas en el receptor

- No esperas que exista un dato, directamente queres leerlo. Imaginate que tomar el dato de RCREG te lleva un ciclo de reloj mientras que recibir el dato son varios ciclos.
- Luego tenes instrucciones del LCD, y delays, entre lecturas y lecturas. Existe un solo lugar para que se quede el dato, si enviaste 2 datos y estuvo encerrado en lo del LCD o delays, entonces el UART se bloquea. Y tenes que desactivarlo y activarlo nuevamente. Pero esto NO deberia ocurrir, te sugiero que utilices interrupciones. Y cada dos datos comenzas de nuevo.

Desconectado MarShall

  • PIC10
  • *
  • Mensajes: 9
Re:EUSART + LCD
« Respuesta #2 en: 28 de Octubre de 2020, 22:00:03 »
Usa interrupciones por recepción, el PIC que estas usando si no me equivoco se puede configurar con el MCC.


 

anything