No estamos buscando formas simples.

Anteriormente, es mi primera
publicación que causó resonancia entre los usuarios de Habr. Decidió no parar. Continuamos exprimiendo lo imposible de ATtiny13. Te advierto de inmediato, las soluciones descritas no son estándar nuevamente, y alguien puede causar indignación y disonancia cognitiva ("¿Y cuál es el objetivo del artículo? ¿Mostrar qué elementos pueden conectarse?"). Además, tal solución tampoco es práctica, lo que escribiré con más detalle a continuación. Pero sucedió que las soluciones estándar se conocen desde hace mucho tiempo, y leer sobre ellas no siempre es interesante, pero escribir es desagradecido.
Realmente me gusta este chico ATtiny13. Tiene suficientes cerebros para resolver muchos problemas cotidianos (enciende las luces, ventilación,
huye a la tienda por cerveza ). Y el precio es simplemente ridículo. Aquí hay algunas patas y no hay manijas en absoluto. Por lo tanto, tienes que recurrir a todo tipo de trucos para resolver el problema de la falta de piernas.
En el proceso de estudiar la programación de microcontroladores (en el entorno Arduino, no se lo digas a nadie), como muchos, pasé por el paso de conectar un sensor de distancia ultrasónico, algo como esto:

Dado que el método de transmisión de información desde el sensor al controlador es fácil de deshonrar, ATtiny13 se las arregla fácilmente. Luego fue necesario mostrar información en un indicador de siete segmentos utilizando registros de desplazamiento. Es decir, el esquema de la parte de la pantalla era varias veces mayor que el controlador en sí. En ese momento jugué y seguí adelante.
Recientemente, pensé, ¿qué otra cosa sería una tarea abrumadora para asignar a Tinka? Lo que todavía no podía manejar en los ejemplos descritos. Lo primero que recordaba de la indicación. Hace algún tiempo ya estaba buscando información sobre un tema similar. Entonces encontré una
opción tan
interesante .21 segmentos de 5 pies del controlador. Wow! Ni siquiera necesito tanto, dos signos son suficientes, más un punto, un total de 15 segmentos. ¿Y si con cuatro patas? Luego obtenga un máximo de 13 segmentos, no lo suficiente. A la vista del circuito, surgió un deseo inmediato de ensamblar e intentar, aunque no es fácil elaborar un algoritmo de operación. Pero con una mirada más cercana, entiendes que no funcionará recolectar, tales animales de siete segmentos no existen en la naturaleza (muy probablemente). Puedes hacer, por supuesto, pero este es un nivel diferente. Entonces la idea fue pospuesta hasta tiempos mejores.
Offtopic: ¿Por qué no hay indicadores de siete segmentos con lógica integrada? ¿Dónde están buscando los desarrolladores? Qué conveniente es la instalación y el control: dos patas de alimentación y 3 (1, 2) patas de datos. Y después de todo, incluso estaban en la URSS: 490IP1, 490IP2. Dentro del indicador más común para 2 ... 4 dígitos hay mucho espacio para colocar el microcircuito de chip, y el precio del registro de desplazamiento es 0.064 cu junto con la caja. Oh bien
Y entonces pensé nuevamente, ¿cómo reducir el número de patas para trabajar con el indicador de siete segmentos? Las salidas del controlador pueden tomar tres estados (en realidad 4, pero ahora no importa). ¿Hay alguna forma de usar esto? Si dos estados con respecto al LED pueden interpretarse solo como brillantes, no brillantes, entonces con tres es un poco más interesante. Todavía no he descubierto cómo usarlo, pero el siguiente esquema me vino a la mente:

Si la salida del controlador está en estado cero, los LED no se iluminan (lo cual es obvio).
Si la salida está en el estado de la unidad, los LED están encendidos, lo que también es comprensible.
Pero si la salida no es la salida, sino que se conecta a la entrada, entonces fluye una corriente a través del circuito de dos resistencias y LED HL1, creando una caída de voltaje en el punto de conexión de las resistencias de aproximadamente (5-1.7) / (2.2 + 1.5) * 1.5 + 1.7 = 3.0 V. Esto no es suficiente para que la corriente fluya a través del circuito VD1_R3_HL2 (se necesitan aproximadamente 3.4 V). VD1 es un LED adicional que se utiliza como diodo zener (el estabilizador es más correcto), por lo tanto, no lo consideraremos un LED para no confundirnos. No importa si la resistencia pull-up está encendida dentro del microcontrolador, su resistencia (20 kOhm) prácticamente no afecta la situación. No llegué a tales clasificaciones de inmediato, antes de eso probé con un diodo normal como VD1, también funciona bastante bien con las mismas resistencias R1 y R2. Pero es mejor que R2 sea aproximadamente una vez y media más grande que R1. Y casi olvidé lo más importante: todo lo descrito es posible solo con el uso de LED
rojos tanto en el indicador como en los adicionales. En casos extremos,
el indicador
o los LED adicionales se pueden aplicar en verde. Y con una tensión de alimentación de 4,5 V a 5 V.
¿Qué tenemos al final? Tres estados: ningún LED (0) brilla, HL1 (1) brilla, o HL1 y HL2 (2) brillan. Muy similar al sistema ternario. Pero no podemos encender HL2 sin HL1, esto debe recordarse. Pero ahora, con la ayuda de las cuatro patas del microcontrolador, podemos controlar ocho LED (quería pensar que sí).
Luego intenté dividir los segmentos indicadores en pares (como en un jardín de infantes: un niño-niña). La condición principal es que en cada par uno de los segmentos no puede brillar por sí solo, tal discriminación. Esto es lo que obtuve:

