Autor Tema: Problema, bloqueo de recepcion por USART  (Leído 1621 veces)

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

Desconectado I3iT

  • PIC12
  • **
  • Mensajes: 50
Problema, bloqueo de recepcion por USART
« en: 23 de Noviembre de 2005, 05:09:00 »
Wenas.

Comento asi rapido el PROBLEMON. La cosa es que recibo bytes serialmente, por interrupcion RDA cogiendo un byte cada vez y cuando han llegado 4 bytes se considera trama completa y se "utiliza".
El programa funciona perfectamente, le mando datos desde un programa hecho en visualBasic y los recibe correctamente haciendo lo que le indique..... hasta que se le va la bola (aleatirio) y cuando le mando datos no los recibe. El PIC sigue haciendo el programa pero ya no hace caso a la USART y tengo q reiniciarle.

Uso un 16F876A con un xtal 4Mhz

Si alguien puede darme indicaciones de xq pasa esto para poder solucionarlo se lo agradezco.

Un saludo

Desconectado gfp

  • PIC18
  • ****
  • Mensajes: 274
RE: Problema, bloqueo de recepcion por USART
« Respuesta #1 en: 23 de Noviembre de 2005, 09:04:00 »
Me sucedio los mismo con un 18F452; lo que hacia era lo siguiente:
el uC interrogaba a un dispositivo electronico y luego visualizaba un dato en particular de una extensa trama; cuando todo el sistema se iniciaba el dispositivo electronico enviaba unos datos de como estaba configurado, el uC al recibir esta cantidad de datos se bloqueba la usart, no siquiera aun limpiando la interrupcion se desbloqueaba, la solucion fue no utilizar la usart si no el pin rb0 con interrupcion de alto a bajo,  despues de la rafaga de datos bastaba con limpiar la interrupcion y esta es la hora que trabaja perfecto.

gfp Sonrisa

Desconectado I3iT

  • PIC12
  • **
  • Mensajes: 50
RE: Problema, bloqueo de recepcion por USART
« Respuesta #2 en: 23 de Noviembre de 2005, 17:31:00 »
Hola.

Al menos veo que no solo me pasa a mi...
Tu solucion, no entiendo, cambiaste el uso de la USART por interrupcion RB0? pero como distinguias los bits entonces, igual estoy espeso a estas horas.

La cuestion es que quiero que funcione con la USART, ya por cabezoneria porque no entiendo como puede estar funcionando bien y de repente bloquearse.

Salu2

Desconectado gfp

  • PIC18
  • ****
  • Mensajes: 274
RE: Problema, bloqueo de recepcion por USART
« Respuesta #3 en: 24 de Noviembre de 2005, 15:49:00 »
Al definir en la cabecera del programa la siguiente directiva:

#use rs232(baud=4800,parity=N,xmit=PIN_B0,rcv=PIN_B1,bits=8, stream=PC)

entonces el compilador genera por software una usart y si se activa la interrupcion por RB0 como sigue con flanco de bajada:

ext_int_edge(H_TO_L);
clear_interrupt(INT_EXT);
enable_interrupts(GLOBAL);

entonces ya tiene listo el uC para recibir datos por RB0 y transmitir por RB1,. Cuando llega un dato entonces se genera una interrupcion y allí lo recibes por ejemplo de esta manera:

#int_EXT
void EXT_isr()
   char    Trama[10];
{   
   fgets(Trama,PC);
}


Aunque el registro "Trama" lo debes definir en la cabecera del programa y no olvides que la instruccion fgets espera datos hasta que llegue el "enter" (0x0D)

Saludos,

gfp Sonrisa

Desconectado I3iT

  • PIC12
  • **
  • Mensajes: 50
RE: Problema, bloqueo de recepcion por USART
« Respuesta #4 en: 24 de Noviembre de 2005, 17:08:00 »
Hola.

Ahora lo veo, gracias por la explicación.

Yo uso en la interrupcion la función getc(), y con un indice voy poniendo los bytes en un vector. Tengo que probar con fgets(), no se me habia ocurrido.

Al definir #use rs232(..... stream=PC), ese campo stream=PC es solo para identificar de donde llegan los datos en fgets(Trama, PC), como ponerle una etiqueta de donde llegan los datos ¿no? (podria ponerse cualquier cosa en vez de PC).

De todas formas, asi estamos desaprovechando el hardware del microcontrolador. Me gustaria solucionarlo usando la USART hardware, aunque si asi funciona no es mala opción.

Salu2

Desconectado gfp

  • PIC18
  • ****
  • Mensajes: 274
RE: Problema, bloqueo de recepcion por USART
« Respuesta #5 en: 25 de Noviembre de 2005, 08:11:00 »
Así es puedes colocar cualquier cosa en el campo stream=** donde "**" es lo que puedes modificar a voluntad. Recuerda que fgets espera los caracteres hasta el caracter "enter" (0x0D).
saludos,

gfp Sonrisa


 

anything