Como no usar delay en la conversión A/D

#1
Normalmente para usar el conversor del pic 16f877 uso estas instrucciones:
Código:
set_adc_channel(0);		//aca selecciono el canal de la conversion
v=read_adc();	delay_us(500);  // aca se guarda el valor de la conversion en la variable “v” y hace una espera de medio milisegundo para que termine la conversion
Mi problema es que no puedo usar el delay porque me traba el programa, probe sin poner el delay pero el valor que toma es erroneo o inestable.
Me dijeron que hay un registro que te avisa cuando la conversion esta lista, pero nose cuál es ni como usarlo en ccs. Alguien me puede ayudar?
Gracias y saludos
 
#2
Bueno Vegetal Digital yo usaria una interrupcion por timer 0 o 1, que cada 1mS se desbordara y tome el valor del read_adc.

por ejemplo..

#INT_TIMER0 //Se cumplio el desbordamiento cada 1mS
void timer1(void){
set_adc_channel(0);
x=read_adc();
set_timer0(tiempo para 1mS);
}

algo asi....

para que tenga tiempo para hacer la conversion
 
#5
Hola

Creo que es incorrecto lo que comentabas. Cuando pones v = readadc(), lee el ADC y te devuelve inmediatamente el valor (lo que tarde en leerse el ADC). Si después de eso añades el delay(), lo que consigues es:

- Lees el ADC
- Y luego esperas (¿para qué, si ya lo has leído? -> El delay después sobra)

Espero que se entienda... Si lo que quieres es tener la medida estable, tendrías que poner el delay después de seleccionar el canal y antes de leerlo:

set_adc_channel(0);
delay_us(500);
v=read_adc();

Un saludo
 
#7
Para mejorar las medidas lo mejor es hacer un promediado o una mediana.

Tomas ocho medidas y las sumas y despues las divides por ocho. o lo que es lo mismo mides y sumas ocho veces y rotas a la derecha 3 veces.

Un metodo mejor es el siguiente:
while
resultado=(resultado_tmp+ medida) >>1 "divido por 2"
resultado_tmp=resultado;


Pero tiene un inconveniente que las primeras medidas son malas, aunque si sabemos mas o menos los valores de partida rapidamente tomara el valor mas proximo al real.
 
Arriba