TL; DR: la multiplexación no puede eliminar la complejidad. De hecho, nada puede eliminar la complejidad. Si algo es intrínsecamente complejo, todo lo que puedes hacer es mover esa complejidad a un área donde puedas manejarlo.
En el caso de multiplexación, mueve la complejidad de a ton of individual wires that are relatively slow
a a few wires that have to work like mad to get all that information across
. Con algunas excepciones como charlieplexing , la mayoría de las técnicas se reducen a usar algún tipo de comunicación predefinida para que un software de ejecución de MCU diga a otro , chip relativamente tonto como un registro de desplazamiento, qué hacer.
Hice esto con SPI (Interfaz Periférica Serial) hace unos años. De hecho, tuve tanto las entradas (botones) como las salidas (LED) multiplexadas en solo 4 pines MCU. Como preguntaste sobre las salidas, aquí está mi esquema de LED:
Esposiblequeesteregistrodeturnosespecíficonocoincidaconelsuyo,peroeslamismaidea.UsandolosnombresdelasseñalesSPI:
- CS=ChipSelect
- Cuandobaja(Chipseleccionadoparatransferenciadedatos),losregistrosdedesplazamientocambianunbitporreloj.
- Cuandopasaanivelalto,losregistrosdedesplazamientoemitencualquierbytequehayanterminadoconsuspinesQx.
- EstaeslaúnicaseñaldelascuatroquenoesadministradaporelperiféricoSPI(unapartedelalógicacableadaqueestáincorporadaenelchipMCUparacontrolarestetipodecomunicaciónmientraselsoftwareseapagayhaceotracosa).Porlotanto,podríasercualquierpindesalidaconvenientedelaMCU.
- SCK=SerieClocK
- CadatransicióndeinactivoaactivodesplazaunbitdeMOSIalprimerregistrodeturno.Todoslosbitssemuevenunoauno,yelquesaledelotroextremovaalsiguienteregistrodedesplazamiento,yasísucesivamentehastadondequierair.
- NopuedodeciraltoobajoaquíporqueSPIlepermitealdiseñadordeterminarquéestadosignificaqué.Peroenestecaso,lahojadedatosdelregistrodecambiosprobablementelodeterminaráporusted.
- MOSI=MasterOutSlaveIn
- Estossonlosdatosrealesquedeseaquesemuestren,quesepresentenbitabityqueseconfirmenconelbordedelrelojapropiado.
- MISO=MasterInSlaveOut
- Setratadedatosqueserecibenalmismotiempoqueestáordenandotodasesassalidas.Noseusaenestaplacaenparticular,peroestáconectadodirectamentealotroconector.
- Tengootravariantedeestaplacaquehacealgosimilarconlosbotonesysepuedeencadenarconesteencualquierordenyconcualquiernúmerodecopias,demodoqueelmismoperiféricoSPIyelmismocontroladordesoftwarepuedanleerunatoneladadebotonesymanejaunatoneladadeLEDalmismotiempo.
Asíqueeseeseldiseñodelhardware.
Ensoftware,yo:
- ConfigureelperiféricoSPIydosmatricesdeigualtamaño,unaparaLEDyotraparabotones
- Tienenqueserdelmismotamañoenelsoftware,inclusosinolosonfísicamente,porqueparacadabyte,unotienequeentrar.Porsupuesto,puedeevitaresterequisitohaciendoquelosISRseanunpocomáscomplicados.,peromiproyectolostuvolosuficientementecercacomoparaigualardetodosmodosquenovilanecesidad.
- DefinalasRutinasdeServiciodeInterrupción(ISR)apropiadasparaqueestecontroladorpueda"simplemente funcionar" sin que el software principal tenga que hacer nada especial
- Un ISR de temporizador inicia una actualización completa cargando el primer byte de LED en el registro de desplazamiento del periférico SPI (integrado en la MCU), iniciando esa transmisión y habilitando el ISR de cambio realizado
- El ISR de cambio realizado continúa la actualización colocando todo lo que haya terminado en el registro de cambios del periférico SPI en la matriz de botones, escribiendo el siguiente valor de LED en su lugar y comenzando esa transmisión. Si acaba de pasar por toda la matriz, también se desactiva.
- Escriba el software principal para usar esos arreglos como si fueran magia. Los ISR se encargan del resto.
Por supuesto, esa es una explicación simplificada. También tendrá que dividir la señal CS explícitamente en los ISR en algún lugar. Mire a través de las hojas de datos y piense cuidadosamente sobre el tiempo.