Haz una pregunta
  Foros de Electrónica » Diseño digital » Microcontroladores y sistemas embebidos
Foros Registrarse ¿Olvidaste tu contraseña?

Temas similares

31/01/2015 #121

Avatar de JoaquinFerrero

Yo lo pondría *antes* de la medición.

De esa manera presento inmediatamente el resultado de la conversión (aunque... también es cierto que 50 µs es muy poco tiempo de espera para el usuario).
03/02/2015 #122

Avatar de callecuatro1976

anda muy bien con los led de 7seg ahora consulta como puedo hacer para que la medición sea mas lenta y no se mueva tanto el ultimo digito.
03/02/2015 #123

Avatar de JoaquinFerrero

Bucles de espera... por ejemplo.
03/02/2015 #124

Avatar de cosmefulanito04

callecuatro1976 dijo: Ver Mensaje
anda muy bien con los led de 7seg ahora consulta como puedo hacer para que la medición sea mas lenta y no se mueva tanto el ultimo digito.
Usá la función de promedio móvil que te pasé y aumentale la cantidad de muestras hasta alcanzar la óptima.
04/02/2015 #125

Avatar de callecuatro1976

Puse así el ejemplo. ¿Está bien así?
Me quedan parpadeando los dos últimos números.
Archivos Adjuntos
Tipo de Archivo: rar voltimetro con display 7 segmento.rar (941 Bytes, 97 visitas)
04/02/2015 #126

Avatar de JoaquinFerrero

Pero... ¿esto qué es?
Código PHP:
valor_adc=0
for(
var1=0;var1<500;var1++) 

    
valor_adc=valor_adcread_adc(); 
    
delay_us(62);   

Esto solo sirve para perder el tiempo. El valor almacenado en valor_adc no se usa en el resto del bucle. El único efecto que veo es que hay una espera de 500 * 62 µs = 31 ms. Si a esa espera le sumamos el resto de retrasos, nos sale que los display se repintan unas 30~31 veces por segundo, así que es normal ver que parpadean.

Otra cosa... yo haría la extracción de los dígitos de otra manera:

Código PHP:
    // Obtener el valor para cada dígito a partir de la tabla para 7 segmentos.
    
centenas voltaje 100;
    
voltaje  voltaje 100;
    
decenas  voltaje 10;
    
voltaje  voltaje 10;
    
unidades voltaje;

    
unidades tabla_7segs[unidades];
    
decenas  tabla_7segs[decenas ];
    
centenas tabla_7segs[centenas];

    
// Multiplexar los displays. 
    
output_b(1);            // Activar display 1 y desactivar display 2 y 3 
    
output_c(unidades);     // Mostrar unidades. 
    
delay_ms(2);            // Retardo para mostrar las unidades. 
    
output_b(2);            // Activar display 2 y desactivar Display 1 y 3 
    
output_c(decenas);      // Mostrar decenas. 
    
delay_ms(2);            // Retardo para mostrar las decenas. 
    
output_b(4);            // Activar display 3 y desactivar Display 1 y 2 
    
output_c(centenas);     // Mostrar las centenas. 
    
delay_ms(2);            // Retardo para mostrar las centenas. 
06/02/2015 #127
Moderador

Avatar de D@rkbytes

