El operacional es un TLC272 y el circuito es un seguidor tal cual. El cable común del potenciómetro lo conecto a la entrada + del AO (pin3), la pata - del AO (pin2) la llevo a la salida (pin1) y la alimentación es de 12V (pin8) y la masa en el pin4.
Esta configuración tal cual, sin el PIC, funciona perfectamente, la entrada se replica a la salida sin problema. Si mido el pin del ADC sin nada conectado leo 0V. Si conecto el ADC a la salida del AO (pin1) ese pin pasa a valer de 0 a 1V ´(sólo en un pequeño margen, en el resto vale 0) según donde esté el potenciómetro en lugar de dar de 0 a 5V. Parece como si el PIC impusiera la tensión en ese pin del AO. En la entrada + del AO sigue habiendo la tensión correcta.
Os pego el código por si acaso:
#include <16F818.h> //PIC a utilizar
#device adc=10 //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
#byte ADCON0=0x1F //parametros ADC
#byte ADCON1=0x9F
#byte ADH=0x1E
#byte ADL=0x9E
#include <flex_lcd.c> //libreria LCD
int nClocks=0, nDelay=0, flag_seg=0;
#INT_TIMER2
void Interrupcion_Timer2() //interrupcion cada 5ms
{
nDelay++;
if(nDelay==200)
{
nDelay=0;
flag_seg=1;
output_high(LED);
}
else
{
output_low(LED);
}
}
void main(void)
{
int16 valor_adc=0;
int decimales=0;
int unidades=0;
int wind_dir=0;
disable_interrupts(GLOBAL); //deshabilitar interrupciones
disable_interrupts(INT_EEPROM); //deshabilitar interrupcion EEPROM
disable_interrupts(INT_RB); //deshabilitar interrupcion portb
disable_interrupts(INT_TIMER0); //deshabilitar interrupcion del timer0
disable_interrupts(INT_TIMER1); //deshabilitar interrupcion timer1
disable_interrupts(INT_CCP1); //deshabilitar interrupcion CCP1
disable_interrupts(INT_SSP); //deshabilitar interrupcion I2C / SPI
disable_interrupts(INT_AD); //deshabilitar interrupcion ADC
disable_interrupts(INT_EXT); //deshabilitar interrupcion RB0
setup_TIMER_0(RTCC_INTERNAL | RTCC_DIV_1); //preescaler=1
setup_TIMER_1(T1_DISABLED); //desactivar timer1
setup_TIMER_2(T2_DIV_BY_1,255,16); //preescaler=16
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_adc_channel(0);
set_tris_a(0b00000001); //porta todo como salida menos A0
ext_int_edge(H_TO_L); //interrupcion externa en flanco de bajada
port_b_pullups(TRUE); //pullups portb activadas
ADCON0=0b11000001; //configurar ADC
ADCON1=0b10001110;
enable_interrupts(INT_TIMER2); //habilitar interrupcion timer2
enable_interrupts(GLOBAL); //interrupciones activadas
lcd_init();
delay_ms(50);
output_a(0b0001000);
do
{
if(flag_seg==1)
{
flag_seg=0;
valor_adc=read_adc();
wind_dir=valor_adc/2,8417;
printf(lcd_putc,"\f");
lcd_gotoxy(1,1);
printf(lcd_putc,"ADC=%lu", valor_adc);
lcd_gotoxy(1,2);
printf(lcd_putc,"Dirección=%u", wind_dir);
}
}while(TRUE);
}