Gràcias a todos por las respuestas pero acabo de probar de alimenar directamente la entrada analógica con 5V sin la etapa amplificadora y el problema persiste, aunque le entre 5V el PIC ve 4V. Además el problema de swing ja lo tuve en su momento y por eso alimento el operacional com -8V y 8V.
Despues de la prueba de hoy de conectar directamente 5V y que no funcione veo que el problema es del PIC o de la programación. Os dejo el codigo del programa.
#include <16f876.h>
#device adc=10
#FUSES XT,NOWDT
#use delay (clock=2000000)
#include <lcd420.c>
float b;
float valor;
float G=1.0;
int8 unitat=1;
short n=0;
////////////////////////////////////////////////////////////////////////////////
// Funciones del programa //
////////////////////////////////////////////////////////////////////////////////
void menu2()
{
printf(lcd_putc, "1-GAUSS 2-TESLA\n");
printf(lcd_putc, "3-VOLT 4-ANT\n");
}
void menu1()
{
printf(lcd_putc, "1-MESURA\n");
printf(lcd_putc, "2-UNITATS 3-SEG\n");
}
void menu3()
{
printf(lcd_putc, "1-GUANY 3-ANT\n");
printf(lcd_putc, "\n");
}
void ant4()
{
printf(lcd_putc, "\n 4-ANT");
}
void menys()
{
printf(lcd_putc, "\fG=%01.2f 4-ANT" , G);
printf(lcd_putc, "\n1:- 2:0.1 3:0.01");
delay_ms(250);
}
void mes()
{
printf(lcd_putc, "\fG=%01.2f 4-ANT\n" , G);
printf(lcd_putc, "1:+ 2:0.1 3:0.01\n");
delay_ms(250);
}
////////////////////////////////////////////////////////////////////////////////
// Función principal del programa //
////////////////////////////////////////////////////////////////////////////////
// //
////////////////////////////////////////////////////////////////////////////////
// Inicialización del programa //
////////////////////////////////////////////////////////////////////////////////
void main() {
setup_adc_ports(all_analog);
setup_adc(ADC_CLOCK_INTERNAL);
lcd_init();
printf(lcd_putc, " BENVINGUTS\n");
delay_ms(2000);
printf(lcd_putc, "\f");
printf(lcd_putc, " GAUSSIMETRE\n");
printf(lcd_putc, " DIGITAL");
delay_ms(2000);
inici:
printf(lcd_putc, "\f");
for (;
{
menu1();
///////////////////////////////////////////////////////////////////////////////
// Programa para la medida //
////////////////////////////////////////////////////////////////////////////////
if(input(pin_c0)==0)
{
while (input(pin_c0)==0)
{
menu1();
}
while (input(pin_c3)==1)
{
set_adc_channel(0);
valor=read_adc();
delay_ms(20);
set_adc_channel(1);
b=read_adc();
delay_ms(20);
b=2.0*b/1024.0;
valor=(5.0*valor/1024.0);
if (input(pin_c4)==1)
{
if (unitat==1)
{
valor=((G*200.0*valor)-(b*500));
printf(lcd_putc, "\f %04.2f Gauss", valor);
ant4();
delay_ms(250);
}
else if (unitat==3)
{
printf(lcd_putc, "\f %01.2f Volts", valor);
ant4();
delay_ms(250);
}
else if (unitat==2)
{
valor=((G*200.0*valor)-(b*500));
valor=valor*0.1;
printf(lcd_putc, "\f %04.2f mTeslas", valor);
ant4();
delay_ms(250);
}
}
else if (input(pin_c4)==0)
{
if(unitat==1)
{
valor=((G*1000.0*valor)-(b*2500.0));
printf(lcd_putc, "\f %04.2f Gauss", valor);
ant4();
delay_ms(250);
}
else if (unitat==3)
{
printf(lcd_putc, "\f %01.2f Volts", valor);
ant4();
delay_ms(250);
}
else if (unitat==2)
{
valor=((G*1000.0*valor)-(b*2500.0));
valor=valor*0.1;
printf(lcd_putc, "\f %04.2f mTeslas", valor);
ant4();
delay_ms(250);
}
}
}
goto inici;
}
///////////////////////////////////////////////////////////////////////////////
// Programa para el cambio de unidades //
////////////////////////////////////////////////////////////////////////////////
if(input(pin_c1)==0)
{
while (input(pin_c1)==0)
{
menu1();
}
printf(lcd_putc, "\f");
for(;
{
menu2();
if(input(pin_c0)==0)
{
while (input(pin_c0)==0)
{
menu2();
}
printf(lcd_putc, "\f");
unitat=1;
printf(lcd_putc, " MESURA GAUSS\n");
delay_ms(1000);
goto inici;
}
if(input(pin_c1)==0)
{
while (input(pin_c1)==0)
{
menu2();
}
printf(lcd_putc, "\f");
unitat=2;
printf(lcd_putc, " MESURA TESLAS\n");
delay_ms(1000);
goto inici;
}
if(input(pin_c2)==0)
{
while (input(pin_c2)==0)
{
menu2();
}
printf(lcd_putc, "\f");
unitat=3;
printf(lcd_putc, " MESURA VOLTS\n");
delay_ms(1000);
goto inici;
}
if(input(pin_c3)==0)
{
goto inici;
}
}
}
///////////////////////////////////////////////////////////////////////////////
// Programa para la variación de la ganancia //
////////////////////////////////////////////////////////////////////////////////
if(input(pin_c2)==0)
{
while (input(pin_c2)==0)
{
menu1();
}
printf(lcd_putc, "\f");
for(;
{
menu3();
if(input(pin_c0)==0)
{
while (input(pin_c0)==0)
{
menu3();
}
tornar:
printf(lcd_putc, "\f");
if(n==0)
{
for(;
{
mes();
if (input(pin_c0)==0)
{
while (input(pin_c0)==0)
{
mes();
}
n=1;
goto tornar;
}
else if (input(pin_c1)==0)
{
while (input(pin_c1)==0)
{
mes();
}
G=G+0.1;
goto tornar;
}
else if (input(pin_c2)==0)
{
while (input(pin_c2)==0)
{
mes();
}
G=G+0.01;
goto tornar;
}
else if (input(pin_c3)==0)
{
while (input(pin_c3)==0)
{
mes();
}
goto inici; &n