Si además quieres enviarnos un Artículo para el Blog y redes sociales, pulsa el siguiente botón:
Hola Señores, tengo un problema y pregunto sobre este tema por si me podéis echar un cable con alguna sugerencia.
Resulta que tengo un PIC 16F876a que me controla unos motores mediantes relés y a su vez el PIC es controlado por un PC mediante una comunicación serie, el problema que tengo es que tras varias transmisiones entre PIC y PC, parece que el PIC pierde el norte y no contesta más....
Para que os hagáis una idea, desde el PC siempre transmito 3 bytes con los comandos, y siempre espero 2 bytes de respuesta del PIC que informan de la operación realizada, algunos comandos implican retardos, pero estos retardos se realizan posteriormente a contestar al PC por parte del PIC, y antes de volver a enviarle una orden al PIC me espero un ratito... el caso es que tras varias transmisiones ya no recibo nada del PIC.
Hay que tener en cuenta que uso una rutina enganchada al Timer0, para que el PIC haga otras tareas referentes a los fines de carrera de los motores.
He probado en comunicarme mediante puerto serie, con la aplicación que tengo desarrollada en C, como mediante con el Hyperterminal y en los dos casos sucede lo mismo, el PIC parece no seguir contestando, lo curioso es que a veces sucede antes y otras veces despues.
Alguna idea de porque, pues necesito controlar el PIC desde el PC y ya descarte i2c pues también tenía problemas.
Ciao y gracias.
A ver, un tema de definiciones:
- la INT_RDA se va a activar cada vez que se reciba un dato serie y se almacene en el buffer de la UART. En cuanto esto suceda, tenemos que leer el carácter para poder recibir el siguiente.
- la función kbhit() nos devuelve teóricamente TRUE, si se ha detectado el bit de inicio de carácter en el pin de recepción. Pero según he leído, podría no hacerlo, si por ejemplo nuestro programa no ha leído el byte del buffer de la UART a tiempo.
Es decir, que puedes tener errores antes o después respecto a este tema.
Mi consejo, haz una prueba: quita el if con kbhit() y deja el resto tal y como está. Los bytes, procesalos igualmente a como lo haces, pero sin ese if.
Okey Sphinx, entiendo... pues el Lunes a primera hora lo pruebo, porque esta tarde ya no estoy con el circuito delante.
Gracias y te tengo informado.
Hola chicos, tengo buenas noticias... despues de darle vueltas y vueltas al problema, parece que hemos encontrado donde podía estar el problema.
Por lo visto no nos habíamos percatado de que había pines que superaban la carga de 25mA que según el PDF puede haber en cualquier PIN, y un máximo de 200mA en la suma de los PUERTOS, al parecer teníamos varios optoacopladores que chupaban algo más de la cuenta, unido a los LEDs que teníamos, nos hacía pensar que estabamos superando el máximo permitido de 200mA, por ahora hemos eliminado los LEDs en el diseño y en la programación nunca activamos más de dos OPTOs de forma simultánea, y parece que la comunicación es bastante estable.
¿Os ha pasado esto alguna vez?
Gracias de verdad por todos vuestros comentarios anteriores... pensé que la cosa ya no tenía solución y caímos por casualidad. (Ahora solo me queda solucionar mi otro post del i2c... jejeje pero eso ya para otro día).
Ciao.