TODOPIC
Microcontroladores PIC => Todo en microcontroladores PIC => Mensaje iniciado por: caragones en 16 de Noviembre de 2011, 11:22:16
-
Hola,
tengo un serio problema con la comunicación PC <--> PIC-USB. :(
Lo que estoy intentando hacer es comunicar un ordenador Intel Atom (Windows 7) con un dispositivo externo mediante USB. Y el problema es que, de vez en cuando, la comunicación se corta y no tengo idea de como solucionarlo. El problema es que se suele cortar después de varias horas, con lo que es muy difícil depurar y encontrar el error. De hecho, no creo que el error esté en mi código.
El dispositivo lo ha creado una empresa externa, utilizando un PIC de la familia 18F, por lo que no tengo acceso al código que va en el PIC (aunque tampoco tengo experiencia en programación de PICs, ya que no se nada de electrónica).
Para comunicarme con el dispositivo estoy utilizando Visual C++, los drivers WinUSB y la librería MPUSBAPI de Microchip (versión 6.0).
Básicamente la aplicación tiene varios threads, uno de ellos dedicado en exclusiva a comunicarse con el dispositivo USB. Para no pegar código, ya que puede ser largo, diré que la aplicación se comunica con el dispositivo USB cada vez que una persona pisa sobre una cosa y toca un botón (es decir, pseudo-aleatoriamente). A partir de ese momento se registran una serie de pisadas del usuario en diferentes posiciones (pongamos menos de 100) y después se corta la comunicación con el dispositivo USB. Y esperamos a la siguiente persona.
¿Alguna sugerencia?
----
Casi todos los ejemplos que he visto de comunicación USB con PICs se limitan a enviar/recibir dos o tres paquetes realizando alguna operación. ¿Pero que pasa después de varias horas de comunicación? ¿A alguien más se le pierden paquetes?
He comprobado que no es nada bueno abrir y cerrar los puertos de comunicación cada vez que me comunico con el dispositivo USB (se cuelga más veces), por los que los cierro sólo cada cierto tiempo.
Además, cuando se cuelga el dispositivo hay que reiniciar el ordenador!!! No sirve ni cerrar el programa, ni desconectar el USB :shock:
Gracias por vuestra ayuda!
-
creo que hay una opcion para desconectar el usb a x tiempo para ahorrar energia, creo que venia en windows, mira la configuracion de los puertos usb. De todas formas seria en caso de inactividad, si se estan mandando datos constantemente no deberia entrar en modo sleep.
-
Hola,
gracias por tu respuesta!
A parte de la 'comunicación normal', el dispositivo envía un 'PING' cada cierto tiempo y yo le respondo con un 'ACK'. Por lo que no creo que sea eso. :(
¿Alguna otra sugerencia?
-
Puede ser por falta de respuesta dentro del intervalo por parte del uC.
Me ha pasado que si no atiendo lo suficientemente seguido a los endpoints del usb para leerlos, la comunicación USB falla aleatoriamente. Podrías probar leyendo/escribiendo los endpoints del USB más seguido desde el uC a ver si te sigue sucendiendo.
Saludos.
-
Utilizas interrupción o polling?
-
Puede ser por falta de respuesta dentro del intervalo por parte del uC.
Me ha pasado que si no atiendo lo suficientemente seguido a los endpoints del usb para leerlos, la comunicación USB falla aleatoriamente. Podrías probar leyendo/escribiendo los endpoints del USB más seguido desde el uC a ver si te sigue sucendiendo.
Saludos.
Disculpa, pero no entiendo lo que me dices :oops: podrías aclararmelo un poco, darme un ejemplo?
-
Utilizas interrupción o polling?
Interrupción
-
Puede ser por falta de respuesta dentro del intervalo por parte del uC.
Me ha pasado que si no atiendo lo suficientemente seguido a los endpoints del usb para leerlos, la comunicación USB falla aleatoriamente. Podrías probar leyendo/escribiendo los endpoints del USB más seguido desde el uC a ver si te sigue sucendiendo.
Saludos.
Disculpa, pero no entiendo lo que me dices :oops: podrías aclararmelo un poco, darme un ejemplo?
En C18, si se usa polling, significa llamar con suficiente periodicidad a la función USBDeviceTasks(). También a la función que trabaja con los datos enviados/recibidos. Otro problema puede ser ruido en el cable USB, un usuario del foro tenia un problema similar y lo solucionó agregando un toroide de ferrita al cable USB.
Saludos!
-
Al parecer funciona por interrupción.
Muy interesante lo del toroide ^_^
-
Ahora si dices que el dispositivo se compro, ni como descartar algun problema en el firmware o en el circuito, se asume que todo en esa parte esta perfecto(por eso se pago).............siempre me pasaba que cuando olvidaba poner los condensadores de desacoplo correctos o los condensadores con el valor incorrecto en VUSB, despues de estar el dispositivo trabajando bien y luego de cierto tiempo el sistema operativo quitaba la coneccion.
Cuando se supera cierto rango de tencion en los pines que se conenctan a la PC(v+v-d+d-), el sistema operativo por seguridad digamos expulsara el dispositivo..............y te lo dira.
Que tal si conectas el dispositivo sin ejecutar tu programa, y vas viendo si aun asi se va la comunicacion(en el administrador de dispositivos). Al insertar el dispositivo el SO inicia la comunicacion y la mantiene asi este o no tu programa presente.
Saludos............
-
Ahora si dices que el dispositivo se compro, ni como descartar algun problema en el firmware o en el circuito, se asume que todo en esa parte esta perfecto(por eso se pago).............siempre me pasaba que cuando olvidaba poner los condensadores de desacoplo correctos o los condensadores con el valor incorrecto en VUSB, despues de estar el dispositivo trabajando bien y luego de cierto tiempo el sistema operativo quitaba la coneccion.
Bueno, me puedo poner en contacto con la otra empresa y comentarles cualquier cosa que pueda ayudar.
Cuando se supera cierto rango de tencion en los pines que se conenctan a la PC(v+v-d+d-), el sistema operativo por seguridad digamos expulsara el dispositivo..............y te lo dira.
Cómo me lo dice? Al PC o al PIC?
Esto me interesa mucho!
Que tal si conectas el dispositivo sin ejecutar tu programa, y vas viendo si aun asi se va la comunicacion(en el administrador de dispositivos). Al insertar el dispositivo el SO inicia la comunicacion y la mantiene asi este o no tu programa presente.
Muy buena idea!
Un abrazo!