Autor Tema: variable float max7219  (Leído 4880 veces)

0 Usuarios y 3 Visitantes están viendo este tema.

Desconectado septiembre_negro

  • PIC18
  • ****
  • Mensajes: 310
variable float max7219
« en: 26 de Agosto de 2009, 23:20:00 »
Hola recién e comenzado a utilizar el compilador ccs y ya me e topado con una situación que no encuentro como resolver les cuento.
Tengo que mostrar la lectura de un censor de temperatura  en 4 display de 7 segmentos
Con un max7219.
Gracias a los magníficos ejemplos que hay en el foro e conseguido inicializar el max7219 y visualizar una cuenta de 0000 a 9999.
 
Mi problema es que dicho sensor me entrega la lectura en una variable float   el formato seria algo así  22.45 grados
  y no encuentro la manera de reflejar esta lectura en el display; vamos no encuentro como destripar la variable float en dígitos, si alguien fuera tan amable de indicarme por donde van los tiros   o referirme a algún ejemplo se lo e de agradecer.
Anexo el programa que estoy usando para hacer pruebas con el Max



#include <16F874A.h>              // DISPOSITIVO A PROGRAMAR
#include <MAX7219.h>             // DRIVER MAX7221
/////////////////declaracion de variables y configuracion///////////////////////
#use delay(clock=20000000)        // XTAL OSCILADOR EXRTERNO 4MHZ
#fuses hs,NOWDT,NOPROTECT        // FUSIBLES DE CONFIGURACION
#use fast_io(a)
#use fast_io(b)

 int16 conta;
 int8 z;
 int8 digit[5];



/////////////////////////////// PROGRAMA PRINCIPAL//////////////////////////////
void main(void)
  {
set_tris_b(0b00000000);               
set_tris_a(0b00000000); 

display_init();             
                               
output_high(L_SC);         
output_low(L_SCK);         
                               
//**************ENVIA DATOS AL DISPLAY DE 7segx8dig**************************
  while (true)                  // bucle infinito
  {
  for (conta=0;conta<=9999;conta++)
  {
  digit[1]=conta%10;     
  digit[2]=(conta/10)%10;
  digit[3]=(conta/100)%10;
  digit[4]=(conta/1000)%10;
  for (z=1;z<=4;z++)   
  {
    write_LED(z,digit[z]);     
   
  }
     delay_ms(50);
    }                       
  }
  }

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: variable float max7219
« Respuesta #1 en: 26 de Agosto de 2009, 23:51:09 »
Como hiciste con el conteo, si te entrega un 22.56 lo multiplicas por 100, lo guardas en una variable de 16 bits y los transformas:

Código: C
  1. float MFloat;
  2. char Unidad, Decena, Centena, UnidadMil;
  3. long Medida;
  4.  
  5.  
  6.    Medida=MFloat*100.0;
  7.    Unidad=Medida%10;
  8.    Decena=(Medida/10)%10;
  9.    Centena=(Medida/100)%10;
  10.    UnidadMil=(Medida/1000)%10;

Saludos!
No contesto mensajes privados, las consultas en el foro

Desconectado septiembre_negro

  • PIC18
  • ****
  • Mensajes: 310
Re: variable float max7219
« Respuesta #2 en: 27 de Agosto de 2009, 00:03:46 »
Muchas gracias   :-/ :-/ :-/

Desconectado MLO__

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4581
Re: variable float max7219
« Respuesta #3 en: 27 de Agosto de 2009, 01:30:55 »
Hola.

Tambien podrias pasar el float a string y visualizarlo. Usarias solo una funcion: sprintf();
El papel lo aguanta todo

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: variable float max7219
« Respuesta #4 en: 27 de Agosto de 2009, 10:56:22 »
Hola.

Tambien podrias pasar el float a string y visualizarlo. Usarias solo una funcion: sprintf();

Acuérdate que es en display de 7 segmentos  ;-)
No contesto mensajes privados, las consultas en el foro

Desconectado MLO__

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4581
Re: variable float max7219
« Respuesta #5 en: 27 de Agosto de 2009, 11:34:31 »
Sip.

Yo uso mejor los strings para visualizacion. La tabla la creo con los numeros y con las letras que se pueden visualizar en el display de 7 segmentos(hay algunas letras que no entran en un display de 7 segmentos). Una vez paso la variable a string, paso el numero de bytes y los bytes a la funcion de visualizacion. Si el numero es mayor que el numero de displays uso el efecto marquesina.  ;-)

Es como para darle un mejor uso a los displays.  :mrgreen:

Saludos
El papel lo aguanta todo

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: variable float max7219
« Respuesta #6 en: 27 de Agosto de 2009, 15:00:58 »
Muy buena la idea  ;-) Ahora entedí a que te referias  :mrgreen:


