TODOPIC
Microcontroladores PIC => Todo en microcontroladores PIC => Mensaje iniciado por: FerRoman 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
//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
//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," ");
}
}
-
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.
-
Usa interrupciones por recepción, el PIC que estas usando si no me equivoco se puede configurar con el MCC.