Autor Tema: MUESTREO DE VARIABLE INT EN DISPLAY 7 SEGMENTOS  (Leído 6832 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado pilkinsur0

  • PIC10
  • *
  • Mensajes: 3
MUESTREO DE VARIABLE INT EN DISPLAY 7 SEGMENTOS
« en: 15 de Septiembre de 2011, 16:30:01 »
Buenos dias.
Antes que nada pido disculpas por crear este nuevo tema ya que vi muchas aplicaciones como esta, necesitaba una ayuda mas puntual.
Estoy haciendo un proyecto en el que necesito mostrar una variable int en un display de 7 segmentos.
El contenido de la variable es un numero entero que va de 0 a 300. Para manejar el display estoy utilizando un driver 7447 para lo cual utilizo cuatro salidas del pic para em BCD y tres mas para los transistores de la unidad, decena y centena.
El microcontrolador que decidi utilizar para este proyecto es el 16F88 y el compilador es el PIC-C con la configuracion que adjunto.

Me gustaria que me guien un poco de como hacer la conversion de una variable tipo int a BCD y como mostrarla en el display de 7 segmentos.
Tenia algo pensado como esto:
dividir la variable XXX/100... si es mayor o igual a 1, entonces convierto ese numero a BCD y es la centena.
si es cero, entonces pongo un 0 en las centenas.
dividir la variable XXX/10... si es mayor o igual a 1, entonces convierto ese numero a BCD y es la decena.
si es cero, entonces pongo un 0 en las decenas.
dividir la variable XXX/1... si es mayor o igual a 1, entonces convierto ese numero a BCD y es la unidad.
si es cero, entonces pongo un 0 en las unidades.

Espero su respuesta y muchas gracias de antemano.

Desconectado rivale

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1707
Re: MUESTREO DE VARIABLE INT EN DISPLAY 7 SEGMENTOS
« Respuesta #1 en: 15 de Septiembre de 2011, 16:45:09 »
Hola, por lo que entiendo tienes que mostrar un numero entero en los 3 displays. por ejemplo si tienes un 123, el 1 en el primer display, el 2 en el segundo y el 3 en el tercero.

si tu variable es del tipo int solo puedes contar hasta 255.

tienes que mostrar tus datos en binario o puede ser en hexadecimal?. ya que si es en hexa solo necesitas 2 displays, el primero para los 4 bits menos significativos y el segndo para los mas significativos.

"Nada es imposible, no si puedes imaginarlo"

Desconectado gera

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2188
Re: MUESTREO DE VARIABLE INT EN DISPLAY 7 SEGMENTOS
« Respuesta #2 en: 15 de Septiembre de 2011, 18:52:50 »
Hola!!
Primero que nada, nos referimos a "muestreo" cuando tomamos muestras de una señal. Supongo que quisiste decir "mostrar".
Para mostrar variables en un display, primero que nada tenes q convertir la variable a BCD, asi tenes por separado unidades, decenas y centenas. Una vez que tenes esos tres numeros, tenes q usar una tabla para saber que salidas en el puerto del pic corresponden a cada numero.
Te pongo un ejemplo en CCS de un cronometro que hice hace un tiempo. Hay una funcion bin2bcd() que convierte binario a BCD, y despues tenes una matriz num[] que contiene los codigos para mostrar cada numero en un display. La funcion mostrar()  multiplexa cada numero en cada display.
Suerte!!

Código: C
  1. #include <16F628.h>
  2. #fuses INTRC_IO, NOWDT, NOPROTECT, BROWNOUT, PUT, NOLVP
  3. #use delay(clock=4000000)
  4.  
  5. #byte port_a=0x05
  6. #byte port_b=0x06
  7. #use fast_io(a)
  8. #use fast_io(b)
  9.  
  10. #byte OSCCON = 0x8F
  11. #byte OSCTUNE = 0x90
  12.  
  13. int8 num[10]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x98};
  14. int8 display[4]={~0x01,~0x02,~0x04,~0x08};
  15. int8 matriz[4], uni, dec, cen, umil;
  16. int16 ms=0,seg=0,min=0;
  17. int8 bocina=1;
  18.  
  19. #int_timer0
  20. void isr()
  21. {
  22.    ms++;
  23.    SET_TIMER0(7); //valor teorico 7
  24. }
  25.  
  26. void bin2bcd(int16 valor)
  27. {
  28.    uni=0;
  29.    dec=0;
  30.    cen=0;
  31.    umil=0;
  32.    
  33.    while(valor>=1000)
  34.    {
  35.       valor-=1000;
  36.       umil++;
  37.    }
  38.    while(valor>=100)
  39.    {
  40.       valor-=100;
  41.       cen++;
  42.    }
  43.    while(valor>=10)
  44.    {
  45.       valor-=10;
  46.       dec++;
  47.    }
  48.    while(valor>=1)
  49.    {
  50.       valor-=1;
  51.       uni++;
  52.    }
  53. }
  54.  
  55. void mostrar(int16 valor)
  56. {
  57.    int i;
  58.    bin2bcd(valor);
  59.    matriz[0]=num[uni];
  60.    matriz[1]=num[dec];
  61.    matriz[2]=num[cen];
  62.    matriz[3]=num[umil];
  63.    
  64.    for(i=0;i<=3;i++)
  65.    {
  66.       port_b = matriz[i] & ~(bocina << 7);
  67.       port_a = display[i];
  68.       delay_us(500);
  69.    }
  70. }
  71.  
  72. void main()
  73. {
  74.    int pausa=1;
  75.    
  76.    OSCCON = 0x60; // Para fijar el oscilador a 4 MHz
  77.    OSCTUNE = 0x00; // Para calibrar la frecuencia a 4MHz "exactos"
  78.    
  79.    set_tris_b(0x00); // todo puerto B como salida
  80.    set_tris_a(0x10); // RA4 como entrada
  81.    
  82.    enable_interrupts(INT_RTCC);
  83.    disable_interrupts(GLOBAL);
  84.    setup_timer_0(RTCC_INTERNAL | RTCC_DIV_4);
  85.    set_timer0(7);
  86.    
  87.    while(TRUE)
  88.    {
  89.       mostrar(min*100+seg);
  90.       if(!input(PIN_A4))
  91.       {
  92.          delay_ms(10);
  93.          if(pausa)
  94.             enable_interrupts(GLOBAL);
  95.          else
  96.             disable_interrupts(GLOBAL);
  97.          
  98.          pausa = !pausa;
  99.          while(!input(PIN_A4))
  100.             mostrar(min*100+seg);
  101.       }
  102.      
  103.       //rutina acumuladora de min
  104.       if(ms >= 999)
  105.       {
  106.          ms=0;
  107.          if(seg++ >= 59)
  108.          {
  109.             seg=0;
  110.             min++;
  111.          }
  112.       }
  113.      
  114.       //rutina de bocina
  115.       if( !pausa && (min==0 || min==7 || min==9 || min==14) && (seg >= 0 && seg < 5) )
  116.          bocina=0;
  117.       else
  118.          bocina=1;
  119.      
  120.    }
  121. }

