Autor Tema: Contar 3 pulsos en 1.5 segundos  (Leído 2224 veces)

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

Desconectado lycans2005

  • PIC10
  • *
  • Mensajes: 23
Contar 3 pulsos en 1.5 segundos
« en: 18 de Septiembre de 2018, 11:57:40 »
Hola,   quiero contar 3 pulsos en 1.5s, si hay 3 pulso   consecutivos en B0  durante  ese tiempo hago tarea X,Si dura presionado por 10s, se hace una tarea Y.

sino, no se hace nada y se borra todas la banderas.

Código: C
  1. long tpo;
  2. #int_ext
  3. void cap_pulso(){
  4. cont++;
  5. tpo=get_timer1();
  6. set_timer1(0);
  7. }
  8.  
  9.  
  10. void main()
  11. {
  12. setup_timer_1(T1_INTERNAL); // Start timer 1
  13. set_timer1(0);
  14. enable_interrupts(INT_EXT);
  15. while(1);
  16.  
  17. if (cont==3)
  18. {
  19. printf("OK\r\n",tpo);
  20. }
  21. else
  22. {
  23. cont=0;
  24. }
  25.  
  26. }


Alguna ayuda porfavor?
« Última modificación: 18 de Septiembre de 2018, 12:53:48 por lycans2005 »

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Contar 3 pulsos en 1.5 segundos
« Respuesta #1 en: 18 de Septiembre de 2018, 23:11:57 »
Trata primero de hacer una codigo que actue a los 1.5s, por ejemplo calcula el Timer 1 para 0.5s y que al entrar 3 veces a la interrupcion le cambie el estado de la salida ( 3 * 0.5s = 1.5s ), asi al menos tenes la parte del Timer funcionando.

Luego como siguiente paso:

Tendrias 2 interrupciones
con la interrupcion externa como tenes que, al detectar un toque, activar el Timer1 (Se puede parar/iniciar el conteo en este Timer) e incrementar una variable (supongamos que se llama "toques"). Y si es 3 esta variable, proceda a activar una flag (int1) para que luego en el while haga lo que vos desees.

Y en la interrupcion del timer, al entrar 3 veces, en ves de activar alguna salida, lo que tenes que hacer es parar el timer, reiniciarlo al valor correcto, y poner a 0 la variable "toques".


Desconectado lycans2005

  • PIC10
  • *
  • Mensajes: 23
Re:Contar 3 pulsos en 1.5 segundos
« Respuesta #2 en: 25 de Septiembre de 2018, 12:38:59 »
...

Código: C
  1. #int_ext
  2. void ext_isr(void){
  3.   button_pressed=TRUE;
  4.   enable_interrupts(int_timer1); // deshabilitando todo lo no necesario ...
  5.   touch++;                               // cuenta de pulsaciones
  6. }
  7.  
  8. #int_TIMER1
  9. void  TIMER1_isr(void){   //Función de interrupción por desbordamiento TMR1  {
  10.   flag_t++;                                               // Contador
  11. //!//  --------  Para 4MHZ ------                         //
  12.   set_timer1 (0x0);                                       // Carga del TMR1  con 0, para desbordamiento de 525ms
  13.    
  14.    // OFF CPU
  15.    if((touch==1)&&(flag_t>20)){                            // 10 seg
  16.       touch=0;
  17.       flag_t=0;                                            // Bandera para un segundo
  18.       disable_interrupts(int_timer1);                      // deshabilitando todo lo no necesario ...
  19.      
  20.       #if defined(_debug)
  21.          fprintf(debug, "Dispositivo OFF\r\n");
  22.       #endif
  23.       output_low(ON_CPU);                                  // CPU OFF
  24.    }
  25.    
  26.    // ON CPU
  27.    if ((touch>3)&&(flag_t<10)){
  28.         touch=0;
  29.         output_high(ON_CPU);                               // CPU ON
  30.         disable_interrupts(int_timer1);                    // deshabilitando todo lo no necesario ...
  31.        
  32.        #if defined(_debug)
  33.          fprintf(debug, "Dispositivo ON\r\n");
  34.        #endif  
  35.       }
  36. }

mas o menos eso es lo que quiero por ahora, 3 tocadas antes de 5seg activa el mosfet para dejar conmutada la fuente, y 1 vez durante 10 seg para apagar el mostfet.
Quiero hacer el apagado en la misma interrupción...Pero no logro hacer que funcione...
« Última modificación: 25 de Septiembre de 2018, 12:56:55 por lycans2005 »