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

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

Desconectado retovil

  • PIC10
  • *
  • Mensajes: 43
Re:Apagar un led despuès de varias horas
« Respuesta #30 en: 01 de Diciembre de 2016, 12:09:11 »
Hola ,disculpas me retrase por trabajo pero estoy retornando de a poco .
Tengo una pregunta AconranTF, es posible poner el int_ext dentro del int_timer osea :
//...//
#int_timer1
   int1 start=0; 
#int_EXT         //Coloca aqui la rutina de interrupcion del RB0
  void Int_RB0(){
 
}
//----------------------------------------------------------------------------------//
o seria como lo he visto en algunos codigos que primero va la int_ext y despuès va el int_tiemer1???????

Desconectado AcoranTf

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1099
Re:Apagar un led despuès de varias horas
« Respuesta #31 en: 18 de Diciembre de 2016, 09:55:46 »
No es buena practica anidar interrupciones, entre otras cosas porque podrias entrar en un bucle sin fin, bloqueando la ejecucion del programa. Aparte si desacivas las interrupciones al entrar en su rutina y dentro pretendes leer otra interrupcion, no sera posible, ya que estarian desactivadas todas las interrupciones.

Saludos.

Desconectado retovil

  • PIC10
  • *
  • Mensajes: 43
Re:Apagar un led despuès de varias horas
« Respuesta #32 en: 18 de Diciembre de 2016, 17:07:06 »
Bueno entre tantas pruebas parece que uno copia y amontona codigo .
Pero entre las pocas cosas que pude aprender se me ocurren cosas que solo saco de la galera .
haber este codigo que no puedo desifrar no es copiado .
Código: [Seleccionar]
#include<16f628A.h>
#Fuses xt,nowdt,NOPROTECT, PUT, NOLVP,MCLR
#use delay(clock=4000000)
#use fast_io(b)
int1 start=0;
int1 starta=0;
int16 contador=0;

#int_ext
void ext_isr()
 {
   starta=true; // bandera para el TIMI_isr,pruebo haber si selecciona
     start=false; //bandera para el TIMER1_isr  ,pruebo haber si no selecciona
       delay_ms(5);
       
       
 
   }


#int_timer1
void TIMER1_isr(void)
   {
      if(start)//Si activado temporizador

      output_bit(PIN_B7,1);//Inicia con el led encendido
   
   {
      contador++;
      if(contador==100)
         {
               output_toggle(PIN_B7);
               output_bit(PIN_B5,1);
            contador=0;
          }
   }
   }
   
   void TIM1_isr(void)
   {
      if(starta)//Si activado temporizador

      output_bit(PIN_B7,0);//Inicia con el led apagado
   {
      contador++;
      if(contador==300) //tiempo mayor
         {
               output_toggle(PIN_B7);
               output_bit(PIN_B5,0);// se apaga al finalizar el conteo 
            contador=0;
          }
   }
   }
   
 
 
void main()   {
    set_tris_b (0b00000001);
      set_tris_a (0b00000001);//Puerto a como ent
        ext_int_edge(0,L_TO_H);//output_low(int_timer1);//Inicia con el led encendido
       setup_timer_1(RTCC_INTERNAL| RTCC_DIV_4);
        set_timer1(192);
         enable_interrupts(INT_EXT);
           enable_interrupts(INT_TIMER1);
            enable_interrupts(GLOBAL);
           
     
 while(1);
     
     
         
       
       }

Bueno hasta aqui ,es como volver a empezar de nuevo .

Desconectado AcoranTf

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1099
Re:Apagar un led despuès de varias horas
« Respuesta #33 en: 18 de Diciembre de 2016, 21:07:33 »
Bueno entre tantas pruebas parece que uno copia y amontona codigo .
Pero entre las pocas cosas que pude aprender se me ocurren cosas que solo saco de la galera .
haber este codigo que no puedo desifrar no es copiado .
Código: [Seleccionar]
#include<16f628A.h>
#Fuses xt,nowdt,NOPROTECT, PUT, NOLVP,MCLR
#use delay(clock=4000000)
#use fast_io(b)
int1 start=0;
int1 starta=0;
int16 contador=0;

#int_ext
void ext_isr()
 {
   starta=true; // bandera para el TIMI_isr,pruebo haber si selecciona
     start=false; //bandera para el TIMER1_isr  ,pruebo haber si no selecciona
       delay_ms(5);
       
       
 
   }