Cuatro pares de segmentos, en cada letra mayúscula se indica el segmento dominante, que puede funcionar solo, el segundo solo puede con él. Puede notar que el segmento "a" se agita con dos a la vez, y nadie llegó al punto más pobre. ¡Cómo se ve la vida!
Pero con estos pares puede mostrar (casi) todos los números:
Cada par está pintado en su propio color. Un espectador atento notó que algo andaba mal con el deuce. No nos centraremos en esto por ahora. Intenté algunas opciones más para agrupar segmentos, mejor no aparecer. Quizás alguien sugiera. Quizás la red neuronal podría manejarlo.
En la segunda etapa de los experimentos, tuve que usar un indicador con un ánodo común. Por lo tanto, el esquema final es el siguiente:
Alguien puede preguntar: ¿a dónde fueron las resistencias de 100 ohmios? Hace tiempo que se sabe (y se usa activamente) que con indicaciones dinámicas hechas correctamente, se pueden prescindir de las resistencias limitadoras de corriente. Incluso si el voltaje se aplica constantemente desde la salida del controlador a los dos LED conectados en serie por error, el microcontrolador y los LED normalmente resisten esto, la corriente está limitada por la resistencia de transición dentro del MC. Y más sobre resistencias. La corriente máxima a través de HL1 según el esquema anterior es de aproximadamente 2 mA, y a través de HL2 alcanza 25 ... 40 mA (presumiblemente, más adelante diré de dónde provienen estos números). Esto significa que la salida de luz de diferentes segmentos será diferente. Pero como se utilizará la indicación dinámica, esto se puede resolver fácilmente debido al diferente tiempo de visualización de los segmentos.
Todos los experimentos que realicé con el Arduino Nano en el Arduino IDE. Una excelente placa de creación de prototipos, se pone bien en la placa de pruebas, se actualiza a través de USB sin problemas. ¿Algo falló? Arreglé el boceto y en un minuto cargué un nuevo firmware. Y cuando depuró el código, puede ir al firmware en ATtiny13, todavía requiere un poco más de gestos.
Por cierto, también estoy flasheando con Arduino en el entorno Arduino, esto prácticamente elimina la posibilidad de bloquear MK con los fusibles incorrectos, y mucho más fácil.
Aquí hay un ejemplo de cómo mostrar el número 4 en el código:
pinMode(f_a, INPUT);
En principio, todo debe estar claro, incluso para aquellos que no están familiarizados con Arduino, pero entienden un poco sobre los controladores. Las cifras de 150 microsegundos y 2 milisegundos se seleccionan experimentalmente por el brillo de los segmentos. En el código final, debe colocarlos en variables separadas para que pueda cambiarlos durante la depuración. A partir de estas cifras, es posible determinar aproximadamente el orden de diferencia en las corrientes a través de dos segmentos en un par. Dado que el segmento G brilla aproximadamente 13 veces menos que los otros y proporciona el mismo brillo, se puede suponer que la corriente a través de este segmento es 13 veces más que a través de los otros. De hecho, la dependencia del brillo de la corriente no es lineal, por lo que la corriente puede ser 25 veces mayor, es decir, 50 mA. Que con dicho ciclo de trabajo es bastante seguro para la salida de MK. Por cierto, esta diferencia en las corrientes jugó en las manos al resolver el problema de la figura 2. Como escribí anteriormente, el segmento G solo puede iluminarse junto con el segmento C. Pero si pasa 0 al tramo MK, que es responsable de C y G, en 150 μs, y después 2 ms para mantener 1 en él, entonces el segmento G "funcionará" a pleno brillo, y el segmento C solo tendrá un poco de tiempo para encenderse durante los mismos 150 microsegundos. Tenemos dos casi completos. Por lo tanto, logré romper la regla que yo mismo establecí. Lo que no se puede hacer desde la desesperanza.
Entonces, encendimos la figura con las cuatro patas del MK. En realidad, me perdí esta etapa por mí mismo, inmediatamente mostré dos personajes. Para hacer esto, desconecte la salida del ánodo común de uno de los bits indicadores del power plus, y conecte a otra salida MK, y el ánodo de la otra descarga a la siguiente salida (6 patas ya). Ahora, a su vez, establezca 1 en el ánodo del dígito menos significativo, muestre el dígito del dígito menos significativo, luego 1 en el ánodo del dígito menos significativo, y muestre el dígito del dígito más alto, y así sucesivamente en un círculo. Realicé este experimento con Arduino Nano, ella tiene suficientes piernas. Todo el código fue depurado, no la primera vez. Y así funcionó, como debería.
Dado que los ánodos están conectados a su vez, con la ayuda de un refinamiento simple, se puede liberar una salida más del MK. Aquí está el diagrama de resumen:
Total use 5 patas MK para mostrar un número de dos dígitos. En esta etapa, ya puedes probar con el bebé ATtiny. Lo cual hice. Pero no de inmediato. Un boceto compilado en un entorno Arduino para ATtiny13 ocupaba aproximadamente 1.7 kB de memoria con 1 kB disponible. Para reducir el tamaño, tuve que recurrir a los puertos directamente, lo que iba a hacer más tarde. Por cierto, en Arduino usé los mismos puertos que iba a usar en ATtiny, es muy conveniente. Ya están indicados en el último diagrama. Después del procesamiento, el código perdió un kilobyte.
Aquí está el código resultante para ATtiny13:
El código anterior permitirá que su ATtiny13 lea de 0 a 99. Sería más correcto proporcionar la posibilidad de reasignar las patas MK. Los gurús de programación podrían reducir el código varias veces (
¿Dónde está el límite mínimo de Hello World en AVR? ).
Puede agregar la función necesaria al código para que MK muestre algo consciente. Es cierto que Tinki ya tiene todas sus piernas ocupadas. También hay un tramo de reinicio que se puede usar como puerto de entrada / salida. Pero usarlo fue más difícil de lo que pensaba. Por lo tanto, para mí me voy "para después". Pero hay una característica interesante que no todos conocen. La entrada analógica ADC0 sale al mismo tramo, ¡y funciona! Es cierto que cuando el voltaje es inferior a 1/4 del voltaje de suministro, el MK entra en modo de reinicio. Pero desde 1/4 hasta el voltaje de suministro, es bastante posible medir el voltaje de entrada. Aproveché esto:
La experiencia muestra que el indicador puede reducirse hasta 21, solo entonces el MK entra en modo de reinicio y comienza a funcionar cuando vuelve a aproximadamente 25 o más. Por lo tanto, es posible hacer un "indicador" muy incorrecto para indicar el voltaje de 25 a 99 voltios, por supuesto, con un divisor en la entrada de medición.
Ahora sobre la aplicación práctica. La idea original de mostrar datos de un sensor de distancia se pospuso hasta tiempos mejores debido a la falta de una entrada digital. ¿Por qué si no puedes aplicar el esquema hasta que surjan ideas? Otra advertencia: no puede haber ninguna cuestión de rentabilidad. Incluso si paga todos los segmentos, una corriente de 2.5 mA fluirá a través de la resistencia R2 (según el primer esquema), en total 10 mA al indicador, más el control del transistor agrega aproximadamente 5 más. No mencioné, el transistor de casi cualquier pnp es moderno.
Sobre conveniencia. La opción más barata para enviar al segmento siete es ATtiny13 más 74HC595. Dos casos de SMD me costarán aproximadamente 0,50 pies cúbicos El más simple es ATmega8 (y eso es todo, sin resistencias, nada más), es 0.68 pies cúbicos Y la opción descrita anteriormente es el costo de ATtiny, 9 resistencias, 4 LED, un transistor (todos SMD): esto es aproximadamente 0.46 pies cúbicos, aunque es pieza por pieza, todo es más costoso a veces. Además, poner todo junto es más complicado que en las versiones anteriores.
En realidad, la única opción que puedo ver es si tienes un ATtiny13 completo, pero aún necesitas ir a la tienda por ATmega. Bueno, si un indicador de siete segmentos es la decoración principal de su dispositivo, no recomendaría este esquema, la pantalla no es perfecta, en algunas combinaciones los segmentos innecesarios están ligeramente resaltados. Sucede que la indicación es ocasionalmente necesaria cuando se configura, luego el lugar en sí.
En general, pasé unos días en vano.
Además de las críticas, estoy esperando sugerencias para mejorar el código y simplificar el esquema. O funcionalidad mejorada sin complicaciones. Lo que más me interesa es cómo iluminar un punto, esto ampliaría el alcance. Pero si también pudiéramos publicar una conclusión de los 5 involucrados, entonces sería posible deambular.
Me alegraría si mi solución no estándar beneficiará a alguien, no ahora, algún día.
UPD: ¡Sé sobre Charliplexing! El esquema de terceros que cité al comienzo de este artículo es Charliplexing. Y allí escribí por qué Charliplexing no es adecuado.
No escriba comentarios si lee el artículo en diagonal.