Yahoo Groups archive

Lpc2000

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

Message

Re: PWM with olimex lpc2106-mt pcb - how to?

2004-07-23 by killtheclock

Now I got it:
It is really simple. The only problem was that I inited P0.8 to be 
used as TxD UART 1, PINSEL P0.8 bits set to 01. Then in the main 
program I set the bits to 10.
  PINSEL0 |= 0x20000;
That resulted in both bits set for P0.8, wich is undefined and does 
not work.

This code does work:

        //setup PWM4
	PINSEL0 &= ~BIT16; // deselect pin 0.08 GPIO function
	PINSEL0 |= BIT17;  // select pin 0.08 PWM4 function
	PWM_PCR = BIT12;   //PWM4 enable, single edge
	PWM_PR  = 0x0000;  // max prescale counter value
	PWM_MR0 = 0x400;   // MR0 must be set prior to enabling 
                           // the PWM 
	PWM_MCR = 0x02;	   // enable reset on MR0
	PWM_TCR = 0x09;    // PWM enable and counter start
        PWM_MR4 = 0x0200;  // match register 4 trigger value
        PWM_LER |= 0x10;   // latch MR4

Kris, there is no need to poll the interrupt flag when you init MR0 
before enabling PWM mode. 
The docu says (UM_LPC2106_2105_2104_1.pdf, p.152, table 117): 

"Note that the PWM Match register that determines the PWM rate (PWM 
Match 0) must be set up prior to the PWM being enabled. Otherwise a 
Match event will not occur to cause shadow register contents to 
become effective."

Thank you Kris and Karl,
regards,
Kurt.

--- In lpc2000@yahoogroups.com, "microbit" <microbit@c...> wrote:
> > I still can't get it running. Karl showed me the way to 
understand 
> > the docu - at least I felt like understanding it...
> > Current code status:
> > 
> > //testing PWM4
> >   PINSEL0 |= 0x20000;   // select pin 0.08 PWM4 function
> >   
> >   PWM_PR  = 0x0000;          // max prescale counter value
> >   PWM_MCR = 0x0002;         // reset TC when PWMMR0 matches
> >   PWM_PCR = 0x7E00;         // enable all PWM just to get the 
right one
> >   PWM_TCR = 0x000A;      // reset TC counter (not yet needed?!)
> >   
> >   PWM_MR0 = 0x0400;          // match register 0 trigger value
> >   PWM_LER |= BIT0;
> >   
> >   PWM_MR4 = 0x0150;      // match register 4 trigger value
> >   PWM_LER |= BIT4;            
> >   
> >   PWM_TCR = 0x0009;          // set the TC counter and enable the 
PWMs
> > 
> > But still getting the single 88.64 ms pulse.
> > Any idea?
> > 
> > Cheers, Kurt.
> 
> Hi Kurt,
> 
> I think the main problem is that you have to wait until you get the 
Match _before_
> the PWM cycle is actually written. This would explain why you only 
get a single pulse.
> 
> Follow this procedure I use :
> 
> /* Setting the PWM cycle */
> /*******************/
> PWMTCR = 0x0B;                // Hold TC in reset while altering 
Cycle
> PWMMR0 = CYCLE;             // Write the new PWM period
> PWMMCR = 0x01;               // Allow the INT flag for MR0
> PWMTCR = 0x09;                // Restart PWM
> PWMIR |= 0x01;                 // Reset MR0 Int flag
> PWMLER = 0x01;                // Enable PWM0 latch
> while ( ! (PWMIR & 0x01));  // Wait for match -> new cycle complete
> PWMMCR = 0;                    // Disable MR0 Int flagging
> 
> /* Setting , for example, PWM5 */
> /***********************/
> PWMMR5 = DUTY;              // write duty cycle
> PWMLER = 0x20;                // enable PWM5 Latch
> 
> Obviously CYCLE is the total PWM cycle and PERIOD makes the
> PWM's dutycycle as = DUTY / CYCLE
> 
> So if you eg. set CYCLE to 1000 and DUTY to 150 you would get a 15% 
dutycycle
> with a frequency of PCLK / 1000 (cycle), providing Prescaler is set 
to ONE (=0).
> 
> There might be better ways of doing this, but this way ensures you 
wait long enough 
> for the PWM period cycle to update, but no longer than 
necessary......
> 
> B rgds and good luck,
> Kris
> 
> 
> [Non-text portions of this message have been removed]

Attachments

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.