/*
* Lucas Trento
* Llave de conmutacion.
* Cada flanco ascendente en las entradas,
* invierte el estado de una única salida.
*/
//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)
#define INVERTIR_SALIDA PUERTO_SALIDAS= PUERTO_SALIDAS ^ 1
void setup()
{
CONFIGURAR_LED;
CONFIGURAR_SALIDAS;
CONFIGURAR_ENTRADA1;
CONFIGURAR_ENTRADA2;
CONFIGURAR_ENTRADA3;
}
void loop(){
Led_Test();
LlaveConmutacion();
delay(1);
}
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;
}
void LlaveConmutacion(void){
static bool ent1_activada_ant = 0,
ent2_activada_ant = 0,
activar_salida = 0;
// 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 && !ENTRADA_ACTIVADA2) return;
//acción
INVERTIR_SALIDA;
/*
activar_salida = !activar_salida;
if(activar_salida) ACTIVAR_SALIDA5;
else DESACTIVAR_SALIDA5;
*/
//queremos invertir el bit 0, que es el asociado a la salida que elegimos
/*
PUERTO_SALIDAS= PUERTO_SALIDAS ^ (1<<0);
PUERTO_SALIDAS= 10010110
AND (|)
MASCARA = 11101111 --> ~(1<<4)
------------
10000110
*/
//Resumen:
//~ --> Se utiliza para invertir cada uno de los bits
// XOR ^ --> Se utiliza para invertir determinados bits
// OR | --> Se utiliza para poner en uno determinados bits
// AND & --> Se utiliza para poner en cero determinados bits
//PUERTO_SALIDAS = activar_salida; //00000001 ó 00000000
//
}