TODOPIC
Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: gardelitock en 03 de Enero de 2015, 20:17:47
-
Hola a todos!
Probando las entradas analógicas del PIC16f887 me salió una duda, que quizá es muy facil resolverla, pero.. ¡la verdad que no me puedo dar cuenta!
La programación es en C con el PIC C. La idea es simple, usar la entrada analógica y que se muestre en una pantalla lcd el valor de 8 bits leido y el voltaje calculado (que acá creo que esta el problema) con la formula. voltaje= 5 * valor/2^8 = 5 * valor/256 ;
Lo que quiero es que el voltaje mostrado en pantalla sea como el de un voltimetro con 3 decimales. A voltaje lo definí como flotante, pero igual asi no me da ninguna decimal en el lcd.
Quiero saber donde esta error.Si es que definí mal las variables o lo que sea.
Add programa:
#include <16F887.h>
#FUSES NOWDT
#FUSES NOBROWNOUT
#FUSES NOLVP
#fuses NOMCLR,INTRC
#use delay(internal=4MHz)
// CAMBIE LOS PINES QUE SIEMPRE USABA EN EL PUERTO B
#define LCD_DB4 PIN_D4
#define LCD_DB5 PIN_D5
#define LCD_DB6 PIN_D6
#define LCD_DB7 PIN_D7
#define LCD_RS PIN_D1
#define LCD_E PIN_D0
#include <lcdazul.c>
void main()
{
long valor;
float voltaje;
setup_comparator(NC_NC_NC_NC);
setup_adc_ports(sAN0|VSS_VDD);
setup_adc(ADC_CLOCK_INTERNAL);
setup_adc(ADC_CLOCK_DIV_32);
set_adc_channel(0);
delay_ms(20);
lcd_init();
lcd_putc("\f ");
while(TRUE)
{
valor=read_adc();
delay_ms(20);
voltaje= 5 * valor/256 ;
printf(lcd_putc,"\f Volt:%0.3f \n Valor:%Lu", voltaje,valor);
output_b(0b00000000);
if(voltaje>=0 && voltaje<1)
{
Output_High (PIN_B0);
}
if(voltaje>=1 && voltaje<2)
{
Output_High (PIN_B1);
}
if(voltaje>=2 && voltaje<3)
{
Output_High (PIN_B2);
}
if(voltaje>=3 && voltaje<=4)
{
Output_High (PIN_B3);
}
if(voltaje>4)
{
output_d(0b00001111);
}
}
}
Tambien quería saber como puedo configurar el conversor ad a 10 bits, ya que programandolo como #device adc= valor (8 o 10) me sale error.
Espero su ayuda, gracias!
-
Prueba
voltaje= 5.0 * valor/256.0 ;
o
voltaje=(float) (5.0 * (valor/256.0)) ;
-
Prueba
voltaje= 5.0 * valor/256.0 ;
o
voltaje=(float) (5.0 * (valor/256.0)) ;
Gracias por tu respuesta! Funciona. Surge un problema cuando la medicion pasa los 4.0 V la pantalla se descontrola y empieza a pasar simbolos raros, hasta que se llega al voltaje máximo y se estabiliza.
-
Sino proba asi
voltaje=(float) ((5.0 * valor)/256.0) ;
Si dividiera por 256 primero a valor quedaria muy chiquito xD, Probar no cuesta nada. Y todo parece ser problema del printf
PD, tengo la cabeza tan podrida que cuando veo en la pagina principal te encontras con esto:
Último mensaje Hoy a las 11:48:16
en Re: Duda de entrada anal... por gardelitock
-
La sentencia para setear el ADC es:
Y si funciona con esa, que debe estar ubicada después del procesador, deberías dividir tu valor en 1024, ya que te devolverá un valor de conversión de 10 bits.
-
La sentencia para setear el ADC es:
Y si funciona con esa, que debe estar ubicada después del procesador, deberías dividir tu valor en 1024, ya que te devolverá un valor de conversión de 10 bits.
Buenísimo, gracias! Siempre la ponía despues de los fuses, por eso el error.