CCCPaste

ContadorDeTiempoEntreFlancos_LUCAS

//Lucas Trento
//CONTADOR  DE FLANCOS DESCENDENTES
//Ajustar la cantidad de destellos de un Blink multidestellos conectado a la salida,
//de modo que coincida con la cantidad de flancos descendentes procesados en la entrada.
//Los flancos deberán procesarse pasado cierto tiempo de ocurrido último.
 
#define LED_TEST 13
#define CONFIGURAR_LED      pinMode(LED_TEST, OUTPUT)
#define ENCENDER_LED        digitalWrite(LED_TEST, HIGH)
#define APAGAR_LED          digitalWrite(LED_TEST, LOW)
 
//Salida
#define PIN_SALIDA 12
#define CONFIGURAR_SALIDA   pinMode(PIN_SALIDA, OUTPUT)
#define ACTIVAR_SALIDA      digitalWrite(PIN_SALIDA, HIGH)
#define DESACTIVAR_SALIDA   digitalWrite(PIN_SALIDA, LOW)
 
//Entrada
#define PIN_ENTRADA 7
#define CONFIGURAR_ENTRADA  pinMode(PIN_ENTRADA, INPUT)
#define ENTRADA_ACTIVADA   (digitalRead(PIN_ENTRADA)==HIGH)
 
#define MS_ESTADO          500
 
void setup()
  {
   CONFIGURAR_LED;
   CONFIGURAR_SALIDA;
   CONFIGURAR_ENTRADA;
  }
 
void loop()
  {
   Led_Test();
   Flancos();
   delay(1);
  }
 
void Flancos(void)
  {
    static bool entrada_activada_ant = 0;  
    static bool led_encendido=0;
    static unsigned long millis_ant=0,millis_tiempo_flancos=0,millis_entrada_activada=0;  
    static unsigned long tpo_espera=0,tpo_transcurrido=2000;
    static unsigned char pulsos_restantes=0;
    const unsigned int t_pulso=300, t_pausa=1000;
    static int cont_pulsos=1,cont=0;
     
 // Ajustar la cantidad de destellos de un Blink multidestellos conectado a la salida,
 //de modo que coincida con la cantidad de segundos transcurridos
 // entre un flanco ascendente y descendente en la entrada.
 
  /* if(cont)  
   {
     if(millis() - millis_tiempo_flancos > tpo_transcurrido)
    {
      cont_pulsos=cont;
      cont=0;
    }    
   }*/
  /* if(cont)
   {                                        
    if((millis()- millis_entrada_activada)%1000==0) cont++;
    }*/
 
   if(ENTRADA_ACTIVADA)                                      
    if(millis()- millis_entrada_activada > 1000)
      {
        cont++;
        millis_entrada_activada=millis();
      }
     
     if(millis() - millis_ant > tpo_espera )
     {
       millis_ant =  millis();
         {
          if(led_encendido)
          {
            pulsos_restantes--;
            if(pulsos_restantes)   tpo_espera=t_pulso;
            else                   tpo_espera=t_pausa;
          }
          else
          {
            if(!pulsos_restantes)
            {
              pulsos_restantes=cont_pulsos;
            }
            tpo_espera=t_pulso;
          }
         
          led_encendido=!led_encendido;
   
          if(led_encendido)    ACTIVAR_SALIDA;
          else                 DESACTIVAR_SALIDA;
         }
       }
   
    // flanco ascendente                    
   if(ENTRADA_ACTIVADA == entrada_activada_ant) return;
    entrada_activada_ant = ENTRADA_ACTIVADA;
   
    if(!ENTRADA_ACTIVADA)
    {
      cont_pulsos=cont;
      cont=0;
      return;
    }
 
    millis_entrada_activada=millis();
  }
 
void Led_Test(void)
  {
    static bool estado=0;
    static unsigned long millis_ant=0;
 
    if(millis()-millis_ant < MS_ESTADO) return;
    millis_ant=millis();
 
    estado = !estado;
 
    if(estado)       ENCENDER_LED;
    else             APAGAR_LED;
  }