Autor Tema: interrupcion por A/D  (Leído 4140 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado micro_pepe

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 3206
interrupcion por A/D
« 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.
Se obtiene más en dos meses interesandose por los demás, que en dos años tratando de que los demás se interesen por ti.

新年快乐     的好奇心的猫死亡

Desconectado grouchy

  • PIC10
  • *
  • Mensajes: 39
RE: interrupcion por A/D
« Respuesta #1 en: 16 de Febrero de 2006, 10:21:00 »
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..............SALUDOSRebotado

Desconectado micro_pepe

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 3206
RE: interrupcion por A/D
« Respuesta #2 en: 17 de Febrero de 2006, 11:47:00 »
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.
Se obtiene más en dos meses interesandose por los demás, que en dos años tratando de que los demás se interesen por ti.

新年快乐     的好奇心的猫死亡

Desconectado pocher

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 2568
RE: interrupcion por A/D
« Respuesta #3 en: 17 de Febrero de 2006, 21:28:00 »
Una vez solo en el main

Desconectado micro_pepe

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 3206
RE: interrupcion por A/D
« Respuesta #4 en: 20 de Febrero de 2006, 16:33:00 »
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);
}
Se obtiene más en dos meses interesandose por los demás, que en dos años tratando de que los demás se interesen por ti.

新年快乐     的好奇心的猫死亡

Desconectado micro_pepe

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 3206
RE: interrupcion por A/D
« Respuesta #5 en: 21 de Febrero de 2006, 13:26:00 »
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.
Se obtiene más en dos meses interesandose por los demás, que en dos años tratando de que los demás se interesen por ti.

新年快乐     的好奇心的猫死亡


 

anything