#int_timer1
void TIMER1_isr(void)
   {
      if(start)//Si activado temporizador

      output_bit(PIN_B7,1);//Inicia con el led encendido
   
   {
      contador++;
      if(contador==100)
         {
               output_toggle(PIN_B7);
               output_bit(PIN_B5,1);
            contador=0;
          }
   }
   }
   
   void TIM1_isr(void)
   {
      if(starta)//Si activado temporizador

      output_bit(PIN_B7,0);//Inicia con el led apagado
   {
      contador++;
      if(contador==300) //tiempo mayor
         {
               output_toggle(PIN_B7);
               output_bit(PIN_B5,0);// se apaga al finalizar el conteo 
            contador=0;
          }
   }
   }
   
 
 
void main()   {
    set_tris_b (0b00000001);
      set_tris_a (0b00000001);//Puerto a como ent
        ext_int_edge(0,L_TO_H);//output_low(int_timer1);//Inicia con el led encendido
       setup_timer_1(RTCC_INTERNAL| RTCC_DIV_4);
        set_timer1(192);
         enable_interrupts(INT_EXT);
           enable_interrupts(INT_TIMER1);
            enable_interrupts(GLOBAL);
           
     
 while(1);
     
     
         
       
       }

Bueno hasta aqui ,es como volver a empezar de nuevo .

No entiendo que quieres decir con que no puedes descifrarlo. Segun veo ese codigo esta compuesto de fragmentos del que yo te envie y otros que desconozco, supongo que los habras agregado tu. Creo deducir del codigo que mire por encima que pretendes realizar alguna prueba. Si me explicas mejor lo que quieres hacer y lo que no entiendes lo vemos e intentamos arreglarlo.

Saludos.

Desconectado retovil

  • PIC10
  • *
  • Mensajes: 43
Re:Apagar un led despuès de varias horas
« Respuesta #34 en: 19 de Diciembre de 2016, 12:42:26 »
Si claro esta que la base es la que vos me propusiste y le tenìa que agregar la interrupciòn .
Te aclaro que siempre la idea es cambiar el tiempo por medio de swich.
En la INT_EXT puse dos banderas ,lo cual desde mi ignorancia ,pretendo que el programa por medio de alguna sentencia vinculada al sw,tome el tiempo correpondiente a la bandera  seleccionada  y bueno de esta forma que probe manualmente se puede ver en la interrupcion externa que estan las banderas start y starta no funciona manualmente.
Código: [Seleccionar]
#int_ext
     void ext_isr() {
          starta=true;
           start=false;
 
 
Siempre se activa la primer bandera osea start .y va al void TIMER1_isr(void)que esta vinculado a dicha bandera .
« Última modificación: 19 de Diciembre de 2016, 12:55:58 por retovil »

Desconectado AcoranTf

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1099
Re:Apagar un led despuès de varias horas
« Respuesta #35 en: 20 de Diciembre de 2016, 18:40:23 »
Retovil en cuanto pueda lo miro a fondo y te digo algo.

Saludos.

Desconectado retovil

  • PIC10
  • *
  • Mensajes: 43
Re:Apagar un led despuès de varias horas
« Respuesta #36 en: 03 de Enero de 2017, 11:21:59 »
Hola AconranTF, bueno sigo esperando ,espero que el codigo que puse no sea demasiado descabellado o irrealizable .Feliz año ,que esta pequeña relaciòn de alumno maestro,con todo el respeto, dure por muchos años màs .  :)

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Apagar un led despuès de varias horas
« Respuesta #37 en: 03 de Enero de 2017, 15:16:22 »
Perdon pero creo que no queda claro lo que tiene que hacer el PIC, ya que fue mutando y agregandose muchas cosas al mismo tiempo. Segun lo que entendi es:

- Una entrada para seleccionar la velocidad con que enciende y apaga.
- Una entrada de ¿start/parada o reiniciar? el estado del temporizador de la luz
- Una salida que deberia apagarse en 3hs y comienza encendida


Las dudas que tengo son:

