Hola a todos luego de algunas semanas estoy por aqui saludos a todos .
Tengo este problema haber si me echan una mano, he hecho dos programas un para transmitir y otro para recibir esta por uart.
El transmisor (pic16f628) solo envia datos cuando se pulsa el RA2, envio una cadena de 10 bytes primero los almaceno en un arreglo ya definido (DataTx[]), los primeros 5 caracteres son la cabecera (PicRF) los otros cinco son solo datos y vuelve a enviar cuando se preciona de nuevo el RA2.
El receptor (pic16f876) esta por int. el programa primero reconoce la cabecera para despues mostrarlo en el LCD si la cabecera no coincide con PicRF entonces muestra error, cuando llega un caracter pasa por el filtro logico y se almacena en DataRX[] uno por uno al final lo muestra en el lcd.
El programa funciona bien si muestra en el lcd , mi problema es que el programa deberia funcionar en la primera pulsada de RA2, pero funciona en la segunda pulsada.
Espero es que me alla dejado entender, algo mas amigos existe algun comando para borrar solo una linea del lcd; gracias y saludos.
/****************************************************/
/********** Programa del transmisor *********************/
#include <16f628a.h>
#fuses HS,NOWDT
#use delay(clock=20000000)
#use rs232(baud=9600,xmit=pin_b2,rcv=pin_b1)
#use fast_io(a)
void main (){
int j=0;
int header[5]={'P','i','c','R','F'},DataTx[10];
while(TRUE){
if(input(pin_a2)==0){ /* pulsaron RA2 */
delay_ms(10); /* retardo para rebotes */
if(input(pin_a2)==0){ /* pregunta si es que sigue pulsado */
while(input(pin_a2)==0){ /* se queda aqui si aun esta pulsado */
}
}
for(j=0;j<=4;j++){
datatx[j]=header[j];
}
for(j=0;j<=4;j++){ /* bucle para enviar data de cabecera */
putc(DataTx[j]); /* envio de cabecera */
delay_ms(70);
}
j=5;
while(j<=9){
DataTx[j]=j+68;
putc(DataTx[j]);
delay_ms(70);
j++;
}
}
}
}
/****************************************************/
/************ Programa del receptor ********************/
#include <16f876.h>
#fuses HS,NOWDT
#use delay(clock=20000000)
#use rs232(baud=9600,xmit=pin_c6,rcv=pin_c7,bits=8)
#define LCD_RS PIN_B1
#define LCD_RW PIN_B2
#define LCD_E PIN_B3
#define LCD_DB4 PIN_B4
#define LCD_DB5 PIN_B5
#define LCD_DB6 PIN_B6
#define LCD_DB7 PIN_B7
#include "flex_lcd.c"
#use fast_io(a)
int FLAG_INT_RX=0,valor;
/***********************************************************/
/**************** RUTINA DE INTERRUPCION *******************/
#int_RDA
void RDA_isr(){
valor=GETC(); /* recibe caracter */
FLAG_INT_RX=1;
}
/***********************************************************/
/****************** PROGRAMA PRINCIPAL *********************/
void main(){
int cont=0,i,DataRX[10]; /* variables locales */
lcd_init();
enable_interrupts(INT_RDA);
enable_interrupts(GLOBAL);
lcd_gotoxy(1,1);
printf(lcd_putc,"Recibiendo:");
while(true){
if(FLAG_INT_RX==1){ /* solo entra si hay recepcion */
FLAG_INT_RX=0;
if(cont<5){
switch(valor){
case 'P' : if(cont==0){
DataRX[cont]=valor;
cont++;
}
break;
case 'i' : if(cont==1){
DataRX[cont]=valor;
cont++;
}
break;
case 'c' : if(cont==2){
DataRX[cont]=valor;
cont++;
}
break;
case 'R' : if(cont==3){
DataRX[cont]=valor;
cont++;
}
break;
case 'F' : if(cont==4){
DataRX[cont]=valor;
cont++;
}
break;
default : cont=0;
lcd_gotoxy(1,2);
printf(lcd_putc,"Error");
}
}
else{ /* aqui entra si ya reconocio la cabecera (cont>=5)*/
if(cont<10){
DataRX[cont]=valor;
cont++;
}
else{ /* aqui entra si llegaron los 10 datos (cont>=10) */
lcd_gotoxy(1,2); /* voy a escribir en la segunda linea del LCD */
for(i=0;i<=9;i++){ /* los envia al LCD */
lcd_putc(DataRX);
delay_ms(300);
}
cont=0;
}
}
} /* aqui termina el if principal */
do{ /* bucle infinito espera int de recepcion */
}
while(FLAG_INT_RX==0);
}
}