Autor Tema: PIC "se cuelga" al recibir datos por USART  (Leído 9153 veces)

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

Desconectado sauron

  • PIC12
  • **
  • Mensajes: 78
PIC "se cuelga" al recibir datos por USART
« en: 25 de Octubre de 2011, 23:16:40 »
Hola compañeros foristas.

Me topé con éste obstáculo y les agradezco sus opiniones al respecto:

Tengo el Rx del USART de un 16f628A conectado "en paralelo" junto con el Rx de dos sendos dispositivos seriales (no PICs).

Ésto es debido a que deben recibir datos de forma remota y según el dato, cada uno debe hacer una función.

Resulta que el PIC funciona hasta que se mandan los datos para los otros dos dispositivos, se puede decir que cuando el PIC lee esos datos a los segundos "se cuelga", ya que no hace nada y hay que reiniciarlo.

He de acotar que se tiene la interrupción del USART activada, ya que en teoría, cuando llega el dato que le concierne al PIC, éste debe reconocerlo y ejecutar la función. He pensado que el PIC se debe saturar o algo parecido por el uso excesivo de la interrupción, pero no puedo desactivarla porque entonces como se le daría ordenes.

El problema es que solo hay una vía para que le lleguen los datos a los tres y por eso hay que tener a los tres en un nodo"escuchando" al mismo tiempo.

Alguna opinión? Gracias!

Desconectado Diego E.

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1086
Re: PIC "se cuelga" al recibir datos por USART
« Respuesta #1 en: 25 de Octubre de 2011, 23:50:09 »
Hola amigo, alguna vez me pasaba con un USART que se bloqueaba y lo solucioné adicionando en la configuración del USART un timeout

Saludos.

Desconectado jeremylf

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1341
Re: PIC "se cuelga" al recibir datos por USART
« Respuesta #2 en: 25 de Octubre de 2011, 23:51:25 »
tu codigo debe estar algo mal seguro.

Desconectado MerLiNz

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2463
Re: PIC "se cuelga" al recibir datos por USART
« Respuesta #3 en: 26 de Octubre de 2011, 00:01:55 »
si tienes una interrupcion y no borras el flag de la interrupcion el codigo no sale de la interrupcion, por lo cual ahi tendrias un bucle infinito. La interrupcion solo funciona si tu quieres, poniendo el IE=0 que le pertenece ya no hace interrupcion y sigue recibiendo datos igualmente. Si pones tu codigo se podra ver el fallo mejor.

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18310
    • MicroPIC
Re: PIC "se cuelga" al recibir datos por USART
« Respuesta #4 en: 26 de Octubre de 2011, 01:30:27 »
Entiendo que cuando el PIC entra en la interrupción y ve que el dato recibido no es para sí mismo, no lo procesa pero sigue leyéndolos, ¿verdad?

Me da la impresión de que podría llenarse el buffer si no lo estás leyendo.

Desconectado alcubo01

  • PIC12
  • **
  • Mensajes: 69
Re: PIC "se cuelga" al recibir datos por USART
« Respuesta #5 en: 26 de Octubre de 2011, 03:28:39 »


 Según cuentas, parece que cuelga cuando envias datos y esperas respuesta. ¿Podría ser que se cuelgue al enviar datos y no al recibirlos?

 ¿Tienes habilitada la interrupcion por Tx en la USART?
 

Desconectado AngelGris

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2480
Re: PIC "se cuelga" al recibir datos por USART
« Respuesta #6 en: 26 de Octubre de 2011, 09:24:42 »
  Sería bueno que pongas el programa para ver que puede estar pasando. Aunque sea subir la parte de la interrupción así vemos como manejas las llegadas de datos.
De vez en cuando la vida
nos besa en la boca
y a colores se despliega
como un atlas

Desconectado rivale

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1707
Re: PIC "se cuelga" al recibir datos por USART
« Respuesta #7 en: 26 de Octubre de 2011, 09:31:30 »
  Sería bueno que pongas el programa para ver que puede estar pasando. Aunque sea subir la parte de la interrupción así vemos como manejas las llegadas de datos.

++; :mrgreen:

realmente pueden ser muchas cosas, pero lo mas facil es ver el codigo y te ayudaremos mas facilmente

"Nada es imposible, no si puedes imaginarlo"

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: PIC "se cuelga" al recibir datos por USART
« Respuesta #8 en: 26 de Octubre de 2011, 11:29:32 »
Por más que los datos sean para otro dispositivos, el microcontrolador debe leerlos y desecharlos en todo caso. Pero si no lo lees y ocurre un overflow, el módulo se bloquea y debes re-iniciarlo.


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

Desconectado sauron

  • PIC12
  • **
  • Mensajes: 78
Re: PIC "se cuelga" al recibir datos por USART
« Respuesta #9 en: 26 de Octubre de 2011, 11:50:30 »
Vale gracias a todos, me alegra que les haya interesado, en realidad puede ser una aplicación útil para muchos.

Les voy a explicar más a fondo:

(IMAGEN A MODO DE EJEMPLO)

HAY UN ERROR EN LA IMAGEN, EL PIN TX DEL PIC VA CONECTADO AL SWITCH



El pin Rx del PIC y de los dispositivos seriales están conectados en un solo nodo y los pines Tx van conectados a un Switch digital (74HC4066), el cual el PIC va a controlar, dónde según el dato que éste reciba, va a "suichear" y así permitir que el terminal Tx del dispositivo 1 o 2 se conecte al puerto serial.

Voy a ser lo más explícito posible respecto al código:

Código: [Seleccionar]
#include <16F628A.h>
#include <string.h>

