Reset para alarma de sueño

#1
Hola que tal amigos !!! queria compartir este programa con ustedes a ver si me pueden ayudar el tema es el siguiente el programa es una alarma de sueño tan basica como el que la diseño (yo) ja ja !!! consiste en un retardo de 6 minutos aprox y luego comienza a parpadear un led el cual se va acelerando cada vez mas hasta que finalmente cae en un while donde parpadea el led y suena un buzzer el punto esta en que tengo que colocar un pulsador que en cualquier punto del programa me lo vuelva al comienzo , como si reseteara el pic . sera tan sencillo que no lo veo ?? o esta mal diseñado el programa y de esta manera no se puede hacer. Desde ya les agradezco su colaboracion Saludos !!!



Código:
#include <16f84a.h>
#use delay (clock=4000000)
#fuses xt,nowdt
#use standard_io(b)
#use fast_io(a)

int b=0;

void main()
{
set_tris_a(0b11111111);/*todo el puerto A como entrada*/
output_b(0b00000000);/*puerto B en estado bajo*/


 for( b=0;b<=7 ;b++)          // cuando pulse el boton tengo que saltar hasta aca
{
output_b(0b00000000);/*tiempo de 7 min aca no hace nada solo espera */
delay_ms(60000);

}

for( b=0;b<=10 ;b++)          //parpadea la luz diez veces cada 500ms
{
output_b(0b00000000);
delay_ms(500);
output_b(0b00000010);
delay_ms(500);

}
for( b=0;b<=10 ;b++)         //parpadea la luz diez veces cada 300ms
{
output_b(0b00000000);
delay_ms(300);
output_b(0b00000010);
delay_ms(300);

}
for( b=0;b<=10 ;b++)       //parpadea la luz diez veces cada 200ms
{
output_b(0b00000000);
delay_ms(200);
output_b(0b00000010);
delay_ms(200);

}
for( b=0;b<=10 ;b++)        //parpadea la luz diez veces cada 100ms
{
output_b(0b00000000);
delay_ms(100);
output_b(0b00000010);
delay_ms(100);

}

while(1)
{
output_b(0b00000110);/*suena la alarma y parpadea la luz*/
delay_ms(200);
output_b(0b00000000);
delay_ms(200);
output_b(0b00000110);
}
} ...
 
Última edición por un moderador:
#2
El punto está en que tengo que colocar un pulsador que en cualquier punto del programa me lo vuelva al comienzo, como si reseteara el pic. ¿Será tan sencillo que no lo veo? o está mal diseñado el programa y de esta manera no se puede hacer.
¿Y por qué no utilizas el pin de reset?
También puedes usar una comparación dentro de los bucles for para saber siempre cuando se pulsó el botón.
 
#3
Hola, te doy un consejo para reducir tu código a sólo pocas líneas. En vez de utilizar tantos bucles for, utiliza sólo uno, con la única diferencia, en que deberás reemplazar las constantes de tiempos y cantidad de parpadeos por variables que se van ajustando según la etapa que debe suceder. Y en dicha última etapa accionas el buzzer.
 
#4
Muchas gracias por responder !!! . en principio el circuito lo tengo montado y funcionando pero con un pulsador en el reset del pic pero siempre tuve dudas si se podia dañar por resetearlo tantas veces , asique el desafio era modificar el programa para resetearlo por soft ,pero probe varias cosas como interrupciones externas y funciones como if (input(pin_a0)==1 ; o break y no me funcionaron solo me sacan del while pero no logro volver al comienzo del programa y la otra cosa era simplificarlo como dice Gudino que es lo que estoy tratando de hacer pero todavia no me doy cuenta,como hago para que haga esto
parpadea 10 veces cada 500ms
parpadea 10 veces cada 400ms
parpadea 10 veces cada 300ms
parpadea 10 veces cada 200ms
sera algo asi ?? pero esto no funciona
while (1){
tiempo-=100
for (b=0;b<=10;b++)
{
output_b(0b00000010);
delay_ms(tiempo);
output_b(0b00000000);
delay_ms(tiempo);
}
}
Si alguien puede tirarme una punta les estare muy agradecido . Saludos!!!
 
#5
En principio el circuito lo tengo montado y funcionando pero con un pulsador en el reset del pic, pero siempre tuve dudas si se podía dañar por resetearlo tantas veces, así que el desafio era modificar el programa para resetearlo por soft.
No le pasa nada al microcontrolador si lo reseteas muchas veces.
Para realizar las secuencias de la forma como menciona Gudino, la verdad no la entiendo.

Esta es la forma que te mencioné, pero es mejor usar el botón de reset si quieres reiniciar el programa.
Código:
#include <16f84a.h>
#fuses   nowdt
#use     delay(crystal = 4MHz)

void main (void)
{
   int8 i;
   output_low(pin_b3);
   
   while (true)
   {
reiniciar:
   output_low(pin_b1);
   delay_ms(6000);
   
      for(i=1;i<=20;++i)
      {
         if(!input(pin_a1))
         {
            goto reiniciar;
         }
            output_toggle(pin_b1);
               delay_ms(500);
      }
      
      for(i=1;i<=20;++i)
      {
         if(!input(pin_a1))
         {
            goto reiniciar;
         }
            output_toggle(pin_b1);
               delay_ms(400);
      }
      
      for(i=1;i<=20;++i)
      {
         if(!input(pin_a1))
         {
            goto reiniciar;
         }
            output_toggle(pin_b1);
               delay_ms(300);
      }
      
      for(i=1;i<=20;++i)
      {
         if(!input(pin_a1))
         {
            goto reiniciar;
         }
            output_toggle(pin_b1);
               delay_ms(200);
      }
      
      output_high(pin_b3);
         delay_ms(2000);
            output_low(pin_b3);
   }
}
No sé si eso es lo que quieres que haga el programa y sólo se me ocurre con varios bucles.

Nota:
El los bucles puse 20 porque los ciclos de apagado también cuentan cuando se usa output_toggle();
Así en total se visualizará un conteo de encendido del LED de 10 veces.

Saludos.
 
#6
Muchas gracias por tu aporte D@rKbytes !!! despues lo voy a probar y te cuento ahora veo la manera de salir de cada bucle , pero si decis que el pic no se daña con los reset y que es mejor para reiniciar el programa , entonces no se que hacer, si cambiarlo como me aconsejas en tu programa o dejarlo asi ?, Te agradezco mucho por tu ayuda que fue muy valiosa .Saludos !!!
 

Temas similares

Arriba