Autor Tema: Problemas con la recepción por USART, cuando recibo mas de un caracter  (Leído 7570 veces)

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

Desconectado Milo

  • PIC16
  • ***
  • Mensajes: 101
Buennas:

Estoy haciendo una aplicación con mi dspic y con el visual basic. Yo le puedo enviar todo lo que quiera y mas del dspic al programa, el problema viene cuando quiero enviar mas de un caracter del programa al dspic. He estado probando y probando y no se como solucionarlo le envio a lo bruto del programa datos, todos seguidos y llega un momento en el que el dspic se satura y ya no recibe mas datos. Los datos los voy metiendo en un array mediante la interrupción de recepción de la usart conforme van llegando. La configuración de la UART esta para que salte la interrupción con cada caracter que le llegue.

No se si debo poner un intervalo de tiempo cada vez que le envie un byte por ejemplo del programa al dspic o si tengo que limpiar algo del buffer de la uart de dspic, en resumen que no se. Seguiré mirando este fin de semana.

Si alguien le ha ocurrido algo relacionado con esto, estoy aquí para recibir su sabio consejo,

gracias y buen finde.

saludos,

He posteado aquí el tema por que creo que tiene que ver mas con dspic
"En tanto que haya alguien que crea en una idea, la idea vive" Ortega y Gasset

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18310
    • MicroPIC
Re: Problemas con la recepción por USART, cuando recibo mas de un caracter
« Respuesta #1 en: 19 de Mayo de 2007, 01:30:09 »
Pega aquí tu rutina de interrupción de USART y la parte de la configuración, a ver si encontramos algo sospechoso.

Desconectado Milo

  • PIC16
  • ***
  • Mensajes: 101
Re: Problemas con la recepción por USART, cuando recibo mas de un caracter
« Respuesta #2 en: 21 de Mayo de 2007, 13:01:11 »

Buennass Nocturno,

Aquí dejo la interrupción de la usart,


Citar
void __attribute__((__interrupt__)) _U2RXInterrupt(void)
   {
      IFS1bits.U2RXIF = 0; // borra bit señalador de interrupción de recepción
      pulsado = ReadUART2();
      datos_uart[indice_datos]=pulsado;
      indice_datos++;         
   }

/*FIN INTERRUPCIÓN UART2*******************/

Aquí pongo la configuración de la uart (Interrupción recepción en modo char)

Citar
void configura_uart(void)
{

   unsigned int baudvalue;         /* Pone el valor del registro baud */
   unsigned int U2MODEvalue;      /* Pone el valor del registro de configuración de la uart*/
   unsigned int U2STAvalue;      /* Modos de interrupción de TX y RX*/

   __C30_UART=2;               //Le digo que voy a utilzar la usart2

            
   CloseUART2();               /* Apaga el modulo UART2 */
   
   /* Configura las interrupciones de la UART2, transmisión y recepción */
   ConfigIntUART2(UART_RX_INT_EN & UART_RX_INT_PR6 & UART_TX_INT_DIS & UART_TX_INT_PR2);
   
   /* Configura el modulo UART2 para transmitir con 8 bits de datos y uno de parada */
   baudvalue = 191;   //9600 baudios
   U2MODEvalue =    UART_EN & UART_IDLE_CON & UART_RX_TX &
                  UART_DIS_WAKE & UART_DIS_LOOPBACK &
               UART_DIS_ABAUD & UART_NO_PAR_8BIT &
               UART_1STOPBIT;

   U2STAvalue =    UART_INT_TX_BUF_EMPTY &
               UART_TX_PIN_NORMAL &
               UART_TX_ENABLE & UART_INT_RX_CHAR &
               UART_ADR_DETECT_DIS &
               UART_RX_OVERRUN_CLEAR;

   OpenUART2(U2MODEvalue, U2STAvalue, baudvalue);   //Inicializa la uart
}


