CCCPaste

MapeoDeContador_Acomodar

/*
 * Lucas Trento
 * Mapeo_de_Contador
 * Mapear en salidas, los 4 (cuatro) bits menos significativos
 * (nibble bajo) de una variable contador.
 * Un flanco ascendente en una entrada, incrementa el contador,
 * y un flanco ascendente en otra entrada decrementa el contador.  
 * Ambas entradas activadas reiniciarán el contador.
 */
 
//Led Test
#define PIN_LED           13
#define CONFIGURAR_LED    pinMode(PIN_LED, OUTPUT)
#define ENCENDER_LED      digitalWrite(PIN_LED, HIGH)
#define APAGAR_LED        digitalWrite(PIN_LED, LOW)
 
//Salida
#define PIN_SALIDA0         A0
#define CONFIGURAR_SALIDA0  pinMode(PIN_SALIDA0, OUTPUT)
#define ACTIVAR_SALIDA0     digitalWrite(PIN_SALIDA0, HIGH)
#define DESACTIVAR_SALIDA0  digitalWrite(PIN_SALIDA0, LOW)
 
#define PIN_SALIDA1         A1
#define CONFIGURAR_SALIDA1  pinMode(PIN_SALIDA1, OUTPUT)
#define ACTIVAR_SALIDA1     digitalWrite(PIN_SALIDA1, HIGH)
#define DESACTIVAR_SALIDA1  digitalWrite(PIN_SALIDA1, LOW)
 
#define PIN_SALIDA2         A2
#define CONFIGURAR_SALIDA2  pinMode(PIN_SALIDA2, OUTPUT)
#define ACTIVAR_SALIDA2     digitalWrite(PIN_SALIDA2, HIGH)
#define DESACTIVAR_SALIDA2  digitalWrite(PIN_SALIDA2, LOW)
 
#define PIN_SALIDA3         A3
#define CONFIGURAR_SALIDA3  pinMode(PIN_SALIDA3, OUTPUT)
#define ACTIVAR_SALIDA3     digitalWrite(PIN_SALIDA3, HIGH)
#define DESACTIVAR_SALIDA3  digitalWrite(PIN_SALIDA3, LOW)
 
#define PIN_SALIDA4         A4
#define CONFIGURAR_SALIDA4  pinMode(PIN_SALIDA4, OUTPUT)
#define ACTIVAR_SALIDA4     digitalWrite(PIN_SALIDA4, HIGH)
#define DESACTIVAR_SALIDA4  digitalWrite(PIN_SALIDA4, LOW)
 
#define PIN_SALIDA5         A5
#define CONFIGURAR_SALIDA5  pinMode(PIN_SALIDA5, OUTPUT)
#define ACTIVAR_SALIDA5     digitalWrite(PIN_SALIDA5, HIGH)
#define DESACTIVAR_SALIDA5  digitalWrite(PIN_SALIDA5, LOW)
 
#define PUERTO_SALIDAS      PORTC
#define CONFIGURAR_SALIDAS  DDRC=0xFF
 
//Entrada
#define PIN_ENTRADA1        7
#define CONFIGURAR_ENTRADA1 pinMode(PIN_ENTRADA1, INPUT)
#define ENTRADA_ACTIVADA1   digitalRead(PIN_ENTRADA1)
 
#define PIN_ENTRADA2        6
#define CONFIGURAR_ENTRADA2 pinMode(PIN_ENTRADA2, INPUT)
#define ENTRADA_ACTIVADA2   digitalRead(PIN_ENTRADA2)
 
#define PIN_ENTRADA3        5
#define CONFIGURAR_ENTRADA3 pinMode(PIN_ENTRADA3, INPUT)
#define ENTRADA_ACTIVADA3   digitalRead(PIN_ENTRADA3)
 
void setup()
  {
   CONFIGURAR_LED;
   CONFIGURAR_SALIDAS;
   CONFIGURAR_ENTRADA1;
   CONFIGURAR_ENTRADA2;
   CONFIGURAR_ENTRADA3;
  }
 
void loop(){
   Led_Test();
   Mapeo_de_Contador();
   delay(1);
}
 
void Mapeo_de_Contador(void){
    static bool ent1_activada_ant = 0,
                ent2_activada_ant = 0,
                activar_salida = 0,
                incrementa_decrementa = 1;
    static char i = 0;
    static unsigned long millis_ant=0;
 
   /*
   * Mapear en salidas, los 4 (cuatro) bits menos significativos
   * (nibble bajo) de una variable contador.
   * Un flanco ascendente en una entrada, incrementa el contador,
   * y un flanco ascendente en otra entrada decrementa el contador.  
   * Ambas entradas activadas reiniciarán el contador.
   */
   if(incrementa_decrementa)
   {
     if(millis()-millis_ant > 500)
      {
        millis_ant=millis();
        i++;
        if(i==16) PUERTO_SALIDAS= 0;  
        PUERTO_SALIDAS++;
        i=0b0000 0010;
        //PUERTO_SALIDAS=0b1010 0001
        PUERTO_SALIDAS= PUERTO_SALIDAS & ~((1<<4)-1);		//11110000
        PUERTO_SALIDAS= PUERTO_SALIDAS | ( i & ((1<<4)-1));
        

        PUERTO_SALIDAS= PUERTO_SALIDAS & (1<<4)-1
        //PUERTO_SALIDAS=i;
      }
   }
    else
    {
      if(millis()-millis_ant > 500)
        {
          millis_ant=millis();
          i--;
          if(i==0) PUERTO_SALIDAS= 15;  
          PUERTO_SALIDAS--;
        }
     }
   
     
    // Si tengo un cambio en cualquiera de las 2 entradas
    if((ENTRADA_ACTIVADA1 == ent1_activada_ant) && (ENTRADA_ACTIVADA2 == ent2_activada_ant))return;
    ent1_activada_ant = ENTRADA_ACTIVADA1;
    ent2_activada_ant = ENTRADA_ACTIVADA2;
   
    if(ENTRADA_ACTIVADA1) incrementa_decrementa =1;
 
    if(ENTRADA_ACTIVADA2)  incrementa_decrementa = 0;
 
    if(ENTRADA_ACTIVADA1 && ENTRADA_ACTIVADA2) PUERTO_SALIDAS= 0;
 
}
 
void Led_Test(void){
    static bool estado=0;
    static unsigned long millis_ant=0;
 
    if(millis()-millis_ant < 1000) return;
    millis_ant=millis();
 
    estado = !estado;
 
    if(estado)       ENCENDER_LED;
    else             APAGAR_LED;
}