Cómo usar un segmento doble 7 con atmega32

1

Estoy aprendiendo sobre los sistemas integrados y cómo usar ATMEGA32 MCU. Ahora estoy tratando de mostrar un número fraccional al segmento 7, ¡pero simplemente no se muestra!

Perosimuevolapalancadelpotenciómetro,elvoltajeensupincentralqueestoytratandodemostrar,muestraunabarraextraña.

Sin embargo, si me olvido de hacer lo decimal y simplemente muestro el número entero y sustituyo el 7SEG doble por uno normal, 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.

Por lo que supongo que, por cualquier motivo, aún se modifica el segundo 7SEG, incluso si el código le está ordenando que solo altere el primero y viceversa.

¿Qué me estoy perdiendo aquí?

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.

   }
    
pregunta Raafat Abualazm

1 respuesta

1

Una cosa sobre las pantallas de 7 segmentos es que no tienen memoria. Normalmente, la forma de controlar más de uno es:

visualización 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í.

Está configurando el dígito 1, y luego cambia al dígito 2 (entonces el dígito 1 ahora está apagado) y se detiene después de eso.

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

La "barra extraña" que está viendo se parece al dígito 0 del color invertido. Por lo general, 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
    
respondido por el Catsunami

Lea otras preguntas en las etiquetas