TODOPIC

Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: jfmateos2 en 25 de Enero de 2008, 14:51:12

Título: Cuánto tiempo requiere el conversor ADC
Publicado por: jfmateos2 en 25 de Enero de 2008, 14:51:12
Estoy usando un 18F2455 con la siguiente configuración:

Código: [Seleccionar]
   setup_adc_ports(PIN_B0);
   setup_adc(ADC_CLOCK_INTERNAL);
   set_adc_channel(12);

y tengo el siguiente código:
Código: [Seleccionar]
   do{
      value = read_adc();
      if (value>UMBRAL){
         break;
      }     
   }while(true);

A. ¿Debería introducir una pausa después de value=read_adc() para que dé tiempo a que se efectúe la conversión?

B. ¿Cómo se configura el número de muestras que se tienen en cuenta en la conversión, en otras palabras, cuánto tiempo requiere la conversión?

C. ¿En caso de A afirmativa, sería más apropiado utilizar el siguiente código que el anterior para evitar introducir la pausa?
Código: [Seleccionar]
   read_adc(ADC_START_ONLY);
   do{
      value = read_adc(ADC_READ_ONLY);
      if (value>UMBRAL){
         break;
      }     
   }while(true);

Gracias. Me temo que no entiendo en absoluto cómo funciona el conversor ADC.
Título: Re: Cuánto tiempo requiere el conversor ADC
Publicado por: PalitroqueZ en 25 de Enero de 2008, 15:00:53
Hola jfmateos2

lo ideal es que le metas un retardo lo suficientemente largo para aproximar la conversión (que depende de la R de carga)

mira en la datasheet, hablan que existe un retardo por hardware mediante los registros ACQT2:ACQT0 en ADCON2

una vez hice unos ensayos con el 4550

http://www.todopic.com.ar/foros/index.php?topic=15208.msg97194#msg97194
Título: Re: Cuánto tiempo requiere el conversor ADC
Publicado por: jfmateos2 en 25 de Enero de 2008, 15:12:04
Gracias Palitroquez; estoy echando un vistazo a tu enlace.

De momento he descubierto que el segundo código que puse (y que repito a continuación) no funcionaría, pues al ejecutar read_adc(ADC_START_ONLY) parece ser que se ejecuta una única conversión.

Código: [Seleccionar]
  read_adc(ADC_START_ONLY);
   do{
      value = read_adc(ADC_READ_ONLY);
      if (value>UMBRAL){
         break;
      }     
   }while(true);
Título: Re: Cuánto tiempo requiere el conversor ADC
Publicado por: maunix en 25 de Enero de 2008, 16:23:07
jfmateos2 si quieres ver la limitante de hardware, te dejo un par de hilos que te pueden interesar

http://www.todopic.com.ar/foros/index.php?topic=14529.msg88942#msg88942


http://www.todopic.com.ar/foros/index.php?topic=12529.0
Título: Re: Cuánto tiempo requiere el conversor ADC
Publicado por: reiniertl en 25 de Enero de 2008, 16:35:10
Si usas read_adc(READ_ONLY) es porque usarás la interrupción para leer el dato, y tendrías que previamente haber iniciado el proceso de conversión con una llamada del tipo read_adc(ADC_START_ONLY)

Si lo que quieres es inicar el proceso de conversión y leer el conversor cuando este termine usando el método de encuesta, no te queda más remedio que usar read_adc(ADC_START_AND_READ), para ello puedes usar el segundo código con este tipo de llamada.

Las otras dos formas permitidas implican inicar el proceso de conversión y luego o esperar un tiempo o consultar constantemente la bandera de fin de conversión o utilizar read_adc(ADC_START_AND_READ) que hace precisamente eso.

Si optas por las INT utilizarás read_adc(ADC_START_ONLY) en alguna parte del programa para iniciar el proceso de conversión y en la ISR del converso utilizarías read_adc(READ_ONLY) para obtener el valor del dato.

Saludos
Reinier
Título: Re: Cuánto tiempo requiere el conversor ADC
Publicado por: jfmateos2 en 25 de Enero de 2008, 17:12:31
Maunix, la explicación del primer enlace que me pusiste es excelente. Muchas gracias.

