bueno me alegro que lo hayas solucionado!!!!
me parece interesante si es que tenes tiempo que hagas un pequeño comentario de que parte del programa era el que te estaba trabando ,y como lo solucionaste, asi podemos tener una base de datos con esos "trucos" o cosas que a veces se nos pasan por alto.
un Abrazo
Hola de nuevo fastyx!!
Pues al parecer era un problema de tiempos al cambiar de canal con el mux y al hacer la conversion, pero al utilizar la interrupcion de AD parece ser que se ha solucionado. Pongo el codigo de la prueba que he realizado por si a alquien le sirve.
Saludos!
#include <18F2525.h>
#device ICD=TRUE
//#define *=16
#device ADC=8
//------Declaraciones para el compilador-------
#use delay(clock =19660800) //frecuencia de reloj
#use i2c(master,sda=PIN_C4, scl=PIN_C3,FORCE_HW)
#use rs232(baud=19200, xmit=PIN_C6, rcv=PIN_C7) //configuracion puerto serie
//#fuses HS,WDT,PUT,NOPROTECT,BROWNOUT
#fuses HS, NOPROTECT, NOPUT,NOBROWNOUT,NOLVP,NOCPD,WRT
//#use standard_io ( a )
#use fast_io(A)
int8 VALUE;
int canal=0;
int ok=FALSE;
int dato;
float valor;
float calibracion;
void calibrar(void){
int i;
float total;
float suma;
canal=4;
set_adc_channel(0);
read_adc(ADC_START_ONLY);
OUTPUT_A(canal<<1);
// for(i=0; i<10; i++){
if(ok==TRUE){
delay_ms(10);
read_adc(ADC_START_ONLY);
// suma+=(float)VALUE;
delay_ms(1);
ok=FALSE;
}
// }
// suma/=10;
total= (float)VALUE*4.98/255;
calibracion=4.98-total;
printf("\r\n%1.2f",calibracion);
printf(" \r\nvalor calibracion: %1.2f",calibracion);
printf(" \r\nvalor : %1.2f",total);
printf(" \r\nvalor total: %1.2f",(total+calibracion));
}
float convertir (int channel){
int canal;
int cont=0;
float promedi=0.00;
canal=channel;
while(cont!=5){
if(ok==TRUE){
OUTPUT_A(canal<<1);
delay_ms(1);
read_adc(ADC_START_ONLY);
valor=(float)VALUE*4.98/255;
valor+=calibracion;
// printf("\r\n%u:%1.2f",canal,valor);
promedi+=valor;
cont++;
delay_ms(1);
ok=FALSE;
}
}
cont=0;
promedi/=5;
return(promedi);
}
void main (void)
{
float promedio=0.00;
int numero_canal=0;
SET_TRIS_A(0b00000001);
SET_TRIS_B(0x00);
setup_adc(ADC_CLOCK_INTERNAL);
setup_adc_ports(AN0);
set_adc_channel(0);
read_adc(ADC_START_ONLY);
disable_interrupts(global);
enable_interrupts(INT_RDA);
enable_interrupts(INT_AD);
enable_interrupts(global);
calibracion=0.00;
calibrar();
delay_ms(50);
while(1){
numero_canal=0;
promedio=convertir(numero_canal);
printf("\r\n%u:%1.2f",numero_canal,promedio);
delay_ms(10);
numero_canal=1;
promedio=convertir(numero_canal);
printf("\r\n%u:%1.2f",numero_canal,promedio);
delay_ms(10);
numero_canal=2;
promedio=convertir(numero_canal);
printf("\r\n%u:%1.2f",numero_canal,promedio);
delay_ms(10);
numero_canal=3;
promedio=convertir(numero_canal);
printf("\r\n%u:%1.2f",numero_canal,promedio);
delay_ms(10);
numero_canal=4;
promedio=convertir(numero_canal);
printf("\r\n%u:%1.2f",numero_canal,promedio);
delay_ms(10);
}
}
#INT_AD
Conversion_Ad()
{
VALUE= READ_ADC(ADC_READ_ONLY);
delay_us(10);
read_adc(ADC_START_ONLY);
ok=TRUE;
}
#INT_RDA //Tratamiento de la interrupcion por recepcion
void rs232_isr(void)
{
dato=getch();
}