CCS C Software and Maintenance Offers
FAQFAQ   FAQForum Help   FAQOfficial CCS Support   SearchSearch  RegisterRegister 

ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in 

CCS does not monitor this forum on a regular basis.

Please do not post bug reports on this forum. Send them to CCS Technical Support

how to use PWM controls in PIC16F877a

 
Post new topic   Reply to topic    CCS Forum Index -> General CCS C Discussion
View previous topic :: View next topic  
Author Message
artohautala



Joined: 17 Nov 2011
Posts: 187

View user's profile Send private message Send e-mail

how to use PWM controls in PIC16F877a
PostPosted: Fri Jan 03, 2014 12:35 am     Reply with quote

hey,
Is it possible to use PIC16F877A so that pin C2 (pin 17) and C1 (pin 16)
use different pulse width modulation ... maybe C2 on-time is 10 and off-time is 90, and C1 on-time is 50 and off-time is 50.

And if it is possible please tell me how to do it in practice.
I learned they both use timer2 interrupt.
Pin C2 is PWM 2 and pin C1 is PWM 1 ok??
But in practice I didn't find any pulses from C1 pin ... is it possible to use
those PWM channels in different pulse widths ?

Pin C2 works fine OK... I use it to control LCD display background light.

Happy new year for you all Smile.

I tried to make it work but no success.

Very happy and fun life for you all and I 'll be happy if you answer my question.

best regards from finland

-arto-
Ttelmah



Joined: 11 Mar 2010
Posts: 19513

View user's profile Send private message

PostPosted: Fri Jan 03, 2014 2:13 am     Reply with quote

OK.
Some comments.
First look again at the data sheet. C2, is PWM1, not PWM2, and C1, is PWM2 not PWM1.
Little things like this will cause a lot of grief....

No, the PWM's, _don't_ use 'timer2 interrupt'. They just use timer2 as their count source. The interrupt is a separate thing entirely.

So:
Code:

#include <16F877A.h>
#FUSES NOWDT, HS, PUT, NOLVP
#use delay(clock=20000000)
#use rs232(baud=9600,parity=N,UART1,bits=8,errors)

void main()
{
   int16 width;
   //Two PWM output demo
   setup_timer_2(T2_DIV_BY_4,249,1);
   //With the 20MHz clock, wil give PWM at 5KHz - 20000000/(4*4*(249+1))
   setup_ccp1(CCP_PWM);
   setup_ccp2(CCP_PWM);
   //setup the two PWM channels
 
   for (width=0;width<1000;width++)
   {
      //Now generate a pwm getting wider slowly on pwm1, and narrower
      //at the same rate on PWM2
      set_pwm1_duty(width);
      set_pwm2_duty(1000-width);
      delay_ms(10);
      //each width will be output for 10mSec, so a total of just over
      //ten seconds to ramp all the way.
   }
   //Now for your simpler 'fixed' widths
   set_pwm1_duty(100L); //10% duty on C2
   set_pwm2_duty(500L); //50% on C1
 
   while(TRUE)
   {

      //and do nothing else....     
   }
}

Now I show how to vary the widths initially, ramping PWM1, from off to fully on, and PWM2 from on to off, over 10 seconds. Then stop and give the fixed ratios you describe.

On the timer, it counts from 0 to 'PR2' (the second number in the setup), so 0 to 249, which is 250 counts. The clock feeding all peripherals like this, is 'Fosc/4'. This then goes through a prescaler (/4 in the example), so the timer runs at 20000000/(4*4*(249+1)) = 5KHz.
Maximum value allowed for PR2, is 255 (256 counts).

Then the value for the 'on' time (which is what the 'duty' function sets), can go from 0 (off) to ((PR2+1)*4)-1. So '999' in the example.

Note the use of 'L', so the constant number is treated as an int16. The duty function has two different modes of operation. In one it only writes the top 8bits of the 10bit value allowed, while in the second it writes the whole value. The former is quicker, but doesn't give access to the full resolution of the PWM. Using int16, ensures the full access is done.

Best Wishes
artohautala



Joined: 17 Nov 2011
Posts: 187

View user's profile Send private message Send e-mail

PostPosted: Fri Jan 03, 2014 8:39 am     Reply with quote

hello Tthelmah,

lot of thanks for your clear and good answer !
It was very confusing for me when I used :

set_pwm1_duty(100); //10% duty on C2
set_pwm2_duty(500); //50% on C1

and in my hardware PWM1 worked OK
it is connected to pin C2... and I did not use this define at all :
setup_timer_2(T2_DIV_BY_4,249,1);
(clock freq. #use delay(clock= 11059200) and pulse frequence is about
600 Hz measured with my good chinese oscilloscope siglent SDS D1072CNL )

but I solved the problem today morning I haven't use those at all:

setup_ccp1(CCP_PWM);
setup_ccp2(CCP_PWM);

thank's a lot have fun

-arto-
freedom



Joined: 10 Jul 2011
Posts: 54

View user's profile Send private message Send e-mail

PostPosted: Mon Jun 15, 2015 3:10 am     Reply with quote

Quote:
First look again at the data sheet. C2, is PWM1, not PWM2, and C1, is PWM2 not PWM1.



Yes I have seen this in datasheet of PIC16F877A

If I want to use PWM_1 and PWM_2 at any other pin ( as example PWM_1 at pin_A0 and PWM_2 at pin_E1),
Does it possible ?
Any software/coding solution?
Any example ? please

I want to do it because , I used all pin of port "C" as input and used Port "A" and "E" as output.
Pin_A0 will be used for stepper pulse generator and Pin_E1 will be used for another stepper pulse generator

I am using compiler version 4.124
artohautala



Joined: 17 Nov 2011
Posts: 187

View user's profile Send private message Send e-mail

PostPosted: Mon Jun 15, 2015 5:53 am     Reply with quote

freedom wrote:
Quote:
First look again at the data sheet. C2, is PWM1, not PWM2, and C1, is PWM2 not PWM1.



Yes I have seen this in datasheet of PIC16F877A

If I want to use PWM_1 and PWM_2 at any other pin ( as example PWM_1 at pin_A0 and PWM_2 at pin_E1),
Does it possible ?
Any software/coding solution?
Any example ? please

I want to do it because , I used all pin of port "C" as input and used Port "A" and "E" as output.
Pin_A0 will be used for stepper pulse generator and Pin_E1 will be used for another stepper pulse generator

I am using compiler version 4.124
Quote:


Hello,

if I get your email I'll send an example how to control RGB led with 2 PWM
and interrupts ...an BLUE led uses interrupts ... RED and GREEN uses PWM

best regards
arto

my email:
arto.hautala@pp1.inet.fi


PCM programmer



Joined: 06 Sep 2003
Posts: 21708

View user's profile Send private message

PostPosted: Mon Jun 15, 2015 2:01 pm     Reply with quote

Quote:
Yes I have seen this in datasheet of PIC16F877A

If I want to use PWM_1 and PWM_2 at any other pin ( as example PWM_1 at pin_A0 and PWM_2 at pin_E1),
Does it possible ?
Any software/coding solution?
Any example ? please

No, you can't move the output pins for the CCP modules with the 16F877A.
If you want PWM on other pins, then you have to do software PWM.
Display posts from previous:   
Post new topic   Reply to topic    CCS Forum Index -> General CCS C Discussion All times are GMT - 6 Hours
Page 1 of 1

 
Jump to:  
You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot vote in polls in this forum


Powered by phpBB © 2001, 2005 phpBB Group