Temporizador 16F84A en C

#1
Hola:

Quiero ver un temporizador sencillo con el popular y famoso PIC16F84A en el lenguaje en C. Nunca me he puesto en C con los PIC, sólo leer a ustedes y muchos se defienden bien.

Por aquí hay muchos temporizadores sencillos en asm.
https://www.forosdeelectronica.com/search.php?searchid=370801

El que quiero es en C para entender paso a paso lo que hicieron. Por ejemplo. Funciona con un oscilador externo del 16F84A típico a 4 MHz de Cristal, no de la resistencia ni condensador. Tiene dos botones, uno de reset para resetear el PIC y el otro es para activar el temporizador y detenerlo puesta a 0 de nuevo. La salida del PIC tiene un relé, un Led de aviso y un zumbador. Las entradas y salidas del PIC la configuran a su merced.

Saludo.
 
#2
Adjunto un pequeño ejemplo que tenia, es bien básico aplicado a un LED y 3 pulsadores para hacer sus ajustes. Espero te sirva.
salu2
 

Adjuntos

#3
En C he encontrado este código.

Código:
#include<16f84A.h>
#fuses XT,NOLVP,NOWDT
#use delay(clock=4000000)

void main()
{
  int i;
  output_low(PIN_B0);                         // Estado bajo del pin B0 indica que el relé está desactivado.
  while(TRUE)
  {
    if(input(PIN_A4))
    {
      output_high(PIN_B0);                     // Activo el relé.
      delay_ms(60000);                          // Retardo de un minuto...
      delay_ms(60000);                          // Retardo de un minuto...
      output_low(PIN_B0);                     // Desactivo el relé.
    }
  }
}
Otro ejemplo:
Código:
#include<16f84A.h>
#fuses XT,NOLVP,NOWDT
#use delay(clock=4000000)

void main()
{
  int i;
  output_low(PIN_B0);                         // Estado bajo del pin B0 indica que el relé está desactivado.
  while(TRUE)
  {
    if(input(PIN_A4))
    {
      output_high(PIN_B0);                     // Activo el relé.
      for(i=2;i>0;i--) delay_ms(60000);   // Retardo de dos minutos...
      output_low(PIN_B0);                     // Desactivo el relé.
    }
  }
}
Está en C y como puedes ver, funciona como un esclavo, ya que si vuelvo a pulsar el botón para deterner el temporizador, no puede ejecutar esa acción o cualquier otra hasta que se acabe el tiempo, en este caso este temporizador dura 2 min.

Falta por harcer esa parte, desde que esté contando hacia atrás 2 min, el tiempo se acaba y se queda el relé apagado. Si pulsas el botón se activa el temporizador, el tema es que al pulsar de nuevo el mismo botón que sea capaz de detenerlo y se quede desactivado.

Saludo.
 

Adjuntos

Última edición:
#4
Sugiero dos formas que ha menudo he usado:

- Si no te urge la precisión puedes usar delays pequeños dentro de un contador FOR más grande; de ese modo por ejemplo un FOR que repita 100 veces un delay de 10ms que hacen un total de 1000ms aprox. y para pausar o detener el conteo se puede poner un if(input(PIN_nn) dentro del FOR, de ese modo estaría verificando el pulsador cada 10ms aprox.

- Para precisión mejor seria usar una interrupción, ya no se usaría la instrucción delay_ms que seria reemplazado por algún timer del PIC. Dentro del programa principal se pone la verificación de los pulsadores para Iniciar, Pausar o Detener el conteo y por interrupción se realizarían los ticks a 1s por ejemplo. De este modo el conteo es más exacto aprovechando que una interrupción se ejecuta en el intervalo exacto.

Saludos.
 

Temas similares

Arriba