Autor Tema: Contador De Tiempo Entre Pulsaciones 12C509  (Leído 2186 veces)

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

Desconectado ayasystems2

  • PIC10
  • *
  • Mensajes: 9
Contador De Tiempo Entre Pulsaciones 12C509
« en: 11 de Junio de 2007, 07:48:42 »
Buenas a todos,

recurro a vosotros para pediros un poco de ayuda

Quiero hace un circuito para controlar el plegado de los espejos del coche remotamente.
Ya he visto como decirle al pic que le he dado al botón de cerrar/abrir del mando a distancia del coche.
Mi idea es que si en dos segundos se producen dos pulsaciones de cierre se pleguen los espejos y si se dan dos de apertura en el intervalo de dos segundos pues que salgan.

Con mis pobres conocimientos de programación de pics he hecho esto, a ver que os parece:

Citar

//Programa de control de espejos y ventanillas


#include <12C509.h>
#fuses INTRC,NOWDT,NOPROTECT, NOMCLR
#use delay(clock=4000000)
#define GP0 PIN_B0 //Relé sacar espejos
#define GP1 PIN_B1 //Relé meter espejos
#define GP2 PIN_B2 //Pulso cierre
#define GP3 PIN_B3 //Pulso apertura
#define GP4 PIN_B4
#define GP5 PIN_B5


void MirrorIn(void){
   output_high(GP1);
   delay_ms(4000); //Esperamos 4 seg. a que se metan
   output_low(GP1);
}

void MirrorOut(void){
   output_high(GP0);
   delay_ms(4000); //Esperamos 4 seg. a que salgan
   output_low(GP0);
}

main() {
   char primer_pulso = 0;
   char segundo_pulso = 0;
   char contador = 0;
   
   output_low(GP0);
   output_low(GP1);
   output_low(GP2);
   output_low(GP4);
   
   while (TRUE){
      contador = 0;
      if (input(GP2)){//pulsado cierre
         //Detectar si han pulsado dos veces en menos de dos segundos
         while (contador<25000){//Calcular el valor para que esté un segundo dando vueltas al While
            if (input(GP2)){
               segundo_pulso = 1;   
            }//if input(GP2)
         }//fin while
         if (segundo_pulso = 1){
            MirrorIn();//Metemos los espejos
         }//if segundo_pulso
      }//if input(GP2)   
     
     
      if (input(GP3)){//pulsado abrrir
         //Detectar si han pulsado dos veces en menos de dos segundos
         while (contador<25000){//Calcular el valor para que esté un segundo dando vueltas al While
            if (input(GP3)){
               segundo_pulso = 1;   
            }//if input(GP3)
         } //fin while   
         if (segundo_pulso = 1){
            MirrorOut();//Sacamos los espejos
         }//segundo_pulso
      }//input(GP3)   
   }//while TRUE Bulce infinito
}//main

Un amigo me hablo que sería mucho mejor hacerlo usando el contador interno del pic para determinar el tiempo entre pulsaciones pero la verdad es que no se como va eso....

Que os parece, mejorable? Me echais un cable??

Un saludo y gracias!

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18286
    • MicroPIC
Re: Contador De Tiempo Entre Pulsaciones 12C509
« Respuesta #1 en: 12 de Junio de 2007, 02:10:41 »
Tiene un riesgo esta forma de hacerlo.

