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
已解决! 转到解答。