Go Down

Topic: DIGITAL MUX 74HC151 (Read 1 time) previous topic - next topic

enriquetomas

Hola a todos,
estoy teniendo algunos problemas al leer desde un MUX digital, el 74hc151. Os paso mi codigo más abajo.

creo que puede ser algún tipo de problema con la temporización del strobe ¿alguien tiene un tutorial para leer desde un mux? (creo que massimo solo escribio el pseudocodigo hace tiempo para uno analogico)

de todas maneras no estaría mal depurarlo y ponerlo en tutorials

un abrazo a todos
Qq

//LECTURA DESDE UN MUX 74HC151 DE 8 INPUTS
//la entrada a arduino (salida del mux) es el pin 6
//los pines de seleccion son el 2,3 Y 4
//el strobe es el pin 5
//Enrique Tomas, Madrid, Junio 2006

//variables para el mux
int input = 6;  
int strobe=5;
int c=4;
int b=3;
int a=2;

int val[] = {0,0,0,0,0,0,0,0};     // valores leidos de cada input del mux


//estados de los pines de seleccion
int c_bin[]={LOW,LOW,LOW,LOW,HIGH,HIGH,HIGH,HIGH};
int b_bin[]={LOW,LOW,HIGH,HIGH,LOW,LOW,HIGH,HIGH};
int a_bin[]={LOW,HIGH,LOW,HIGH,LOW,HIGH,LOW,HIGH};

//para almacenar los estados (por claridad)
int a_val=0;
int b_val=0;
int c_val=0;

//aux
int contador=0;
int entrada=0;

void setup() {
 
 //declaramos los pines
 pinMode(input, INPUT);    
 pinMode(strobe, OUTPUT);
 pinMode(c, OUTPUT);
 pinMode(b, OUTPUT);
 pinMode(a, OUTPUT);
 
 //y la utilizacion de comunicacion serie
 beginSerial(19200);

}

void loop(){

for(entrada=0;entrada<=7;entrada++) {
 
 //seleccionamos el estado de cada pin de seleccion para cada caso
 a_val=a_bin[entrada];
 b_val=b_bin[entrada];
 c_val=c_bin[entrada];
 
 //y escribimos su valor en el mux
 digitalWrite(a,a_val);
 digitalWrite(b,b_val);
 digitalWrite(c,c_val);
 
 //ponemos strobe a LOW para poder leer
 digitalWrite(strobe,LOW);
 
 //leemos el valor de salida del mux
 val[entrada] = digitalRead(input);  
 
 //ponemos strobe a HIGH para buscar la siguiente entrada
 //digitalWrite(strobe,LOW);
 
 }
 
 //escribimos con formato por el puerto serie
 printByte('A');
 
 for(contador=0;contador<=7;contador++) {
   printInteger(val[contador]);
   delay(100);
 }
 
 printByte(10);
 printByte(13);
 
 delay(100);

}



enriquetomas

hola
ya esta todo solucionado, no me acordé de que con logica CMOS uno no puede dejar entradas al aire.

he revisado el codigo y lo dejo aqui para si alguien lo quiere utilizar:


// This patch reads a 74HC151 8 inputs digital mux
// Enrique Tomas, EMI project, Madrid, June 2006
// warholiano@yahoo.es
// www.ultranoise.es

//mux variables
int input = 6;   // digital input to arduino from mux
int strobe=5;   //digital outputs to control mux
int c=4;
int b=3;
int a=2;



// to store the values from mux
int val[] = {0,0,0,0,0,0,0,0};

// digital values to control 8 inputs
int c_bin[]={LOW,LOW,LOW,LOW,HIGH,HIGH,HIGH,HIGH};
int b_bin[]={LOW,LOW,HIGH,HIGH,LOW,LOW,HIGH,HIGH};
int a_bin[]={LOW,HIGH,LOW,HIGH,LOW,HIGH,LOW,HIGH};

//aux
int contador=0;
int entrada=0;
int a_val=0;
int b_val=0;
int c_val=0;

void setup() {

 beginSerial(9600);
 pinMode(input, INPUT);  
 pinMode(strobe, OUTPUT);
 pinMode(c, OUTPUT);
 pinMode(b, OUTPUT);
 pinMode(a, OUTPUT);
}

void loop() {

for(entrada=0;entrada<=7;entrada++) {

 //select mux input
 a_val=a_bin[entrada];
 b_val=b_bin[entrada];
 c_val=c_bin[entrada];

 digitalWrite(a,a_val);
 digitalWrite(b,b_val);
 digitalWrite(c,c_val);

 //strobe LOW to read
 digitalWrite(strobe,LOW);

 //read value
 val[entrada] = digitalRead(input);  // read input value

 //strobe HIGH to avoid jitters
 digitalWrite(strobe,HIGH);
 }

 //serial printing
 serialWrite('A');
 delay(100);
 for(contador=0;contador<=7;contador++) {
   printInteger(val[contador]);
   delay(100);
 }
 printNewline();

}

Go Up