TODOPIC

Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: antoniojdobarro en 10 de Febrero de 2011, 08:14:25

Título: Tiempo espera
Publicado por: antoniojdobarro en 10 de Febrero de 2011, 08:14:25
Bien, supongamos que tengo el siguiente desarrollo ne el pic, a la espera de un caracter por el puerto rs232:

switch (getchar()){
   case '2':
   retroceso();
   break;
   
   case '5':
   avance();
   break;
   
   case '3':
   detencion();
   break;
}

Lo que quiero hacer es que solamente espere durante un tiempo si llega un caracter, de lo contrario que continue, ¿Cómo puedo hacer ese temporizador?
Título: Re: Tiempo espera
Publicado por: AngelGris en 10 de Febrero de 2011, 09:34:08
  Todo depende de como funcione getchar(). Si dicha función se queda a la espera de que llegue un caracter si o si, no te va a servir.
  Si estás usando el RS232 por hard, ¿Por qué no buscas la manera de leer el bit RCIF manualmente? Algo similar a los siguiente

Código: C
  1. if (bit_test(PIR1,RCIF) == 1) // si hay caracter....
  2. {
  3. .........
  4. }
Título: Re: Tiempo espera
Publicado por: antoniojdobarro en 10 de Febrero de 2011, 09:45:11
Bien, esa es la idea y la solución, el problema es que el compilador CCS no reconoce PIR1,RCIF.

Alguna idea de como leer ese bit?
Título: Re: Tiempo espera
Publicado por: Suky en 10 de Febrero de 2011, 10:23:45
Bien, esa es la idea y la solución, el problema es que el compilador CCS no reconoce PIR1,RCIF.

Alguna idea de como leer ese bit?

Revisa la ayuda (F12) y busca RS232 o kbhit()


Saludos!
Título: Re: Tiempo espera
Publicado por: AngelGris en 10 de Febrero de 2011, 10:40:55
Bien, esa es la idea y la solución, el problema es que el compilador CCS no reconoce PIR1,RCIF.

Alguna idea de como leer ese bit?

  Podrías revisar el archivo .H del pic que estés usando y ver como llama tanto a ese registro como al bit. También consultar el datasheet del PIC en cuestión.

  Por ejemplo yo se que en un PIC16F877 el registro PIR1 tiene la dirección 0x0c y que el bit RCIF es el 5. Entonces en CCS podría intentar algo similar a esto

Código: C
  1. #byte PIR1 0x0c // creo que se usaba asi, corregirlo si es necesario
  2.  
  3. .....
  4.  
  5. if (bit_test (PIR1,5) == 1)
  6.  
  7. // o directamente
  8.  
  9. if (bit_test (0x0c,5) == 1)
Título: Re: Tiempo espera
Publicado por: Suky en 10 de Febrero de 2011, 13:51:01
Bien, esa es la idea y la solución, el problema es que el compilador CCS no reconoce PIR1,RCIF.

Alguna idea de como leer ese bit?

  Podrías revisar el archivo .H del pic que estés usando y ver como llama tanto a ese registro como al bit. También consultar el datasheet del PIC en cuestión.

  Por ejemplo yo se que en un PIC16F877 el registro PIR1 tiene la dirección 0x0c y que el bit RCIF es el 5. Entonces en CCS podría intentar algo similar a esto

Código: C
  1. #byte PIR1 0x0c // creo que se usaba asi, corregirlo si es necesario
  2.  
  3. .....
  4.  
  5. if (bit_test (PIR1,5) == 1)
  6.  
  7. // o directamente
  8.  
  9. if (bit_test (0x0c,5) == 1)

Si puede ser así, pero ya que usa CCS, para que re-inventar la rueda  :rolleyes: Hay funciones dedicadas.


Saludos!
Título: Re: Tiempo espera
Publicado por: AngelGris en 10 de Febrero de 2011, 23:24:37
  Sí, lo sé Suky y tenés razón. Pero como antoniojdobarro comenta que tiene problemas con la función kbhit() le sugerí esta forma para ver si le funcionaba.
Título: Re: Tiempo espera
Publicado por: tithanae en 11 de Febrero de 2011, 10:47:33
Para realizar esa espera de una caracter y continuar utilizo :
Código: [Seleccionar]
#use rs232(force_sw,baud=57600,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=8,stream=modem,TIMEOUT=100,ERRORS)
De el manual de CCS
Citar
TIMEOUT=X
 To set the time getc() waits for a byte in milliseconds.  If no character comes in within this time the RS232_ERRORS is set to 0 as well as the return value form getc().  This works for both UART and non-UART ports.

 
No me funciono en todas las versiones de el compilador, con la que trabajo y funciona es con la version 4.093
Con la anterior declaracion espera 100 milisegundos y si no llega RS232_ERRORS es cargado con 0, y el valor que retorna getc() tambien es 0.