ADC en C para 16F877

Hola a todos,

quería preguntaros si alguno puede compartir algún código para la conversión ADC con el PIC 16F877A para el compilador Hi-Tech C.

Es para un sensor de presión, MPX4115, así que simplemente sería convertir el valor analógico de una entrada, (de 0 a 5V) y obtener su valor digital y guardarlo en una variable. No sería necesario enviar el resultado de la conversión a ningún puerto de salida. Ya que el PIC obtiene otros datos de otros sensores y los va guardando en un array, así que el dato de la conversión lo meto en una posición del array y posteriormente lo envío al puerto serie.

Pensé que no me costaría mucho obtener algún código por internet, pero no he encontrado nada, todo lo que he probado no consigo hacer que me funcione y como nunca había trabajado con el ADC del PIC hasta este año, pues ando algo perdido.



Muchas gracias por vuestra ayuda.
 
Finalmente estoy trabajando con este código:

Código:
#include <pic.h>

int ADC_VALUE; /* The value from the analog - digital convertor */

main(){
TRISA=0x01; /* PORTA as Anlog input */
TRISD=0x00; /* PORTD as output */

while(1) /* loop */
{

ADCON0=0b1000011; /*  - the osc F bits 7-6 | the channel bits 5-3| start bit2 | none bit 1| A2D on when "1" bit 0| */
ADCON1= 0x10; /* 10 bit / 8 bit convertor when "0x10" 10 bit - "0x00" 8 bit */ 


ADIE  = 0; /* Masking the interrupt */ 
ADIF  = 0; /* Resetting the ADC interupt bit */ 
ADRESL = 0; /* Resetting the ADRES value register */
ADRESH = 0; 
GODONE=1;     /* Staring the ADC process */ 

while(GODONE); /* Wait for conversion complete */
ADC_VALUE = (ADRESH); /* Getting HSB of CCP1, in 8 bit mode only ADRESH in 10 bit mode need the ADRESL to perform the first 8 bits, THE ADRESH perform the 8 last bits*/ 
PORTD = ADC_VALUE; /* perform in PORTD the Value */
}
}

El problema que no consigo solucionar es que cuando la entrada es por ejemplo 4V, obtengo a la salida 216(decimal), si es 3V, 153, 2V, 102 etc...

No consigo configurar de modo que a la salida me de el valor de la tensión de entrada...

¿Alguno encuentra el fallo al código?
 
El codigo esta bien y te funciona perfectamente. Si tu tienes 5 voltios en la entrada la salida en el ADRESH='11111111'=255. Si es 0 V ADRESH='00000000'=0.Para que te de los voltios tendrias que cojer (ADRESH*5)/255. Para que te de el valor en voltios.
 
Hola ante todo.
He estado viendo un ejemplo que encontré sobre el conversor AD y me puse a programar, pero a la hora de compilar me vota error. :eek:
Justo en la parte donde se escribe en el lcd donde tiene que visualizar el contenido de la variable.
Código:
 #include <16f876.h>
#device adc=10
#include <cabecera.c>
#include <lcd.c>
#define use_portb_lcdtrue

int16 valor_leido;
float voltios;


void main ()
{setup_adc_ports(AN0);
setup_adc(adc_clock_internal);
lcd_init();
while(1)
{
set_adc_channel(0);
delay_ms(20);
valor_leido=read_adc();
voltios=5.0*valor_leido/1024.0;
printf(lcd_putc,"\fADC=%41d",valor_leido); //acá me marca error
printf(lcd_putc,"\nvoltaje=%01.fv",voltios);// error

}
}
 
Última edición por un moderador:
Seria mejor que indiques cuál es el error o abre el help del CCS y busca "printf", ahí indica los formatos para string que soporta y como escribirlos.
%41d es raro y no pasa ya que la variable es de 16bits sin signo, bastaria con %Lu. Averigua para el float.

Saludos.
 
a la hora de compilar me vota error. :eek:
Justo en la parte donde se escribe en el lcd donde tiene que visualizar el contenido de la variable.
Aparte de las recomendaciones que te mencionó ByAxel también tendrás problemas de visualización.
Al estar borrando continuamente la pantalla para mostrar los valores verás que parpadea.

Aquí tienes esto:
printf(lcd_putc,"\fADC=%41d",valor_leido); //acá me marca error
printf(lcd_putc,"\nvoltaje=%01.fv",voltios);// error

Lo que está marcando en rojo es lo que te produce los errores.

Debería ser así como te mencionaron:
printf(lcd_putc,"\fADC=%41lu",valor_leido); //acá me marca error
printf(lcd_putc,"\nvoltaje=%01fv",voltios);// error

Y como sugerencia para evitar los parpadeos de la pantalla durante la lectura puedes hacer esto:
En la parte del main después de lcd_init() agrega esta parte...
lcd_putc("\fADC=\nVoltaje=");

Y durante el bucle de lectura agrega esto...
lcd_gotoxy(6,1);
printf(lcd_putc,"%04lu",valor_leido);
lcd_gotoxy(10,2);
printf(lcd_putc,"%3.2fv",voltios);

Otro detalle que acabo de ver:
En la formula de conversión debes dividir por 1023 y no por 1024 :cool:

Suerte.
 
Última edición:
Atrás
Arriba