AnsweredAssumed Answered

TRK-MPC5606B ADC1 Program?

Question asked by Akshay Daga on Mar 27, 2016


I am Trying to run this code in which, Potentiometer is connected to PB[4] -> ADC1_P[0]  (ADC_1) and Its output is Shown on LED1,2,3,4.  I am trying to run ADC1 in scan mode but attached program is not working properly.

 

I tried to similar code for ADC_0 (scan mode) and it was working perfectly (showing as expected output).

 

From the comments in the program, You can see the ADC_0 code.

Please help me find out problem in the program. or please someone provide Sample code for ADC_1 Scan mode. (created in CodeWarrior)

 

Connections:

Potentiometer is connected to PB[4] -> ADC1_P[0]  (ADC_1) and Its output is Shown on LED1,2,3,4 connected to PE[4], PE[5], PE[6] and PE[7] respectively.

 

My ADC_1 (Scan mode) is as shown below:

*********************************************************************************************************************************************

/* ADC0_ScanMoode example for MPC5606B (Tested on TRK-MPC5606B Board)

Description: Converts inputs ANS0, ANS1 and ANS2 using scan mode (continuous)

Program Outcome:

Analog INPUT     =>   OUTPUT

(PB[8])   [LED1 LED2 LED3 LED4]

DigitalValue (0-200) => ON OFF OFF OFF

DigitalValue (201-500) => ON ON OFF OFF

DigitalValue (501-800) => ON ON ON OFF

DigitalValue (801-1023) => ON ON ON ON

*/

/*Connections:

SIGNAL ADC0_Channel   PORT   SIU_PAD_CONFIG  PACKAGE_PIN(QFP/BGA)

  100 144  176

ANS0 CH32 B8 PCR[24]=2000 39 53  R9

ANS1 CH33 B9 PCR[25]=2000 38 52  T9

ANS2 CH34 B10 PCR[26]=2000 40 54   P9    

  ADC1_Channel

ANP0 CH0 B4 PCR[20]=2000 50   72   88

ANP1 CH1 B5 PCR[21]=2000 53   73   91

ANP2 CH2 B6 PCR[22]=2000 54   76   92

 

 

NOTE: Do not forget to add "ME.PCTL[68].R = 0x01;" line

in void initModesAndClock(void) function to make ADC1 work.

*/

 

 

 

 

#include "MPC5606B.h"

 

 

#define GPIO_INPUT 0x0101

#define GPIO_OUTPUT 0x0201

#define LED_ON 0

#define LED_OFF 1

#define LED1 68

#define LED2 69

#define LED3 70

#define LED4 71

 

 

void initModesAndClock(void);

void disableWatchdog(void);

void initPeriClkGen(void);

void main (void);

 

 

uint16_t Result[3]; // ADC conversion results

uint16_t ResultInMv[3]; // ADC conversion results in mv

 

 

void initModesAndClock(void) {

ME.MER.R = 0x0000001D; /* Enable DRUN, RUN0, SAFE, RESET modes */

/* Initialize PLL before turning it on: */

CGM.FMPLL_CR.R = 0x02400100; /* 8 MHz xtal: Set PLL0 to 64 MHz */

ME.RUN[0].R = 0x001F0074; /* RUN0 cfg: 16MHzIRCON,OSC0ON,PLL0ON,syclk=PLL0*/

ME.RUNPC[1].R = 0x00000010; /* Peri. Cfg. 1 settings: only run in RUN0 mode */

ME.PCTL[32].R = 0x01; /* MPC56xxB/P/S ADC 0: select ME.RUNPC[1] */

ME.PCTL[33].R = 0x01; //ADC 1: Select ME.RUNPC[1]

ME.PCTL[68].R = 0x01; /* MPC56xxB/S SIU: select ME.RUNPC[1] */

/* Mode Transition to enter RUN0 mode: */

ME.MCTL.R = 0x40005AF0; /* Enter RUN0 Mode & Key */

ME.MCTL.R = 0x4000A50F; /* Enter RUN0 Mode & Inverted Key */

while (ME.GS.B.S_MTRANS) {} /* Wait for mode transition to complete */

/* Note: could wait here using timer and/or I_TC IRQ */

while(ME.GS.B.S_CURRENTMODE != 4) {} /* Verify RUN0 is the current mode */

}

 

 

void disableWatchdog(void) {

SWT.SR.R = 0x0000c520; /* Write keys to clear soft lock bit */

SWT.SR.R = 0x0000d928;

SWT.CR.R = 0x8000010A; /* Clear watchdog enable (WEN) */

}

 

 

void initPeriClkGen(void) {

CGM.SC_DC0.R = 0x80; /* MPC56xxB/S: Enable peri set 3 sysclk divided by 1 */

CGM.SC_DC1.R = 0x80; /* MPC56xxB/S: Enable peri set 3 sysclk divided by 1 */

CGM.SC_DC2.R = 0x80; /* MPC56xxB/S: Enable peri set 3 sysclk divided by 1 */

}

 

 

