I am trying to learn EMIOS module for MPC 5634M for all modes of operation. In this Initially I have tried use of Bus A and internal counter to drive the unifeid channel. ITS working propely. Now, I am trying to use counter bus B, C, D to drive the channel by selecting EMIOS.CH[10].CCR.B.BSL = 0x1 but its not working. Can anyone tell me what are the other settings require to use this mode. Also can I use use internal counter by selecting EMIOS.CH[10].CCR.B.BSL = 0x3 for other channel while using EMIOS.CH[10].CCR.B.BSL = 0x1 mode for some different channel in the same program.
This is my code.
/ Initilization of EMIOS
void initEMIOS(void) {
EMIOS.MCR.B.GPRE= 63; /* Divide 64 MHz sysclk by 63+1 = 64 for 1MHz eMIOS clk*/
EMIOS.MCR.B.GPREN = 1; /* Enable eMIOS clock */
EMIOS.MCR.B.GTBE = 1; /* Enable global time base */
EMIOS.MCR.B.FRZ = 1; /* Enable stopping channels when in debug mode */
//EMIOS.MCR.B.ETB = 0;
}
// Channel 23 for modulous counter
void initEMIOSch23(void) { /* EMIOS CH 23: Modulus Up Counter */
EMIOS.CH[23].CADR.R = 999; /* Period will be 999999+1 = 1000000 clocks (1 sec) */
EMIOS.CH[23].CCR.B.MODE = 0x50; /* MPC551x, MPC563x: Mod Ctr Bufd (MCB) int clk */
EMIOS.CH[23].CCR.B.BSL = 0x3; /* Use internal counter */
EMIOS.CH[23].CCR.B.UCPRE=0; /* Set channel prescaler to divide by 1 */
EMIOS.CH[23].CCR.B.FREN = 1; /* Freeze channel counting when in debug mode */
EMIOS.CH[23].CCR.B.UCPREN = 1; /* Enable prescaler; uses default divide by 1 */
}
//Channel 10 for OPWMB
void initEMIOSch10(void) { /* EMIOS CH 0: Output Pulse Width Modulation */
EMIOS.CH[10].CADR.R = 250 ; /* Leading edge when channel counter bus=250*/
EMIOS.CH[10].CBDR.R = 500; /* Trailing edge when channel counter bus=500*/
EMIOS.CH[10].CCR.B.BSL = 0x1; /* Use counter bus A (default) */
//EMIOS.CH[14].CCR.B.UCPRE = 1; // internal prescaler of Unified Channel=1
//EMIOS.CH[14].CCR.B.UCPREN = 1; // internal prescaler of Unified Channel enable
EMIOS.CH[10].CCR.B.EDPOL = 1; /* Polarity-leading edge sets output/trailing clears*/
EMIOS.CH[10].CCR.B.MODE = 0x60; /* MPC551x, MPC563x: Mode is OPWM Buffered */
SIU.PCR[189].R = 0x0600; /* Initialize pad for eMIOS chan. 0 output */
}
/Channel 14 for OPWFMB
void initEMIOSch14(void) { /* EMIOS CH 0: Output Pulse Width Modulation */
EMIOS.CH[14].CADR.R = 499; /* Leading edge when channel counter bus=250*/
EMIOS.CH[14].CBDR.R = 999; /* Trailing edge when channel counter bus=500*/
EMIOS.CH[14].CCR.B.UCPRE = 1; // internal prescaler of Unified Channel=1
EMIOS.CH[14].CCR.B.UCPREN = 1; // internal prescaler of Unified Channel enable
EMIOS.CH[14].CCR.B.EDPOL = 1; /* Polarity-leading edge sets output/trailing clears*/
EMIOS.CH[14].CCR.B.MODE = 0x58; /* MPC551x, MPC563x: Mode is OPWM Buffered */
SIU.PCR[193].R = 0x0600; /* Initialize pad for eMIOS chan. 0 output */
}
Hi,
There is always group of channels, which are running from counter bus B, C or D. See Figure 297 “eMIOS block diagram” of the device RM for more info.
Channels 1-7 can use Counter bus B, which is driven by Channle 0.
Channels 9-15 can use Counter bus C, which is driven by Channle 8.
Channels 17-23 can use Counter bus D, which is driven by Channle 16.
So channel 10 can run from Counter bus C, thus you need to initialize channel 8 for MCB mode, similarly as you init channel 23 to serve counter bus A.
Each channel can run from Counter bus A or one of B/C/D buses or internal counter depending on CCR[BSL] setting and used mode.
Note: only a big channels can run from internal counter. See Table 209 for channel group implementation.
BR, Petr
Okay.
I got it.
Thank you.