Yahoo Groups archive

Lpc2000

Index last updated: 2026-04-28 23:31 UTC

Thread

Reg: PWM in LPC2104

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

Move to quarantaine

This moves the raw source file on disk only. The archive index is not changed automatically, so you still need to run a manual refresh afterward.