void main (void) {

  vuint32_t i = 0; /* Dummy idle counter */

  initModesAndClock(); /* Initialize mode entries and system clock */

  disableWatchdog(); /* Disable watchdog */

  initPeriClkGen(); /* Initialize peripheral clock generation for DSPIs */

 

 

  //SIU.PCR[24].R = 0x2000; /* MPC56xxS: Initialize PB[8] as ANS0 */

  //SIU.PCR[25].R = 0x2000; /* MPC56xxS: Initialize PB[9] as ANS1 */

  //SIU.PCR[26].R = 0x2000; /* MPC56xxS: Initialize PB[10] as ANS2 */

 

  SIU.PCR[20].R = 0x2000; //Initialize PB[4] as ANP0 (ADC1)

  SIU.PCR[21].R = 0x2000; //Initialize PB[5] as ANP1 (ADC1)

  SIU.PCR[22].R = 0x2000; //Initialize PB[6] as ANP2 (ADC1)

 

  SIU.PCR[LED1].R = GPIO_OUTPUT;  //GPIO as Output //LED1

  SIU.PCR[LED2].R = GPIO_OUTPUT;  //GPIO as Output //LED2

  SIU.PCR[LED3].R = GPIO_OUTPUT;  //GPIO as Output //LED3

  SIU.PCR[LED4].R = GPIO_OUTPUT;  //GPIO as Output //LED4

 

 

  //ADC_0.MCR.R = 0x20000000; // Initialize ADC0 for scan mode

  //ADC_0.MCR.B.MODE = 1; //Initialize ADC0 for scan mode

  //ADC_0.MCR.B.PWDN = 0; //Power Down mode Disabled

 

  ADC_1.MCR.B.MODE = 1; //Initialize ADC1 for scan mode

  ADC_1.MCR.B.PWDN = 0; //Power Down mode Disabled

 

  //ADC_0.NCMR1.R = 0x00000007; // Select ANS0:2 inputs for conversion

  //ADC_0.NCMR1.B.CH32 = 1; //Select ANS0 input for Conversion

  //ADC_0.NCMR1.B.CH33 = 1; //Select ANS1 input for Conversion

  //ADC_0.NCMR1.B.CH34 = 1; //Select ANS2 input for Conversion

 

  ADC_1.NCMR0.B.CH0 = 1; //Select ANP0 (ADC1) input for Conversion

  ADC_1.NCMR0.B.CH1 = 1; //Select ANP0 (ADC1) input for Conversion

  ADC_1.NCMR0.B.CH2 = 1; //Select ANP0 (ADC1) input for Conversion

 

  //ADC_0.CTR1.R = 0x00008606; // Conversion times for 32MHz ADClock

 

  ADC_1.CTR0.R = 0x00008606; // Set Conversion time

 

  ADC_0.MCR.B.NSTART = 1; // Trigger normal conversions for ADC0

 

  ADC_1.MCR.B.NSTART = 1; // Trigger normal conversions for ADC1

 

  SIU.GPDO[LED1].B.PDO = LED_OFF;

  SIU.GPDO[LED2].B.PDO = LED_OFF;

  SIU.GPDO[LED3].B.PDO = LED_OFF;

  SIU.GPDO[LED4].B.PDO = LED_OFF;

 

  while (1) {

  while (ADC_1.CDR[2].B.VALID != 1) {}; /* Wait for last scan to complete */

  Result[0]= (uint16_t)(ADC_1.CDR[0].B.CDATA); /* Read ANP0 conversion result data */

  Result[1]= (uint16_t)(ADC_1.CDR[1].B.CDATA); /* Read ANP1 conversion result data */

  Result[2]= (uint16_t)(ADC_1.CDR[2].B.CDATA); /* Read ANP2 conversion result data */

  //ResultInMv[0] = (uint16_t) (5000*Result[0]/0x3FF); /* Converted result in mv */

  //ResultInMv[1] = (uint16_t) (5000*Result[1]/0x3FF); /* Converted result in mv */

  //ResultInMv[2] = (uint16_t) (5000*Result[2]/0x3FF); /* Converted result in mv */

 

  if(Result[0]<=1000){

  SIU.GPDO[LED1].B.PDO = LED_ON;

  SIU.GPDO[LED2].B.PDO = LED_OFF;

  SIU.GPDO[LED3].B.PDO = LED_OFF;

  SIU.GPDO[LED4].B.PDO = LED_OFF;

  }

  else if(Result[0]>1000 && Result[0]<=2000){

  SIU.GPDO[LED1].B.PDO = LED_ON;

  SIU.GPDO[LED2].B.PDO = LED_ON;

  SIU.GPDO[LED3].B.PDO = LED_OFF;

  SIU.GPDO[LED4].B.PDO = LED_OFF;

  }

  else if(Result[0]>2000 && Result[0]<=3000){

  SIU.GPDO[LED1].B.PDO = LED_ON;

  SIU.GPDO[LED2].B.PDO = LED_ON;

  SIU.GPDO[LED3].B.PDO = LED_ON;

  SIU.GPDO[LED4].B.PDO = LED_OFF;

  }

  else if(Result[0]>3000 && Result[0]<=4095){

  SIU.GPDO[LED1].B.PDO = LED_ON;

  SIU.GPDO[LED2].B.PDO = LED_ON;

  SIU.GPDO[LED3].B.PDO = LED_ON;

  SIU.GPDO[LED4].B.PDO = LED_ON;

  }

  i++;

  }

}

 

*********************************************************************************************************************************************

Original Attachment has been moved to: ADC1_ScanMode_APDaga.rar

Outcomes