Cómo usar un segmento doble de 7 con atmega32

Estoy aprendiendo Sistemas Embebidos y cómo usar ATMEGA32 MCU. Ahora estoy tratando de mostrar un número fraccionario en el segmento 7, ¡pero simplemente no se muestra!7SEG No muestra nada

Pero si muevo el mango del potenciómetro (el voltaje en su pin central que estoy tratando de mostrar), muestra una barra extraña.

7SEG Barra de visualización

Sin embargo, si me olvido de hacer lo decimal y solo muestro el número entero y reemplazo el doble 7SEG con uno ordinario, funciona. Lo que significa que la MCU lee el valor correctamente.

Si agrego un retraso en el código.

Muestra los números momentáneamente antes de eliminarlos.

Entonces, supongo que, por alguna razón, todavía altera el segundo 7SEG, incluso si el código le ordena que altere solo el primero y viceversa.

¿Que me estoy perdiendo aqui?

Editar: Aquí está el código:

    void SvnSEG_Disp(float num) {
        num_int = (uint8_t)num; // Will take values from Zero to 5
        after_point = (num - (uint8_t)num)*10; // Will take values from Zero to 9
        PORTD &= ~(1 << PD5); // Set PD5 to Zero. Use first 7SEG
        PORTD |= (1 << PD6);  // Set PD6 to One. Don't use second 7SEG
        PORTD |= (1 << PD4);  // Set PD4 turning on the Decimal point.
        PORTD &= ~(1 << PD0); // Set PD0 to 0
        PORTD &= ~(1 << PD1); // Set PD1 to 0
        PORTD &= ~(1 << PD2); // Set PD2 to 0
        PORTD &= ~(1 << PD3); // Set PD3 to 0 


        PORTD |= num_int; // Set the lower 4 bits of Port D (PD0 - PD3) to the bits of the number.

        PORTD |= (1 << PD5); // Set PD5 to One. Don't use first 7SEG
        PORTD &= ~(1 << PD6); // Set PD6 to Zero. Use second 7SEG
        PORTD |= (1 << PD4); // Set PD4 turning on the Decimal point.
        PORTD &= ~(1 << PD0); // Set PD0 to 0
        PORTD &= ~(1 << PD1); // Set PD1 to 0
        PORTD &= ~(1 << PD2); // Set PD2 to 0
        PORTD &= ~(1 << PD3); // Set PD3 to 0


        PORTD |= after_point; // Set the lower 4 bits of Port D (PD0 - PD3) to the bits of the number.

   }
¿Exactamente qué pantalla 'doble 7SEG' eligió? (por ejemplo, 7SEG-MPX2-CA-AZUL)
me hiciste reír... estás tratando de encender una pantalla de 7 segmentos... cuando uno de los segmentos finalmente se enciende, lo llamas "barra rara"... lol... +1 por eso
@BruceAbbott 7SEG-MPX2-CC-AZUL
@jsotola Quiero un número, no una barra.
revise la hoja de datos del 4511. ... es posible que tenga algunos de los valores de los pines configurados incorrectamente
este enlace muestra cómo conectar el 4511 bcd al pestillo de 7 segmentos
en general, y para mantener el código simple, el código debe contener una tabla de qué bits deben estar activados/desactivados para cada dígito deseado que se muestra. Luego, al código se le pasa un valor y ese valor se usa para seleccionar la entrada deseada de la tabla. Luego, el código establece los 4 bits del puerto de salida por esa entrada de la tabla
Debido a que el cambio de los bits individuales dará como resultado un parpadeo en las pantallas LCD de 7 segmentos, sugerimos construir todo el valor del puerto como una imagen en la memoria y luego escribir el byte completo como una sola E/S.
Publique un enlace a la hoja de datos del 7SEG-MPX2-CC-BLUE.
¿No debería haber conexiones al chip dual de 7 segmentos, para alimentación y tierra?
el valor pasado es a, floatpor lo que para obtener un número entero, use la floor()función y asigne el resultado a una palabra, luego realice un módulo 10 para obtener el dígito menos significativo. Para obtener la fracción, multiplique por 10.0f, luego use la floor()función y luego realice un módulo 10. para obtener el valor para establecer los bits bcd, use una tabla con 10 entradas y use el resultado de los cálculos anteriores para indexar en esa tabla para obtener el valor a establecer en los bits bcd
@jsotola No, los pines 4511 están configurados correctamente.
@ user3629249 Veré el enlace muchas gracias.
@user3629249 Pero esto no es necesario usando este BCD en particular, la representación binaria del número que quiero que se muestre dará la combinación correcta de los bits de ENCENDIDO/APAGADO que se le darán al BCD.
@ user3629249 La única hoja de datos que pude encontrar: google.com.eg/…
@ user3629249 Es una simulación, muchas cosas no necesitan energía/tierra.
@ user3629249 Pero la forma en que solía obtener el dígito y la fracción funciona, ¿verdad? Agregué un retraso en el código, los números que se muestran son correctos, aún así el 7SEG se enciende y apaga después de cada retraso.
si estuviera tratando de hacer que la pantalla funcionara, comenzaría con la pantalla y algunos interruptores. cambiaría manualmente las entradas 1y 2al menos tres de los otros. ... eso me diría qué tengo que hacer con los pines de entrada para que la pantalla funcione. ... luego pase a cambiar manualmente las entradas a U2

