Reg: PWM in LPC2104
2005-03-07 by rockraj_2003
Hi,
I am a silent member of this group.
I am trying to work with PWMs.
I want to produce 1 DOUBLE EDGE CONTROLLED and others SIGLE EDGE
CONTROLLED PWMs.
I am using IAR EMBEDDED WORKBENCH.
I want to know where the problem lies
The Code was developed in IAR MEKEAPP.
I am using this code only.
THE RESPONE FROM LPC
PWM1 & PWM6 PINS REMAINS HIGH FOREVER.
#include "usercode.h" /* Usercode macros (see <template.h>) */
#include "ma_tgt.h" /* Target specific header file */
#include "ma_sfr.h" /* Special function register bitfield macros
*/
#include "iolpc210x.h" /* Defines Special function registers */
#include "ma_pwm0.h" /* PWM0 Module driver header file */
#define MA_PWMTCR_PWM0 0x00000008 /* PWM Timer Control
Register */
#define MA_PWMTCR_PWM0_MASK 0x0000000B /* Used bits */
#define MA_PWMTC_PWM0 0x00000000 /* PWM Timer Counter */
#define MA_PWMTC_PWM0_MASK 0xFFFFFFFF /* Used bits */
#define MA_PWMPR_PWM0 0x00000000 /* PWM Prescale Register */
#define MA_PWMPR_PWM0_MASK 0xFFFFFFFF /* Used bits */
#define MA_PWMPC_PWM0 0x00000000 /* PWM Prescale Counter */
#define MA_PWMPC_PWM0_MASK 0xFFFFFFFF /* Used bits */
#define MA_PWMMCR_PWM0 0x00000000 /* PWM Match Control
Register */
#define MA_PWMMCR_PWM0_MASK 0x001FFFFF /* Used bits */
#define MA_PWMMR0_PWM0 0x00000000 /* PWM Match Register 0 */
#define MA_PWMMR0_PWM0_MASK 0xFFFFFFFF /* Used bits */
#define MA_PWMMR1_PWM0 0x00000000 /* PWM Match Register 1 */
#define MA_PWMMR1_PWM0_MASK 0xFFFFFFFF /* Used bits */
#define MA_PWMMR2_PWM0 0x00000000 /* PWM Match Register 2 */
#define MA_PWMMR2_PWM0_MASK 0xFFFFFFFF /* Used bits */
#define MA_PWMMR3_PWM0 0x00000000 /* PWM Match Register 3 */
#define MA_PWMMR3_PWM0_MASK 0xFFFFFFFF /* Used bits */
#define MA_PWMMR4_PWM0 0x00000000 /* PWM Match Register 4 */
#define MA_PWMMR4_PWM0_MASK 0xFFFFFFFF /* Used bits */
#define MA_PWMMR5_PWM0 0x00000000 /* PWM Match Register 5 */
#define MA_PWMMR5_PWM0_MASK 0xFFFFFFFF /* Used bits */
#define MA_PWMMR6_PWM0 0x00000000 /* PWM Match Register 6 */
#define MA_PWMMR6_PWM0_MASK 0xFFFFFFFF /* Used bits */
#define MA_PWMPCR_PWM0 0x00007000 /* PWM Control Register */
#define MA_PWMPCR_PWM0_MASK 0x00007E7E /* Used bits */
#define MA_PWMLER_PWM0 0x00000000 /* PWM Latch Enable
Register */
#define MA_PWMLER_PWM0_MASK 0x0000007F /* Used bits */
void MA_Init_PWM0( void )
/*
**--------------------------------------------------------------------
-------
**
** Abstract:
** Initialises the PWM0 module. Only sets those registers with
values
** not equal to the power-on reset values. PWM is not started by
** this function. Use MA_Start_PWM0 to start.
**
** Parameters:
** None
**
** Returns:
** None
**
**--------------------------------------------------------------------
-------
*/
{
/*--- Handle user code on function entry ---*/
ENTER_MA_INIT_PWM0;
/*--- Initialise registers ---*/
PWMTCR = ( PWMTCR & ~MA_PWMTCR_PWM0_MASK ) | MA_PWMTCR_PWM0;
PWMPCR = ( PWMPCR & ~MA_PWMPCR_PWM0_MASK ) | MA_PWMPCR_PWM0;
/*--- Handle user code on function exit ---*/
EXIT_MA_INIT_PWM0;
} /* MA_Init_PWM0 */
void MA_Reset_PWM0( void )
/*
**--------------------------------------------------------------------
-------
**
** Abstract:
** Resets the PWM0 module. Sets all registers. PWM is not
started by
** this function. Use MA_Start_PWM0 to start.
**
** Parameters:
** None
**
** Returns:
** None
**
**--------------------------------------------------------------------
-------
*/
{
U32 IntSrc;
/*--- Handle user code on function entry ---*/
ENTER_MA_RESET_PWM0;
/*--- Initialise registers ---*/
PWMMR0 = MA_PWMMR0_PWM0;
PWMMR1 = MA_PWMMR1_PWM0;
PWMMR2 = MA_PWMMR2_PWM0;
PWMMR3 = MA_PWMMR3_PWM0;
PWMMR4 = MA_PWMMR4_PWM0;
PWMMR5 = MA_PWMMR5_PWM0;
PWMMR6 = MA_PWMMR6_PWM0;
PWMPR = MA_PWMPR_PWM0;
PWMTCR = ( PWMTCR & ~MA_PWMTCR_PWM0_MASK ) | MA_PWMTCR_PWM0;
PWMMCR = ( PWMMCR & ~MA_PWMMCR_PWM0_MASK ) | MA_PWMMCR_PWM0;
PWMPCR = ( PWMPCR & ~MA_PWMPCR_PWM0_MASK ) | MA_PWMPCR_PWM0;
/*--- Reset Interrupt flags ---*/
IntSrc = PWMIR;
PWMIR = (IntSrc & 0x70f);
PWMLER = 0;
PWMTC = 0;
PWMPC = 0;
/*--- Handle user code on function exit ---*/
EXIT_MA_RESET_PWM0;
} /* MA_Reset_PWM0 */
S8 MA_Start_PWM0( U8 Reset )
/*
**--------------------------------------------------------------------
-------
**
** Abstract:
** Start PWM0. Optionally, the PWM counter can be cleared before
** the PWM is started.
**
** Parameters:
** Reset 0 = Do not reset PWM before start
** 1 = Reset PWM value before start
**
** Returns:
** MA_OK
**
**--------------------------------------------------------------------
-------
*/
{
/*--- Handle user code on function entry ---*/
ENTER_MA_START_PWM0;
/*--- Reset PWM first? ---*/
if( Reset )
{
PWMTCR_bit.CR = 1; /* Reset */
PWMTCR_bit.CR = 0; /* Release Reset */
}
/*--- Start PWM0 ---*/
PWMTCR_bit.CE = 1;
/*--- Handle user code on function exit ---*/
EXIT_MA_START_PWM0;
return MA_OK;
} /* MA_Start_PWM0 */
S8 MA_Stop_PWM0( void )
/*
**--------------------------------------------------------------------
-------
**
** Abstract:
** Stop PWM0.
**
** Parameters:
** None
**
** Returns:
** MA_OK
**
**--------------------------------------------------------------------
-------
*/
{
/*--- Handle user code on function entry ---*/
ENTER_MA_STOP_PWM0;
/*--- Stop PWM0 ---*/
PWMTCR_bit.CE = 0;
/*--- Handle user code on function exit ---*/
EXIT_MA_STOP_PWM0;
return MA_OK;
} /* MA_Stop_PWM0 */
S8 MA_Set_PWM0( U8 Channel, U8 EnableLatch, U32 Value )
/*
**--------------------------------------------------------------------
-------
**
** Abstract:
** Set the selected PWM channel match register.
**
**
** Parameters:
** Channel The PWM channel to set (0-6)
** EnableLatch Enables use of new PWM match values (bit 0 to 6)
** Value The value to set
**
** Returns:
** MA_ERROR If illegal channel number was given
** MA_OK Otherwise
**
**--------------------------------------------------------------------
-------
*/
{
S8 ReturnCode = MA_OK;
/*--- Handle user code on function entry ---*/
ENTER_MA_SET_PWM0;
/*--- Handle correct channel ---*/
switch( Channel )
{
case 0:
PWMMR0 = Value;
break;
case 1:
PWMMR1 = Value;
break;
case 2:
PWMMR2 = Value;
break;
case 3:
PWMMR3 = Value;
break;
case 4:
PWMMR4 = Value;
break;
case 5:
PWMMR5 = Value;
break;
case 6:
PWMMR6 = Value;
break;
default:
/*--- Illegal channel ---*/
ReturnCode = MA_ERROR;
break;
}
if( ReturnCode == MA_OK )
{
/*--- Update Latch enable register ---*/
PWMLER = (EnableLatch & 0x7f);
}
/*--- Handle user code on function exit ---*/
EXIT_MA_SET_PWM0;
return ReturnCode;
} /* MA_Set_PWM0 */
void main()
{
int i;
S8 Result8;
PINSEL0 = 0x000A800A;
MA_Init_PWM0();
MA_Reset_PWM0();
do Result8 = MA_Set_PWM0(0,0,0x000000FFF);
while(Result8 != MA_OK);
do Result8 = MA_Set_PWM0(1,1,0x000000040);
while(Result8 != MA_OK);
do Result8 = MA_Set_PWM0(2,2,0x000000060);
while(Result8 != MA_OK);
do Result8 = MA_Set_PWM0(3,3,0x0000000A0);
while(Result8 != MA_OK);
do Result8 = MA_Set_PWM0(4,4,0x0000000B0);
while(Result8 != MA_OK);
do Result8 = MA_Set_PWM0(5,5,0x0000000C0);
while(Result8 != MA_OK);
do Result8 = MA_Set_PWM0(6,6,0x000000080);
while(Result8 != MA_OK);
do Result8 = MA_Start_PWM0(1);
while(Result8 != MA_OK);
}
I ALSO TRIED USING KEIL SOFTWARE AGAIN THE SAME RESPONSE
void main()
{
int i;
S8 Result8;
PINSEL0 = 0x000A800A;
PWMTCR = 2;
PWMPR = 0x00000000;
PWMIR = 0;
PWMPCR = 0x00006040;
PWMMCR = 0x000D0000;
PWMMR0 = 100;
PWMMR1 = 0xA;
PWMMR2 = 0xF;
PWMMR3 = 0x40;
PWMMR4 = 0x50;
PWMMR5 = 0x60;
PWMMR6 = 0x80;
PWMLER = 0xF0;
PWMEMR = 0x00210A8E;
PWMTCR = 0x00000009;
}
KINDLY HELP ME TO SOLVE THE PROBLEM
with Regards
Rajendra