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.
Hola bactering repasando de nuevo tu post pues estoy ahora mismo con el programa y el circuito delante, comentas "Si no le llega en 8 milisegundos el quinto byte descarta los cuatro que han entrado y vuelve a contar la entrada de 5 Bytes (lo llamo resetear Sonriente ). Esto es una interrupcion con el Timer".
Como puedo hacer yo, para saber si ha llegado el 5º byte en cierto tiempo? Yo estoy usando el TIMER0 para mis otros menesteres, podría tener algo que ver en mi desincronización ?
Gracias.
El problema es que no se usar correctamente eso de los foros para contestar e igual lio la cosa.
Veamos:
No te preocupes por ello y pregunta cuanto quieras.
La estadistica dice que si hay probabilidad de que algo pueda suceder sucede. Si existe el peligro de desiscronización se producirá. Ahora hay que proteger eso.
Aleatoriamente le desconecto y conecto el cable y le meto interferencias y de momento no provoca errores. Si tiene errores desconecta las salidas.
Adjunto el primer programa que realicé y puedes ver (cuando procesa) los filtros que le fui dando para evitar los fallos. Está algo liado ya que es el primero que hice y está lleno de pruebas. De esa forma puedes ver todos los pasos que tuve que realizar para que todo funcionase.
Espera la llegada del final de linea. Si no llega en el tiempo predeterminado, el timer borra el bufer.
El programa del PC está en Buider c++ en la carpeta mplab está el programa del pic.
saludos
Una serie de preguntas para aclararme:
¿La comunicación es por el puerto serie?
¿UART o USART?
yo he usado la comunicación UART y la única coordinación que necesitas es ajustar el baudrate y clavarlo con el del PC, las interrupciones tratarlas en el menor tiempo posible y poner control para que si no puedes atender una por cualquier razon que te la atienda posteriormente.
Dentro de ésto no se porque necesitas coordinar el envío de datos con un Timer.
La forma de llegar a un mismo sitio es infinita.
En la versión comercial se envian y reciben datos por el mismo puerto desde 3 pic por el puerto serie.
Si cualquiera de ellos no recibe información del PC desconecta sus salidas por motivos de seguridad. Si haces un argoritmo potente vas detectando las tramas conforme van entrando y vas procesando sin problemas (la recepción se hace más pesada y lenta) tienes que ir comprobando el desbordamiento del Pic, etc. Si haces una recepción rápida (ves si es el último y cargas el bufer) la cosa cambia. El procesado de la información la tienes que hacer de forma diferente o se "descincronizan"
La desisncronización significa que cada uno (PC y Pic) se encuentran a la espera de cosas diferentes y por tanto se quedan desincronizados. Los Bytes llegan correctamente pero se interpretan mal.
Para evitar complicarse la vida (en este caso, complicarme) lo solucioné con un "perro guardian" en la recepción. Una forma sencilla y muy facil de usar.
Si cualquiera de ellos no entiende lo que le llega se queda a la espera de que se lo repitan. Si el que envia no recibe la contestación en el tiempo máximo vuelve a repetir la trama ya que no le han oido.(para ello siempre tienes que temporizar con algo)
Saludos
Gracias bactering por los ejemplos y las explicaciones me ayudan mucho.
El timer0 lo he utilizado para otros menesteres, simplemente preguntaba si podía dar problemas.
Parece que ya funciona bastante bien, el motivo lo ignoro, básicamente lo que he hecho ha sido en la rutina de atención del puerto serie, cada byte recibido en el PIC es devuelto "eco" al PC, y la verdad es que parece que va bastante bien.
Lo que me comentas de usar un timer para resetear la trama, me parece fenomeno y veo algo así en el ejmplo que me has pasado, así que lo tendré en cuenta.
Sobre lo de UART y USART, la verdad es que yo no he puesto lo de stream=PC, no sé si tiene algo que ver, debo ponerlo?
Gracias por todo!