Haz una pregunta
  Foros de Electrónica » Diseño digital » Microcontroladores y sistemas embebidos
Foros Registrarse ¿Olvidaste tu contraseña?

Temas similares

20/12/2010 #1

Avatar de Meta

Temporizador 16F84A en C
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.
http://www.forosdeelectronica.com/se...earchid=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.
20/12/2010 #2

Avatar de ByAxel

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
19/01/2011 #3

Avatar de Meta

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.
Archivos Adjuntos
Tipo de Archivo: zip Temporizador_16F84A.zip (10,4 KB (Kilobytes), 121 visitas)
19/01/2011 #4

Avatar de ByAxel

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.
Respuesta
¿Tienes una mejor respuesta a este tema? ¿Quieres hacerle una pregunta a nuestra comunidad y sus expertos? Registrate

Foros de Electrónica » Diseño digital » Microcontroladores y sistemas embebidos

Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2017, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO ©2011, Crawlability, Inc.