Mostrar varios datos en display 7 segmentos

Hola, estoy con el proyecto del voltímetro con varias muestras que habíamos comenzados, estuve tratando de hacer cambios, subo lo que hice, hasta ahora, si pueden verlo me hacen un favor , gracias
 

Adjuntos

  • fuente geo digital.rar
    215.2 KB · Visitas: 27
Me quedé trabado en las muestra, el código original mostraba 300 volt, lo quiero pasar para que muestre hasta 18 volt y me muestra 1,8! Como me complica los display 7 segmentos!!!
 
Muchas gracias por la ayuda, ya me muestra los volt como quiero , todavía me falta mostrar, los datos de frecuencia y duty que es bastante complejo por lo que veo, ya que tengo que apagar el punto decimal en esos datos, tampo entendiendo porque no m,e muestra los valores de porcentaje y duty

la verdad que quiero agradecerle a darkbytes por el reto!!!! que me hizo pensar y puede solucionarlo , no tomaba la medición porque me falto esta linea setup_timer_1(T1_INTERNAL | T1_DIV_BY_8); y solo me queda un tema como prendo el punto decimal solo en los volt?????
 

Adjuntos

  • fuente geo digital.rar
    220.1 KB · Visitas: 10
Sabes que lo pongo y me enciende el display centenas siempre.
C:
  switch (lectura)

      {

         case 1:

            dato = (int16) voltaje;

          

          

           output_high(pin_c7);  aqui..enciende display 1

            output_low(led_ancho_p);

            output_low(led_pulsos);

            output_high(led_voltaje);

            

        

            break;

         case 2:

            dato =(int16) porcentaje;

            

            output_low(led_voltaje);

            output_low(led_pulsos);

            output_high(led_ancho_p);

          

            break;

         case 3:

            dato =(int16) frecuencia;

            

            output_low(voltaje);

            output_low(led_ancho_p);

            output_high(led_pulsos);

          

      }

      

      separar_digitos(dato);

      

      // Multiplexar los dosplays de 7 segmentos.

      unidades = tabla_7segs[digitos[2]];

      decenas = tabla_7segs[digitos[1]];

      centenas = tabla_7segs[digitos[0]];

      

      output_low(pin_cen);

      output_low(pin_dec);

      output_high(pin_uni);

      output_c(unidades);

      delay_ms(2);

      

      output_low(pin_uni);

      output_high(pin_dec);

      output_low(pin_cen);

      output_c(decenas);

      //output_high(pin_c7);   aqui enciende el 2 pero siempre queda encendido

      delay_ms(2);

      

      output_low(pin_uni);

      output_low(pin_dec);

      output_high(pin_cen);

      output_c(centenas);

      //output_high(pin_pd);   // Punto decimal.

      delay_ms(2);
 
Ya lo encontré!!! Pero igual el tema de los pulsadores no me quedo bien! Tengo que buscar una solución.

Podría hacer el cambio con int por time 2 tiene que funcionar, mañana voy a probar

bueno, funciono el único tema que tengo ya le di vueltas por todos lados, es como hacer que muestre los valores de frecuencia y porcentaje mas lento y preciso, no se si el timer 2 me esta haciendo que ande mal si lo pueden ver , gracias
 

Adjuntos

  • fuente geo digital.rar
    218.6 KB · Visitas: 12
Yo anterior mente el cambio de display solia acerlo con tmr0 pero tmr2 tambien vale y como esta funcionando para el pwm....
Si estan la conversion a/d y tmr2 o tmr0 por interrutcion. Deverian sobrarte pila de procesos para el resto de operaciones.. pulsadorrs, calculos y diversos procesos con menos prioridad..

Aconsejo poner interrupt y no int por ser int en una interruption propia de cambio de estado de un bit o byte... (Confunde un poco)

Un saludo
Mensaje automáticamente combinado:

Pero que bueno.... El mismo programa con mala estructura y peor echo...

(Ahora aver si no soy mal critico, o peor persona por una critica obvia)
 
Última edición:
Yo anterior mente el cambio de display solia acerlo con tmr0 pero tmr2 tambien vale y como esta funcionando para el pwm....
Si estan la conversion a/d y tmr2 o tmr0 por interrutcion. Deverian sobrarte pila de procesos para el resto de operaciones.. pulsadorrs, calculos y diversos procesos con menos prioridad..

Aconsejo poner interrupt y no int por ser int en una interruption propia de cambio de estado de un bit o byte... (Confunde un poco)

