TODOPIC
Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: micro_pepe en 14 de Febrero de 2006, 13:47:00
-
Hola, tengo una duda a cerca de la interrupcion en ccs con el conversor a/d.
Si yo pongo la instruccion: i=read_adc();
¿inmediatamente despues se ejecuta la siguiente instruccion, y cuando termine la conversión salta a la rutina de interrupción?
y ademas ¿cuando, la variable i tiene un valor valido?¿al saltar la interrupción?
Por otro lado me gustaria saber cuanto tiempo se debe esperar al cambiar de un canal de adquisicion a otro antes de una nueva conversion.
Saludos y gracias por atenderme.
-
Escrito originalmente por micro_pepe
Hola, tengo una duda a cerca de la interrupcion en ccs con el conversor a/d.
Si yo pongo la instruccion: i=read_adc();
¿inmediatamente despues se ejecuta la siguiente instruccion, y cuando termine la conversión salta a la rutina de interrupción?
y ademas ¿cuando, la variable i tiene un valor valido?¿al saltar la interrupción?
Por otro lado me gustaria saber cuanto tiempo se debe esperar al cambiar de un canal de adquisicion a otro antes de una nueva conversion.
Saludos y gracias por atenderme.
No, mira si quieres ocupar la interrupcion del ADC tienes que hacer lo siguiente:
#INT_AD
AD_isr()
{
i=read_ADC(ADC_READ_ONLY);
valor_i_valido=TRUE;
}
void main()
{
.
.
.
enable_interrupts(INT_AD);
enable_interrupts(GLOBAL);
valor_i_valido=FALSE
x=read(ADC_START_ONLY); // Se ejecuta y luego salta a la siguiente instrucción, no se espera..
.
.
.
if (valor_i_valido==TRUE)
{Introduces lo que quieres hacer con el valor i}
}
Con lo del tiempo de espera para cambiar de canal, yo te recomiendo que hagas un delay_ms() de 1 ms, y yo creo que es suficiente..........
Otra cosa, hay una directiva que se ocupa para obtener el valor del ADc, la cual es #device ADC=10 o #DEVICE ADC=8, no se si para el pic q estas ocupando aplica, es decir de cuantos bits es el ADC interno del micro????
Si es de 10, entonces puedes ocupar ambas directivas que mencione, solo que hay que hacer una correcion, cuando definas el valor i lo tienes que hace de la siguiente manera
Si ocupas #DEVICE ADC=10 entonces int16 i=0; los valores de i van desde 00 hasta 0x03FF
Si ocupas #device ADC=8 entonces int i=0; los valores de i van desde 0 hasta 255, ojo aqui solo se toman los 8 bits menos signifdicativos
Espero haberte ayudado aunque sea un poco..............SALUDOS
-
Muchas gracias grouchy, me has resuelto muchas dudas.
Ahora una mas, la instruccion:
setup_adc(ADC_CLOCK_DIV_32);
es necesario ponerla cada vez que se lee el conversor, o solamente una vez en la inicialización del main.
Saludos y gracias.
-
Una vez solo en el main
-
Hola de nuevo, estoy probando este programita en Proteus para medir el voltaje del canal 0, usando interrupcion del A/D, y me pone la variable i siempre a cero. Me pregunto si el Proteus no simula el conversor A/D, o si el programa está mal hecho.
Gracias por su atencion.
--------------------------------------------------------------------------------------------------
# include <16F876a.h>
# DEVICE ADC=10 //ADC usa 10 bit
# use delay(clock=4000000)
# fuses XT,NOWDT,NOPROTECT,NOLVP
# define use_portb_lcd TRUE
# include <lcd.c>
# USE FAST_IO(A)
# USE FAST_IO(B)
# USE FAST_IO(C)
int16 i;
# INT_AD
AD_isr(){
i=Read_ADC(ADC_READ_ONLY);
Read_ADC(ADC_START_ONLY);//inicia nueva conversion.
}
void main(){
lcd_init();
Setup_ADC_Ports(RA0_RA1_ANALOG_RA3_REF);
Setup_ADC(ADC_CLOCK_DIV_64);
enable_interrupts(INT_AD);
enable_interrupts(GLOBAL);
Set_ADC_Channel(0);
delay_ms(1);
Read_ADC(ADC_START_ONLY);
do{
lcd_gotoxy(1,1);
printf(lcd_putc," Salida: ");
printf(lcd_putc,"
%Lu ",i);
}while(1);
}
-
Asunto solucionado, el problema era la fuente que estaba poniendo como referencia y como entrada, en lugar de esta, hay que poner un estimulo que está en un icono de la barra de erramientas.
Saludos.