Autor Tema: RX datos serie?  (Leído 1993 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado radioelf

  • PIC10
  • *
  • Mensajes: 42
    • Radioelf
RX datos serie?
« 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 :)
« Última modificación: 20 de Junio de 2006, 17:54:00 por radioelf »

Desconectado maunix

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 4751
    • Mi Sitio Web Personal
Re: RX datos serie?
« Respuesta #1 en: 20 de Junio de 2006, 17:57:10 »
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
- La soberbia de un Einstein es entendible.. la de un salame es intolerable (A.Dolina)
- En teoría no hay diferencia entre la teoría y la práctica. En la práctica... si la hay.
- Lee, Lee, Lee y luego pregunta.(maunix)
- Las que conducen y arrastran al mundo no son las máquinas, sino las ideas (V. Hugo)
- Todos los hombres se parecen por sus palabras; solamente las obras evidencian que no son iguales.(Moliere)
- Todo debería ser hecho tan simple como sea posible pero no mas simple que eso.(A.Einstein)

Desconectado radioelf

  • PIC10
  • *
  • Mensajes: 42
    • Radioelf
Re: RX datos serie?
« Respuesta #2 en: 20 de Junio de 2006, 18:17:13 »
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 :?

Desconectado maunix

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 4751
    • Mi Sitio Web Personal
Re: RX datos serie?
« Respuesta #3 en: 21 de Junio de 2006, 08:50:25 »
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
- La soberbia de un Einstein es entendible.. la de un salame es intolerable (A.Dolina)
- En teoría no hay diferencia entre la teoría y la práctica. En la práctica... si la hay.
- Lee, Lee, Lee y luego pregunta.(maunix)
- Las que conducen y arrastran al mundo no son las máquinas, sino las ideas (V. Hugo)
- Todos los hombres se parecen por sus palabras; solamente las obras evidencian que no son iguales.(Moliere)
- Todo debería ser hecho tan simple como sea posible pero no mas simple que eso.(A.Einstein)

Desconectado radioelf

  • PIC10
  • *
  • Mensajes: 42
    • Radioelf
Re: RX datos serie?
« Respuesta #4 en: 21 de Junio de 2006, 15:42:16 »
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  :)