Generating delay problem ADC

Discussion in 'Embedded Systems and Microcontrollers' started by reyes33d88, Jan 10, 2015.

  1. reyes33d88

    Thread Starter New Member

    Jan 10, 2015
    7
    1
    Hi guys, I have a problem to convert a signal with the ADC of a DSPic33FJ12GP202, because I need a delay to retain the data and to convert it. My problem is with the Delay10KTCYx (660) instruction, because the compiler marks me wrong, my code is as follows, thanks


    Code (Text):
    1.  
    2. #include <p33FJ12GP202.h>
    3. #include <delay.h>
    4. #define _XTAL_FREQ 16000000
    5. #define fcy 16000000
    6. //#define fcy
    7.    _FOSC ( FCKSM_CSDCMD & IOL1WAY_OFF & OSCIOFNC_OFF & POSCMD_XT );
    8.  
    9.  
    10.  
    11. int TCY;
    12.  
    13. int main (void);
    14. void retardo(void);
    15. void inicia_adc(void);
    16.  
    17.  
    18. int main (void)
    19. {
    20.     TRISB=0X0000;
    21.     inicia_adc();
    22.     AD1CON1bits.ADON=1;        //SE HABILITA EL ADC
    23.     /////////////OSCILADOR DE 16MHz/////////////////////
    24.     ////////TCY=4/16MHz = 1/4us/////////////////////////
    25. while(1)
    26. {
    27. void retardo(void){
    28. //TCY=1/4000000;
    29. Delay10KTCYx(660);//DELAY DE 10X60X1/4MZ=150us
    30. }
    31. }
    32.  
    33. PORTB=ADC1BUF0;
    34. }
    35. void inicia_adc(void)
    36. {
    37.  
    38. ///////DEFINIMOS LA ENTRADA (RA0), LOS BITS DEL ADC Y SE CONFIGURA SOLO ADCON 1/////////////
    39.     TRISA=0X0001;    //ENTRADA POR RA0
    40.     AD1PCFGL=0;        //ENTRADAS ANALÓGICAS
    41.     AD1CON1bits.AD12B=1;//ADC DE 12 BITS}
    42.     AD1CON1bits.ADSIDL=0;
    43.     AD1CON1bits.FORM=0;
    44.     AD1CON1bits.ASAM=1;///EL MUESTRO INICIA DESPUÉS DE LA ÚLTIMA CONVERSIÓN
    45.     AD1CON1bits.SSRC=0b111;///TERMINA EL MUESTREO
    46.     AD1CON1bits.SAMP=1;///INICIA EL MUESTREO
    47.  
    48. ////////////CONFIGURACIÓN AD1CON2//////////////
    49.     AD1CON2bits.VCFG=0b00;///VDD Y VSS
    50.     AD1CON2bits.CSCNA=1;///ESCANEA LAS ENTRADAS
    51.     AD1CON2bits.SMPI=0b111;//DETERMINA LA CANTIDAD DE MUESTRAS (EN ESTE CASO 16)7
    52.     AD1CON2bits.BUFM=0;//SIEMPRE SE LLENA EL BUFFER DESDE EL PRINCIPIO
    53.     AD1CON2bits.ALTS=0;//SIEMPRE SE UTILIZA LA ENTRADA DE CANAL, PARA EL MUESTREO A
    54. ////////////CONFIGURACIÓN AD1CON3//////////////
    55.  
    56.     AD1CON3bits.ADRC=1;//SE SELECCIONA EL RELOJ INTERNO
    57.     AD1CON3bits.SAMC=0b11111;//BITS DE AUTO MUESTREO
    58.     AD1CON3bits.ADCS=0b11111;//TIEMPO DE CONVERSIÓN DE BITS ADC
    59. ////////////CONFIGURACIÓN AD1CHS0://////////////
    60.     AD1CHS0bits.CH0NB=0;//VREF
    61.     AD1CHS0bits.CH0SB=0b00000;//ENTRADA POSITIVA POR AN0
    62.     AD1CHS0bits.CH0NA=0;//ENTRADA NEGATIVA POR -REF
    63.     AD1CHS0bits.CH0SA=0b00000;//ENTRADA POSITIVA POR AN0
    64. ///////////CONFIGURACIÓN DEL REGISTRO BAJO///////////
    65. //    AD1CSSLbits.CSS=1;//SE ESCANEAN LAS ENTRADAS
    66.  
    67.  
    68.     IFS0bits.AD1IF=1;
    69.     IEC0bits.AD1IE=1;/////SI SE REALIZA LA CONVERSIÓN HAY INTERRUPCIÓN
    70.     IPC0bits.T1IP=1;//PRIORIDAD DE LA INTERRUPIÓN
    71.  
    72.     AD1CON1bits.DONE=1;
    73. }
    74.  
    Moderators note: Please use code tags for pieces of code
     
    Last edited by a moderator: Jan 18, 2015
  2. JohnInTX

    Moderator

    Jun 26, 2012
    2,338
    1,018
    Welcome to AAC!
    Code (Text):
    1. while(1)
    2. {
    3. void retardo(void){
    4. //TCY=1/4000000;
    5. Delay10KTCYx(660);//DELAY DE 10X60X1/4MZ=150us
    6. }
    7. }
    I don't think you can declare the function 'redardo' inside a while loop.
    Also, Microchip says this about delays on the PIC32:
    I agree.

    Anyway, you should not have to use a 'delay' at all. Just start the conversion and poll the 'DONE' flag.

    Is this X32? Delay10KTCYx is not in the library (that I have, anyway).

    Also, you can put your code inside 'CODE' tags (click the icon that looks like a little american flag) and it will be easier to read.
     
    Last edited: Jan 10, 2015
  3. ErnieM

    AAC Fanatic!

    Apr 24, 2011
    7,386
    1,605
    The symptom "the compiler marks me wrong" is meaningless to anyone not seeing the build output. What is the compiler output? If it points to specific line numbers what are those lines (with numbers!) ?

    Additionally, in C it is oft the case that one incorrect line will cause a compile error on the very next line.

    You cannot define the functions redardo() and inicia_adc() as you do within the main() (or any other) function. Move the code out of main and replace with function calls.

    (Aside to JohnInTX: I have seen a Delay10KTCYx() function in some library code Microchip holds for alphanumeric LCD work.)
     
    JohnInTX likes this.
  4. reyes33d88

    Thread Starter New Member

    Jan 10, 2015
    7
    1
    Thank you, I have another code, where I made a delay using the timer, buT I have another errors, the compiler says "my_adc1.c: In function 'main':
    my_adc1.c:26: error: too many arguments to function 'atraso_ms'
    my_adc1.c:88: error: syntax error at end of input", what do you think about my code?, thank you for all



    Here is my code

    Code (Text):
    1.  
    2. #include <p33FJ12GP202.h>
    3.  
    4. #define _XTAL_FREQ 16000000
    5. #define fcy 16000000
    6.  
    7.    _FOSC ( FCKSM_CSDCMD & IOL1WAY_OFF & OSCIOFNC_OFF & POSCMD_XT );
    8.  
    9.  
    10.  
    11. unsigned int t=0;
    12.  
    13. int main (void);
    14. void atraso_ms(void);
    15. void inicia_adc(void);
    16.  
    17.  
    18. int main (void)
    19. {
    20.     TRISB=0X0000;
    21.     inicia_adc();
    22.     AD1CON1bits.ADON=1;        //SE HABILITA EL ADC
    23. while(1)
    24. {
    25.     AD1CON1bits.SAMP=1;///INICIA EL MUESTREO
    26.     atraso_ms(3);///TIEMPO EN EL QUE SE REALIZA EL MUESTREO
    27.     AD1CON1bits.SAMP=0;///RETIENE EL DATO
    28. while(!AD1CON1bits.DONE); //MIENTRAS SE REALIZE LA CONVERSIÓN, LOS DATOS SE GUARDAN EN EL PUERTO B
    29. PORTB=ADC1BUF0; // Datos se guardan en ADC1BUF0 y se envía al puerto B
    30.  
    31. }
    32.  
    33.  
    34. /////////////CONFIGURACIÓN DEL RETARDO//////////////////////
    35. void atraso_ms(void){
    36. TMR1=0;//INICIAMOS RESETEANDO EL TIMER 1
    37. IPC0bits.T1IP=0b101;//LA INTERRUPCIÓN TIENE UNA PRIORIDAD 5
    38.     /////////////OSCILADOR DE 20MHz///////////////////////////////////////////
    39.     ////////TCY=4/16MHz = 1/4us///////////////////////////////////////////////
    40.     //////PARA UN RETARDO DE 1s SE CARGA A PR1 CON  39062.5///////////////////
    41.     //////////////////////////////////////////////////////////////////////////
    42.     //////FCY=20MHz/2=10MHz, PREESCALAR DE 256////////////////////////////////
    43.     //////POR REGLA DE 3, PARA UN RETARDO DE 1ms, PR1=39.0625/////////////////
    44.     PR1=39.0625;
    45.     IFS0bits.T1IF=0;//LIMNPIA LA BANDERA DEL TIMER
    46.     IEC0bits.T1IE=0;//CUANDO OCURRE UNA INTERRUPCIÓN DESHABILITA EL TIMER
    47.     T1CON=0X8030;//CONFIGURA T1CON
    48. while(IFS0bits.T1IF==0);
    49. }
    50. void inicia_adc(void)
    51. {
    52.  
    53. ///////DEFINIMOS LA ENTRADA (RA0), LOS BITS DEL ADC Y SE CONFIGURA SOLO ADCON 1/////////////
    54.     TRISA=0X0001;    //ENTRADA POR RA0
    55.     AD1PCFGL=0;        //ENTRADAS ANALÓGICAS
    56.     AD1CON1bits.AD12B=1;//ADC DE 12 BITS}
    57.     AD1CON1bits.ADSIDL=0;
    58.     AD1CON1bits.FORM=0;
    59.     AD1CON1bits.ASAM=1;///EL MUESTRO INICIA DESPUÉS DE LA ÚLTIMA CONVERSIÓN
    60.     AD1CON1bits.SSRC=0b111;///TERMINA EL MUESTREO
    61.  
    62.  
    63. ////////////CONFIGURACIÓN AD1CON2//////////////
    64.     AD1CON2bits.VCFG=0b00;///VDD Y VSS
    65.     AD1CON2bits.CSCNA=1;///ESCANEA LAS ENTRADAS
    66.     AD1CON2bits.SMPI=0b111;//DETERMINA LA CANTIDAD DE MUESTRAS (EN ESTE CASO 16)7
    67.     AD1CON2bits.BUFM=0;//SIEMPRE SE LLENA EL BUFFER DESDE EL PRINCIPIO
    68.     AD1CON2bits.ALTS=0;//SIEMPRE SE UTILIZA LA ENTRADA DE CANAL, PARA EL MUESTREO A
    69. ////////////CONFIGURACIÓN AD1CON3//////////////
    70.  
    71.     AD1CON3bits.ADRC=1;//SE SELECCIONA EL RELOJ INTERNO
    72.     AD1CON3bits.SAMC=0b11111;//BITS DE AUTO MUESTREO
    73.     AD1CON3bits.ADCS=0b11111;//TIEMPO DE CONVERSIÓN DE BITS ADC
    74. ////////////CONFIGURACIÓN AD1CHS0://////////////
    75.     AD1CHS0bits.CH0NB=0;//VREF
    76.     AD1CHS0bits.CH0SB=0b00000;//ENTRADA POSITIVA POR AN0
    77.     AD1CHS0bits.CH0NA=0;//ENTRADA NEGATIVA POR -REF
    78.     AD1CHS0bits.CH0SA=0b00000;//ENTRADA POSITIVA POR AN0
    79. ///////////CONFIGURACIÓN DEL REGISTRO BAJO///////////
    80. //    AD1CSSLbits.CSS=1;//SE ESCANEAN LAS ENTRADAS
    81.  
    82.  
    83.     IFS0bits.AD1IF=1;
    84.     IEC0bits.AD1IE=1;/////SI SE REALIZA LA CONVERSIÓN HAY INTERRUPCIÓN
    85.     IPC0bits.T1IP=1;//PRIORIDAD DE LA INTERRUPIÓN
    86.  
    87.     AD1CON1bits.DONE=1;
    88. }
    89.  
    Moderators note: Please use code tags for pieces of code
     
    Last edited by a moderator: Jan 18, 2015
  5. JohnInTX

    Moderator

    Jun 26, 2012
    2,338
    1,018
    This is because on line 14 you have prototyped void atraso_ms(void); and on line 35 declared the function void atraso_ms(void) but on line 26, you try to pass a value to the function atraso_ms(3);///TIEMPO EN EL QUE SE REALIZA EL MUESTREO. You can't do that. void atraso_ms(void); means no arguments are expected or accepted.

    I think you are missing a closing bracket '}' at the end of 'main'. It is easier to keep track of things if you indent your code blocks and line up the brackets.

    Also, please use 'CODE' tags to post your code. It makes it easier to look at:
    Code (Text):
    1. #include <p33FJ12GP202.h>
    2.  
    3. #define _XTAL_FREQ 16000000
    4. #define fcy 16000000
    5.  
    6. _FOSC ( FCKSM_CSDCMD & IOL1WAY_OFF & OSCIOFNC_OFF & POSCMD_XT );
    7.  
    8. unsigned int t=0;
    9.  
    10. int main (void);
    11. void atraso_ms(void);
    12. void inicia_adc(void);
    13.  
    14.  
    15. int main (void)
    16. {
    17.     TRISB=0X0000;
    18.     inicia_adc();
    19.     AD1CON1bits.ADON=1; //SE HABILITA EL ADC
    20.     while(1){
    21.         AD1CON1bits.SAMP=1;///INICIA EL MUESTREO
    22.         atraso_ms(3);///TIEMPO EN EL QUE SE REALIZA EL MUESTREO
    23.         AD1CON1bits.SAMP=0;///RETIENE EL DATO
    24.         while(!AD1CON1bits.DONE); //MIENTRAS SE REALIZE LA CONVERSIÓN, LOS DATOS SE GUARDAN EN EL PUERTO B
    25.         PORTB=ADC1BUF0; // Datos se guardan en ADC1BUF0 y se envía al puerto B
    26.     }
    27. }// *** ADDED THIS  ****
    28.  
    29. /////////////CONFIGURACIÓN DEL RETARDO//////////////////////
    30. void atraso_ms(void){
    31.     TMR1=0;//INICIAMOS RESETEANDO EL TIMER 1
    32.     IPC0bits.T1IP=0b101;//LA INTERRUPCIÓN TIENE UNA PRIORIDAD 5
    33. /////////////OSCILADOR DE 20MHz///////////////////////////////////////////
    34. ////////TCY=4/16MHz = 1/4us///////////////////////////////////////////////
    35. //////PARA UN RETARDO DE 1s SE CARGA A PR1 CON 39062.5///////////////////
    36. //////////////////////////////////////////////////////////////////////////
    37. //////FCY=20MHz/2=10MHz, PREESCALAR DE 256////////////////////////////////
    38. //////POR REGLA DE 3, PARA UN RETARDO DE 1ms, PR1=39.0625/////////////////
    39.     PR1=39.0625;
    40.     IFS0bits.T1IF=0;//LIMNPIA LA BANDERA DEL TIMER
    41.     IEC0bits.T1IE=0;//CUANDO OCURRE UNA INTERRUPCIÓN DESHABILITA EL TIMER
    42.     T1CON=0X8030;//CONFIGURA T1CON
    43.     while(IFS0bits.T1IF==0);
    44. }
    45.  
    46. void inicia_adc(void)
    47. {
    48. ///////DEFINIMOS LA ENTRADA (RA0), LOS BITS DEL ADC Y SE CONFIGURA SOLO ADCON 1/////////////
    49.     TRISA=0X0001; //ENTRADA POR RA0
    50.     AD1PCFGL=0; //ENTRADAS ANALÓGICAS
    51.     AD1CON1bits.AD12B=1;//ADC DE 12 BITS}
    52.     AD1CON1bits.ADSIDL=0;
    53.     AD1CON1bits.FORM=0;
    54.     AD1CON1bits.ASAM=1;///EL MUESTRO INICIA DESPUÉS DE LA ÚLTIMA CONVERSIÓN
    55.     AD1CON1bits.SSRC=0b111;///TERMINA EL MUESTREO
    56.  
    57.  
    58.     ////////////CONFIGURACIÓN AD1CON2//////////////
    59.     AD1CON2bits.VCFG=0b00;///VDD Y VSS
    60.     AD1CON2bits.CSCNA=1;///ESCANEA LAS ENTRADAS
    61.     AD1CON2bits.SMPI=0b111;//DETERMINA LA CANTIDAD DE MUESTRAS (EN ESTE CASO 16)7
    62.     AD1CON2bits.BUFM=0;//SIEMPRE SE LLENA EL BUFFER DESDE EL PRINCIPIO
    63.     AD1CON2bits.ALTS=0;//SIEMPRE SE UTILIZA LA ENTRADA DE CANAL, PARA EL MUESTREO A
    64.     ////////////CONFIGURACIÓN AD1CON3//////////////
    65.  
    66.     AD1CON3bits.ADRC=1;//SE SELECCIONA EL RELOJ INTERNO
    67.     AD1CON3bits.SAMC=0b11111;//BITS DE AUTO MUESTREO
    68.     AD1CON3bits.ADCS=0b11111;//TIEMPO DE CONVERSIÓN DE BITS ADC
    69.     ////////////CONFIGURACIÓN AD1CHS0://////////////
    70.     AD1CHS0bits.CH0NB=0;//VREF
    71.     AD1CHS0bits.CH0SB=0b00000;//ENTRADA POSITIVA POR AN0
    72.     AD1CHS0bits.CH0NA=0;//ENTRADA NEGATIVA POR -REF
    73.     AD1CHS0bits.CH0SA=0b00000;//ENTRADA POSITIVA POR AN0
    74.     ///////////CONFIGURACIÓN DEL REGISTRO BAJO///////////
    75.     // AD1CSSLbits.CSS=1;//SE ESCANEAN LAS ENTRADAS
    76.  
    77.  
    78.     IFS0bits.AD1IF=1;
    79.     IEC0bits.AD1IE=1;/////SI SE REALIZA LA CONVERSIÓN HAY INTERRUPCIÓN
    80.     IPC0bits.T1IP=1;//PRIORIDAD DE LA INTERRUPIÓN
    81.  
    82.     AD1CON1bits.DONE=1;
    83. }
    84.  
     
    Last edited: Jan 12, 2015
    reyes33d88 likes this.
  6. reyes33d88

    Thread Starter New Member

    Jan 10, 2015
    7
    1
    Thank you for your answers and your advices, it is so importan for me. I´ve modified the program, but Know I need to process this signal, I need to get the FFT (Fast Fourier Transform), but I don´t know how to get the signal and process it, because signal converted is outed in the port B. Do you have some idea how to do it?, thank you for all and for you patient with me, I´m new programming microcontrol. I´ll try to use code tags, thank you!
    Code (Text):
    1. #include <p33FJ12GP202.h>
    2. _FOSC ( FCKSM_CSDCMD & IOL1WAY_OFF & OSCIOFNC_OFF & POSCMD_XT );
    3. //#define _XTAL_FREQ 16000000
    4. #define fcy 16000000
    5.  
    6.  
    7. int main (void);
    8. void atraso_ms();
    9. void inicia_adc(void);
    10.  
    11. /////////////////INICIO DEL PROGRAMA////////////
    12. int main (void)
    13. {
    14.     TRISB=0X0000;
    15.     inicia_adc();
    16.     AD1CON1bits.ADON=1;        //SE HABILITA EL ADC
    17. while(1)
    18. {
    19.     AD1CON1bits.SAMP=1;///INICIA EL MUESTREO
    20.     atraso_ms(3);///TIEMPO EN EL QUE SE REALIZA EL MUESTREO
    21.     AD1CON1bits.SAMP=0;///RETIENE EL DATO
    22. while(!AD1CON1bits.DONE); //MIENTRAS SE REALIZE LA CONVERSIÓN, LOS DATOS SE GUARDAN EN EL PUERTO B
    23. PORTB=ADC1BUF0; // Datos se guardan en ADC1BUF0 y se envía al puerto B
    24.  
    25. }
    26. }
    27. void inicia_adc(void)
    28. {
    29. ///////DEFINIMOS LA ENTRADA (RA0), LOS BITS DEL ADC Y SE CONFIGURA SOLO ADCON 1/////////////
    30.     TRISA=0X0001;    //ENTRADA POR RA0
    31.     AD1PCFGL=0X0000;        //ENTRADAS ANALÓGICAS
    32.     AD1CON1bits.AD12B=1;//ADC DE 12 BITS}
    33.     //AD1CON1bits.ADSIDL=0;
    34.     //AD1CON1bits.FORM=0;
    35.     AD1CON1bits.ASAM=0;///EL MUESTRO INICIA DESPUÉS DE LA ÚLTIMA CONVERSIÓN
    36.     AD1CON1bits.SSRC=0b111;///TERMINA EL MUESTREO
    37.  
    38.  
    39. ////////////CONFIGURACIÓN AD1CON2//////////////
    40.     AD1CON2bits.VCFG=0b00;///VDD Y VSS
    41.     AD1CON2bits.CSCNA=0;//MUESTREO SECUENCIAL DESHABILITADO
    42.     AD1CON2bits.SMPI=0b111;//DETERMINA LA CANTIDAD DE MUESTRAS (EN ESTE CASO 16)7
    43.     AD1CON2bits.BUFM=0;//SIEMPRE SE LLENA EL BUFFER DESDE EL PRINCIPIO
    44.     AD1CON2bits.ALTS=0;//SIEMPRE SE UTILIZA LA ENTRADA DE CANAL, PARA EL MUESTREO A
    45. ////////////CONFIGURACIÓN AD1CON3//////////////
    46.  
    47.     AD1CON3bits.ADRC=1;//SE SELECCIONA EL RELOJ INTERNO
    48.     AD1CON3bits.ADRC=21;//TIEMPO DE CONVERSIÓN
    49.     AD1CON3bits.SAMC=0b11111;//BITS DE AUTO MUESTREO
    50.     AD1CON3bits.ADCS=0b11111;//TIEMPO DE CONVERSIÓN DE BITS ADC
    51. ////////////CONFIGURACIÓN AD1CHS0://////////////
    52.     AD1CHS0bits.CH0NA=0;//ENTRADA NEGATIVA POR VSS
    53.     AD1CHS0bits.CH0SA=0;//ENTRADA POSITIVA POR AN
    54. }
    55. /////////////CONFIGURACIÓN DEL RETARDO//////////////////////
    56. void atraso_ms(){
    57. T1CON= 0;
    58. TMR1=0;//INICIAMOS RESETEANDO EL TIMER 1
    59. IPC0bits.T1IP=0b101;//LA INTERRUPCIÓN TIENE UNA PRIORIDAD 5
    60.     /////////////OSCILADOR DE 20MHz///////////////////////////////////////////
    61.     ////////TCY=4/16MHz = 1/4us///////////////////////////////////////////////
    62.     //////PARA UN RETARDO DE 1s SE CARGA A PR1 CON  39062.5///////////////////
    63.     //////////////////////////////////////////////////////////////////////////
    64.     //////FCY=20MHz/2=10MHz, PREESCALAR DE 256////////////////////////////////
    65.     //////POR REGLA DE 3, PARA UN RETARDO DE 1ms, PR1=39.0625/////////////////
    66.     PR1=39.0625;
    67.     IFS0bits.T1IF=0;//LIMNPIA LA BANDERA DEL TIMER
    68.     IEC0bits.T1IE=0;//CUANDO OCURRE UNA INTERRUPCIÓN DESHABILITA EL TIMER
    69.     T1CON=0X8030;//CONFIGURA T1CON
    70. while(IFS0bits.T1IF==0);
    71. }
     
    Last edited: Jan 17, 2015
  7. MrChips

    Moderator

    Oct 2, 2009
    12,414
    3,353
    Why do you send the data to PORTB? Save the data in an array.

    Why do you type your comments in CAPS?
     
  8. reyes33d88

    Thread Starter New Member

    Jan 10, 2015
    7
    1
    Thank you for your advices, I´m sending data to PORTB because I wanted to see if my ADC was workin well. I type my comments in Caps because I like to coment my programs in Caps, I like more caps hehehehe
     
    ErnieM likes this.
Loading...