Reiniertl, maunix: entonces entiendo que este código no es correcto

Código: [Seleccionar]
   do{
      value = read_adc();
      if (value>UMBRAL){
         break;
      }     
   }while(true);

porque entre dos llamadas consecutivas a read_adc() debo esperar 2TADs ¿es así?, pero... lo que no sé calcular es cuánto tiempo es 2TAD utilizando estos valores:

Código: [Seleccionar]
#use delay(clock=48000000)
setup_adc(ADC_CLOCK_INTERNAL);
Título: Re: Cuánto tiempo requiere el conversor ADC
Publicado por: reiniertl en 25 de Enero de 2008, 17:23:42
con read_adc(ADC_START_AND_READ) ya no tienes que calcular nada, esta función se encarga de encuestar la bandera de fin de conversión hasta que el conversor termina de convertir. Puesto que el tiempo que demora la conversión dependerá de muchos factores, entre ellos la frecuencia del oscilador, el nivel de tensión de la señal medida y el circuito equivalente conectado a la entrada del ADC.

Así que no te calientes mucho con eso de cuanto esperar ni nada de eso, si trabajas por encuesta utiliza read_adc(ADC_START_AND_READ), si trabajas por INT utiliza las otras dos.

Saludos
Reinier
Título: Re: Cuánto tiempo requiere el conversor ADC
Publicado por: jfmateos2 en 25 de Enero de 2008, 17:26:08
Gracias reiniertl,

el problema es que obtengo el siguiente mensaje al depurar en mplab

Código: [Seleccionar]
ADC-W0012: Selected channel 12 is an invalid channel.
ADC-W0010: A Minimum of 2 TADs are required before another conversion should be started.
Título: Re: Cuánto tiempo requiere el conversor ADC
Publicado por: maunix en 25 de Enero de 2008, 17:54:34
jfmateos2 no tomes todo a literal, lo de 2Tad es para los 16F, para el pic que tu usas es 3Tad.  Te pego el extracto del datasheet

For next conversion, go to step 1 or step 2, as required. The A/D conversion time per bit is
defined as TAD. A minimum wait of 3 TAD is required before the next acquisition starts.


For correct A/D conversions, the A/D conversion clock (TAD) must be as short as possible but greater than the
minimum TAD (see parameter 130 in Table 28-29 for more information).
Table 21-1 shows the resultant TAD times derived from the device operating frequencies and the A/D clock
source selected.



Así que no te calientes mucho con eso de cuanto esperar ni nada de eso, si trabajas por encuesta utiliza read_adc(ADC_START_AND_READ), si trabajas por INT utiliza las otras dos.
No estoy de acuerdo o no te comprendí, según lo que yo sé hay que esperar si o si.  Los 3Tad entre Starts de las conversiones es una limitante del módulo. 

jfmateos2 si lo que sigue al read ocupa 3Tad entonces no tendrás que preocuparte.  Ese warning puede que te lo de el MPLAB ni bien enciendes el módulo A/D.  Si te lo hace siempre en todas las ocurrencias del bucle entonces sí, de seguro estas haciendo algo mal. 

Lo que tienes que hacer es calcular el TAD, para ello debieras conocer de cuanto es la división que estas usando en el módulo A/D.  Si el CCs te setea todo en forma automática para saber bien hará que digas como queda cargado el registro ADCON2.

Otra cuestión que no es menor, fíjate que te está advirtiendo que estás queriendo leer el canal 12 del A/D siendo que tu micro no lo tiene.
Título: Re: Cuánto tiempo requiere el conversor ADC
Publicado por: reiniertl en 25 de Enero de 2008, 18:00:08
Eso pensaba yo, que el error estaba en que quería leer el canal 12 que no existe, el resto de las cosas tendré que refrescarlas en los datasheets del uC.

Así que sin más, amigo maunix, voy a sumergirme en los profundos mundos de la existencia de los PICs, preparando...

¡DATSSHEET A MI!