Saludos!
No contesto mensajes privados, las consultas en el foro

Desconectado septiembre_negro

  • PIC18
  • ****
  • Mensajes: 310
Re: variable float max7219
« Respuesta #7 en: 27 de Agosto de 2009, 15:31:20 »
Sip.

Yo uso mejor los strings para visualizacion. La tabla la creo con los numeros y con las letras que se pueden visualizar en el display de 7 segmentos(hay algunas letras que no entran en un display de 7 segmentos). Una vez paso la variable a string, paso el numero de bytes y los bytes a la funcion de visualizacion. Si el numero es mayor que el numero de displays uso el efecto marquesina.  ;-)

Es como para darle un mejor uso a los displays.  :mrgreen:

Saludos


Hola pues ami no me queda claro estoy muy verde en estos temas aquí anexo mi código con la solución que amablemente me proporciono suky .
Como seria como tú me propones suena bastante interesante.  :-/
Considerando que yo utilizo un max7219 para controlar los display  y tal ves no sea posible el efecto de barrido o si  :shock:

#include "C:\proyectos ccs\estacionmetro.h"
#include <MAX7219.h>             // DRIVER MAX7221


void main()

{
int8 digit[5];
int8 z ;
int8 q ;
int8 r;
long medida;
float p ;
float luz;
float volts;

   setup_adc_ports(AN0_AN1_AN2_AN3_AN4);
   setup_adc(ADC_CLOCK_INTERNAL);
   setup_psp(PSP_DISABLED);
   setup_spi(SPI_SS_DISABLED);
   setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
   setup_timer_1(T1_DISABLED);
   setup_timer_2(T2_DISABLED,0,1);
   setup_comparator(NC_NC_NC_NC);
   setup_vref(FALSE);

   // TODO: USER CODE!!
   
   set_tris_a(0b11111111);
   set_tris_b(0b00000000);
   # use fast_io(a)
   # use fast_io(b)
   # use fast_io(c)
   
   display_init();              // inicializo max 7221-7219 (ver archivo .h y
                                // datasheets) otros modos de operacion
   output_high(L_SC);          // hacer el pin SC del max77219 alto
   output_low(L_SCK);          // hacer elpin de reloj clk del max7216 bajo
                                // para esta conf funciona en modo scan limit
 do
 {
 
 
 
 
 
set_adc_channel(0);
  delay_us(20);
  q=read_adc();
  volts=q*.0195-.400;
  P=volts /.0195 ;
  printf("adc0 = %u  \n\r ",q );
  printf("temperatura= %01.2fv \n\r ", p);
  delay_ms(1000);
 
  medida=p*100.0;
  digit[1]=medida%10;    // estraer digitos
  digit[2]=(medida/10)%10;
  digit[3]=(medida/100)%10;
  digit[4]=(medida/1000)%10;
  for (z=1;z<=4;z++)    //pasar digitos al max7219
  {
    write_LED(z,digit[z]);     //digito a escribir con el dato en max7219
   
  }
   
 

 
  set_adc_channel(1);
  delay_us(20);
  r=read_adc();
  luz=5.0*r/256;
  printf("adc1 = %u  \n\r ",r);
  printf("luminocidad= %01.2fv \n\r ", luz);
  r=0;
  luz=0;
  delay_ms(1000);
 
  set_adc_channel(2);
  delay_us(20);
  r=read_adc();
  luz=5.0*r/256;
  printf("adc2 = %u  \n\r ",r);
  printf("infrarojo= %01.2fv \n\r ", luz);
  r=0;
  luz=0;
  delay_ms(1000);
 }
 
while(1);   

}

   






Desconectado MLO__

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4581
Re: variable float max7219
« Respuesta #8 en: 27 de Agosto de 2009, 16:00:52 »
Hola.

Pues ojeando el datasheet por encima no creo que se pueda hacer, ya que según la tabla 5 (Code B Font) no se podria enviar la info correspondiente, pero no estoy del todo seguro ... no he usado nunca ese integrado, por lo general uso multiplexación.

El bufer que uso es:

Código: [Seleccionar]
const int8 Letras[31]={192,249,164,176,153,146,130,248,128,144,136,131,198,161,134,142,144,137,207,241,199,200,192,140,206,146,135,193,145,164,255};

El cual, corresponde a 0,1,2,3,4.....,A,B,C..... Hay letras que ni modo, como la M, la Ñ ....

En el momento de pasar el float a string, el valor p.e 2.56, pasaría a ser '2','.','5','6'. Estos valores los paso a una función la cual toma el byte correspondiente y lo decodifica y lo despliega en los displays según el orden. Para el punto decimal, seria implementar en la función de decodificación un habilitador para el pin que maneja el punto decimal del display correspondiente.

Saludos
El papel lo aguanta todo


 

anything