TODOPIC

Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: DarkVect en 26 de Enero de 2010, 20:41:44

Título: Comunicación bidireccional PIC - PC por RS-232 (temporización)
Publicado por: DarkVect en 26 de Enero de 2010, 20:41:44
Hola,

Tengo un pequeño problemilla con la temporización en una comunicación PIC - PC por RS-232. Cuando en el PC envío un comando al PIC (1 único byte) el PIC responde perfectamente pero cuando quiero confirmar si el PIC está listo para recibir un comando y luego enviarlo no me funiona el invento. Sería algo así:

PIC     PC
------------
          ¿Estás listo? (1 byte)
ACK
          Te envío el comando (1 byte)
ACK

Vosotros dejáis un tiempo entre el getc y el putc(ACK) y el nuevo getc y el putc(ACK)? Cuánto?

En el programa del PC (Visual basic) también lo ponéis?

Gracias!!
Título: Re: Comunicación bidireccional PIC - PC por RS-232 (temporización)
Publicado por: DarkVect en 28 de Enero de 2010, 15:25:12
SOLUCIÓN:

Usar un timer como timeout:

Código: [Seleccionar]
set_timer0(0);
f_com_tout = 0;

while(!f_com_tout)   //TIMEOUT
{
   restart_wdt();
     
   if(kbhit())
   {
      alr_test = getc();

      putc(ACK);
      return;
   }
}
putc(NAK);
Título: Re: Comunicación bidireccional PIC - PC por RS-232 (temporización)
Publicado por: fidodido18 en 30 de Enero de 2010, 15:48:03
SOLUCIÓN:

Usar un timer como timeout:

Código: [Seleccionar]
set_timer0(0);
f_com_tout = 0;

while(!f_com_tout)   //TIMEOUT
{
   restart_wdt();
     
   if(kbhit())
   {
      alr_test = getc();

      putc(ACK);
      return;
   }
}
putc(NAK);

No entendí nada! para que configuras el timer0 si no lo utilizas?
Código: [Seleccionar]
f_com_tout = 0;

while(!f_com_tout)   //TIMEOUT

condición siempre verdadera coloca un

Código: [Seleccionar]
while(true)
me imagino que estas utilizando el wdt en caso que el PIC se pierda o quede esperando un bit perdido.

Título: Re: Comunicación bidireccional PIC - PC por RS-232 (temporización)
Publicado por: DarkVect en 31 de Enero de 2010, 12:05:09
¿Cómo? Claro que utilizo el timer0. Dentro de la ISR del timer0 es donde se coloca f_com_tout a 1 al pasar el tiempo programado como timeout.

Si pones un while(TRUE) y no te mandan ningún caracter te quedas dentro del bucle para siempre.

El restart_wdt() es porque el periodo del watchdog es menor que el timeout de recepción.
Título: Re: Comunicación bidireccional PIC - PC por RS-232 (temporización)
Publicado por: Renatox_ en 31 de Enero de 2010, 15:01:13
Una consulta Dark en la función putc() el micro se queda esperando en esa linea hasta que se termine de transmitir el byte?
o solo deja el dato en el buffer de transmisión y sale de inmediato.

saludos.
Título: Re: Comunicación bidireccional PIC - PC por RS-232 (temporización)
Publicado por: DarkVect en 31 de Enero de 2010, 20:01:01
Una consulta Dark en la función putc() el micro se queda esperando en esa linea hasta que se termine de transmitir el byte?
o solo deja el dato en el buffer de transmisión y sale de inmediato.

saludos.

La funcion putc() escribe un byte por el PIN indicado. Es decir, hasta que no está transmitido no termina esa función.
Título: Re: Comunicación bidireccional PIC - PC por RS-232 (temporización)
Publicado por: fidodido18 en 01 de Febrero de 2010, 13:09:47
¿Cómo? Claro que utilizo el timer0. Dentro de la ISR del timer0 es donde se coloca f_com_tout a 1 al pasar el tiempo programado como timeout.

Si pones un while(TRUE) y no te mandan ningún caracter te quedas dentro del bucle para siempre.

El restart_wdt() es porque el periodo del watchdog es menor que el timeout de recepción.

JAJAJA ok entonces coloca el código completo, porque no se entiende nada..
Título: Re: Comunicación bidireccional PIC - PC por RS-232 (temporización)
Publicado por: INGJHOM en 24 de Febrero de 2010, 19:13:18
Una pregunta. Para que vas a utilizar un retardo si para eso son los ACK, con los ACK aseguras que los dispositivos no se envien datos hasta cuando reciban los ACK. Si quieres puedes esculcar dentro del archivo y sacar las lineas que te interesen. Exitos