PD: Y después alguien por aquí anda diciendo que la teoría no sirve para nada, simplemente PAMPLINAS




Título: Re: Cuánto tiempo requiere el conversor ADC
Publicado por: maunix en 25 de Enero de 2008, 18:13:12
Eso pensaba yo, que el error estaba en que quería leer el canal 12 que no existe, el resto de las cosas tendré que refrescarlas en los datasheets del uC.
Así que sin más, amigo maunix, voy a sumergirme en los profundos mundos de la existencia de los PICs, preparando...
¡DATSSHEET A MI!
PD: Y después alguien por aquí anda diciendo que la teoría no sirve para nada, simplemente PAMPLINAS

Jijiji.  Es cierto, hay que leer los datasheets.  Yo los suelo leer cuando uso un micro nuevo y trato de repasarlos si haré alguna aplicación que sea crítica en tiempos, etc.   Esto de esperar los TAD aplica cuando uno quiere leer el módulo A/D a máxima velocidad, si uno lo lee cada X tiempo entonces no hace falta tenerlo en cuenta.  ;)

Por eso cuando surje la disyuntiva de si comenzar por el assembly o el C ó Basic, digo que programar en assembly permite aprender esas cuestiones profundamente, para eso sirve bastante saberlo, para conocer bien la arquitectura y sus limitaciones.  Luego usar el C o Basic para programar más velozmente.
Título: Re: Cuánto tiempo requiere el conversor ADC
Publicado por: jfmateos2 en 25 de Enero de 2008, 19:03:28
Si el canal 12 no existe ahora ya sí que me he liado del todo ¿Qué canal le corresponde al pin AN12?¿el 11?