"conozco dos cosas infinitas: el universo y la estupidez humana. Y no estoy muy seguro del primero." A.Einstein

Desconectado pilkinsur0

  • PIC10
  • *
  • Mensajes: 3
Re: MUESTREO DE VARIABLE INT EN DISPLAY 7 SEGMENTOS
« Respuesta #3 en: 15 de Septiembre de 2011, 21:51:16 »
Hola, por lo que entiendo tienes que mostrar un numero entero en los 3 displays. por ejemplo si tienes un 123, el 1 en el primer display, el 2 en el segundo y el 3 en el tercero.

si tu variable es del tipo int solo puedes contar hasta 255.

tienes que mostrar tus datos en binario o puede ser en hexadecimal?. ya que si es en hexa solo necesitas 2 displays, el primero para los 4 bits menos significativos y el segndo para los mas significativos.


Buenos dias.
Efectivamente, tengo que mostrar un numero en los tres displays.
Ahora que lo comentaste, me parece razonable llegar a contar solo hasta 255... tenia pensado hacerlo hasta mas, pero no me conviene.
Los datos de la variable int tengo que convertirlos a BCD ya que utilizo un driver 7447 para manejar los displays... pero en los displays propiamente dichos se van a ver en decimal.
Muchas gracias por tu respoesta.

Desconectado pilkinsur0

  • PIC10
  • *
  • Mensajes: 3
Re: MUESTREO DE VARIABLE INT EN DISPLAY 7 SEGMENTOS
« Respuesta #4 en: 15 de Septiembre de 2011, 21:54:23 »
Hola!!
Primero que nada, nos referimos a "muestreo" cuando tomamos muestras de una señal. Supongo que quisiste decir "mostrar".
Para mostrar variables en un display, primero que nada tenes q convertir la variable a BCD, asi tenes por separado unidades, decenas y centenas. Una vez que tenes esos tres numeros, tenes q usar una tabla para saber que salidas en el puerto del pic corresponden a cada numero.
Te pongo un ejemplo en CCS de un cronometro que hice hace un tiempo. Hay una funcion bin2bcd() que convierte binario a BCD, y despues tenes una matriz num[] que contiene los codigos para mostrar cada numero en un display. La funcion mostrar()  multiplexa cada numero en cada display.
Suerte!!

