Hola a toda la comunidad.
Estoy tratando de ampliar la cantidad de salidas posibles de un Arduino, para lo cual estoy usando latches de 8 bits (74HC373) para crear un bus de datos binarios. Por ahora solo estoy probando con dos, pero la idea sería poder ampliarlo más aún (si funciona lo que estoy intentando con 9 pines del ATMega podría tener 40 salidas
).
La idea sería la siguiente: en ocho pines del arduino estoy cargando una serie de estados altos o bajos, los cuales estan conectados en paralelo a las entradas de las latches. Las latches solo registraran y guardaran el dateo del bus al aplicar una subida y bajada al pin del cerrojo. Como son dos integrados debería accionar el cerrojo del primero para que carguen los datos del bus y guardarlos, limpiar el bus, escribir sus nuevos valores y accionar el cerrojo del segundo integrado. De este modo quedan 16 estados lógicos fijados hasta que se vuelva a accionar el cerrojo de alguno de ellos.
Para realizar la función de seleccionar que cerrojo se acciona he utilizado un CD4017 (contador decimal) que es accionado por un novenos pin del Arduino. Para evitar errores tome para los cerrojos solo las salidas impares, dejando el cero y las pares sin ir a ningún lado, solo para aprovechar os "silencios" entre los pares.
Todo muy bonito, pero... por algún motivo no me funciona
. Imaginé que quizás el 4017 era muy "lento", así que intenté añadir un milisegundo de delay (deberíaser más que suficiente). Aún así no hubo mejoras. El código que estoy usando es el siguiente:
Si alguien tiene alguna sugerencia soy todo oídos. Muchas gracias desde ya!
...
Estoy tratando de ampliar la cantidad de salidas posibles de un Arduino, para lo cual estoy usando latches de 8 bits (74HC373) para crear un bus de datos binarios. Por ahora solo estoy probando con dos, pero la idea sería poder ampliarlo más aún (si funciona lo que estoy intentando con 9 pines del ATMega podría tener 40 salidas
La idea sería la siguiente: en ocho pines del arduino estoy cargando una serie de estados altos o bajos, los cuales estan conectados en paralelo a las entradas de las latches. Las latches solo registraran y guardaran el dateo del bus al aplicar una subida y bajada al pin del cerrojo. Como son dos integrados debería accionar el cerrojo del primero para que carguen los datos del bus y guardarlos, limpiar el bus, escribir sus nuevos valores y accionar el cerrojo del segundo integrado. De este modo quedan 16 estados lógicos fijados hasta que se vuelva a accionar el cerrojo de alguno de ellos.
Para realizar la función de seleccionar que cerrojo se acciona he utilizado un CD4017 (contador decimal) que es accionado por un novenos pin del Arduino. Para evitar errores tome para los cerrojos solo las salidas impares, dejando el cero y las pares sin ir a ningún lado, solo para aprovechar os "silencios" entre los pares.
Todo muy bonito, pero... por algún motivo no me funciona
PHP:
int bus0 = 2;
int bus1 = 3;
int bus2 = 4;
int bus3 = 5;
int bus4 = 6;
int bus5 = 7;
int bus6 = 8;
int bus7 = 9;
int cd4017 = 10;
int led = 13;
void setup()
{
pinMode (led, OUTPUT);
digitalWrite(led, HIGH);
pinMode (bus0, OUTPUT);
pinMode (bus1, OUTPUT);
pinMode (bus2, OUTPUT);
pinMode (bus3, OUTPUT);
pinMode (bus4, OUTPUT);
pinMode (bus5, OUTPUT);
pinMode (bus6, OUTPUT);
pinMode (bus7, OUTPUT);
pinMode (cd4017, OUTPUT);
digitalWrite(bus0, LOW);
digitalWrite(bus1, LOW);
digitalWrite(bus2, LOW);
digitalWrite(bus3, LOW);
digitalWrite(bus4, LOW);
digitalWrite(bus5, LOW);
digitalWrite(bus6, LOW);
digitalWrite(bus7, LOW);
digitalWrite(cd4017, LOW);
digitalWrite(led, LOW);
}
void loop()
{
loadBus(1, 0, 1, 1, 0, 0, 1, 1); latchAndClearBus; loadBus(0, 1, 1, 0, 1, 1, 1, 0); latchAndClearBus;
}
void latchAndClearBus() //limpiar y prepararse para el proximo latcheo
{
digitalWrite(cd4017, HIGH); digitalWrite(cd4017, LOW); digitalWrite(cd4017, HIGH); digitalWrite(cd4017, LOW);
delay(1);
digitalWrite(bus0, LOW); digitalWrite(bus1, LOW); digitalWrite(bus2, LOW); digitalWrite(bus3, LOW);
digitalWrite(bus4, LOW); digitalWrite(bus5, LOW); digitalWrite(bus6, LOW); digitalWrite(bus7, LOW);
}
void loadBus (int a, int b, int c, int d, int e, int f, int g, int h)
{
digitalWrite(bus0, h);
digitalWrite(bus1, g);
digitalWrite(bus2, f);
digitalWrite(bus3, e);
digitalWrite(bus4, d);
digitalWrite(bus5, c);
digitalWrite(bus6, b);
digitalWrite(bus7, a);
delay(1);
}
Si alguien tiene alguna sugerencia soy todo oídos. Muchas gracias desde ya!