TODOPIC

Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: gera en 13 de Octubre de 2008, 01:53:37

Título: mostrar un numero en displays de 7 segmentos [SOLUCIONADO]
Publicado por: gera en 13 de Octubre de 2008, 01:53:37
Hola amigos!!!
Me estoy rompiendo la cabeza con un problema q seguro alguno de ustedes ya soluciono, o se les ocurre una mas facil q a mi. Asiq aqui va:
Estoy haciendo un cronometro de alta precision con un 16f84 en ccs, para poder medir el tiempo de caida de un objeto. Ya tengo todo el hardware hecho con 4 displays de 7 segmentos para mostrar el tiempo transcurrido.
El problema es q no se como dividir el numero obtenido en cifras para mostrarlas individualmente en cada uno de los displays. Con esto quiero decir, que si por ej tengo 245 centesimas de segundo, tengo q mostrar "0" en el primer display, "2." en el segundo, "4" en el tercero y "5" en el ultimo.
Espero haber sido claro y ojala me puedan dar una mano. Muchas gracias desde ya!
Título: Re: mostrar un numero en displays de 7 segmentos
Publicado por: Nocturno en 13 de Octubre de 2008, 04:05:05
Esto está escrito en MikroC y para la usart, pero seguro que das buena cuenta de él.

Código: ActionScript
  1. void printn (int numero) {                          // Envía un número de 4 dígitos al puerto serie
  2.      int iniciado=0;
  3.      if (numero>1000) {
  4.          USART_write(numero/1000 + '0');
  5.          numero = numero - 1000 * (numero/1000);
  6.          iniciado=1;
  7.          };
  8.      if ((numero>100) || iniciado ){
  9.          USART_write(numero/100 + '0');
  10.          numero = numero - 100 * (numero/100);
  11.          iniciado=1;
  12.          };
  13.      if ((numero>10)  || iniciado ){
  14.          USART_write(numero/10 + '0');
  15.          numero = numero - 10 * (numero/10);
  16.          };
  17.      USART_write(numero + '0');
  18.  
  19.  
  20. }
Título: Re: mostrar un numero en displays de 7 segmentos
Publicado por: gera en 13 de Octubre de 2008, 12:59:51
Muchas gracias por tu ayuda Nocturno!!
Algo al estilo es lo q habia pensado, y si no usar la funcion itoa, pero a la larga hace mas o menos lo mismo, y como no quiero desperdiciar muchos ciclos de reloj para no comprometer la exactitud del cronometro, queria una funcion mas cortita. Recien se me ocurrio esta:

Código: [Seleccionar]
int main()
{
        int num=4328, cifra;
        while(num >= 1)
        {
                cifra=num%10;
                num=num/10;
                printf("cifra= %d\n",cifra);
        }
        return 0;
}

Lo probe en la compu y funciona, voy a ver como lo implemento ahora en el pic. Ademas me gustaria que mientras no supere el segundo, muestre solo las centesimas (para tener mayor precisión), y q vaya corriento el punto a medida q transcurre el tiempo...
Voy a hacer unas pruebas esta tarde y si tengo algun drama chiflo por aca.
Muchas gracias!!!
Título: Re: mostrar un numero en displays de 7 segmentos
Publicado por: Nocturno en 13 de Octubre de 2008, 14:08:07
Pero esa rutinita que has pegado pinta los números al revés. En tu ejemplo saca 8234 en vez de 4328
Título: Re: mostrar un numero en displays de 7 segmentos
Publicado por: gera en 13 de Octubre de 2008, 14:18:37
no hay problema... porq lo q voy a hacer es ponerlos en un arreglo, y tengo una funcion q muestra ese arreglo en los 4 displays de 7 segmentos q tengo. Por lo tanto puedo ordenarlos a la hora de ponerlos en dicho arreglo. ;)
Título: Re: mostrar un numero en displays de 7 segmentos
Publicado por: gera en 13 de Octubre de 2008, 14:33:10
Ya q estoy, pregunto otra cosita. Resulta q estoy llevando la cuenta de los milisegundos con una variable q es incrementada en la interrupcion del timer. Esta interrupcion se produce cada 1ms (obviamente), pero la duda es si el contenido de la ISR afecta el periodo de la interrupcion. Tambien tengo duda si el timer se recarga solo con el valor q tenia antes, o si tengo q recargarlo al final de la ISR.
gracias!
Título: Re: mostrar un numero en displays de 7 segmentos
Publicado por: Nocturno en 13 de Octubre de 2008, 14:52:08
Te recomiendo que eches un vistazo a esto:
http://www.todopic.com.ar/foros/index.php?topic=23351.0
Título: Re: mostrar un numero en displays de 7 segmentos
Publicado por: gera en 13 de Octubre de 2008, 16:21:49
muchas gracias Nocturno! :D eso me saca de varias dudas
bueno, les cuento q sigo haciendo pruebas. Ya logre mostrar un arreglo de dimension 4 en el display. El problema ahora es una funcion q arma el arreglo a partir de un numero de 4 cifras (q es lo q pregunte al principio).
Sera problema del compilador ccs? parece q no calcula bien el modulo. Este es el codigo q tengo:

