Despues de casi dos semanas tratando de atrapar al "gato negro en el cuarto negro" lo logré!
El problema se presentaba cuando a la maxima velociadad de transmision (57600 bps) la interrupcion del temporizador era llamada, por muy corta que fuera la interrupcion, se seguia presentando el problema, de forma que haciendo calculos, el resultó que el tiempo necesario para guardar el contexto para saber donde regresar era suficiente para perder un bit (y por ende, recibir ese byte incorrectamente).
La interrupcion estaba pensada para contar el tiempo transcurrido desde la llegada del ultimo byte, cuando ese tiempo excedia cierto valor (algo asi como 5 veces el tiempo de un byte) se encendia la bandera para autorizar el envío del buffer completo. En otras palabras, servia para no enviar byte por byte sino esperar antes de enviar para ver si habia mas bytes por recibir y asi transmitir el buffer completo una vez se hubiera finalizado una recepción.
Esta espera DEBIA hacerse, asi que habia que encontrar la forma de seguir contando el tiempo, en total intenté tres metodos, el que funcionó fue el que no entra a la interrupcion.
a. Cada vez que se recibe un caracter se resetea el Contador del timer, es decir, cada vez que se recibe un byte, se inicia de nuevo el conteo desde cero.
b. Cada vez que se entra a la interrupción se compara el numero previo y actual de elementos en el buffer de entrada, si son iguales quiere decir que ha pasado un tiempo razonable sin recibir ningun dato nuevo, entonces se autoriza la el envío del buffer.
c. Cada vez que se recibe un caracter se resetea el Contador del timer y en el ciclo principal se pregunta si el valor del Contador del Timer es mayor que cierto numero, cuando es afirmativo, se autoriza el envío, sino, sigue esperando bytes. Es decir, todo se hace en el ciclo principal, sin ir a atender a ninguna interrupcion, simplemente dejando contar al timer y preguntando por el en el momento que es seguro que no se esta recibiendo ningun byte
The space to finish my prehistory and begin my history...my place to write without any particular reason.
Monday, October 12, 2009
Thursday, October 8, 2009
Crisis Musical
Bueno, este es un tema dificil para mi, pues es sabido la importancia de la musica para mi, pero desde un par de semanas atras, no he vuelto a encontrar gran satisfaccion con mi musica.
Incluso ya hay alguna que me molesta, por ejemplo John Lennon, estoy cacorro de el, algunos trabajos de Jehtro Tull y de The Who. Con la salsa tambien, no tanto pero tambien tengo crisis, ya no me hace falta escuchar latina stereo en el trabajo.
Creo que me dispondre a una dolorosa depuracion de mi musica, espero no encontrarme con que ya no me gusta casi nada. :(
Incluso ya hay alguna que me molesta, por ejemplo John Lennon, estoy cacorro de el, algunos trabajos de Jehtro Tull y de The Who. Con la salsa tambien, no tanto pero tambien tengo crisis, ya no me hace falta escuchar latina stereo en el trabajo.
Creo que me dispondre a una dolorosa depuracion de mi musica, espero no encontrarme con que ya no me gusta casi nada. :(
Agotado
Esta semana ha sido bastante agotadora, porque en el trabajo me he dedicado a "atrapar un gato negro en un cuarto negro donde no hay ningun gato".
Yendo al grano: estoy construyendo un "snifer" o espia para una comunicacion serial RS232. El espia funciona perfectamente para transferencia de archivos de hasta 256 bytes en todas las velocidades comunes de transmisión serial (desde 2400bps, hasta 38400bps), pero en la mas alta que estamos usando (57600bps) estoy perdiendo esporadicamente el segundo byte, no siempre sucede, no hay un patron con el que se repita la perdida.
Tres dias intentando cambiar unos tiempos de espera para no perder el bit de Stop o el de Start de el primer o segundo byte respectivamente, pero nada, ya veo el codigo y solo veo caracteres. Hoy intente manejar esa linea con el pin de interrupcion externa y no funciona bien cuando son mas de 10 bytes en la transferencia, tambien intente manejar la comunicacion manualmente (porque el problema es con una UART que tuvo que ser hecha en software, porque la de hardware del PIC ya esta en uso) pero estoy tan agotado de ese codigo que no me funcionó.
Yendo al grano: estoy construyendo un "snifer" o espia para una comunicacion serial RS232. El espia funciona perfectamente para transferencia de archivos de hasta 256 bytes en todas las velocidades comunes de transmisión serial (desde 2400bps, hasta 38400bps), pero en la mas alta que estamos usando (57600bps) estoy perdiendo esporadicamente el segundo byte, no siempre sucede, no hay un patron con el que se repita la perdida.
Tres dias intentando cambiar unos tiempos de espera para no perder el bit de Stop o el de Start de el primer o segundo byte respectivamente, pero nada, ya veo el codigo y solo veo caracteres. Hoy intente manejar esa linea con el pin de interrupcion externa y no funciona bien cuando son mas de 10 bytes en la transferencia, tambien intente manejar la comunicacion manualmente (porque el problema es con una UART que tuvo que ser hecha en software, porque la de hardware del PIC ya esta en uso) pero estoy tan agotado de ese codigo que no me funcionó.
Subscribe to:
Posts (Atom)