TODOPIC
Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: Palomino86 en 14 de Octubre de 2010, 12:14:39
-
Hola que tal;
Estoy teniendo problemas con la comunicación serie por UART, según yo no estoy haciendo nada mas pero probablemente se me este escapando algún detalle en esto. Resulta que estoy comunicando dos microcontroladores, uno envía y el otro recibe datos. El que envía datos me sirve para controlar un teclado y envía de manera serie al otro microcontrolador la tecla que se ha presionado el código de este esta en PBP, mientras que el otro realiza la recepción por medio de comunicación serie por software UART en C18.
Envio serial en PBP
if key<>99 then
KEY_DIG0=key dig 0
KEY_DIG1=key dig 1
SEROUT2 DATO_TEC,S9600,[":",dec1 KEY_DIG1,dec1 KEY_DIG0] : PAUSE 550
ENDIF
Recepción serial C18
unsigned char Revisa_Teclado(void)
{
unsigned int i,n;
unsigned char digito1,digito2,tecla;
char digito[4];
for(i=0;i<3;i++)
{
digito[i]=ReadUART();
}
if (digito[0]=':')
{
switch (digito[1]){
case '0':
digito2=0;
break;
case '1':
digito2=1;
break;
default:
digito2=20;
break;
}
switch (digito[2]){
case '0':
digito1=0;
break;
case '1':
digito1=1;
break;
case '2':
digito1=2;
break;
case '3':
digito1=3;
break;
case '4':
digito1=4;
break;
case '5':
digito1=5;
break;
case '6':
digito1=6;
break;
case '7':
digito1=7;
break;
case '8':
digito1=8;
break;
case '9':
digito1=9;
break;
default:
digito1=20;
break;
}
tecla=(digito2*10)+(digito1);
if (tecla>=20)
{tecla=255;}
return tecla;
}
}
Mi principal problema es que se me queda como ciclado o trabado en el ciclo for y aun no logro descifrar el porque pasa este comportamiento..... :?
-
Si no se usa interrupciones para recibir los datos lo adecuado es esperar hasta que llegue un dato para luego leerlo, esto se hace con:
Saludos!
-
Ok, dejame ver si comprendi lo que me comentas...
Entonces para mi caso la forma correcta de invocarlo seria:
while (!DataRdyUSART())
{
for(i=0;i<3;i++)
{
digito[i]=ReadUART();
}
}
O le ando errando?
Saludos
-
Lo tienes que colocar para saber si llego un dato y después leer. Que haría en el ejemplo que muestras?
-
Lo que pretendo hacer es lo siguiente:
Tengo una función la cual me debe de leer el puerto UART por software, la información que me envia es la de un numero de tecla que es descifrado desde otro pic.
La función para leer la tecla es:
unsigned char Revisa_Teclado(void)
{
unsigned int i,n;
unsigned char digito1,digito2,tecla;
char digito[4];
for(i=0;i<3;i++)
{
digito[i]=ReadUART();
}
if (digito[0]=':')
{
switch (digito[1]){
case '0':
digito2=0;
break;
case '1':
digito2=1;
break;
default:
digito2=20;
break;
}
switch (digito[2]){
case '0':
digito1=0;
break;
case '1':
digito1=1;
break;
case '2':
digito1=2;
break;
case '3':
digito1=3;
break;
case '4':
digito1=4;
break;
case '5':
digito1=5;
break;
case '6':
digito1=6;
break;
case '7':
digito1=7;
break;
case '8':
digito1=8;
break;
case '9':
digito1=9;
break;
default:
digito1=20;
break;
}
tecla=(digito2*10)+(digito1);
if (tecla>=20)
{tecla=255;}
return tecla;
}
}
Esta función la mando llamar desde el programa principal, lo que pretendo hacer es que entre a esta función, cheque si se oprimió alguna tecla, si se oprime pues que haga el debido procesamiento de la información (cheque que el primer caracter que llegue sea ":" y después sigue el numero de la tecla) y si no se ha oprimido ninguna pues que simplemente salga de la función y siga con las demas tareas. El problema es que no me esta dejando continuar con las demas tareas, ya que se me esta ciclando.... y es ahi donde ya no se que hacer...
Saludos
-
Si eso lo entiendo, pero con está modificación:
Ok, dejame ver si comprendi lo que me comentas...
Entonces para mi caso la forma correcta de invocarlo seria:
while (!DataRdyUSART())
{
for(i=0;i<3;i++)
{
digito[i]=ReadUART();
}
}
O le ando errando?
Saludos
Cual es la idea?
Lo que hay que hacer es:
while (!DataRdyUSART());
data=ReadUART();
Saludos!
-
Pero.... no se quedaria esperando por siempre hasta que haya dato para saltar a la siguiente instruccion?
while (!DataRdyUSART()); //Se queda esperando hasta que haya dato?
data=ReadUART();// Lee el dato
Si es asi.... entonces se me seguiria quedando en esa parte del codigo hasta que llegue un dato....
-
Ya resolvi el problema con la comunicacion jejej
Saludos