Buenas tardes colegas, antes que nada agradezco el formar parte de este foro ya que desde hace tiempo he leido sus respuestas a varios problemas que han surgido aquí y me han ayudado bastante en aprender c y asm para pics.
Me surgió un proyecto teóricamente "sencillo" les explico un poco de lo que trata tengo una tarjeta vieja la cual manda mensajes a un display LCD el cual ya esta descontinuado entonces busco adaptar uno nuevo, la tarjeta de control encargada de mandar códigos tiene un integrado m82c51-a2 y a la salida de este una compuerta NOT(con esto se que solo envía y no recibe datos) y el display tiene a la entrada una compuerta NOT y a la salida un integrado z86c91, cabe destacar que las compuertas las puedo eliminar ya que al mandar datos el emisor la compuerta NOT de salida niega datos y el receptor vuelve a negar los datos de entrada, leyendo las hojas de datos del ms82c51(emisor) me dice lo siguiente: es un usart configurable de 5 a 8bits,bit de inicio de 1,1.5 y 2 con la posibilidad de agregar paridad par e impar y algo importante puede llevat bit de stop o no, el receptor que es el z86c91 es un microcontrolador sin indagar tanto recibe solo 8 bits con bit de stop y de paro. Ahora lo mas importante desconozco todos estos datos y es el reto que he tenido desde hace unas semanas, el planteamiento del problemas es el siguiente:
-Conocer la cantidad de bits en la transmisión
-Conocer la velocidad de transmisión
-Tratar de descifrar la cantidad de bits mandado
Estudiando el protocolo rs232 con la ayuda de proteus y pics llegue a la conclusión de que necesito tres programas en este orden:
-Un programa para leer la cantidad de flancos de bajada en un dato
Esto es con el fin de leer todos los tiempos sin perder alguno ejemplo:
La linea de comunicación siempre es a 5v si mando la letra e en código ascII seria 1100101 agregando los bits de stop y star seria asi 011001010, el pic me lee el numero de flancos de bajada en el dato y si le resto 1 a esta cantidad me da la cantidad aproximada claro del numero de 1 quedando de la siguiente forma: 4 flancos de bajada y 3 flancos positivos dentro de ese numero, esto se cumple con todos los caracteres sin excepción.
-El segundo programa que realice lo hice con interrupcion externa funcionando de la siguiente manera:
Cuando mando un carácter por rs232 la interrupción del pic me detecta un flanco descendente y cuento con ayuda del timer 1 el tiempo que permanece en estado bajo y alto de todos los caracteres enviados y estos caracteres serian la cantidad de flancos que detecte anteriormente 4 flancos de bajada y 3 de subida en total 7 tiempos,con estos tiempos puedo definir la velocidad de transmisión y la cantidad exacta de unos y ceros dentro de ese dato. Por ejemplo mandando la letra e el tiempo mas pequeño es de 9979 ticks usando el pic18F4550 a ,0.0833 us * tick si lo multiplicamos 9979ticks*0,0833us=831.2us =0,831.2ms un aproximado de 1200 baudios, esto lo comprobé con distintos tiempos y en todos se aproxima, volviendo a la tarjeta y aplicando esto llegue a lo siguiente:
-La tarjeta manda un total de 6 flancos de bajada y 5 de subida dentro de la transmisión.
-Midiendo los tiempos tengo que el mas pequeño es de 9999 ticks por lo que puedo decir que es a 1200 baudios.
-El dato en binario que logre sacar es el siguiente junto con los tiempos espero no hacerlos bolas ya que reconozco no soy bueno explicando, estos datos son consecutivos y van en el orden que los escribo:
Primer flanco 14448 ticks este es un flanco de bajada=0
Segundo flanco 64814 ticks este es un flanco de subida=1
Tercer flanco 9999 ticks este es un flanco de bajada=0
cuarto flanco 19999 ticks este es un flanco de subida=1
quinto flanco 19999 ticks este es un flanco de bajada=0
sexto flanco 50009 ticks este es un flanco de subida=1
septimo flanco 9999 ticks este es un flanco de bajada=0
octavo flanco 19999 ticks este es un flanco de subida=1
noveno flanco 9999 ticks este es un flanco de bajada=0
decimo flanco 29999 ticks este es un flanco de subida=1
onceavo y ultimo flanco 9999 ticks este es un flanco de bajada=1
y aqui la linea permance en 5v, con estos datos y dividiendo el tiempo menor de los ticks entre todos obtuve este codigo:
0111111011001111101101110
las conclusiones hasta ahora son que el tiempo es aproximadamente de ,833ms por bit aun no puedo estar seguro de el numero de bits*dato y el tercer programa que necesito es para verificar la información solo que aqui estoy atorado ya que yo debo de mandar ese codigo con los tiempos exactos para que el receptor los lea casi igual que el emisor, esto lo he resuelto de las maneras mas burdas como por ejemplo cambiando el estado logico de una salida del pic simulando los datos y dandole un delay de us simulando los tiempos, ha funcionado algunas veces ya que he podido ver el mensaje que manda la tarjeta original en el display pero solo algunas veces ya que los delays y las instrucciones no son tan precisas con el tiempo, otra que he intentado es mandar los 16 bits por el puerto serie del pic obviamente esto no sirve ya que recibo informacion muy extraña, espero puedan apoyarme es un tema bastante complejo, cualquier aporte lo agradeceria bastante, dejo mis programas por si le interesan a alguien y para los que quieran apoyarme, muchas gracias.