Autor Tema: Problema de lectura con comunicacion serie UART por software C18  (Leído 3766 veces)

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

Desconectado Palomino86

  • PIC16
  • ***
  • Mensajes: 180
Problema de lectura con comunicacion serie UART por software C18
« 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
Código: [Seleccionar]
   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
Código: [Seleccionar]
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.....  :?
Lo que no me destruye, me fortalece

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: Problema de lectura con comunicacion serie UART por software C18
« Respuesta #1 en: 14 de Octubre de 2010, 12:21:25 »
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:

Código: C
  1. while (!DataRdyUSART());


Saludos!
No contesto mensajes privados, las consultas en el foro

Desconectado Palomino86

  • PIC16
  • ***
  • Mensajes: 180
Re: Problema de lectura con comunicacion serie UART por software C18
« Respuesta #2 en: 14 de Octubre de 2010, 12:32:56 »
Ok, dejame ver si comprendi lo que me comentas...

Entonces para mi caso la forma correcta de invocarlo seria:

Código: [Seleccionar]
while (!DataRdyUSART())
{
for(i=0;i<3;i++)
{
digito[i]=ReadUART();
}
}

O le ando errando?

Saludos
Lo que no me destruye, me fortalece

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: Problema de lectura con comunicacion serie UART por software C18
« Respuesta #3 en: 14 de Octubre de 2010, 12:54:52 »
Lo tienes que colocar para saber si llego un dato y después leer. Que haría en el ejemplo que muestras?
No contesto mensajes privados, las consultas en el foro

Desconectado Palomino86

  • PIC16
  • ***
  • Mensajes: 180
Re: Problema de lectura con comunicacion serie UART por software C18
« Respuesta #4 en: 14 de Octubre de 2010, 13:06:35 »
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:
Código: [Seleccionar]
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
Lo que no me destruye, me fortalece

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: Problema de lectura con comunicacion serie UART por software C18
« Respuesta #5 en: 14 de Octubre de 2010, 13:15:59 »
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:

Código: [Seleccionar]
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:

Código: C
  1. while (!DataRdyUSART());
  2. data=ReadUART();



Saludos!
No contesto mensajes privados, las consultas en el foro

Desconectado Palomino86

  • PIC16
  • ***
  • Mensajes: 180
Re: Problema de lectura con comunicacion serie UART por software C18
« Respuesta #6 en: 14 de Octubre de 2010, 13:42:55 »
Pero.... no se quedaria esperando por siempre hasta que haya dato para saltar a la siguiente instruccion?

Citar
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....
Lo que no me destruye, me fortalece

Desconectado Palomino86

  • PIC16
  • ***
  • Mensajes: 180
Re: Problema de lectura con comunicacion serie UART por software C18
« Respuesta #7 en: 15 de Octubre de 2010, 12:32:40 »
Ya resolvi el problema con la comunicacion jejej

Saludos
Lo que no me destruye, me fortalece