TODOPIC
Microcontroladores PIC => Todo en microcontroladores PIC => Mensaje iniciado por: radioelf en 20 de Junio de 2006, 17:38:32
-
Hola, estoy realizando un programa de un pic (16F876) donde me comunico
con un módem y me funcióna correctamente, pero hay una parte del código
que no me convence y que se ejecuta por interrupción de recepción de datos
por RS-232 y es:
movf RCREG,w ; Leemos dos valores ASCII enviados por el PC
xorlw 0x4F ; O?
btfss STATUS,Z
goto NO_OK ; NO es K
btfss PIR1,RCIF ; Esperamos nuevo valor ascci del módem
goto $-1
movfw RCREG ; Leemos dos valores ASCII enviados por el PC
xorlw 0x4B ; K?
btfss STATUS,Z
goto NO_OK ; NO es K
no me convence usar goto $-1, si por el ejemplo el módem se cuelga o falla
la comunicación serie, el pic se quedaría colgado sin salir del bucle, esta
claro que es un caso muy poco probable pero sabéis si se puede hacer de otra forma :)
-
no me convence usar goto $-1, si por el ejemplo el módem se cuelga o falla
la comunicación serie, el pic se quedaría colgado sin salir del bucle, esta
claro que es un caso muy poco probable pero sabéis si se puede hacer de otra forma :)
Como primera medida es peligroso hacer eso que haces, dentro del vector de interrupción. Lo "usual" o la "buena costumbre" es ir leyendo byte a byte e irlo guardando en algun buffer de memoria a medida que los vayas recibiendo. Luego los procesas tranquilo en el bloque del programa pero no en la rutina de interrupción.
Eso solucionaría tu problema del goto $-1.
De todas formas, si te gusta programar así, una salida sería por ejemplo usar un timer y además de verificar el RCIF podrías verificar si se pone el flag del timer en 1, lo cual te indicará que hubo un "timeout".
Saludos
-
Si tienes razón la idea es que solo compruebo si recibo "OK" del módem y desprecio el resto de datos, como no gestiono mas caracteres (error, etc) pensé que seria la mejor forma de asegurar que no pierdo un OK en la gestión del resto de datos ya que no tengo muy claro cuantos caracteres tendría que almacenar en el buffer ( supongo que por ejemplo para error serían 3?)y poder asegurar que tengo tiempo de comprobar todos los datos recibidos antes de recibir de nuevos.... bueno no se si me explico , pero creo que me entenderéis :?
-
Si tienes razón la idea es que solo compruebo si recibo "OK" del módem y desprecio el resto de datos, como no gestiono mas caracteres (error, etc) pensé que seria la mejor forma de asegurar que no pierdo un OK en la gestión del resto de datos ya que no tengo muy claro cuantos caracteres tendría que almacenar en el buffer ( supongo que por ejemplo para error serían 3?)y poder asegurar que tengo tiempo de comprobar todos los datos recibidos antes de recibir de nuevos.... bueno no se si me explico , pero creo que me entenderéis :?
Puedes usar un buffer de 8 bytes, eso sería más que suficiente para detectar si tienes un OK o NO. Además ten en cuenta que a veces los modems responden también con caracters 0x0D, 0x0A, etc. Depende si tienes el eco activado o no.
Saludos
-
El módem que estoy utilizando me envía 0x0D retorno de carro, 0x0A avance de línea, la respuesta y de nuevo 0x0D, 0x0A, para el OK sería suficiente 4 bytes despreciando los dos ultimos, pero la idea es que mas adelante gestiones el resto de repuestas del módem, de todas formas modificare el código... gracias por la explicación :)