Autor Tema: Lectura ADC continua en CCS  (Leído 3040 veces)

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

Desconectado marcoscab1166

  • PIC12
  • **
  • Mensajes: 57
Lectura ADC continua en CCS
« en: 07 de Noviembre de 2015, 13:01:24 »
hola muchachos hoy les presento una duda que se me ocurrio experimentando con el modulo AD de los pic. Como sabran la mayoria de los pic con puertos analogos tienen la interrupcion AD, que ejecuta una funcion cuando termina de leerse el puerto analogico especificado. Se me ocurrio que, si pongo un read_adc() al final de la funcion, junto con un sistema para que cambie automaticamente de canal, la interrupcion se ejecutaria en un ciclo fijo indefinidamente cada vez que termine de leer el AD. Solo haria falta poner un read_adc al principio del programa para iniciar el ciclo. Quedaria asi:
Código: [Seleccionar]
int i=0;       //variable para cambiar de canal analogo
int a=0;      //variable para cambiar direccion de los datos
char dato[];    //string para guardar datos

#int_AD
void  AD_isr(void)
{
 i++;           //siguiente canal
 set_adc_channel(i);
 if(valor>100){        //esto lo hago para representar
  dato[a]='1';}        //el tratamiento de los datos
 else{
  dato[a]='0';}
 a++;          //siguiente direccion de datos
 valor=read_adc();
}

void main(){
   setup_adc_ports(ALL_ANALOG|VSS_VDD);
   setup_adc(ADC_CLOCK_INTERNAL);
   enable_interrupts(INT_AD);
   enable_interrupts(global);
   set_adc_channel(0);
   delay_ms(1);
   valor=read_adc();

   while(1){
   }
}

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Lectura ADC continua en CCS
« Respuesta #1 en: 07 de Noviembre de 2015, 13:50:36 »
Esta bien la suposicion, pero esta mal aplicado.

Por que read_adc() es una funcion bloqueante. es decir espera hasta que exista un valor, lo cual estarias ese tiempo de espera dentro de la interrupcion.
No se si CCS provee otra alternativa a esto. O directamente tener que modificar los registros.

Ademas tenes que al cambiar el canal, tenes que esperar un tiempo para que la tension del capacitor de S/H este al nivel de la señal nueva, lo cual en una interrupcion significaria poner una demora dentro. Y es algo malo poner una demora en una interrupcion.

Pensando en esto podrias crear un codigo que tenga esas consideraciones.
Creo que lo mas correcto seria usar un timer para dar los valores a realizar. Y directamente no usas la interrupcion de A/D
El timer que tenga un tiempo que sea = Tiempo de conversion o tiempo para que se acomode la señal con el cambio de canal ( el que sea mayor )
De esa forma podes en la interrupcion del timer:

Mirar el flag de interrupcion de ADC ( te va a permitir saber si es la primera ves que entra (flag = 0) o no (flag = 1) )
Si es la primera ves que entra inicias la conversion y salis ( ya que en la configuracion habras puesto que era el canal 0 )
Si es la segunda ves tomas el dato, borras el flag, y cambias de canal, y salis

Es decir una entrada para tomar el dato y cambiar de canal, y otra entrada para iniciar la conversion.
Creo que seria lo mas factible para hacer un barrido sin usar demoras o loops infinitos ( funciones bloqueantes ). AL menos es lo unico que se me ocurrio en el momento

PD: No se si es posible una ves iniciada la conversion el cambiar de canal, si es asi por cada entrada al timer podes hacer las 2 cosas.
Te digo por que cuando inicia la conversion, deberia de aislarse con el valor de entrada. Por lo tanto seria valido hacerlo, pero yo no se como se maneja internamente el PIC, por eso propuse lo anterior, sino directamente cuando entra de nuevo, inicias la conversion y cambias de canal en el mismo momento.
« Última modificación: 07 de Noviembre de 2015, 15:14:03 por KILLERJC »

Desconectado RALF2

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 2060
Re:Lectura ADC continua en CCS
« Respuesta #2 en: 07 de Noviembre de 2015, 15:49:56 »
Si no mal recuerdo Cuando el adc termina de relizar una conversion, el programa salta a la rutina de interrupcion y luego con read_adc() obtienes el valor leido por el adc  :mrgreen:
Asi no pierdes tiempo, porque al entrar en la interrupcion ya el valor del adc lo tienes listo!

Saludos

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Lectura ADC continua en CCS
« Respuesta #3 en: 07 de Noviembre de 2015, 17:41:16 »
O sea que el primero tenes que si o si iniciarlo de otra forma ? O ya el adc_read() comprueba dentro primero si ya existe un valor antes de pedir una nueva lectura ?
Tiene 2 rutinas segun tenga o no resultado? Sino volveria a quedarse esperando.

Pienso que es bloqueante por que basicamente podes hacer un variable = adc_read() y ya en variable tenes el resultado, la unica forma que podes hacer eso es si espera que termine la conversion.
« Última modificación: 07 de Noviembre de 2015, 18:18:36 por KILLERJC »

Desconectado RALF2

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 2060
Re:Lectura ADC continua en CCS
« Respuesta #4 en: 07 de Noviembre de 2015, 20:07:04 »
Para que la configuracion del adc sea automatica se debe configurar previamente el modulo CCP en modo de disparo especial y luego utilizar la interrupcion para leer el valor obtenido por medio de Value= adc_read(adc_reaad_only)  :mrgreen:

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Lectura ADC continua en CCS
« Respuesta #5 en: 07 de Noviembre de 2015, 20:21:19 »
Perfecto, ahora entendi. Esperemos que marcoscab entienda tambien como realizarlo.

Para marcoscab, RALF dice de usar el modulo CCP+timer el cual dispararia la conversion del ADC, entonces en tu interrupcion ( unicamente la del ADC) leerias el valor y cambiarias de canal. Solo el CCP nuevamente va a dispararse para realizar la proxima conversion.

Desconectado RALF2

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 2060
Re:Lectura ADC continua en CCS
« Respuesta #6 en: 07 de Noviembre de 2015, 20:27:47 »
Citar
Para marcoscab, RALF dice de usar el modulo CCP+timer el cual dispararia la conversion del ADC, entonces en tu interrupcion ( unicamente la del ADC) leerias el valor y cambiarias de canal. Solo el CCP nuevamente va a dispararse para realizar la proxima conversion.
Esa es la idea  :mrgreen:


 

anything