(http://img233.imageshack.us/img233/8784/canal12ps4.th.jpg) (http://img233.imageshack.us/my.php?image=canal12ps4.jpg)

¡qué follón tengo! Cuanto más leo el datasheet más me lío. Lo voy a dejar para mañana.
Título: Re: Cuánto tiempo requiere el conversor ADC
Publicado por: Jorge_ en 25 de Enero de 2008, 20:32:01
Yo creo que es el AN9, porque si abres el Stimulus tienes desde el AN0 al AN9, y en el datasheet dice que el AN5,AN6 yAN7 no estan implementados, y entonces 12 - 3 = 9
Título: Re: Cuánto tiempo requiere el conversor ADC
Publicado por: maunix en 25 de Enero de 2008, 20:53:52
jorge_ si te fijas en el datasheet dice bien que hay que poner el canal 12 para el AN12.

Si el canal 12 no existe ahora ya sí que me he liado del todo ¿Qué canal le corresponde al pin AN12?¿el 11?

Mmm,  tienes razón.  En el MPLAB abajo al medio, qué micro te indica que está seleccionado?
tienes puesto el 18F2455?
Título: Re: Cuánto tiempo requiere el conversor ADC
Publicado por: jfmateos2 en 26 de Enero de 2008, 06:07:34
Tengo el 18f2455.

Te adjunto una captura.

(http://img207.imageshack.us/img207/251/mplabln8.th.jpg) (http://img207.imageshack.us/my.php?image=mplabln8.jpg)

El caso es que eligiendo el canal 12, el prototipo real funciona, a pesar del aviso que muestra MPlab.

Al final he recurrido a la interrupción #int_ad para saber cuándo ha terminado un read_adc y poder ejecutar de nuevo otro read_adc. Esta interrupción ocurre cuando read_adc ha terminado del todo, incluidos los 2TAD ¿verdad?

Por cierto, ¿qué significa la interrupción #int_adof?
Título: Re: Cuánto tiempo requiere el conversor ADC
Publicado por: Jorge_ en 26 de Enero de 2008, 06:26:20
Significa: Analog to Digital Conversion Timeout.

Si te funcionó en el prototipo, yo creo que has descubierto un bug en el simulador del mplab, porque en el Stimulus sólo aparecen los canales AN0 a AN9
Título: Re: Cuánto tiempo requiere el conversor ADC
Publicado por: jfmateos2 en 26 de Enero de 2008, 06:38:51
Gracias Jorge.

Pero ¿qué significa ese timeout?¿a qué se refiere? en otras palabras ¿cuándo se produce esta interrupción?
Título: Re: Cuánto tiempo requiere el conversor ADC
Publicado por: maunix en 26 de Enero de 2008, 12:07:44
El caso es que eligiendo el canal 12, el prototipo real funciona, a pesar del aviso que muestra MPlab.

Por eso te preguntaba en qué se configuraba el ADCON2 para saber lo que sucedía y ver si no era algo mal del CCS o si era algo del Simulador.

Has posteado este problema en el support de microchip?

Título: Re: Cuánto tiempo requiere el conversor ADC
Publicado por: PerriPic en 30 de Enero de 2008, 08:03:40
Yo utilizo el 2550 q tiene el mismo datasheet q el 2455 y te dice q no tiene implementadas las An7, AN6 y AN 5, ahora bien, tb utilizo el c18 y en la libreria adc.h así como en la funcion setchanel, solo te deja utilizar del CH_0 a CH_9. Con lo q imagino q aunq en el micro la entrada se llama AN12 al programarlo se utilizan del 0 al 9...
Título: Re: Cuánto tiempo requiere el conversor ADC
Publicado por: jfmateos2 en 30 de Enero de 2008, 08:51:13
Pues en CCS C no es así PerriPic. Aparentemente sólo funciona si eliges específicamente el canal 12.
Título: Re: Cuánto tiempo requiere el conversor ADC
Publicado por: maunix en 30 de Enero de 2008, 10:18:31
Yo utilizo el 2550 q tiene el mismo datasheet q el 2455 y te dice q no tiene implementadas las An7, AN6 y AN 5, ahora bien, tb utilizo el c18 y en la libreria adc.h así como en la funcion setchanel, solo te deja utilizar del CH_0 a CH_9. Con lo q imagino q aunq en el micro la entrada se llama AN12 al programarlo se utilizan del 0 al 9...

Estas mezclando las cosas.

El C18 'si' permite seleccionar el canal 12, en ese micro.  De hecho para confirmarlo puedes verlo en cómo queda configurado el registro ADCON0.

Poniendo SetChanADC(ADC_CH12) y habiendo encendido previamente el modulo A/D, queda

ADCON0 = 0b00110001;

Donde la parte roja es la que corresponde al canal, en este caso el canal 12.

Es un problema del SIMULADOR (MPSIM) , no del CCS ni del C18.

Ya mismo voy a poner un ticket en microchip para que lo solucionen en sucesivas versiones.



Código para probar el problema

Código: C
  1. #include <adc.h>
  2. #include <delays.h>
  3.  
  4. unsigned int myad;
  5.  
  6. #pragma code
  7. void main (void) {
  8.  
  9.     OpenADC(ADC_FOSC_2 & ADC_RIGHT_JUST & ADC_8_TAD ,
  10.             ADC_CH0 & ADC_CH1 & ADC_CH2 & ADC_CH12 & ADC_INT_OFF & ADC_REF_VDD_VSS,
  11.             ADC_13ANA);
  12.        
  13.  
  14.   while(1) {
  15.      SetChanADC(ADC_CH12);
  16.      ConvertADC();
  17.      myad = ReadADC();
  18.      Delay1KTCYx(100);  
  19.   }    
  20. }
Título: Re: Cuánto tiempo requiere el conversor ADC
Publicado por: PerriPic en 30 de Enero de 2008, 10:41:54
Creo q me expliqué mal :D, lo q keria decir es q en el adc.h te dice q si defines 182550 solo utilizas del 0 al 9. Pongo lo q yo creo q es:

/* ***** channel selection ***** */
#define ADC_CH0          0b10000111  // Channel 0
#define ADC_CH1          0b10001111  // Channel 1
#define ADC_CH2          0b10010111  // Channel 2
#define ADC_CH3          0b10011111  // Channel 3
#define ADC_CH4          0b10100111  // Channel 4
#define ADC_CH5          0b10101111  // Channel 5
#define ADC_CH6          0b10110111  // Channel 6
#define ADC_CH7          0b10111111  // Channel 7
#define ADC_CH8          0b11000111  // Channel 8
#define ADC_CH9          0b11001111  // Channel 9
#if !defined(__18F2455) && !defined(__18F2550) && \
    !defined(__18F2510) && !defined(__18F2520)
#define ADC_CH10         0b11010111  // Channel 10
#define ADC_CH11         0b11011111  // Channel 11
#define ADC_CH12         0b11100111  // Channel 12
#if !defined(__18F4455) && !defined(__18F4550) && \
    !defined(__18F4410) && !defined(__18F4420) && \
    !defined(__18F4510) && !defined(__18F4520)
#define ADC_CH13         0b11101111  // Channel 13
#define ADC_CH14         0b11110111  // Channel 14
#define ADC_CH15         0b11111111  // Channel 15
#endif

Es lo q e entendido, si estoy en un error s x mi ignorancia,jejejeje. Esto es en C18, en CCS no tengo ni idea.

akbo de hacer la prueba y si pongo CH_12 con 18f2550 definido, me da error!!!
Título: Re: Cuánto tiempo requiere el conversor ADC
Publicado por: maunix en 30 de Enero de 2008, 13:00:11
Ahhh, estas en microchip también jajaja.

Te paso lo que tengo en el adc.h del  C18 v2.14


#ifdef USE_OR_MASKS
/* ***** channel selection ***** */
#define ADC_CH0          0b00000000  // Channel 0
#define ADC_CH1          0b00001000  // Channel 1
#define ADC_CH2          0b00010000  // Channel 2
#define ADC_CH3          0b00011000  // Channel 3
#define ADC_CH4          0b00100000  // Channel 4
#define ADC_CH5          0b00101000  // Channel 5
#define ADC_CH6          0b00110000  // Channel 6
#define ADC_CH7          0b00111000  // Channel 7
#define ADC_CH8          0b01000000  // Channel 8
#define ADC_CH9          0b01001000  // Channel 9
#define ADC_CH10         0b01010000  // Channel 10
#define ADC_CH11         0b01011000  // Channel  11
#define ADC_CH12         0b01100000  // Channel 12
#define ADC_CH13         0b01101000  // Channel 13
#define ADC_CH14         0b01110000  // Channel 14
#define ADC_CH15         0b01111000  // Channel 15
#define ADC_CH_MASK      (~ADC_CH15)
//------------------------------------------------
#else
/* ***** channel selection ***** */
#define ADC_CH0          0b10000111  // Channel 0
#define ADC_CH1          0b10001111  // Channel 1
#define ADC_CH2          0b10010111  // Channel 2
#define ADC_CH3          0b10011111  // Channel 3
#define ADC_CH4          0b10100111  // Channel 4
#define ADC_CH5          0b10101111  // Channel 5
#define ADC_CH6          0b10110111  // Channel 6
#define ADC_CH7          0b10111111  // Channel 7
#define ADC_CH8          0b11000111  // Channel 8
#define ADC_CH9          0b11001111  // Channel 9
#define ADC_CH10         0b11010111  // Channel 10
#define ADC_CH11         0b11011111  // Channel 11
#define ADC_CH12         0b11100111  // Channel 12
#define ADC_CH13         0b11101111  // Channel 13
#define ADC_CH14         0b11110111  // Channel 14
#define ADC_CH15         0b11111111  // Channel 15
#endif
Título: Re: Cuánto tiempo requiere el conversor ADC
Publicado por: maunix en 05 de Marzo de 2008, 15:13:07
Es un problema del SIMULADOR (MPSIM) , no del CCS ni del C18.

Ya mismo voy a poner un ticket en microchip para que lo solucionen en sucesivas versiones.
Bueno, me acaban de responder luego de una pequeña lucha en que no podían compilar el proyecto que les había pasado en C18 ,a pesar que yo utilizaba las .h y demás del último C18 disponible.  Al parecer quienes atienden los reclamos no son expertos en C18, al menos no los que me tocaron a mí.

El problema lo vieron cuando les pasé el mismo problema pero en assembler básico.  Me informaron por el ticket de support que el tema ya pasó al sector de "development tools" y que lo van a ver de resolver.



Código assembler para reproducir el problema

Código: ASM
  1. List P=PIC18F2455
  2.         #include P18F2455.INC
  3.  
  4.         config DEBUG   = OFF
  5.         config FOSC    = HS          ; Osc section bits
  6.         config BORV    = 3
  7.         config BOR     = OFF
  8.         config WDT     = OFF
  9.               config PBADEN  = ON
  10.    
  11. #define a       0
  12. #define       bsr             1
  13.  
  14. gpr0          udata
  15. DELAY         res     3
  16.  
  17.  
  18.  
  19. VECTORS       code
  20.               goto          _STARTUP
  21.  
  22.  
  23. PROGRAMPAGE   code
  24. _STARTUP:
  25.         ;INIT A/D
  26.         movlw   0x00
  27.         movwf   ADCON0,a
  28.         movlw   0x02
  29.         movwf   ADCON1,a
  30.         movlw   0xA2
  31.         movwf   ADCON2,a
  32.         bsf     ADCON0,0,a    ;Turns ON AD Module
  33.  
  34.  
  35. _ADLOOP:        movlw   b'00110001'
  36.         movwf   ADCON0,a        ;Select CH12 - ADon
  37.         bcf     PIR1,ADIF,a
  38.        
  39.         movlw         .104
  40.         call          _DELAY
  41.  
  42.               ;Convert Analog Value
  43.               bsf           ADCON0,GO,a   ;Shows warning "Selected channel 12 is an invalid channel."
  44.  
  45. _WAITADCH12:  btfss         PIR1,ADIF,a
  46.               goto          _WAITADCH12
  47.              
  48.               nop
  49.               goto          _ADLOOP
  50.  
  51.  
  52.  
  53.  
  54. _DELAY:       movwf         DELAY+1,bsr
  55. _DELAYloop:
  56.               movlw         0xFF
  57.               movwf         DELAY+0,bsr
  58.              
  59.               decfsz        DELAY+0,f,bsr
  60.               goto          $-2
  61.              
  62.               decfsz        DELAY+1,f,bsr
  63.               goto          _DELAYloop
  64.              
  65.              
  66.              
  67.               return
  68.              
  69.               end


Linker File


// File: 18f2455.lkr
// Sample linker script for the PIC18F2455 processor

// Not intended for use with MPLAB C18.  For C18 projects,
// use the linker scripts provided with that product.

LIBPATH .

CODEPAGE   NAME=vectors    START=0x0            END=0x29           PROTECTED
CODEPAGE   NAME=page       START=0x2A           END=0x5FFF
CODEPAGE   NAME=idlocs     START=0x200000       END=0x200007       PROTECTED
CODEPAGE   NAME=config     START=0x300000       END=0x30000D       PROTECTED
CODEPAGE   NAME=devid      START=0x3FFFFE       END=0x3FFFFF       PROTECTED
CODEPAGE   NAME=eedata     START=0xF00000       END=0xF000FF       PROTECTED

ACCESSBANK NAME=accessram  START=0x0            END=0x5F
DATABANK   NAME=gpr0       START=0x60           END=0xFF
DATABANK   NAME=gpr1       START=0x100          END=0x1FF
DATABANK   NAME=gpr2       START=0x200          END=0x2FF
DATABANK   NAME=gpr3       START=0x300          END=0x3FF
DATABANK   NAME=usb4       START=0x400          END=0x4FF          PROTECTED
DATABANK   NAME=usb5       START=0x500          END=0x5FF          PROTECTED
DATABANK   NAME=usb6       START=0x600          END=0x6FF          PROTECTED
DATABANK   NAME=usb7       START=0x700          END=0x7FF          PROTECTED
ACCESSBANK NAME=accesssfr  START=0xF60          END=0xFFF          PROTECTED


SECTION    NAME=PROGRAMPAGE   ROM=page
SECTION    NAME=VECTORS       ROM=vectors