TODOPIC
Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: kain589 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
-
Hola.
Intenta declarando la variable como unsigned int16. CCS tiene sus cosas.
Saludos
-
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.
-
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
}