- Las entradas, ¿ son botones o llaves ?
- La entrada que maneja el temporizado, es de arranque/parada o simplemente resetea el temporizador a 0 para que comienze todo el ciclo de nuevo ?
- Luego de apagarse la salida, ¿que ocurre? Se espera que se presione el boton que resetea el temporizador, mientras se queda apagada la salida, o solo esta 3hs mas y lo enciende de nuevo?.
- ¿Que cantidad de velocidades se desean seleccionar?, si es una sola llave serian 2 velocidades, si son 2 serian 4 velocidades, si es un boton podrian ser mas, pero esto implica tener una salida mas como indicador para saber que velocidad se selecciono. La velocidad seleccionada se debe guardar o debe setearse cada ves que se alimenta el PIC?, si se hace por boton se debe usar la EEPROM, si se hace por llaves no hace falta.
- ¿Se necesita de una gran velocidad de respuesta a las entradas? es decir que si es obligatorio para el PIC que al detectar la entrada lo procese en microsegundos o se puede tardar 100ms sin problemas?- Las entradas, ¿las manejaria una persona? ( con esta ultima se deduce lo de la velocidad )

Desconectado AcoranTf

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1099
Re:Apagar un led despuès de varias horas
« Respuesta #38 en: 03 de Enero de 2017, 18:36:47 »
Hola AconranTF, bueno sigo esperando ,espero que el codigo que puse no sea demasiado descabellado o irrealizable .Feliz año ,que esta pequeña relaciòn de alumno maestro,con todo el respeto, dure por muchos años màs .  :)

Feliz año tambien para ti. Siento el retraso pero entre las fiestas y el trabajo no he tenido tiempo de ver el programa a fondo. Voy a intentar dejar un rato y verlo mañana.
De todas formas responde a KillerJc y asi tambien me sirve a mi tu respuesta y el seguro te da tambien alguna idea.

Saludos.

Desconectado retovil

  • PIC10
  • *
  • Mensajes: 43
Re:Apagar un led despuès de varias horas
« Respuesta #39 en: 04 de Enero de 2017, 20:47:13 »
Bien gracias KillerJC, voy a tratar de contestar tus dudas que son muy profecionales para mi posiciòn .
 Las entradas, ¿ son botones o llaves ? : son pulsadores o botones.
 La entrada que maneja el temporizado, es de arranque/parada o simplemente resetea el temporizador a 0 para que comienze todo el ciclo de nuevo ?: ahi te lo dejo a tu criterio no se que serìa lo mejor .
 Luego de apagarse la salida, ¿que ocurre? :Se espera que se presione el boton que resetea el temporizador, mientras se queda apagada la salida.
 ¿Que cantidad de velocidades se desean seleccionar?:No son velosidades, son tiempos .El programa que realizaste esta muy bien .Lo que quiero ahora es utilizar un  vector,para hacer lo mismo ,con el sentido de aprendizaje.
 Las entradas, ¿las manejaria una persona? ( con esta ultima se deduce lo de la velocidad ): Si ,digo si porque es el usuario quien determina el timpo de calentamiento del agua ,(tener en cuenta que es un calefon electrico).

 :)
 Dejo el circuito que hice en proteus aunque no se porque no me funciona el relay

Por otro lado a mi se me ocurrio poner en la interrupcion externa dos banderas diferentes para llamar a diferentes tiempos del timer1 ,no me dio resultado . A lo mejor con otros codigos se puede realizar lo mismo ,pero me gustarìa que lo analises y me comentes ,esta màs atras .
« Última modificación: 04 de Enero de 2017, 21:06:31 por retovil »

Desconectado AcoranTf

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1099
Re:Apagar un led despuès de varias horas
« Respuesta #40 en: 04 de Enero de 2017, 21:57:16 »
Hola retovil, la razon por la que no te funciona el rele es sencillamente porque esta mal conectado. El emisor del transistor debe ir a GND, un extremo del rele al colector del transistor y el otro extremo del rele a positivo, la R4 sobra debes eliminarla y debes poner un diodo 1N4148 en paralelo con la bobina del rele, el catodo hacia el positivo y el anodo hacia el colector del transistor. Tambien entre la base del transistor y el PIN RB7 debes poner una resistendia de 220 Ohm.
Por otro lado no es aconsejable referenciar la tension de AC a GND, seria mejor dejarla flotante y por tanto aislada del resto del circuito.
Hoy tampoco tuve tiempo de ver el programa.

Saludos.
« Última modificación: 04 de Enero de 2017, 22:00:38 por AcoranTf »

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Apagar un led despuès de varias horas
« Respuesta #41 en: 04 de Enero de 2017, 22:58:13 »
No se si funcionara, deberias probarlo.