Si en vez de enviar todos los datos seguidos con el componente mscomm se los envio con el terminal me los coje, el problema son los tiempos, si yo se los envio de uno en uno (caracteres) desde el terminal me los coje todos, el problema viene si se los envio todos a la vez por ejemplo:

Terminal:

Pulso 1,
lo coje
Pulso 5,
lo coje,
Pulso 7,
lo coje....

pero si pongo por ejemplo 1234568 y se lo envio de golpe no me los coje y lo que hago desde el programa en visual basic es esto:

frmPrincipal.MSComm1.Output = Chr$(&HC)                     'Modo Algoritomo PY0
frmPrincipal.MSComm1.Output = Chr$(&H4)                     'Modo Algoritomo PY0
frmPrincipal.MSComm1.Output = Chr$(&H2)                     'Modo Algoritomo PY0
frmPrincipal.MSComm1.Output = Chr$(&H3)                     'Modo Algoritomo PY0
frmPrincipal.MSComm1.Output = Chr$(&H4)                     'Modo Algoritomo PY0
frmPrincipal.MSComm1.Output = Chr$(&HFE)                     'Caracter fin de trama

En resumen creo que si no lo soluciono de otra manera iré a ver si me pueden echar una mano el el foro de Visual Basic, para poner algún delay entre cada envio de caracter que haga.

Gracias por el tiempo,

saludos
"En tanto que haya alguien que crea en una idea, la idea vive" Ortega y Gasset

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18310
    • MicroPIC
Re: Problemas con la recepción por USART, cuando recibo mas de un caracter
« Respuesta #3 en: 21 de Mayo de 2007, 13:38:16 »
No sé si se resolverá tu problema con lo que te voy a indicar, pero en la ayuda de C30 viene un ejemplo de interrupción de recepción USART en la que se procesa el buffer entero, y no sólo un carácter:

Código: C
  1. void __attribute__((__interrupt__)) _U1RXInterrupt(void)
  2. {
  3. IFS0bits.U1RXIF = 0;
  4. /* Read the receive buffer till atleast one or more character can be read */
  5. while( DataRdyUART1())
  6. {
  7. ( *( Receiveddata)++) = ReadUART1();
  8. }
  9. }

Quizás con esa modificación consigas algo. Suerte

Desconectado Renatox_

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 541
    • máquinas cnc
Re: Problemas con la recepción por USART, cuando recibo mas de un caracter
« Respuesta #4 en: 21 de Mayo de 2007, 13:40:46 »
 Hola Milo, para descartar si el problema está en el dspic o no puedes probar enviando esa cadena del 1 al 8 con el hiperterminal, crea un archivo de texto con estos caracteres y envialo como archivo, a ver si el dspic los recibe. sigues usando la versión 2.05? en la 3 tienes que definir no_auto_psv o auto_psv en la interrupción.

Saludos
control de movimiento

Desconectado Renatox_

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 541
    • máquinas cnc
Re: Problemas con la recepción por USART, cuando recibo mas de un caracter
« Respuesta #5 en: 21 de Mayo de 2007, 13:48:02 »
 También me parece que debes preguntar si se ha terminado de enviar todo el caracter. porque tu lo recojes apenas entras a la interrupción y lo debes hacer cuando se ha completado el dato, como el ejm que puso Nocturno o como este:

Código: [Seleccionar]
for(i=0;i<=3;i++)
     {
       while (DataRdySPI1()==0);  // el registro SPIRB (SPIBUF) está vacio
       num[i]=getcSPI1();
     }
control de movimiento

Desconectado Milo

  • PIC16
  • ***
  • Mensajes: 101
Re: Problemas con la recepción por USART, cuando recibo mas de un caracter
« Respuesta #6 en: 22 de Mayo de 2007, 13:01:50 »

Buennass:

Nocturno, gracias por la ayuda, de momento me interesa seguir recibiendo en modo carácter si no me trastocaría otras cosas del programa, mas o menos lo he conseguido arreglar poniendo una especie de delay con el visual basic entre cada instrucción de envio. Ya me coje todos los carácteres.