Un saludo
Mensaje automáticamente combinado:

Pero que bueno.... El mismo programa con mala estructura y peor echo...

(Ahora aver si no soy mal critico, o peor persona por una critica obvia)
Como lo harías el programa, que estructura usarías? Gracias
 
Hola, mo pude seguir antes por la artritis que me dio un brote!! En fin, estoy armando el físico y tengo un problema cuando monto el pic con el display, un dígito enciende bien y los otros 2 a medio encender puse transistores bc337, y resistencias 330 ohm a los pines del display, porque ocurre eso?
 
hola, no le encuentro la manera para que iluminen parejos los display, también pasa en el físico que no mide bien o no muestra bien las mediciones, y los cambios de mediciones no son precisos, tenes que pulsar muchas veces para que cambie de medicion!
Mensaje automáticamente combinado:

subo el esquematico y el pcb por si algiuien le interaza o le sirve la fuente
 

Adjuntos

  • fuente geo digital.rar
    183.4 KB · Visitas: 6
  • fuente geo kicad.rar
    512.6 KB · Visitas: 6
Última edición:
No creo que sea ni el esquemático ni el PCB. Me apuesto un café a que es el código.


Código:
   #int_timer2
...
   void timer2_isr(void)
   {
   if (input(PIN_A1)==0)
  {
   while(!input(pin_a1)){

     if(++ lectura > 3) lectura = 1;
    delay_us(50);
   }
  }
   }
...

El pack completo; delays y whiles dentro de la rutina que atiende a la interrupción.
No se me ocurre que mas poner ahí para que funcione peor.
Lo raro es que funcione aunque sea mal.
 
Última edición:
Me tome el atrevimiento de modificar un poco el codigo, y eliminar cosas que no servian, como el timer2 y algo mas, como mejor formateo del codigo...

Hay una parte que no entiendo o esta mal.
Cuando lees los flancos, pones primero "set_timer1(0);", y luego asignas a la variable que sigue el valor de "get_timer1();", pero en todo caso sigue siendo 0, ya que lo reiniciaste.

Ademas en la simulacion, cuando el duty cicle es 50%, hace cosas raras, y pasa de 49,50,90,etc. Y cambie la frecuencia de 116 a 216Hz, y con 50% de duty cicle me marca 98%... No me puse a realizar bien el codigo, solo me base en lo que subiste, pero creo que esa parte tendrias que replanteartela.

Intente usar interrupciones con el timer para mostrar el display, pero por falta de experiencia y estudio, no fui capaz.

PD: Use la misma simulacion que subiste. Proteus v8.8, CCS C Compiler 4.104
 

Adjuntos

  • 18F883 Valores en 3 Dsp 7 Seg.zip
    17.1 KB · Visitas: 5
Voy a seguir revisando, el código casi igual solo usándolo con lcd funciona perfecto, en los display 7 segmentos nunca lo pude hacer andar, me ayudaron un montón y voy a seguir hasta que funcione
Mensaje automáticamente combinado:

Me enrede bastantande abría que hacer los cambios con interrupción externa pero no se como medir los flancos de otra manera, no tengo el conocimiento para tanto cambio
Mensaje automáticamente combinado:

No creo que sea ni el esquemático ni el PCB. Me apuesto un café a que es el código.


Código:
   #int_timer2
...
   void timer2_isr(void)
   {
   if (input(PIN_A1)==0)
  {
   while(!input(pin_a1)){

     if(++ lectura > 3) lectura = 1;
    delay_us(50);
   }
  }
   }
...

El pack completo; delays y whiles dentro de la rutina que atiende a la interrupción.
No se me ocurre que mas poner ahí para que funcione peor.
Lo raro es que funcione aunque sea mal.
Gracias por comentar, como harías para que funcione mejor?
 
Última edición:
Pues lo mismo pero al revés.
Es pecado mortal motivo de excomunión colocar bucles, retardos y esperas a cualquier cosa dentro de una rutina de interrupción.
Esa es precisamente la idea, se usa una interrupción para NO hacer eso.

Si necesitas algo así (no sé para qué) usa flags. Es decir, cambias el valor de una variable y sales de la interrupción. En el bucle principal si esa variable es ta se hace tal cosa y si es cual se hace cual cosa.

A la rutina de interrupción se entra y se sale lo más rápidamente posible. Esa es la idea.
 
Atrás
Arriba