Código: C
  1. #include <16f628A.h>
  2. #Fuses xt,nowdt,NOPROTECT, PUT, NOLVP,NOMCLR
  3. #use delay(clock=4000000)
  4. #use fast_io(b)
  5.  
  6. volatile int1    activo;
  7. volatile int16   contador=0;
  8. int8    indice;
  9. int16   tiempo[4] = {1000,2000,3000,4000};
  10. volatile int16   limite;
  11.  
  12. #int_timer1
  13. void TIMER1_isr(void)
  14. {
  15.     set_timer1(192);
  16.     if(activo)
  17.     {
  18.         contador++;
  19.     }
  20.  
  21.     if(contador>=limite)
  22.     {
  23.         output_bit(PIN_B7,0);                   // Apago Rele
  24.         contador=0;
  25.         activo= false;
  26.     }
  27. }
  28.  
  29.  
  30. void main()
  31. {
  32.    
  33.     int8 i;
  34.    
  35.     // Inicializacion de variables
  36.     indice = 0;
  37.     limite = tiempo[0];
  38.     activo = true;
  39.    
  40.     // Configuracion de los modulos
  41.    
  42.     set_tris_b(0x0F);                               // RB0 a RB3 entradas, RB4 a RB7 salidas
  43.     output_bit(PIN_B7,1);                           //Inicia con el rele encendido
  44.     setup_timer_1(RTCC_INTERNAL| RTCC_DIV_4);
  45.     set_timer1(192);
  46.     enable_interrupts(INT_TIMER1);
  47.     enable_interrupts(GLOBAL);
  48.  
  49.     while(1)
  50.     {
  51.         /*
  52.          * Boton de reset
  53.          */
  54.         if(input(PIN_B0))                       // Boton de reset
  55.         {
  56.             contador = 0;                           // Reinicio el tiempo
  57.             output_bit(PIN_B7,1);                   // Activo rele
  58.             activo = true;
  59.         }
  60.        
  61.         /*
  62.          * Boton de tiempo
  63.          */
  64.        
  65.         if(input(PIN_B1))                       // Boton seleccion de tiempo
  66.         {
  67.             while(input(PIN_B1));
  68.             indice++;
  69.             limite = tiempo[indice];
  70.             if(indice>=sizeof(tiempo))
  71.             {
  72.                 indice = 0;
  73.             }
  74.             for(i=0;i<=indice;i++)
  75.             {
  76.                 output_bit(PIN_B6,0);
  77.                 delay_ms(200);
  78.                 output_bit(PIN_B6,1);
  79.                 delay_ms(200);
  80.             }
  81.         }
  82.        
  83.         /*
  84.          * Led indicador
  85.          */
  86.         output_bit(PIN_B6,activo);
  87.     }
  88. }

Y para que te des una idea de lo que dice AcoranTF :

« Última modificación: 06 de Enero de 2017, 02:02:49 por KILLERJC »

Desconectado retovil

  • PIC10
  • *
  • Mensajes: 43
Re:Apagar un led despuès de varias horas
« Respuesta #42 en: 05 de Enero de 2017, 01:31:17 »
No AconranTF,ni con la configuracion emisor comun funciona. vos sabes que le conecto directo una fuente de 12 y no acciona .en el simulador proteus sera el proteus ?

Desconectado AcoranTf

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1099
Re:Apagar un led despuès de varias horas
« Respuesta #43 en: 05 de Enero de 2017, 16:28:48 »
No AconranTF,ni con la configuracion emisor comun funciona. vos sabes que le conecto directo una fuente de 12 y no acciona .en el simulador proteus sera el proteus ?

Si el rele que has elegido es del voltaje correcto y ademas es simulable y aun asi no funciona, seguro es el Proteus, pero para asegurarte antes de eso, coloca un led en serie con una resistencia de 220 Ohm y el conjunto en paralelo con el rele, ojo el led debe quedar al contrario que el 1N4148. Si enciende el led en el momento que deberia activarse el rele, pero el rele no se activa, el problema es el rele, casi seguro que no es similable. En cambio si no enciende el led ni se activa el rele, podria ser el Proteus. Pero aun puedes hacer otra prueba para asegurarte, desconecta la resistencia de base del lado que va al PIC y conectala directamente a Vcc, con eso en el momento que simules tu circuito deberan encender el led y activarse el rele, si ocurre asi, definitivamente es el Proteus, en caso contrario es otro el problema.
Todo lo anterior vale para el circuito que te recomende antes, el que tu aportas mas arriba no es correcto.

Saludos.

Desconectado retovil

  • PIC10
  • *
  • Mensajes: 43
Re:Apagar un led despuès de varias horas
« Respuesta #44 en: 06 de Enero de 2017, 18:31:19 »
inclusive los transistores funcionan mal funcionan  como si estuvieran en corto o con fugas