#FUSES NOWDT                    //No Watch Dog Timer
#FUSES XT                       //Crystal osc <= 4mhz for PCM/PCH , 3mhz to 10 mhz for PCD
#FUSES NOPUT                    //No Power Up Timer
#FUSES NOPROTECT                  //Code protected from reads
#FUSES NOBROWNOUT               //No brownout reset
#FUSES NOMCLR                   //Master Clear pin used for I/O
#FUSES NOLVP                    //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#FUSES NOCPD                    //No EE protection

#use delay(clock=4000000)
#use rs232(baud=9600, parity=N, bits=8, xmit=PIN_B2, rcv=PIN_B1) //manejo del RS232
#use fast_io(a)
#use fast_io(b)

char dato, BufferRx[6];
unsigned int i=0;
int1 BanderaComp=0;

//Tramas de 5 caracteres
char disp1[6]="xxxx$", disp2[6]="yyyy$", desactivar[6]="zzzz$";

// Rutina de Interrupcion por RX USART
#int_RDA
void RDA_isr(void)
{
 //Caracter de final: $ (HEX: 24)
 dato=0x00;
 if(kbhit())
 {
  dato=getc();
 }
 BufferRx[i]=dato;
 i++;
 if(dato==0x24)
 {
  BanderaComp=1;
  i=0;
 }
}

La idea es que cuando se reciba el caracter "$" indique el fin de la trama, luego dicha trama guardada en BufferRx, se compara:

Código: [Seleccionar]
void comprobacion()
{
 disable_interrupts(global);
  if(!strcmp(BufferRx, disp1)) //cuando la comparación NO es igual, retorna 1
 {
  output_high(PIN_B4);
 }
 if(!strcmp(BufferRx, disp2)) //cuando la comparación NO es igual, retorna 1
 {
  output_high(PIN_B5);
 }
 if(!strcmp(BufferRx, desactivar)) //cuando la comparación NO es igual, retorna 1
 {
   output_low(PIN_B4);
   output_low(PIN_B5);
 }
 enable_interrupts(global);
 BanderaComp=0;
 BufferRx = 0x00;
}

Los string: "disp1, disp2 y desactivar", son cadenas preestablecidas en el pic que son las que se reciben vía serial.

Y la función MAIN:

Código: [Seleccionar]
void main()
{

// Configuración inicial del PIC
   setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
   setup_timer_1(T1_DISABLED);
   setup_timer_2(T2_DISABLED,0,1);
   setup_ccp1(CCP_OFF);
   setup_comparator(NC_NC_NC_NC);
   enable_interrupts(INT_RDA);
   enable_interrupts(GLOBAL);

   set_tris_a(0x01);
   set_tris_b(0x02);
   BufferRx = 0x00;
   do
   {
     //PIC A LA ESPERA POR COMANDO SERIAL
    if(BanderaComp)
     comprobacion();
   }while(TRUE);
}

He de acotar que los dispositivos seriales tienen sendos programas (privados de su fabricante) para ser controlados.

OJO: El "suicheo" FUNCIONA correctamente, se realizó ésta operación hasta 30 veces seguidas y el PIC no tuvo problema, el detalle está cuando luego de que un dispositivo está conectado al puerto serial, se conecta a través de su programa de fabricante y empiezan a transmitirse sus datos, a los segundos el PIC se cuelga y hay que reiniciarlo.
« Última modificación: 26 de Octubre de 2011, 11:57:56 por sauron »

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: PIC "se cuelga" al recibir datos por USART
« Respuesta #10 en: 26 de Octubre de 2011, 11:54:54 »
Los buffer están mal declarados, si vas a guardar 6 caracteres, mínimo debe tener 7 lugares. Y al recibir, asegúrate de colocar el carácter '\0' para indicar finalización del string.

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

Desconectado sauron

  • PIC12
  • **
  • Mensajes: 78
Re: PIC "se cuelga" al recibir datos por USART
« Respuesta #11 en: 26 de Octubre de 2011, 12:00:44 »
Los buffer están mal declarados, si vas a guardar 6 caracteres, mínimo debe tener 7 lugares. Y al recibir, asegúrate de colocar el carácter '\0' para indicar finalización del string.

Saludos!

Hola Suky.

La trama a manejar es de 5 caracteres, el error está en el código posteado (ya lo corregí) pero si está bien establecido en el original.


Vale orita observando sus comentarios y sobre el overflow, me he dado cuenta de que hay un desbordamiento del string BufferRx dentro de la interrupción, ya que su indice "i" solo se va a inicializar cuando llegue el caracter final.

Obviamente eso puede ser un problema verdad?
« Última modificación: 26 de Octubre de 2011, 12:10:06 por sauron »

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: PIC "se cuelga" al recibir datos por USART
« Respuesta #12 en: 26 de Octubre de 2011, 12:14:09 »
Obviamente eso puede ser un problema verdad?

Claro
No contesto mensajes privados, las consultas en el foro

Desconectado sauron

  • PIC12
  • **
  • Mensajes: 78
Re: PIC "se cuelga" al recibir datos por USART
« Respuesta #13 en: 26 de Octubre de 2011, 12:23:17 »

Claro

Vale incluyo ésto para que se limpie el buffer y les comento:

Código: [Seleccionar]
#int_RDA
void RDA_isr(void)
{
 if(i>6)
 {
  i=0;
  BufferRx = 0x00;
 .
 .

Desconectado sauron

  • PIC12
  • **
  • Mensajes: 78
Re: PIC "se cuelga" al recibir datos por USART
« Respuesta #14 en: 03 de Noviembre de 2011, 17:23:47 »
Efectivamente el problema era ese, tan simple... gracias a todos