Hola, he cogido parte del código de algunos ejemplos en los que se usa el ADC pero no hay forma de que me funcione. El led de control me parpadea y en el LCD sale la información correctamente, pero el valor del ADC siempre es cero. La tensión que le inyecto al conversor es mediante un potenciómetro entre 5V y 0V y midiendo sobre la misma patita del PIC observo que hay, por ejemplo, 3,5V, etc...
Os pongo el código:
#include <16F818.h> //PIC a utilizar
#device adc=8 //numero de bits del ADC
#fuses XT //configuracion de fusibles
#fuses NOWDT
#fuses PROTECT
#fuses PUT
#fuses NOBROWNOUT
#fuses MCLR
#fuses NOLVP
#fuses CPD
#fuses NOWRT
#fuses NODEBUG
#use delay (clock=3276800) //Fosc=3,2768Mhz
#define LED PIN_A1 //LED de funcionamiento
#define LCD_RS PIN_B1 //pinout del LCD
#define LCD_RW PIN_B2
#define LCD_E PIN_B3
#define LCD_DB4 PIN_B4
#define LCD_DB5 PIN_B5
#define LCD_DB6 PIN_B6
#define LCD_DB7 PIN_B7
#include <flex_lcd.c> //libreria LCD
int nClocks=0, flag_seg=0;
#INT_TIMER0
void Interrupcion_Timer0() //interrupcion cada 40ms
{
nClocks++; //contar numero de interrupciones del timer0
output_low(LED); //parpadeo led
if(nClocks==25) //25 interrupciones -> ha pasado 1seg
{
nClocks=0;
output_high(LED);
flag_seg=1;
}
}
void main(void)
{
int valor_adc=0;
disable_interrupts(GLOBAL); //deshabilitar interrupciones
disable_interrupts(INT_EEPROM); //deshabilitar interrupcion EEPROM
disable_interrupts(INT_RB); //deshabilitar interrupcion portb
disable_interrupts(INT_TIMER1); //deshabilitar interrupcion timer1
disable_interrupts(INT_TIMER2); //deshabilitar interrupcion timer2
disable_interrupts(INT_CCP1); //deshabilitar interrupcion CCP1
disable_interrupts(INT_EXT); //deshabilitar interrupcion RB0
disable_interrupts(INT_SSP); //deshabilitar interrupcion I2C / SPI
setup_TIMER_0(RTCC_INTERNAL | RTCC_DIV_128); //preescaler=128 para 1seg
setup_TIMER_1(T1_DISABLED); //desactivar timer1
setup_TIMER_2(T2_DISABLED,0,1); //desactivar timer2
setup_CCP1(CCP_OFF); //desactivar modulo captura
setup_SPI(SPI_SS_DISABLED); //desactivar SPI
setup_ADC_PORTS(AN0); //entradas analogicas
setup_ADC(ADC_CLOCK_INTERNAL); //activar modulo ADC
set_tris_a(0b00000001); //configuracion de los puertos
set_tris_b(0b00011111);
set_adc_channel(0);
ext_int_edge(H_TO_L); //interrupcion externa en flanco de bajada
port_b_pullups(TRUE); //pullups portb activadas
enable_interrupts(INT_AD); //habilitar interrupcion ADC
enable_interrupts(INT_TIMER0); //interrupcion del timer0
enable_interrupts(GLOBAL); //interrupciones activadas
lcd_init();
delay_ms(50);
do
{
if(flag_seg==1)
{
flag_seg=0;
valor_adc=read_adc();
delay_ms(50);
printf(lcd_putc,"\f");
printf(lcd_putc,"Tension: %uV", valor_adc);
}
}while(TRUE);
}
Como véis he desactivado todo lo posible para evitar tener algún problema con eso, pero nada, no hay forma.
Un saludo y gracias!!