/*
MANEJO DE REGISTROS DE ARDUINO UNO
*******************************************************************************************
Configurar pines de un PUERTO como entradas o salidas
DDRX = B11110000; donde X se reemplaza por el puerto B, C o D del Arduino UNO
los 1 configura como salida al pin y 0 como entrada
EJEMPLOS:
DDRB = B11110000; // PORTB7-PORTB4 como salidas, PORTB0-PORTB3 como entradas.
DDRD = B11111111; // PORTD0-PORTD7 como salidas.
DDRB = B00000000; // PORTB0-PORTB7 como entradas.
DDRB = B00000111; // PORTB0-PORTB2 salidas, PORTB3-PORTB7 como entradas.
******************************************************************************************
Escribir el valor del pin de un puerto
PORTX = B11110000; donde X se reemplaza por el puerto B, C o D del Arduino UNO
los 1 configura ALTO al pin y 0 como BAJO
EJEMPLOS:
PORTD = B11111111; // PORTD0-PORTD7 en ALTO (HIGH).
PORTD = B00000000; // PORTD0-PORTD7 en BAJO (LOW).
PORTB = B00000101; // PORTB0 y PORTB2 en ALTO (HIGH), PORTB1, PORTB3-PORTB7 en BAJO (LOW).
*****************************************************************************************
Leer el valor del pin de un puerto
variable = PINX donde X se reemplaza por el puerto B, C o D del Arduino UNO
EJEMPLO:
byte variable = PIND; // Guarda en una variable de tipo byte el estado de PORTD0-PORTD7.
******************************************************************************************
DDRD = B00000000; // Configura los pines del puerto PORTD (D0-D7) como entradas.
PORTD = B00001111; // Habilitar las pull-ups de los pines D0-D3.
******************************************************************************************
*/
//definiciones de mascaras
#define MASK_VALIDEZ 0x1
//definiciones de corrimientos
#define SHIFT_DATO 7
#define SHIFT_VALIDEZ 13
//definiciones de valores binarios
//definiciones varias
#define VALIDO 1
//Variables
byte puerto_B;
byte puerto_D;
int dato;
byte val;
//prototipos de funciones
int enpaquetar(byte puerto_B, byte puerto_D);
void setup() {
//Esta seccion de codigo solo se ejecuta una vez, sirve para setear y configurar
//inicio el monitor serial y su velocidad en baudios
//para comunicarme con la consola de salida
Serial.begin(115200);
//configuro el puerto C como salida
// Utilizamos seis bits del puerto C como salidas.
// Solo utilizamos del b0 al b6
DDRC = B1111110;
//configuro el puerto B como entrada
// Utilizamos seis bits del puerto B como entradas.
// Solo utilizamos del b2 al b7 para dejar el TX y RX
DDRB = B0000000;
//configuro el puerto D como entrada
// Utilizamos seis bits del puerto D como entradas.
// Solo esta disponible del b0 al b5
DDRD = B0000000;
/* Estas instrucciónes equivalen a hacer esto por cada pin:
pinMode(X1,OUTPUT);
pinMode(X2,OUTPUT);
pinMode(...,OUTPUT);
pinMode(Y1,INPUT);
pinMode(Y2,INPUT);
pinMode(...,INPUT);
*/
}
void loop() {
//Esta seccion de codigo se ejecuta en un bucle infinito:
//Leo los puertos y lo guardo en sus variables respectivas
puerto_B = PINB;
puerto_D = PIND;
//empaqueto los puertos en una sola variable de 16 bits
dato = enpaquetar(puerto_B, puerto_D);
val = (dato > SHIFT_VALIDEZ) && MASK_VALIDEZ;
if(val == VALIDO) //ejecuto el codigo principal solo si el dato es valido
{
Serial.print("valido ");
Serial.print(dato);
//desempaqueto y obtengo el valor del sensor y de la medicion
/*
switch(sensor)
{
case SENSOR_1:
//prendo el LED correspondiente
//imrimo el numero de sensor
//imprimo el valor de temperatura en fahrenheit
//convierto el valor a centigrados
//imprimo el valor en centigrados
//imprimo ALARMA o OK
break;
case SENSOR_2:
//prendo el LED correspondiente
//imrimo el numero de sensor
//imprimo el valor de temperatura en fahrenheit
//convierto el valor a centigrados
//imprimo el valor en centigrados
//imprimo ALARMA o OK
break;
case SENSOR_3:
//prendo el LED correspondiente
//imrimo el numero de sensor
//imprimo el valor de temperatura en fahrenheit
//convierto el valor a centigrados
//imprimo el valor en centigrados
//imprimo ALARMA o OK
break;
case SENSOR_4:
//prendo el LED correspondiente
//imrimo el numero de sensor
//imprimo el valor de temperatura en fahrenheit
//convierto el valor a centigrados
//imprimo el valor en centigrados
//imprimo ALARMA o OK
break;
case SENSOR_5:
//prendo el LED correspondiente
//imrimo el numero de sensor
//imprimo el valor de temperatura en fahrenheit
//convierto el valor a centigrados
//imprimo el valor en centigrados
//imprimo ALARMA o OK
break;
case SENSOR_6:
//prendo el LED correspondiente
//imrimo el numero de sensor
//imprimo el valor de temperatura en fahrenheit
//convierto el valor a centigrados
//imprimo el valor en centigrados
//imprimo ALARMA o OK
break;
default :
break;
}
}
*/
delay(2000); //tiempo de espera entre mediociones en milisegundos
//apago todos los LEDS
}
}
int enpaquetar(byte puerto_B, byte puerto_D)
{
int dato;
dato = (puerto_B << SHIFT_DATO) | puerto_D;
return dato;
}
//definiciones de las funciones utilizadas