Logré separar el número para mostrar el valor en 4 displays de 7 segmentos de una forma sencilla.
Código PHP:
void entero_a_bcd(int16 valorint8 digitos_menos_1)
{
int8 i;
   
// Limpiar variables del arreglo "display[]".
   
for(i=0;i<=digitos_menos_1;i++)
   {
      
display[i] = 0;
   }

   
digitos_menos_1;
   
// Separar los números.
   
while (valor 0)
   {
      
display[i--] = (valor 10);
      
valor /= 10;
   }

Se utiliza un arreglo global para almacenar el valor separado de cada dígito y el formato mostrado es con 2 decimales.

El programa funciona perfectamente durante simulación, pero no lo probé físicamente.
También lo realicé usando una referencia externa de 2.5V con un TL431, modificando el divisor de entrada y la fórmula.
El resultado también fue satisfactorio y al parecer mejor que usando la referencia interna.

Adjunto el proyecto como un aporte, agradeciendo a Cosme y a Joaquín por la colaboración al tema.

Notas:
  • En el programa adjunto se está usando la referencia interna del CAD por simplicidad y es una base que puede servir para realizar programas de este tipo.
  • El programa puede medir hasta 99V y se ha dejado en los 40V que se han venido tratando en este tema.
  • Es muy sencillo cambiar el rango. Solo se debe especificar el voltaje (<99.00) y modificar el divisor.
  • El programa está comentado y basado en un PIC16F887, pero se pueden usar otros, p.e, un PIC16F88.
Archivos Adjuntos
Tipo de Archivo: rar 16F887 Voltímetro 4 Displays.rar (30,5 KB (Kilobytes), 103 visitas)
21/02/2015 #128

Avatar de callecuatro1976

hola, que habría que cambiar para hacerlo con display de ánodo común, saludos
21/02/2015 #129
Moderador

Avatar de D@rkbytes

Los valores de la tabla para displays de 7 segmentos e invertir los bits de activación de cada display. (Incluyendo el punto)
22/02/2015 #130

Avatar de callecuatro1976

es bastante lio yo porque tenia un par de display de ánodo común y quería ver como usarlos , saludos
22/02/2015 #131

Avatar de Lord Chango

callecuatro1976 dijo: Ver Mensaje
es bastante lio yo porque tenia un par de display de ánodo común y quería ver como usarlos , saludos
Calculo que solamente complementando las variables seria suficiente, pero cambiar un par de valores no parece tanto lio...
23/02/2015 #132
Moderador

Avatar de D@rkbytes

callecuatro1976 dijo: Ver Mensaje
Es bastante lio, porque tenía un par de display de ánodo común y quería ver como usarlos.
No es ningún problema. El programa tiene una tabla con los valores del 0 al 9 para displays de cátodo común.
O sea, esta: {0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};
El primer número en hexadecimal: 3F es el 0, el 06 es el 1, el 5B es el 2, etc.
Necesitas cambiarlos por los que serían para ánodo común:
El 0 sería: 0xC0, el 1 sería: 0x9F, el 2 sería: 0xA4, etc.

Y también se necesita invertir la activación de los displays.
Si para cátodo común, el bit 0 corresponde al display 4 (LSB) activado por 1 lógico que después de usar un transistor NPN se obtendrá un 0 por colector para el cátodo.
Entonces invirtiendo este bit, tendríamos que el puerto B tendría la siguiente secuencia (LSB a MSB):
Display unidades = 0b11111110 "0xFE"
Display decenas = 0b11111101 "0xFD"
Display centenas = 0b11111011 "0xFB"
Etcétera.

Y lo haces con output_b(valor); Por ejemplo: output_b(0xFE);
Así se obtendrá un 0 como bit de activación para un transistor PNP por display de ánodo común.
Éste deberá dar un 1 por colector, ya que el emisor deberá estar hacia VCC.
Y también se debe invertir la activación y desactivación del punto.

Lo ves. No es ningún lio.
23/02/2015 #133

Avatar de callecuatro1976

Ok. Empiezo a ver que puedo hacer y pido ayuda. Gracias.


¿Dónde encuentro la tabla hex con los valores para ánodo común?

Encuentro para cátodo común por todos lados.
23/02/2015 #134


callecuatro1976 dijo: Ver Mensaje
donde encuentro la tabla hex con los valores para anodo común?

encuentro catodo común por todos lados
Hola...Lo tienes que hacer como te explico correctamente D@rkbytes en esta respuesta.
Saludos.

Ric,
23/02/2015 #135

Avatar de callecuatro1976

0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8, 0x80, 0x98 anodo común seria asi

0b11000000, 0b11111001, 0b10100100, 0b10110000, 0b10011001, 0b10010010, 0b10000010, 0b11111000, 0b10000000, 0b10011000
23/02/2015 #136
Moderador

Avatar de D@rkbytes

Los bits para el número nueve están mal. Es: "10010000" = 0x90
Se vería mejor de esa forma:

Mira por aquí: PIC To 7 Segments

Con ese programa puedes generar fácilmente los bits para la tabla de displays de 7 segmentos.
01/03/2015 #137


Buen día, amigo D@rkbytes.
Hace tiempo monté este circuito del amigo Jorge Ansuini, doy crédito porque no es de mi autoría el circuito y funciona muy bien.
Ahora me gustaría saber si se puede hacer que este voltímetro mida el voltaje de su propia fuente para medir el voltaje de la batería de mi carro sin alimentar el pic con otra funte.
Te agradezco la luz que me puedas brindar.
Archivos Adjuntos
Tipo de Archivo: rar voltimetro con display 7 segmentos.rar (17,8 KB (Kilobytes), 70 visitas)
02/03/2015 #138
Moderador

Avatar de D@rkbytes

Tendrías que poner un divisor de tensión y modificar algo el programa.
El divisor debe entregar 5 voltios cuando se tenga el máximo voltaje de entrada.

En ese programa se usa una suma para obtener un valor final y luego se separa para obtener cada dígito.
Ahí es donde tendrías que usar otro método para leer por ejemplo, 20 voltios máximo.

¿Por qué no usas el proyecto del post #127 y lo adaptas?
Es más sencillo que modificar el programa que adjuntas y aparte muestra los decimales separados por punto.
02/03/2015 #139


D@rkbytes dijo: Ver Mensaje
Tendrías que poner un divisor de tensión y modificar algo el programa.
El divisor debe entregar 5 voltios cuando se tenga el máximo voltaje de entrada.

En ese programa se usa una suma para obtener un valor final y luego se separa para obtener cada dígito.
Ahí es donde tendrías que usar otro método para leer por ejemplo, 20 voltios máximo.

¿Por qué no usas el proyecto del post #127 y lo adaptas?
Es más sencillo que modificar el programa que adjuntas y aparte muestra los decimales separados por punto.
muchas gracias por tu respuesta
11/04/2015 #140

Avatar de callecuatro1976

hola foristas ando con un pequeño problema que me enrede y no se como seguir quiero modificar el programa de d@rkbyte de catodo común a anodo común y me quede aca no me funciona bien , que es lo que estoy haciendo mal , saludos
Tema Cerrado
¿Tienes una mejor respuesta a este tema? ¿Quieres hacerle una pregunta a nuestra comunidad y sus expertos? Registrate

Foros de Electrónica » Diseño digital » Microcontroladores y sistemas embebidos

Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2017, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO ©2011, Crawlability, Inc.