Hola federicoib,
El truco del mux está en multiplexar muy rápido, así parece que lees varias cosas a la vez.
Un ciclo de multiplexación de 16 entradas (74HC4067) tarda menos de 10 ms.
Lo propio es hacer un bucle para leer las entradas del mux, guardar los valores y después de leer, hacer las operaciones. Cuantas más operaciones, más tardarás en hacer el siguiente bucle de lectura del mux.
En internet hay un montón de ejemplos. Basta con ir poniendo los valores correctos en S0, S1 y S2 y leer del pin.
Saludos.
M64.
Hay unos multiplexores de Microchip por I2C que con dos pines (los del puerto I2C) te controlan dieciseis pines de entrada y salida con generacion de interrupcion. Al ser I2C puedes poner unos cuantos en el bus y tambien multiplexzr con ellos.
Yo los uso con frecuencia porque me permiten gestionar un monton de entradas y cambiar de microcontrolador a modelos con menos pines. Ahora no lo tengo a mano pero si quieres mandame un privado para que no me despiste y te paso esquemas y codigo en CCS C para gestionarlos.
Otra ventaja es que pueden estar lejs del microcontrolador y solo tienes que llevar dos hilos mas los dos de alimentacion.
Ire aportando toda la información que encuentre, así también ayudamos a otro que quiera armar proyectos similares!!
Saludos.
Allá va...
Expansores de puertos I2C con el MCP23017 de Microchip.
Los conectas como en la imagen adjunta (Proteus-MCP...) y pones tantos como necesites. A cada uno le asignas una dirección con A0, A1 y A2 (a masa o a VCC) ya ves que hay un montón de combinaciones...
Recuerda poner siempre las resistencias de pull-up en SDA y SCL, en caso contrario se va la comunicación I2C al cuerno.
Verás que cada expansor tiene dos puertos y puedes utilizarlos como entrada o salida. Lo ideal es que los multiplexes tambien haciendo una parrilla. Mandas, por ejemplo el puerto A a las horizontales y el B a las verticales. En cada intersección pones un led o bien un switch segun quieras usarlos para salida o entrada.
En la imagen se adivina esta matriz. Uso el multiplexor que se ve para los dos contactos de un switch y el punto común va a otro multiplexor que está a la derecha y no aparece en la imagen.
En este caso concreto es el circuito de la lectura de un teclado midi con detección de velocidad de pulsación.
Ahora vamos con el código.
En la imagen "CCS-C-Inicializacións" puedes ver unas constantes definiendo las direcciones de los multiplexores y la direccion interna de los puertos dentro de cada multiplexor.
Posteriormente aparece el código que inicializa uno de ellos como entradas y otro como salidas (recuerda que cada uno tiene dos puertos que cada puerto puede ser de entrada o salida. En este caso cada uno de los muxes hace solo una función, uno entradas y otro salidas)
La mayoría de los delays son innecesarios con hardware real y en el código de producción van comentados pero los he dejado para que pueda simular sin quedarse frito en el Proteus.
En las dos imágenes restantes puedes ver la escritura en el mux de direccionamiento de "filas" y la lectura de las teclas pulsadas.
Verás que la función que "escribe" en el multiplexor de salida permite activar independientemente cada pin en cualquiera de los dos puertos. Utilízala tal y como está y te ahorras trabajo.
La función de lectura lee de golpe todo el puerto que le pidas en el mux que le pidas. No lee pin a pin. Si quieres lectura pin a pin puedes hacer luego un shifting del octeto y comprobarlo con una máscara o utilizar el método que prefieras.
No aparece en este código pero si repites la lectura, algo como:
i2c_write( iEXPANSOR + 1 ); // Enderezo + 1 para facela lectura.
delay_us(20);
iLecturaTeclado = i2c_read(); // Lectura do rexistro.
delay_us(20);
iLecturaTeclado = i2c_read(); // Lectura do rexistro.
delay_us(20);
puedes leer los dos ports de uno multiplexor sin tener que direccionarlos de nuevo. Te ahorras trabajo y tráfico en el bus I2C
Creo que los comentarios, a pesar de estar en galego que es en lo que funciona mi cerebro, son suficientes para comprender el código.
Está funcionando con un 18f4550 a 20 Mhz sin ningún tipo de problema, además de correr bien en Proteus (que, afortunadamente, tiene simulados la mayoría de los PIC y tambien el expansor...)
Un saludo y a disfrutarlo.
Archivos adjuntos (
loguéate para descargar)
Brrrrrrr...
Vaya tochazo me he marcado.
Mejor cógete el código, lo utilizas tal y como está y no te complicas. Con los comentarios creo que será suficiente.
Adjunto tambien una de las "ramas" de la matriz de multiplexado. Recuerda que hacemos la lectura de las teclas (cada uno de los switches) en reposo y tambien en pulsación para poder detectar cuanto ha tardado en pulsarse y poder calcular la velocidad.
El resto de las ramas son iguales. Si quieres simularlo en Proteus recuerda que puedes asignar a cada uno de los switches el tiempo que tarda en cambiar de un estado a otro.
En tu caso probablemente no compruebes velocidad de pulsación pero si lo necesitas es relativamente fácil de hacer.
Archivos adjuntos (
loguéate para descargar)
Perfecto! Algo así era lo que estaba buscando, la verdad un crack miscoes! Muchisimas gracias, luego subire los pasos para el armado del controlador!
1
Te va todo lo necesario en los adjuntos