Autor Tema: Problema con printf y variables tipo long  (Leído 3254 veces)

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

Desconectado kain589

  • Colaborador
  • PIC18
  • *****
  • Mensajes: 324
Problema con printf y variables tipo long
« en: 10 de Abril de 2009, 12:15:54 »
Saludos! Estoy teniendo un problema con el puerto serie al enviar datos de variable long. Pretendo usar los 10 bits del adc y para ellos guardo el valor del adc en una variable tipo long, el problema viene al intentar enviar datos por el puerto serie; en lugar de los datos limpios, me llega de esta forma:

El valor del adc es : 5ô880
El valor del adc es : 5ô656
El valor del adc es : 5ô446
El valor del adc es : 5õ010
El valor del adc es : 5õ014
El valor del adc es : 5ô958
El valor del adc es : 5õ014

No sé por qué me mete la parte "5ô", no es un gran problema, pero no sé como solucionarlo, ademas en los datos que pasan de 1000 no me deja leerlos bien. Es curioso que cuando el dato sobrepasa los mil el "5ô" pasa a ser "5õ".

La instruccion que uso es :

printf("\n\rEl valor del adc es : %Lu ",valor);//muestra dato

El identificador %Lu es el que debe usarse para variables de tipo long sin signo segun el manual de CCs.

Habiendo declarado valor como :

long valor;

¿Alguna idea de que puede estar pasando? Gracias de antemano
Saludos desde Córdoba, españa

Desconectado MLO__

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4581
Re: Problema con printf y variables tipo long
« Respuesta #1 en: 10 de Abril de 2009, 12:54:04 »
Hola.

Intenta declarando la variable como unsigned int16. CCS tiene sus cosas.

Saludos
El papel lo aguanta todo

Desconectado kain589

  • Colaborador
  • PIC18
  • *****
  • Mensajes: 324
Re: Problema con printf y variables tipo long
« Respuesta #2 en: 10 de Abril de 2009, 14:36:57 »
Muchas gracias, lo intenté asi y me seguia fallando, al final funciona poniendole unsigned long, es como mejor resultado me da; alguna vez sale algun valor raro, pero muy pocas veces, de este tipo:

El valor del adc es : 5÷õ14

Pero es muy pocas veces, ademas puede deberse a no usar un cristal que de un valor entero para el baudrate o cualquier ruido en la comunicación. cada vez me entran mas ganas de pasarme al C18.
Saludos desde Córdoba, españa

Desconectado setshomaru

  • PIC12
  • **
  • Mensajes: 66
Re: Problema con printf y variables tipo long
« Respuesta #3 en: 10 de Abril de 2009, 18:49:01 »
hola kain  te mando un ejemplo donde muestro en una lcd el voltaje en los primeros 3 analogos del pic estoy utilizando el conversor con sus 10 bits no es lo que necesitas pero puedes modificarlo para que envie al puerto serie.


////////////////////////////////////////////////////////////////////////////////
////programa para visualizar el voltaje en los puertos analogos A0,A1,A2 en una lcd
////////////////////////////////////////////////////////////////////////////////
#define (__PCH__)
#include <18f452.H>
#device ADC=10
#fuses HS,NOWDT,NOPROTECT,NOLVP,PUT,BROWNOUT   
#use delay(clock=20000000)
#use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7)//esto no lo tenia pero debe funcionar
#use standard_io(b)
#use standard_io(c)
#use standard_io(d)

#include <flex_lcd.c>


   
#define  sig         0x06
#define  clear       0x01
#define  cursor_no   0x0C
#define  interfaz    0x38
#define  lin1        0x85
#define  ren1        0x80
#define  ren2        0xC0

#define  m           0.0048828125 // pendiente segun ecuacion de la recta
                                  // 5/1024=m
float voltaje;                                 
int i,lcd_pos;

int16 ana;

///////////////////////////////////////////////////////////////////////////////
////subrutina que ejecuta la conversion analoga, hace el calculo del voltaje
////y envia el resultado a la lcd
///////////////////////////////////////////////////////////////////////////////
void envia_analogo_lcd(byte canal)
{

   
   delay_ms(10);
   lcd_gotoxy(1,1);
   delay_ms(10);
   lcd_putc("voltaje en a0_a2");
   set_adc_channel(canal);
   delay_us(10);
   ana = read_adc();
   voltaje = m * ana; //ejecuta ecuacion
   delay_ms(10);
   lcd_gotoxy(lcd_pos,2);
   delay_ms(10);
   printf(lcd_putc,"\%f",voltaje);
   delay_ms(10);

///////aqui podrias agregar algo como putc(ana) o, printf("\%f",voltaje); pruebalo que seguro te sirve no olvides agregar la funcion rs232 al principio
   
}

///////////////////////////////////////////////////////////////////////////////
////bloque principal
///////////////////////////////////////////////////////////////////////////////
void main()

{

   lcd_init();                      //inicia la lcd
   
   setup_port_a( ALL_ANALOG );      //todo el puertoA analogo
   setup_adc(ADC_CLOCK_internal );  //reloj interno del conversor   
       
   
  do{   
     
     lcd_pos=1;
     
     for (i=0;i<=2;++i){
     envia_analogo_lcd(i);
     lcd_pos=lcd_pos+6;
     }
   
  }while(true);//Bucle infinito
 
}

 
entre mas se, me doy cuenta que no se nada


 

anything