Código: C
  1. if (input(GP2)){//pulsado cierre
  2.          //Detectar si han pulsado dos veces en menos de dos segundos
  3.          while (contador<25000){//Calcular el valor para que esté un segundo dando vueltas al While
  4.             if (input(GP2)){
  5.                segundo_pulso = 1;  
  6.             }//if input(GP2)
  7.          }//fin while

Según eso, al detectar un pulso en GP2 pasamos el primer IF, y justo 2 instrucciones después volvemos a preguntar. A poco que el pulse dure un pelín vamos a cumplir las dos condiciones con el mismo pulso.

Te cuento cómo lo plantearía yo:
Código: [Seleccionar]
- activamos la interrupción externa para la detección del pulso
- en la función de interrupción externa hacemos lo siguiente:
         - ¿es el primer pulso?
                        SI -> cambiamos un flag y activamos el timer y la interrupción del timer. Contador de desbordamientos=0
                        NO -> cambiamos un flag y comprobamos el tiempo transcurrido (en el Timer). Si hace menos de dos segundos, plegar espejos.
- en la función de interrupción del timer hacemos lo siguiente:
         - ¿hemos llegado a 2 seg? (contador de desbordamientos >= x)
                        SI -> cambiamos el flag y desactivamos contador de tiempo y timer
                        NO -> acumulamos contador de desbordamientos

Espero que se entienda

Desconectado ayasystems2

  • PIC10
  • *
  • Mensajes: 9
Re: Contador De Tiempo Entre Pulsaciones 12C509
« Respuesta #2 en: 12 de Junio de 2007, 05:48:12 »
Entiendo como me dices pero es que no tengo mucha idea del manejo de los Pics y las interrupciones no sé manejarlas ni sé como activar el contador interno

La verdad es que no había caido en que si el pulso dura medio segundo por ejemplo pasará los dos IF en el mismo, una solución podría ser que una vez detectado el pulso se espere a tener un nivel bajo de nuevo, no?

Citar

      if (input(GP2)&&!input(GP4)){//pulsado cierre
        while(input(GP2)){
        //esperamos que finalice el pulso
        }
         //Detectar si han pulsado dos veces en menos de dos segundos
         LedStatusOn();//debug ver que sólo está encendido 2 segundos máximo
         while (contador<600){//Calcular el valor para que esté 2 segundos dando vueltas al While
            if (input(GP2)){
               delay_ms(200);
               if (input(GP2)){//evitamos falsas entradas.
                  segundo_pulso = 1;
                  contador = 601;//forzamos la salida ya han dado segundo pulso
               }
            }//if input(GP2)
            delay_ms(200);
            contador ++;
         }//fin while
         contador = 0;
         LedStatusOff();
         if (segundo_pulso = 1 && !input(GP4)){
            MirrorIn();//Metemos los espejos
            segundo_pulso = 0;
         }//if segundo_pulso
      }//if input(GP2)


Que te parece así??

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18286
    • MicroPIC
Re: Contador De Tiempo Entre Pulsaciones 12C509
« Respuesta #3 en: 12 de Junio de 2007, 06:07:27 »
Así tampco vale; sólo te va a funcionar si el tiempo entre un pulso y otro es exactamente de 200ms.

Desconectado ayasystems2

  • PIC10
  • *
  • Mensajes: 9
Re: Contador De Tiempo Entre Pulsaciones 12C509
« Respuesta #4 en: 12 de Junio de 2007, 06:11:58 »
Citar
while (contador<600){//Calcular el valor para que esté 2 segundos dando vueltas al While
            if (input(GP2)){
               delay_ms(200);
               if (input(GP2)){//evitamos falsas entradas.
                  segundo_pulso = 1;
                  contador = 601;//forzamos la salida ya han dado segundo pulso
               }
            }//if input(GP2)
            delay_ms(200);
            contador ++;
         }//fin while
No se quedaría dentro del While durante dos segundos? (aprox) esperando el segundo pulso?? Estará dando 600 vueltas al while esperando el segundo pulso... no?



Un saludo

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18286
    • MicroPIC
Re: Contador De Tiempo Entre Pulsaciones 12C509
« Respuesta #5 en: 12 de Junio de 2007, 06:48:14 »
No lo pillo.
Tal como lo veo está dando vueltas durante x tiempo y, cuando detecta un pulso, espera 200ms y comprueba si el pulso sigue a nivel alto. Sólo en ese caso considera que el pulso es el segundo que se recibe.
Durante todo el rato que dure el bucle, el proceso anterior se repite.

Desconectado ayasystems2

  • PIC10
  • *
  • Mensajes: 9
Re: Contador De Tiempo Entre Pulsaciones 12C509
« Respuesta #6 en: 12 de Junio de 2007, 06:56:43 »
Pongo el programa entero y voy a intentar comentarlo mejor, ok?

Gracias nocturno


Citar
///Programa de control de espejos y ventanillas
#include <12f509.h>
#fuses INTRC,NOWDT,NOPROTECT, NOMCLR
#use delay(clock=4000000)
#define GP0 PIN_B0 //Relé sacar espejos
#define GP1 PIN_B1 //Relé meter espejos
#define GP2 PIN_B2 //Pulso cierre
#define GP3 PIN_B3 //Pulso apertura
#define GP4 PIN_B4 //12v bajo llave Anulamos todo al tenerlos
#define GP5 PIN_B5 //led esperando segundo pulso DEBUG

char primer_pulso = 0;
char segundo_pulso = 0;
char contador = 0;

void MirrorIn(void){
   output_high(GP1);
   delay_ms(4000); //Esperamos 4 seg. a que se metan
   output_low(GP1);
}

void MirrorOut(void){
   output_high(GP0);
   delay_ms(4000); //Esperamos 4 seg. a que salgan
   output_low(GP0);
}

void LedStatusOn(void){
   output_high(GP5);
}

void LedStatusOff(void){
   output_high(GP5);
}

main() {
#if defined(__PCB__)
   setup_counters (RTCC_INTERNAL,RTCC_DIV_2);
                               // See .h file for other special
                               // options for setup_counters
#else
   setup_counters (RTCC_INTERNAL,RTCC_DIV_2);
#endif


   output_low(GP0);
   output_low(GP1);
   output_low(GP2); //son input
   output_low(GP4); //son input
   output_low(GP5);

   while (TRUE){
      contador = 0;
      if (input(GP2)&&!input(GP4)){//Detectamos el primer pulso de cierre, siempre que no tengamos señal en GP4
        while(input(GP2)){
        //esperamos que finalice el primer pulso ya que como dura unos 500ms si no esperamos al nivel bajo
        //el nivel alto pasaría al siguiente IF, interpretandolo como una segunda pulsación
        }     
         
         LedStatusOn();//debug ver que sólo está encendido 2 segundos máximo
         while (contador<600){//Calcular el valor para que esté 2 segundos dando vueltas al While
                              //Esperando al segundo pulso
            if (input(GP2)){//segundo pulso detectado
               delay_ms(200);//esperamos 200ms para ver que no ha sido una señal falsa
               if (input(GP2)){//Es de verdad un segundo pulso? El pulso dura 500ms
                  segundo_pulso = 1;
                  contador = 601;//forzamos la salida ya han dado segundo pulso
               }
            }//if input(GP2)
            delay_ms(200);
            contador ++;
         }//fin while
         contador = 0;
         LedStatusOff();
         if (segundo_pulso = 1 && !input(GP4)){
            MirrorIn();//Metemos los espejos
            segundo_pulso = 0;
         }//if segundo_pulso
      }//if input(GP2)


   //Habría que repetir lo mismo para GP3 que sería lo que detecta que se dio a al mando a abrir

   }//while TRUE Bulce infinito
}//main

Mil gracias por tu ayuda nocturno

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18286
    • MicroPIC
Re: Contador De Tiempo Entre Pulsaciones 12C509
« Respuesta #7 en: 12 de Junio de 2007, 07:12:23 »
Ahora sí lo entiendo ;-)

Digamos que no es la solución más elegante, pero creo que podría funcionar. ¡A probarlo!

Desconectado ayasystems2

  • PIC10
  • *
  • Mensajes: 9
Re: Contador De Tiempo Entre Pulsaciones 12C509
« Respuesta #8 en: 12 de Junio de 2007, 07:15:00 »
Muchas graaacias!!!

A ver si esta semana puedo montarlo en una board  :-/