Código: C
  1. #include <16F628.h>
  2. #fuses INTRC_IO, NOWDT, NOPROTECT, BROWNOUT, PUT, NOLVP
  3. #use delay(clock=4000000)
  4.  
  5. #byte port_a=0x05
  6. #byte port_b=0x06
  7. #use fast_io(a)
  8. #use fast_io(b)
  9.  
  10. #byte OSCCON = 0x8F
  11. #byte OSCTUNE = 0x90
  12.  
  13. int8 num[10]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x98};
  14. int8 display[4]={~0x01,~0x02,~0x04,~0x08};
  15. int8 matriz[4], uni, dec, cen, umil;
  16. int16 ms=0,seg=0,min=0;
  17. int8 bocina=1;
  18.  
  19. #int_timer0
  20. void isr()
  21. {
  22.    ms++;
  23.    SET_TIMER0(7); //valor teorico 7
  24. }
  25.  
  26. void bin2bcd(int16 valor)
  27. {
  28.    uni=0;
  29.    dec=0;
  30.    cen=0;
  31.    umil=0;
  32.    
  33.    while(valor>=1000)
  34.    {
  35.       valor-=1000;
  36.       umil++;
  37.    }
  38.    while(valor>=100)
  39.    {
  40.       valor-=100;
  41.       cen++;
  42.    }
  43.    while(valor>=10)
  44.    {
  45.       valor-=10;
  46.       dec++;
  47.    }
  48.    while(valor>=1)
  49.    {
  50.       valor-=1;
  51.       uni++;
  52.    }
  53. }
  54.  
  55. void mostrar(int16 valor)
  56. {
  57.    int i;
  58.    bin2bcd(valor);
  59.    matriz[0]=num[uni];
  60.    matriz[1]=num[dec];
  61.    matriz[2]=num[cen];
  62.    matriz[3]=num[umil];
  63.    
  64.    for(i=0;i<=3;i++)
  65.    {
  66.       port_b = matriz[i] & ~(bocina << 7);
  67.       port_a = display[i];
  68.       delay_us(500);
  69.    }
  70. }
  71.  
  72. void main()
  73. {
  74.    int pausa=1;
  75.    
  76.    OSCCON = 0x60; // Para fijar el oscilador a 4 MHz
  77.    OSCTUNE = 0x00; // Para calibrar la frecuencia a 4MHz "exactos"
  78.    
  79.    set_tris_b(0x00); // todo puerto B como salida
  80.    set_tris_a(0x10); // RA4 como entrada
  81.    
  82.    enable_interrupts(INT_RTCC);
  83.    disable_interrupts(GLOBAL);
  84.    setup_timer_0(RTCC_INTERNAL | RTCC_DIV_4);
  85.    set_timer0(7);
  86.    
  87.    while(TRUE)
  88.    {
  89.       mostrar(min*100+seg);
  90.       if(!input(PIN_A4))
  91.       {
  92.          delay_ms(10);
  93.          if(pausa)
  94.             enable_interrupts(GLOBAL);
  95.          else
  96.             disable_interrupts(GLOBAL);
  97.          
  98.          pausa = !pausa;
  99.          while(!input(PIN_A4))
  100.             mostrar(min*100+seg);
  101.       }
  102.      
  103.       //rutina acumuladora de min
  104.       if(ms >= 999)
  105.       {
  106.          ms=0;
  107.          if(seg++ >= 59)
  108.          {
  109.             seg=0;
  110.             min++;
  111.          }
  112.       }
  113.      
  114.       //rutina de bocina
  115.       if( !pausa && (min==0 || min==7 || min==9 || min==14) && (seg >= 0 && seg < 5) )
  116.          bocina=0;
  117.       else
  118.          bocina=1;
  119.      
  120.    }
  121. }


Buenos dias.
Muchas gracias por tu respuesta... voy a ojear el ejemplo para utilizarlo en mi aplicacion. Nunca trabaje con tablas, asique si tengo alguna duda les aviso.

Saludos y gracias nuevamente.

Desconectado AngelGris

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2480
Re: MUESTREO DE VARIABLE INT EN DISPLAY 7 SEGMENTOS
« Respuesta #5 en: 15 de Septiembre de 2011, 23:40:01 »
Hola, por lo que entiendo tienes que mostrar un numero entero en los 3 displays. por ejemplo si tienes un 123, el 1 en el primer display, el 2 en el segundo y el 3 en el tercero.

si tu variable es del tipo int solo puedes contar hasta 255.

tienes que mostrar tus datos en binario o puede ser en hexadecimal?. ya que si es en hexa solo necesitas 2 displays, el primero para los 4 bits menos significativos y el segndo para los mas significativos.



  Hola Rivale, en CCS creo que sí int es una variable de 8 bits y por lo tanto podrá contar hasta 255. En HiTech int es una variable de 16bits y por lo tanto podría contar hasta 65535
De vez en cuando la vida
nos besa en la boca
y a colores se despliega
como un atlas

Desconectado rivale

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1707
Re: MUESTREO DE VARIABLE INT EN DISPLAY 7 SEGMENTOS
« Respuesta #6 en: 15 de Septiembre de 2011, 23:55:08 »
cierto AngelGris :mrgreen:, gracias por la correccion.
"Nada es imposible, no si puedes imaginarlo"