En C he encontrado este código. [code]#include<16f84A.h> #fuses XT,NOLVP,NOWDT

Iniciado por Meta, 19 Enero 2011, 08:11 AM

0 Miembros y 2 Visitantes están viendo este tema.

Meta

En C he encontrado este 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:
#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.
Tutoriales Electrónica y PIC: http://electronica-pic.blogspot.com/

skapunky

Mira, se me ocurre una forma, utiliza otro pin, que al detectar que se pulsa un boton, active un flag (una variable usada de bandera), por ejemplo flag =1.

Entonces el bucle del delay, pones que si flag=1, salte fuera del temporizador donde te interese, ccreo que es una forma sencilla de resolverlo.

Otra sería utilizando una interrupción, pero me parece pensandolo rápido que el metodo sería el mismo, utilizando un flag.




Rectifico lo inicial mira, con este codigo te debería funcionar, debes utilizar una interrupción con un pulsador que ponga la variable flag a 1.

#include<16f84A.h>
#fuses XT,NOLVP,NOWDT
#use delay(clock=4000000)
int flag;
void main()
{
 int i;
 flag = 0;                                          // Estado inicia de la bandera
 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--)
        while (flag=0)       //mientras flag no sea 1 hacer retardo.          
        {
          delay_ms(60000);   // Retardo de dos minutos...
        }
output_low(PIN_B0);                     // Desactivo el relé.
   }
flag = 0;                   //Inicializamos la bandera
 }
}


No tengo el mplab en este pc, he hecho el codigo en el bloc de notas, pero espero que entiendas la idea, debe ser hecho por interrupción ya que es una acción externa y no se puede implementar dentro el bucle (almenos yo no lo veo claro).

Solo te faltará declarar una interrupción que cuando se aprete el pulsador para parar el contador, haga flag=1;
Killtrojan Syslog v1.44: ENTRAR

Meta

Tutoriales Electrónica y PIC: http://electronica-pic.blogspot.com/