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!
Pero si muevo el mango del potenciómetro (el voltaje en su pin central que estoy tratando de mostrar), muestra una barra extraña.
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.
}
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
bruce abbott
jsotola
Raafat Abualazm
Raafat Abualazm
jsotola
usuario3629249
usuario3629249
usuario3629249
usuario3629249
usuario3629249
usuario3629249
float
por lo que para obtener un número entero, use lafloor()
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 lafloor()
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 bcdRaafat Abualazm
Raafat Abualazm
Raafat Abualazm
Raafat Abualazm
Raafat Abualazm
Raafat Abualazm
jsotola
1
y2
al 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