Estoy haciendo un proyecto con un ATtiny85 y, por supuesto, me faltan pines de E/S. Una idea que tuve fue usar un solo pin para dos salidas (llamémoslas EN y DATA).
simular este circuito : esquema creado con CircuitLab
Sé que los DATOS no importan cuando EN=0. En otras palabras, estas dos salidas solo pueden asumir los valores EN=0/DATA=x, EN=1/DATA=0, EN=1/DATA=1. ¿Existe una manera fácil de asignar, por ejemplo, 0 a EN=0/DATA=x, 1 a EN=1/DATA=1, Z (pin de entrada) a EN=1/DATA=0? El consumo de energía solo importa cuando EN=0.
Puede usar dos comparadores y los valores alto-bajo-entrada. Por ejemplo:
simular este circuito : esquema creado con CircuitLab
Los dos comparadores darán un 1 lógico cuando el voltaje en la entrada sea mayor que 3/4 * Vcc
(DATA uno) o 1/4 * Vcc
(EN uno).
Cuando el pin attiny se baja, el voltaje se fijará en 0V; los comparadores tendrán entonces el valor 0 y 0. Cuando el pin se deja flotando (establecido como entrada), el voltaje irá a Vcc/2 debido a las dos resistencias; los comparadores mostrarán 1 para EN, 0 para DATA. Cuando el pin se eleva, el voltaje se fijará en Vcc; ambos comparadores mostrarán un 1. Resumiendo:
Pin state | EN | DATA
------------------------
OUT 0 | 0 | 0
INPUT | 1 | 0
OUT 1 | 1 | 1
Tenga en cuenta que esto no es escalable a diferencia de las soluciones con PWM o expansor de puertos. Si necesita más pines, tal vez sea mejor obtener un registro de desplazamiento y dedicarle dos pines (reloj y datos); de esta forma tendrás más salidas si las necesitas.
EDITAR: otra solución, que no implica el uso de circuitos integrados sino solo componentes discretos, es la siguiente:
En este caso, deberá elegir los MOSes para que puedan encenderse con Vcc/2; tenga en cuenta que los valores de las resistencias también pueden aumentarse si desea que fluya una corriente más baja. También puede cambiar el P-MOS con un PNP y el N-MOS con un NPN, pero tendrá que agregar una resistencia limitadora de corriente en su base (y no estoy seguro de cómo influye esto en los tres estados).
En cualquier caso, aquí está la tabla que muestra los estados.
Pin state | EN | DATA
------------------------
OUT 0 | 1 | 1
INPUT | 1 | 0
OUT 1 | 0 | 0
Verdad honesta: lo que está tratando de hacer es más fácil de implementar simplemente usando un microcontrolador con suficientes pines. Probablemente sea incluso más barato que un Attiny85. Quién sabe.
Pero: si realmente debe hacerlo, puede hacer varias cosas para obtener más resultados de una sola línea:
Por supuesto, soy un nerd, así que aquí hay soluciones que es menos probable que usted implemente, pero que vale la pena mencionar por diversión:
Las siguientes ideas se basan en registros de desplazamiento de serie a paralelo.
Simplemente puede cambiar sus datos a la entrada de datos en serie de su registro de turnos.
Problema: los registros de desplazamiento necesitan un reloj para saber cuándo "muestrear" la entrada.
Solución: Generar un impulso de reloj cada vez que cambie la entrada.
Nuevo problema: OK, podemos hacer eso con una puerta AND lógica simple, combinando su DataIN y una versión mínimamente retrasada de su salida (retraso a través de componentes discretos, por ejemplo, un filtro RC). Pero: entonces solo podemos tener patrones de bits alternos.
Solución: La secuencia de salida de su pin siempre debe ser
0->1[long]->B[short]->0
.
Lo que sucede aquí es que el primero 1
carga un capacitor (de ahí el 1 "largo"), el voltaje a través de ese límite desencadena un disparo único retrasado (por ejemplo, a través de un NE555) cuando cruza un umbral, lo que luego provoca un pulso de reloj para el registro de desplazamiento.
En el momento en que ocurre el pulso, ya ha configurado el bit B
de salida deseado en la salida. Eso debe ser más corto que el 1 "fijo" para evitar activar el pulso del reloj nuevamente.
Haga lo anterior dos veces para cambiar dos bits diferentes B1 y B2 en el registro de desplazamiento.
Puede implementar el esquema anterior enviando
0b1111BB00
con la unidad UART (si su microcontrolador tiene tal).
Si miras de cerca, esto es muy similar a lo que hacen las cositas "neopixel" WSxxxx para comunicarse: 0->1
marca el comienzo de un período, y la cantidad 1
dentro de ese período establece si es un 0 o un 1 lógico.
Esto necesitaba un título que rimara. A decir verdad, esto probablemente debería llamarse "generación de registro de desplazamiento de retroalimentación lineal de una secuencia de salida" más o menos.
La idea es que cuando usa un registro de desplazamiento y conecta su entrada a una combinación lógica de sus celdas internas, puede construir algo que recorra todos los estados de salida posibles (si elige la función de retroalimentación apropiadamente). Explicaría eso aquí, pero meh, perezoso, así que lea el artículo de wikipedia sobre Registros de cambio de retroalimentación lineal .
Para llevar: si puede tener un LFSR de este tipo, puede, simplemente alternando su reloj , lograr todas las salidas (solo alternar la cantidad correcta de veces).
Por supuesto, lo anterior es genial (porque tiene numerosas aplicaciones, por ejemplo, en comunicación, verificación de integridad de datos, etc.), y es muy efectivo en términos de la cantidad de puertas que necesita para eso, pero:
También puede comprar o construir un contador de 2 bits (o más). Y cuenta las alternancias de tu pin de Attiny. La salida de bit paralelo del contador puede ser sus 2 pines de salida (o más).
Creo que dice mucho. Primero pensé en LFSR en lugar de contadores.
La idea es simple:
Si no usa 1 y 2 kHz, sino un par de MHz, puede reemplazar su cable de conexión con antenas adecuadas y hacer esa transferencia por aire. También infringiría la ley al abusar del espectro para el que no tiene licencia.
Idea : igual que arriba, pero más fácil.
Que haya dos piezas independientes de información:
Puede tener el ciclo de trabajo> 50% ya sea por
Luego, igual que arriba, un filtro de paso bajo, seguido de un discriminador que cambia a la mitad del rango de voltaje de salida, le brinda el primer bit de salida.
Un filtro de paso alto, seguido de un rectificador, un condensador y un discriminador te dan el segundo bit.
simular este circuito : esquema creado con CircuitLab
Figura 1. Una codificación binaria simple de 3 estados alimentada a través de un filtro de paso bajo y monitoreada por dos comparadores para extraer los datos. Tenga en cuenta que muchos comparadores tienen salida de colector abierto y requieren una resistencia pull-up.
Enfrentará algunos desafíos para obtener la constante de tiempo R1-C1 correcta.
Una (mala) solución es la siguiente.
data = gpio
débil inversor disparador schmitt de gpio a gpio.
monoestable invertida reactivable de gpio a en.
La idea básica es que si la salida está triestablecida, el schmitt hará que oscile, lo que será captado por el monoestable para desactivar la salida. Sin embargo, esto fallará al deshabilitar la salida. Y tiene consumo de energía cuando está deshabilitado.
A menos que esté haciendo una tarea que establezca específicamente que debe usar un Attiny85, sin importar qué, entonces, con mucho, la solución más simple es usar un chip con más pines (por ejemplo, el Atmega328P). El costo sería prácticamente el mismo (por ejemplo, $2,00 en comparación con $1,50).
Algunas de las otras respuestas que sugieren usar el protocolo de un solo cable, los registros de desplazamiento, los disparadores de Schmitt, los comparadores, etc. simplemente agregan más partes (y costo) de todos modos. Sería mucho más fácil usar un microprocesador que realmente haga lo que desea, que agregar chips adicionales para ampliar su funcionalidad de una manera menos fácil de usar.
Otra posibilidad: el pin /RESET se puede configurar como un pin IO general. Puedes obtener un pin adicional de esa manera. Tenga en cuenta que reprogramarlo después será más difícil. Habiendo dicho eso, no es imposible. Tengo una publicación sobre cómo programar chips de alto voltaje como el Attiny85, usando otro procesador (en este caso, un Arduino Uno). Algunas partes permiten que los 12V al pin /RESET se enciendan en el momento apropiado.
Partiendo del segundo ejemplo de @ frarugi87 ( https://electronics.stackexchange.com/a/334700/53375 ), podría hacer algo similar con optoaisladores:
simular este circuito : esquema creado con CircuitLab
La ventaja de esta versión es que puede consumir muy poca corriente si el voltaje directo de los optos (incluidos los diodos adicionales en serie para garantizar esto) es más de la mitad del suministro. Por supuesto, no puede ser más que el suministro completo o nunca se encenderán.
OUT0
y OUT1
puede tener los nombres apropiados y las resistencias pull-up/down para producir la combinación de señales que desee.
Trevor_G
Transistor
paolo bonzini
paolo bonzini
Transistor
paolo bonzini
david schwartz
soy yo
Cort Amón
Jennifer