Hola Renatox, ya probé lo de enviarle una cadena de golpe con el terminal y se colgaba igual, de momento y para ir saliendo del apuro lo he conseguido solucionar poniendo un delay entre cada instrución de envio de datos, de momento la solución me vale. En cuanto a la versión sigo utilzando la 2.05, cuando haya mas tiempo instalaré la 3.

Gracias,

saludos,
"En tanto que haya alguien que crea en una idea, la idea vive" Ortega y Gasset

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18310
    • MicroPIC
Re: Problemas con la recepción por USART, cuando recibo mas de un caracter
« Respuesta #7 en: 22 de Mayo de 2007, 15:56:05 »
Bueno, muchas veces las soluciones menos elegantes pueden ser eficaces, pero me da la sensación de que hacerlo con delays puede ocasionar que de vez en cuando te falle y no sepas porqué.
Si algún día puedes volver a mirar este problema, seguro que logras resolvero.

Desconectado superprp

  • PIC16
  • ***
  • Mensajes: 137
Re: Problemas con la recepción por USART, cuando recibo mas de un caracter
« Respuesta #8 en: 19 de Junio de 2008, 13:54:18 »
A mi me sucede lo mismo, y aunque envíe una cadena de bytes, he creado un buffer circular y un indice de lectura y un indice de procesado (ya que el dato lo proceso despues en la rutina principal) para solo leer dato y salir de la interrupción , me sucede lo mismo, llega un momento en el que deja de recibirme y no es normal, porque toy trabajando con un 20MIPS (10mhz con pllx8) y debería leer lo suficientemente rápido como para no quedarse colgado, de hecho a veces se enciende el bit OERR y otras veces directamente me pierde datos (porque esta ocupado en otra interrupción) sin que se encienda éste bit... no se porque, y deja de funcionarme a veces sin que se encienda el bit OERR, la velocidad de transmisión del canal de la UART lo he probado a 9600, 19200, 38400, 57600 y me sucede lo mismo.

Desconectado tarnec

  • PIC10
  • *
  • Mensajes: 1
Re: Problemas con la recepción por USART, cuando recibo mas de un caracter
« Respuesta #9 en: 07 de Julio de 2010, 14:03:06 »
Estuve revizando tu codigo y el problema que tienes es que cuando entras  a la rutina de interrupcion solo recibes un dato y enseguida desabilitas la interrupcion, por o tanto debes esperar hasta que el micro deje de recibir   y luego  si desbilitar  la interrupcion.

Espero haberte ayudado

Desconectado maurbt

  • PIC10
  • *
  • Mensajes: 1
Re: Problemas con la recepción por USART, cuando recibo mas de un caracter
« Respuesta #10 en: 23 de Julio de 2010, 17:37:11 »
Saludos a todos

Tu problema en la recepcion serial de caracteres en los dspic y en los pic18 yo los he tenido cuando les envio flujos de caracteres y el procesamiento de la recepcion la hago caracter por caracter y creo que es debido a que se supera el buffer de recepcion serial que si mas no recuerdo tiene una profundidad de 3 bytes o algo asi, seria bueno que revisaras de vez en cuando en tu codigo la bandera de desborde del buffer y la devuelvas a 0 ya que eso pudiera provocarte que el USART dejara de recibir datos.


Suerte y espero que consigas la solucion

Desconectado ingwirbo

  • PIC10
  • *
  • Mensajes: 7
Re: Problemas con la recepción por USART, cuando recibo mas de un caracter
« Respuesta #11 en: 12 de Octubre de 2012, 13:06:25 »
Estimado Milo

una solución rápida y que hice, fue colocar un retardo entre byte y byte en el programa en visual basic, yo probe varios retardos y al fin lo deje en 500 microsegundos y no tengo problemas.

Saludos,


 

anything