Obtener dos (o una y media) salidas de un solo pin

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).

esquemático

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.

No de una entrada binaria. Si usa una entrada ADC, podría hacerlo.
¡Estoy confundido! El título dice: " Obtener un 0 y un 1 de una entrada flotante ", pero la pregunta dice: " usar un solo pin para dos salidas ". ¿Cuál es?
@Transistor: me gustaría obtener dos salidas (tres estados en total) de mi placa usando un solo pin GPIO del microcontrolador y algo de lógica de pegamento en la placa. Mi idea era que el microcontrolador puede configurar el pin como salida baja/salida alta/entrada para obtener los estados deseados.
@Trevor: usar una salida PWM en lugar de la entrada flotante podría ser posible ya que no estoy usando ninguna, pero ¿cómo lo haría? ;)
@Paulo: Todavía no está claro. ¿Está tratando de usar un pin para dos salidas o está tratando de monitorear dos señales en un pin de entrada? Hay un botón de esquema en la barra de herramientas del editor. Esbozalo. Necesitas editar tu pregunta.
@Transistor: un pin para dos salidas, se agregó un esquema
Es mucho más fácil obtener 5 salidas de 4 pines que obtener 2 salidas de 1 pin. Quizás estés haciendo la pregunta equivocada.
Tiene 3 estados de salida: 0, 1 y hola-Z; así que use 2 R para establecer el voltaje de alta Z en la mitad, luego 2 comparadores para dar 00, 01 (o 10) y 11.
Así que dudo que las soluciones PWM sean lo que está buscando, pero mi primer pensamiento es la telefonía. Los teléfonos transmiten todos los números en el teclado utilizando un solo cable (más un retorno). Y estoy seguro de que hay hardware para hacer eso =)
Tienes tres estados distintos. ¿Podría hacer algo con pin low para un estado, pin high para el siguiente estado y pin low-to-high-to-low realmente rápido para el tercer estado?

Respuestas (7)

Puede usar dos comparadores y los valores alto-bajo-entrada. Por ejemplo:

esquemático

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:

esquemático

simular este circuito

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
Más elegante que mi solución. Me olvidé de la opción tri-estatal. +1.
Esto es lo más parecido a lo que estaba pensando. En Vcc=3.3V, BSS84 y BSS138 deberían funcionar para los MOSFET. Para reducir el consumo de energía para EN=0, podría agregar dos diodos entre R1 y R2, conectando la entrada entre los diodos y las puertas en los dos lados. Luego, la parte derecha del circuito puede usar inversores CMOS. Cuando la entrada es flotante, deben ir a 0 (para DATA) y 1 (para EN) respectivamente.
@PaoloBonzini, tenga en cuenta que puede estar trabajando un poco fuera de las especificaciones, ya que el voltaje de umbral está muy cerca de Vcc / 2 ... En cuanto a los diodos, ¿por qué debería disminuir el consumo de energía? Puede (y probablemente debería) aumentar el valor de las resistencias hasta algunos cientos de kiloohmios. En cuanto a los CMOS, tenga en cuenta que la región entre 0,8 V y 2,0 V está prohibida (por lo que 1,65 V no está bien para los puertos CMOS).
Los diodos darían un voltaje diferente en las puertas en lugar de 1,65 V para ambos, por lo que puedo usar inversores CMOS (discretos, no 7404) y disminuir el consumo de energía estática. ¿Tiene eso algún sentido?

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:

  • Compre un expansor de E/S que utilice el (pseudo)estándar de 1 cable e implemente un transmisor de 1 cable en Attiny
  • un dispositivo UART también podría funcionar, pero no conozco ningún adaptador de UART a IO de un solo cable que no sea en realidad solo otro microcontrolador programado
  • Implementar un DAC, seguido de un ADC
    • DAC por PWM'ing su salida,
    • alimentando el PWM a un filtro de paso bajo RC, produciendo un voltaje variable "suave"
    • comprar un ADC de salida paralela barato, o
    • implemente su propio ADC de salida paralela con diodos Zener
De hecho, esa podría ser una solución (comprar otro microcontrolador :) o simplemente usar PB5 y un programador de alto voltaje). Es principalmente un ejercicio de aprendizaje en electrónica, construyendo mi propio expansor de E/S con la menor programación posible y lógica de unión discreta. Estaba pensando en usar resistencias y diodos, pero no pude hacerlo funcionar.
Votado a favor. Tengo una solución que se sabe que funciona, pero requiere que el pin en cuestión avance de forma poco natural.

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:

Travesuras basadas en el registro de turnos

Las siguientes ideas se basan en registros de desplazamiento de serie a paralelo.

Pin de salida -> Entrada de datos

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 1carga 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 Bde 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->1marca el comienzo de un período, y la cantidad 1dentro de ese período establece si es un 0 o un 1 lógico.

Pulso Popular Pasivo Polinomial

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).

Do'. Eso está bien, pero es más difícil de explicar que un contador.

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.

Discriminación basada en frecuencia

Banco de filtros con dos frecuencias discretas

La idea es simple:

  1. Genere dos frecuencias diferentes con el pin, por ejemplo, alternando con una frecuencia de 1 kHz (es decir, cada 1 ms, la salida se repite, debe alternar cada 500 µs), o a 2 kHz (alternar cada 250 µs) o la suma lógica de ambas oscilaciones (algo difícil de hacer en la cabeza, pero se reduce a alternar períodos altos largos y cortos).
  2. Filtre la salida con dos filtros diferentes:
    1. un filtro de paso bajo que solo deja pasar todo lo que está debajo, digamos 1.2 kHz, un RC servirá
    2. un filtro de paso de banda que deja pasar 2 kHz, pero no 1 kHz ni 3 kHz.
  3. rectificar y filtrar paso bajo la salida de estos dos filtros. Tada, has construido un receptor 2FSK de 2 tonos, si así lo deseas.
  4. Estas son sus dos señales de salida; use un dispositivo de umbral, un "discriminador" (diodo Zener, comparador) para convertirlos a 0 o 1 binario.

Prima

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.

PWM que

Idea : igual que arriba, pero más fácil.

Que haya dos piezas independientes de información:

  1. Ciclo de trabajo de salida > 50 %
  2. Cambios de salida en absoluto

Puede tener el ciclo de trabajo> 50% ya sea por

  • cambiando el pin constantemente alto (100% ciclo de trabajo), o bajo (0%), o por
  • configurando la unidad PWM para darle un ciclo de trabajo del 25% o 75%.

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.

esquemático

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.

sí, bien, esa es una de las posibles implementaciones de ADC mencionadas en mi primera respuesta .

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.

En realidad eso no es una mala idea. Me olvidé de la opción tri-estatal al escribir mi respuesta. Aliméntalo en un antirrebote RC en la entrada del otro chip. El segundo chip puede leer el estado de la entrada, cambiar la entrada a una salida e intentar llevarlo al otro nivel lógico, liberarlo y ver si permanece allí. Si lo hace, el primer chip es tri-estado. Si no, son datos. Refuerza tu respuesta.
Para solucionar el problema del consumo de energía, podría cambiar la dirección de EN y DATA.

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:

esquemático

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.

OUT0y OUT1puede tener los nombres apropiados y las resistencias pull-up/down para producir la combinación de señales que desee.

Eso está bien, pero tenga cuidado de que con el GPIO triestablecido, ambos LED conducirán un poco.