Código: [Seleccionar]
void convertir(int valor,int8 mat[])
{
   int i,cifra;
   for(i=0;i<=3;i++)
   {
      cifra=valor%10;
      mat[i]=num[cifra];
      valor=valor/10;
   }
}

El display muestra numeros, pero que nada q ver con el q mando por "valor". que sera?
gracias!
Título: Re: mostrar un numero en displays de 7 segmentos [SOLUCIONADO]
Publicado por: gera en 13 de Octubre de 2008, 22:32:24
Señores, encontre la solucion! Por q los problemas mas tontos son los q dan mas trabajo? jaja. El tema es q yo le pasaba a la funcion como parametro un numero de 4 digitos, y con un int me quedaba corto, asiq poniendo un long se soluciono :D
Dejo la funcion como quedo para q otros puedan usarla, saludos!

Código: [Seleccionar]
void convertir(long int valor,int8 mat[])
{
   int8 i,cifra;
   for(i=0;i<=3;i++)
   {
      cifra=(valor%10);
      mat[i]=num[cifra];
      valor=valor/10;
   }
}

Muchas gracias por su ayuda!!! y disculpen haber molestado por alto tan tonto jeje.
Título: Re: mostrar un numero en displays de 7 segmentos [SOLUCIONADO]
Publicado por: PalitroqueZ en 14 de Octubre de 2008, 17:58:47
yo uso estructuras  :mrgreen:

Código: C
  1. struct digitos_separados {         // variables en bcd de unidad,decena,centena
  2.       int  unidad, decena, centena;
  3.    } digito;
  4. //************************************************************************************
  5.    struct mis_datos {                 // variables de datos de entrada y salida
  6.       int  dato1, dato2, resultado;
  7.    } numeros;
  8. //************************************************************************************
  9.    void separar_digitos(){      // separa resultado en unidad, decena y centena
  10.           int   temp;
  11.           digito.unidad=0;
  12.           digito.decena=0;
  13.           temp=numeros.resultado;
  14.           while(temp>=10){
  15.             temp-=10;
  16.        digito.decena++;
  17.           }
  18.           digito.unidad=temp;
  19.    }
  20.    void mostrar(){               // multiplexa en tres display 7-seg anodo común
  21.       int const bcd_7seg[10]= {0x7e,0x30,0x6d,0x79,0x33,0x5b,0x5f,0x70,0x7f,0x73};
  22.       int contador;
  23.       output_low(Q1);
  24.       output_low(Q2);
  25.       output_low(Q3);
  26.       output_low(punto);
  27.     for(contador=0;contador<11;contador++){
  28.          salida=bcd_7seg[digito.unidad];           // muestra unidad
  29.          output_high(Q1);
  30.          delay_ms(5);
  31.          output_low(Q1);
  32.          delay_cycles(4);
  33.          salida=bcd_7seg[digito.decena];           // muestra decena
  34.          output_high(Q2);
  35.          delay_ms(5);
  36.          output_low(Q2);
  37.          delay_cycles(4);
  38.          salida=bcd_7seg[digito.centena];           // muestra centena
  39.          output_high(Q3);
  40.          output_high(punto);
  41.          delay_ms(5);
  42.          output_low(Q3);
  43.          output_low(punto);
  44.          delay_cycles(4);
  45.       }
  46.     }
  47. ...
Título: Re: mostrar un numero en displays de 7 segmentos [SOLUCIONADO]
Publicado por: gera en 14 de Octubre de 2008, 23:44:39
Muy buena PalitroqueZ. Cuando tenga un ratito le voy a pegar una leida, porq la verdad q estoy teniendo dolores de cabeza grandes con esto.
No se q le pasa... tengo un main q se dedica a imprimir una variable de 4 digitos en los displays, y una interrupcion de tmr q incrementa esa variable cada un milisegundo. No entiendo como algo tan simple me trae tantos problemas. En fin, muchas gracias por tu aporte! :D