Foro de elhacker.net

Informática => Electrónica => Mensaje iniciado por: Meta en 19 Enero 2011, 08:11 am



Título: En C he encontrado este código. [code]#include<16f84A.h> #fuses XT,NOLVP,NOWDT
Publicado por: Meta en 19 Enero 2011, 08:11 am
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.


Título: Re: En C he encontrado este código. [code]#include<16f84A.h> #fuses XT,NOLVP,NOWDT
Publicado por: skapunky en 19 Enero 2011, 11:59 am
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.

Código
  1. #include<16f84A.h>
  2. #fuses XT,NOLVP,NOWDT
  3. #use delay(clock=4000000)
  4. int flag;
  5. void main()
  6. {
  7.  int i;
  8.  flag = 0;                                          // Estado inicia de la bandera
  9.  output_low(PIN_B0);                         // Estado bajo del pin B0 indica que el relé está desactivado.
  10.  while(TRUE)
  11.  {
  12.    if(input(PIN_A4))
  13.    {
  14.      output_high(PIN_B0);                     // Activo el relé.
  15.      for(i=2;i>0;i--)
  16.         while (flag=0)       //mientras flag no sea 1 hacer retardo.          
  17.         {
  18.           delay_ms(60000);   // Retardo de dos minutos...
  19.         }
  20. output_low(PIN_B0);                     // Desactivo el relé.
  21.    }
  22. flag = 0;                   //Inicializamos la bandera
  23.  }
  24. }

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;


Título: Re: En C he encontrado este código. [code]#include<16f84A.h> #fuses XT,NOLVP,NOWDT
Publicado por: Meta en 20 Enero 2011, 13:50 pm
Gracias por tu tiempo. Si es por Interrupción no pasa nada.