Hi. I need help with mc9s08qg8 ADC

cancel
Showing results for 
Show  only  | Search instead for 
Did you mean: 

Hi. I need help with mc9s08qg8 ADC

Jump to solution
684 Views
santygo
Contributor I

 this is the code i am using and i am not able to get the output. can you suggest me with any possible sollutions please?

 

 

#include <hidef.h> /* for EnableInterrupts macro */

#include "derivative.h" /* include peripheral declarations */

 

void main(void)

{

  EnableInterrupts;


 

  PTADD = 0x00;

  PTAPE = 0xFF;

  PTBDD = 0xFF;

 

  for(;:smileywink:

  {

    __RESET_WATCHDOG();

   

    ADCSC1_ADCH = 0x00; 

    ADCSC1_AIEN = 1;

    ADCSC1_ADCO = 0;

    ADCSC2_ADTRG = 0; 

    ADCSC2_ACFE = 0; 

    ADCCFG_ADICLK = 0; 

    ADCCFG_ADIV = 0; 

    ADCCFG_MODE = 0x00; 

    ADCCFG_ADLSMP = 0; 

    APCTL1 = 0x01;

 

      if(ADCSC1_COCO==1)

      {

           

            PTBD_PTBD0 = ADCRL_ADR0;

            PTBD_PTBD1 = ADCRL_ADR1;

            PTBD_PTBD2 = ADCRL_ADR2;

            PTBD_PTBD3 = ADCRL_ADR3;

            PTBD_PTBD4 = ADCRL_ADR4;

            PTBD_PTBD5 = ADCRL_ADR5;

            PTBD_PTBD6 = ADCRL_ADR6;

            PTBD_PTBD7 = ADCRL_ADR7;

                       

      }

 

   

  }

}

Labels (1)
Tags (1)
0 Kudos
Reply
1 Solution
439 Views
bigmac
Specialist III

Hello,

 

I can see a few problems with your code.  As a general rule it is better (more efficient) to initialise all bits simultaneously within a hardware register.  This is particularly important for the ADCSC1 register, where each write process will abort any conversion in progress, and start a new conversion.

 

Because writing to the ADCSC1 register starts a conversion, this should be done last, so that ADCCFG, APCTL1 and ADCSC2 register will already have been configured prior to the start of the first conversion.  In fact, you might initialise these within a separate ADC_init() function, called prior to the main loop where the conversions take place.

 

I see that you have enabled the ADC interrupt, but do not have an interrupt service routine (ISR).  However, since you seem to require polling the COCO flag, the interrupt should remain disabled.  In fact, your polling is not correct - you are testing the COCO flag, but not waiting until it becomes set.  As a consequence, the existing code will never complete a conversion because it loops to re-write the ADCSC1 register, which aborts the current conversion.

 

Finally, the enabling of interrupts should take place after all the required peripherals have been initialised, although this would not have affected the operation of your code.

 

Perhaps the following code will do what you intend?

 

#include <hidef.h> /* for EnableInterrupts macro */#include "derivative.h" /* include peripheral declarations */void main(void){    PTADD = 0x00;  PTAPE = 0xFF;  PTBDD = 0xFF;  // Initialise ADC:  ADCCFG = 0x00;   // 8-bit mode, short sample  ADCSC2 = 0x00;   // Software trigger  APCTL1 = 0x01;   // Channel 0 input  EnableInterrupts;    for( ; ; ) {    __RESET_WATCHDOG();    ADCSC1 = 0x00;            // Start conversion on channel 0    while (ADCSC1_COCO == 0); // Wait until conversion is complete    PTBD = ADCRL;  }}

 

Regards,

Mac

 

View solution in original post

0 Kudos
Reply
1 Reply
440 Views
bigmac
Specialist III

Hello,

 

I can see a few problems with your code.  As a general rule it is better (more efficient) to initialise all bits simultaneously within a hardware register.  This is particularly important for the ADCSC1 register, where each write process will abort any conversion in progress, and start a new conversion.

 

Because writing to the ADCSC1 register starts a conversion, this should be done last, so that ADCCFG, APCTL1 and ADCSC2 register will already have been configured prior to the start of the first conversion.  In fact, you might initialise these within a separate ADC_init() function, called prior to the main loop where the conversions take place.

 

I see that you have enabled the ADC interrupt, but do not have an interrupt service routine (ISR).  However, since you seem to require polling the COCO flag, the interrupt should remain disabled.  In fact, your polling is not correct - you are testing the COCO flag, but not waiting until it becomes set.  As a consequence, the existing code will never complete a conversion because it loops to re-write the ADCSC1 register, which aborts the current conversion.

 

Finally, the enabling of interrupts should take place after all the required peripherals have been initialised, although this would not have affected the operation of your code.

 

Perhaps the following code will do what you intend?

 

#include <hidef.h> /* for EnableInterrupts macro */#include "derivative.h" /* include peripheral declarations */void main(void){    PTADD = 0x00;  PTAPE = 0xFF;  PTBDD = 0xFF;  // Initialise ADC:  ADCCFG = 0x00;   // 8-bit mode, short sample  ADCSC2 = 0x00;   // Software trigger  APCTL1 = 0x01;   // Channel 0 input  EnableInterrupts;    for( ; ; ) {    __RESET_WATCHDOG();    ADCSC1 = 0x00;            // Start conversion on channel 0    while (ADCSC1_COCO == 0); // Wait until conversion is complete    PTBD = ADCRL;  }}

 

Regards,

Mac

 

0 Kudos
Reply