Respuestas (1)

Una cosa acerca de las pantallas de 7 segmentos es que no tienen memoria. Por lo general, la forma de controlar más de uno es:

mostrar en el dígito 1 -> cambiar al dígito 2 -> mostrar en el dígito 2 -> cambiar al dígito 1 -> mostrar en el dígito 1 -> cambiar al dígito 2 -> y así sucesivamente.

Está configurando el dígito 1 y luego cambiando al dígito 2 (por lo que el dígito 1 ahora está apagado) y se detiene después de eso.

Debe alternar constantemente entre los dígitos para mantenerlos todos encendidos. Si hace esto lo suficientemente rápido, parecerá que ambos están siempre encendidos.

La "barra extraña" que está viendo se parece al dígito 0 invertido en color. Generalmente sugiero aplicar una máscara a los valores que escribe en PORTD para asegurarse de que en realidad solo está cambiando los bits 0-3. Haz algo como esto:

PORTD &= ~0xF;      // Clear bits 0-3
PORTD |= num & 0xF; // Write bits 0-3
Probaré lo de la máscara.
Pero si uso un bucle dentro de la función, bueno, la MCU no hará nada más. De todos modos, la función se llama en el bloque While (1), por lo que debería estar constantemente encendida. Supongo que no tiene tiempo para encenderse.
"Pero si uso un bucle dentro de la función, bueno, la MCU no hará nada más". - ¿Qué más necesita hacer tu código?
@RaafatAbualazm, siempre puede usar una interrupción del temporizador para activar el cambio de dígito. Sin embargo, dejaría que permanezcan encendidos por un tiempo al menos.
@BruceAbbott Calcule el número a partir del valor del ADC y luego muéstrelo.
@Catsunami Pero eso no ayudará en nada. Si cambio el dígito en un 7SEG, el otro se apagará. Usé el retraso y no ayudó. Hizo que cada 7SEG alternara solo entre encendido/apagado. Pero ambos no mostraban simultáneamente los números.
Como se mencionó en otra parte, la(s) pantalla(s) no tienen memoria, y solo una puede estar 'encendida' a la vez. Por eso es necesario encender cada pantalla en rápida sucesión. Sugerimos encarecidamente usar una interrupción del temporizador para encender repetidamente cada pantalla en una sucesión rápida
"Hizo que cada 7SEG alternara solo entre encendido/apagado". - eso es lo que quieres. Si se alternan lo suficientemente rápido, parecerá que ambos están conectados (en hardware real , ¡quizás no en un simulador!). "Calcule el número a partir del valor del ADC y luego muéstrelo". - Esto puede demorar algunos milisegundos. Ajuste sus retrasos para incluir este tiempo y los dos dígitos deberían tener el mismo brillo.
@RaafatAbualazm, sí, como mencioné en mi respuesta, no hay forma de que ambos estén encendidos al mismo tiempo. Necesita alternar entre los dos rápidamente. Sugiero usar hardware real como ha sugerido BruceAbbott.