Autor Tema: Apagar un led despuès de varias horas  (Leído 10153 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado AcoranTf

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1093
Re:Apagar un led despuès de varias horas
« Respuesta #15 en: 08 de Noviembre de 2016, 00:07:40 »
No entendiste bien, no es para que se apague. Se va a apagar tal como esta, pero ya no volvera a encender hasta que reinicies el programa, que se repetira el mismo ciclo. Si eso es lo que quieres no tienes que hacer nada. Pero si no es asi debes hacerte otro temporizador solo para el tiempo que debe permanecer apagado desactivando la interrupcion del TIMER1, o reprogramar el TIMER1 y utilizar una bandera para saber si esta en el tiempo de encendido o apagado.
Al final del tiempo de apagado deberas o bien reactivar la interrupcion del TIMER1 o cambiar la bandera, segun la opcion que hayas elegido. Y si solo deseas un ciclo, o sea que al conectar el PIC encienda el led y pasado el tiempo estipulado se apague y no haga mas nada, no tendrias que hacer nada, tal como esta deberia hacer eso justamente.

Saludos.
« Última modificación: 08 de Noviembre de 2016, 00:20:31 por AcoranTf »

Desconectado vdiazg

  • PIC12
  • **
  • Mensajes: 68
Re:Apagar un led despuès de varias horas
« Respuesta #16 en: 08 de Noviembre de 2016, 14:52:13 »
Gracias ArcanTf , dio resultado, muy bueno no entiendo eso de tener que hacer otro timer para que se apague

Estimado, que es lo que realmente deseas hacer, quizas pueda darte una manito
quiero construir un "Condensador de flujos"

Desconectado retovil

  • PIC10
  • *
  • Mensajes: 43
Re:Apagar un led despuès de varias horas
« Respuesta #17 en: 09 de Noviembre de 2016, 22:48:56 »
Gracias ArcanTf , dio resultado, muy bueno no entiendo eso de tener que hacer otro timer para que se apague

Estimado, que es lo que realmente deseas hacer, quizas pueda darte una manito
Lo que busco es que el timer corte a las 3horas y despuès incie de vuelta su ciclo .
al principio querìa que un swich o button prendiera el timer con el cual al tiempo se apagara
pero me resulto dificilisimo .Entiendace que hace poco me puse a programar y todavìa no entiendo bien la configuracion de los puertos para que inicie encendido el led bueno desde ya muchas gracias vdiazg.

Desconectado AcoranTf

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1093
Re:Apagar un led despuès de varias horas
« Respuesta #18 en: 09 de Noviembre de 2016, 23:38:34 »
Lo que busco es que el timer corte a las 3horas y despuès incie de vuelta su ciclo .
al principio querìa que un swich o button prendiera el timer con el cual al tiempo se apagara
pero me resulto dificilisimo .Entiendace que hace poco me puse a programar y todavìa no entiendo bien la configuracion de los puertos para que inicie encendido el led bueno desde ya muchas gracias vdiazg.

Hola de nuevo retovil, lo que dices que quieres es muy facil con el pulsador. Defines una bandera para arrancar el temporizador, defines la interrupcion del RB0 y en ella pones que cada vez que se pulse el pulsador situado en RB0, cambie el valor de la variable <start>, deberas seleccionar la deteccion de la pulsacion por flanco ascendente y agregar unos mS de retardo, para evitar rebotes. Te he implementado los cambios necesarios en el codigo adjunto, pero no he declarado la interrupcion del RB0, lo he dejado para que la hagas tu. Estudia un poco y hazlo. Si tienes dudas preguntas.
¡¡ NOTA IMPORTANTE !! He cambiado el led al pin RB7, para aprovechar la interrupcion de RB0 para el pulsador, que estara conectado en el RB0, o sea donde hasta ahora tenias el led. Al pin RB0 debes ponerle una resistencia de pull-up de 4K7.
Si quieres perfeccionarlo mas aun, coloca en la funcion main un if de forma que cuando start sea = 0 deshabilite la interrupcion del TIMER1, ojo solo la del TIMER1, si desabilitas las generales o la del RB0, anularas el pulsador. Y ya para rizar el rizo, en ese mismo if pones que apague el led y que ponga a 0 la variable contador. De ese modo en cualquier momento que pulses el pulsador, el led cambiara de estado y si esta encendido ademas estara corriendo el tiempo del temporizador. Pero si decides detenerlo antes de que acabe, bastara que pulses de nuevo el pulsador y se detendra el temporizador, se apagara el led y se borrara la variable <contador>. Ahora te propongo otro reto, agregale tu otro pulsador en RB1 y haces que provoque solo una pausa en el temporizador y cuando lo pulses de nuevo continue el temporizador por donde iba. El primer pulsador podria llamarse START/STOP y el segundo PAUSA.

Código: [Seleccionar]
#include<16f628A.h>
#Fuses xt,nowdt,NOPROTECT, PUT, NOLVP,NOMCLR
#use delay(clock=4000000)
#use fast_io(b)

int16 contador=0;
#int_timer1
int1 start=0; //Bandera de arranque del temporizador

//Coloca aqui la rutina de interrupcion del RB0

void TIMER1_isr(void)
{

if(start) //Si activado temporizador

output_bit(PIN_B7,1); //Inicia con el led encendido

{

contador++;

if(contador==2000) //Si llega al final del tiempo
{
output_bit(PIN_B7,0); //Apaga el led
contador=0;
start=0; //Desactiva el temporizador
}
}

}


void main()
{
set_tris_b (0b00000001); //Puerto B como salidas bits de 1 a 7, el 0 es entrada
setup_timer_1(RTCC_INTERNAL| RTCC_DIV_4);
set_timer1(192);
enable_interrupts(INT_TIMER1);
enable_interrupts(GLOBAL);

while(1)
{

}
}

Saludos.
« Última modificación: 09 de Noviembre de 2016, 23:54:37 por AcoranTf »

Desconectado retovil

  • PIC10
  • *
  • Mensajes: 43
Re:Apagar un led despuès de varias horas
« Respuesta #19 en: 11 de Noviembre de 2016, 16:17:02 »
Bueno gracias AcoranTF ,por tu paciencia .

int1 start=0;                  //Bandera de arranque del temporizador

aca la unica rutina de interrupcion para el swich es con la sentencia if y me da error es la que mas conosco, por decirte la unica . :mrgreen:

//Coloca aqui la rutina de interrupcion del RB0

void TIMER1_isr(void)

Esta muy interesante la propuesta con el otro swich.

Desconectado AcoranTf

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1093
Re:Apagar un led despuès de varias horas
« Respuesta #20 en: 11 de Noviembre de 2016, 21:08:29 »
Bueno gracias AcoranTF ,por tu paciencia .

int1 start=0;                  //Bandera de arranque del temporizador

aca la unica rutina de interrupcion para el swich es con la sentencia if y me da error es la que mas conosco, por decirte la unica . :mrgreen:

//Coloca aqui la rutina de interrupcion del RB0

void TIMER1_isr(void)

Esta muy interesante la propuesta con el otro swich.

int1 start=0;                  //Bandera de arranque del temporizador  Esto no es una interrupcion, es la declaracion de la variable <start>, con el tipo "boolean, binario o bit". El int1 significa eso que la variable es de un solo bit con las unicas opciones de ser 1 o 0. Tambien se llama short este tipo de variable.

//Coloca aqui la rutina de interrupcion del RB0 deberas declarar una rutina de interrupcion para el RB0, hacer la rutina y colocarla aqui.

Esta muy interesante la propuesta con el otro swich. Me gustaria que lo intentes, de ese modo se aprende bastante. Tambien se podria hacer todo con un solo pulsador, pero es algo mas complicado. Si lo consigues con dos pulsadores, despues te ayudo a hacerlo con uno solo. De ese modo aprenderas a utilizar distintas banderas que te ayuden a cambiar la funcion del pulsador segun convenga.

Saludos.

Desconectado soymoe

  • PIC18
  • ****
  • Mensajes: 456
    • El blog de Moe
Re:Apagar un led despuès de varias horas
« Respuesta #21 en: 12 de Noviembre de 2016, 09:55:33 »
yo lo hago simple, con el timer cuento medio segundo y lo repito hasta la cantidad que necesito pero no uso for, anda muy bien ya he vendido muchos de esos

Desconectado retovil

  • PIC10
  • *
  • Mensajes: 43
Re:Apagar un led despuès de varias horas
« Respuesta #22 en: 14 de Noviembre de 2016, 00:01:36 »
AconranTF ,puede ser que este programa produzca error,sin la rutina de interrupcion, en el Isis proteus .porque se tilda al correrlo .
#include<16f628A.h>
#Fuses xt,nowdt,NOPROTECT, PUT, NOLVP,NOMCLR
#use delay(clock=4000000)
#use fast_io(b)

int16 contador=0;
#int_timer1
int1 start=0;                                 //Bandera de arranque del temporizador

//Coloca aqui la rutina de interrupcion del RB0

void TIMER1_isr(void)
   {

      if(start)                              //Si activado temporizador

         output_bit(PIN_B7,1);                  //Inicia con el led encendido
         
         {

            contador++;

            if(contador==2000)                  //Si llega al final del tiempo
               {
                  output_bit(PIN_B7,0);         //Apaga el led
                  contador=0;
                  start=0;                  //Desactiva el temporizador
               }
         }

   }


void main()
   {
      set_tris_b (0b00000001);                  //Puerto B como salidas bits de 1 a 7, el 0 es entrada
      setup_timer_1(RTCC_INTERNAL| RTCC_DIV_4);
      set_timer1(192);
      enable_interrupts(INT_TIMER1);
      enable_interrupts(GLOBAL);

      while(1)
         {

         }
   }

Desconectado AcoranTf

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1093
Re:Apagar un led despuès de varias horas
« Respuesta #23 en: 14 de Noviembre de 2016, 05:15:42 »
Claro retovil, es logico que no funcione sin la rutina que falta de la interrupcion del RB0, ya que nunca va a activarse el temporizador.
Estudia las diferencias entre este programa y el anterior que te puse, de ese modo entenderas porque no puede funcionar este.

Saludos.

Desconectado retovil

  • PIC10
  • *
  • Mensajes: 43
Re:Apagar un led despuès de varias horas
« Respuesta #24 en: 14 de Noviembre de 2016, 12:05:51 »
yo lo hago simple, con el timer cuento medio segundo y lo repito hasta la cantidad que necesito pero no uso for, anda muy bien ya he vendido muchos de esos
Si Claro moe yo tambien realice ese programa el tema esta en ponerle botones de arranque y parada ,me entendes? :o

Desconectado retovil

  • PIC10
  • *
  • Mensajes: 43
Re:Apagar un led despuès de varias horas
« Respuesta #25 en: 16 de Noviembre de 2016, 17:23:45 »
hola,AconranTF  ,encontre esta rutina
 #include<16f628A.h>
#Fuses xt,nowdt,NOPROTECT, PUT, NOLVP,MCLR
#use delay(clock=4000000)

#use fast_io(b)
#BYTE PORTB = 0X86
#BIT RB0 = 0x06.0
#BIT RB7 = 0x06.7
int16 contador=0;

#int_timer1
int1 start=0;               //Bandera de arranque del temporizador
           
//Coloca aqui la rutina de interrupcion del RB0
#int_EXT
void EXT_isr(void){
If (start){
  RB7=1;
  }
}


 void TIMER1_isr(void)
   {

      if(start)            //Si activado temporizador

         output_bit(PIN_B7,1);      //Inicia con el led encendido
         
         {

            contador++;

            if(contador==2000)      //Si llega al final del tiempo
               {
                  output_bit(PIN_B7,0);         //Apaga el led
                  contador=0;
                  start=0;         //Desactiva el temporizador
               }
         }

   }


void main()
   {
      set_tris_b (0b00000001);         //Puerto B como salidas bits de 1 a 7, el 0 es entrada
          ext_int_edge(L_TO_H);     // activacion flanco de subida ,aunque por default es por flanco de subida .
               setup_timer_1(RTCC_INTERNAL| RTCC_DIV_4);
      set_timer1(192);
      enable_interrupts(INT_TIMER1);
      enable_interrupts(GLOBAL);

      while(1)
         {

         }
   }

                                       
parece funcionar todavia no lo probe con el circuito por lo meno no produce desbordamiento por pila en el proteus .
De todas maneras me gustarìa ver estudiar el tema pero no hay bibliografia donde estudiar
este caso en particular . donde? se conseguiria estas paginas para estudiar ,consegui hacer una alarma por sencilla con la entrada RB0/INT pero no puede en el caso de la alarma enlazar el timer1
« Última modificación: 16 de Noviembre de 2016, 20:00:53 por retovil »

Desconectado AcoranTf

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1093
Re:Apagar un led despuès de varias horas
« Respuesta #26 en: 16 de Noviembre de 2016, 20:35:22 »
Con esto:

Código: [Seleccionar]
//Coloca aqui la rutina de interrupcion del RB0
#int_EXT
void EXT_isr(void)
    {
        If (start)
            {
                  RB7=1;
            }
    }

No haces nada. Lo que necesitas es sustituir el if por lo necesario para hacer lo siguiente en este orden: desabilitar la interrupcion exterior, asignar el valor 1 a la variable <start>, retardo de 5 mS para evitar rebotes, rehabilitar la interrupcion exterior. Para hacer mas seguro el antirrebotes tambien es bueno que pongas esta linea en el main: <int_ext_edge(L to H)>, ademas de una resistencia de 10 K entre RB0 y Vcc y el pulsador entre RB0 y GND. De ese modo hasta que no sueltes el pulsador, no lo tendra en cuenta.
Una sugerencia: para hacer mas legible el codigo, es conveniente tabular o sangrar las distintas lineas de forma que con un simple vistazo veas lo que corresponde a cada parte. Tambien es conveniente que al ponerlo aqui en el foro lo hagas como codigo y no como texto. Eso se consigue pinchando en el simbolo # que hay justo encima del ultimo emoticono, ( ((:-))) y pegando a continuacion tu codigo entre las etiquetas [ c o d e ] y [ / c o d e ], los espacios es para que no interprete eso como codigo aqui.
Hay un libro interesante y que te puede ser muy util, se llama <Compilador C CCS y Simulador Proteus para Microcontroladores PIC> de la editorial Marcombo.
Espero ver tus avances pronto.

Saludos.
« Última modificación: 16 de Noviembre de 2016, 21:03:58 por AcoranTf »

Desconectado AcoranTf

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1093
Re:Apagar un led despuès de varias horas
« Respuesta #27 en: 24 de Noviembre de 2016, 18:54:47 »
¿Como andas con el tema?.
¿Te diste por vencido, andas investigando, estas trabado?.


Desconectado retovil

  • PIC10
  • *
  • Mensajes: 43
Re:Apagar un led despuès de varias horas
« Respuesta #28 en: 26 de Noviembre de 2016, 00:54:10 »
Estoy investigando y trabajando ,no me doy por vencido .
He notado varios errores en el codigo que has escrito .Uno es en la configuracion del timer1 . El otro es en la declaracion dela interrupcion ext RB0 dentro del #int_timer1 .

Desconectado AcoranTf

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1093
Re:Apagar un led despuès de varias horas
« Respuesta #29 en: 26 de Noviembre de 2016, 17:44:26 »
Estoy investigando y trabajando ,no me doy por vencido .
He notado varios errores en el codigo que has escrito .Uno es en la configuracion del timer1 . El otro es en la declaracion dela interrupcion ext RB0 dentro del #int_timer1 .

Ok, ya nos diras algo.

Saludos.