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

Temas similares

12/04/2014 #1


Reset para alarma de sueño
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);
}
} ...
12/04/2014 #2
Moderador

Avatar de D@rkbytes

ariel 37 dijo: Ver Mensaje
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.
12/04/2014 #3

Avatar de Gudino Roberto duberlin

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.
13/04/2014 #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!!!
13/04/2014 #5
Moderador

Avatar de D@rkbytes

ariel 37 dijo: Ver Mensaje
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.
14/04/2014 #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 !!!
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.