View previous topic :: View next topic |
Author |
Message |
8051topic
Joined: 05 Nov 2009 Posts: 7 Location: Viet Nam
|
PIC16F887 and steering mode |
Posted: Sun May 02, 2010 1:55 am |
|
|
I test PWM in steering mode in multi pins.
Datasheet PIC16F887 - DS41291F page 146.
11.6.7 PULSE STEERING MODE
In Single Output mode, pulse steering allows any of the PWM pins to be the modulated signal. Additionally, the same PWM signal can be simultaneously available on multiple pins.
But PWM signal is only appeared in P1A, not another pin.
Code: |
#include <16F887.h>
#fuses INTRC_IO, NOWDT, NOPROTECT, BROWNOUT, PUT, NOLVP
#use delay(clock = 4000000)
void main(void)
{
setup_timer_2(T2_DIV_BY_1, 255, 1);
set_pwm1_duty(124);
output_low(PIN_C2); // Set P1A output low
output_low(PIN_D5); // Set P1B output low
output_low(PIN_D6); // Set P1C output low
output_low(PIN_D7); // Set P1D output low
setup_CCP1(CCP_PWM,CCP_PWM_H_H | CCP_PULSE_STEERING_A | CCP_PULSE_STEERING_B| CCP_PULSE_STEERING_C | CCP_PULSE_STEERING_D);
while(1)
{}
}
|
Please help me.
Thanks all! |
|
|
PCM programmer
Joined: 06 Sep 2003 Posts: 21708
|
|
Posted: Sun May 02, 2010 12:21 pm |
|
|
If you suspect a bug in the compiler, then post your compiler version.
Always do this. |
|
|
8051topic
Joined: 05 Nov 2009 Posts: 7 Location: Viet Nam
|
|
Posted: Mon May 03, 2010 9:57 am |
|
|
My CCS version is 4.105.
Thank for your reply. |
|
|
PCM programmer
Joined: 06 Sep 2003 Posts: 21708
|
|
Posted: Mon May 03, 2010 12:26 pm |
|
|
I don't think it's setting up the pulse steering correctly. Try this code
as a work-around:
Code: |
#include <16F887.h>
#fuses INTRC_IO, NOWDT, NOPROTECT, BROWNOUT, PUT, NOLVP
#use delay(clock = 4000000)
// These are the PWM output pins for the 16F887.
#define P1A PIN_C2
#define P1B PIN_D5
#define P1C PIN_D6
#define P1D PIN_D7
/*
// For the 16F886.
#define P1A PIN_C2
#define P1B PIN_B2
#define P1C PIN_B1
#define P1D PIN_B4
*/
#byte PSTRCON = 0x9d
// Call this routine to set the PWM steering. You can OR
// together the PWM steering constants from the PIC's
// header file.
void set_pulse_steering(int32 steering)
{
int8 temp;
temp = make8(steering, 3); // Get high byte only
PSTRCON = temp; // Setup PWM steering register
// Set the TRIS to outputs for the enabled steering pins.
// Also set the selected pins to a low level.
if(temp & 1)
output_low(P1A);
if(temp & 2)
output_low(P1B);
if(temp & 4)
output_low(P1C);
if(temp & 8)
output_low(P1D);
}
//===========================================
void main()
{
setup_timer_2(T2_DIV_BY_16, 124, 1); // Set 1000 Hz PWM freq
set_pwm1_duty(31); // Set PWM for 25% duty cycle
// Set up PWM so that all four outputs are active high.
setup_ccp1(CCP_PWM_H_H);
// Enable PWM output on all four pins.
set_pulse_steering( CCP_PULSE_STEERING_A |
CCP_PULSE_STEERING_B |
CCP_PULSE_STEERING_C |
CCP_PULSE_STEERING_D);
while(1);
}
|
|
|
|
8051topic
Joined: 05 Nov 2009 Posts: 7 Location: Viet Nam
|
|
Posted: Tue May 04, 2010 9:04 am |
|
|
Thank you, PCM programmer.
I'll try. |
|
|
PCM programmer
Joined: 06 Sep 2003 Posts: 21708
|
|
Posted: Thu May 06, 2010 2:49 pm |
|
|
I emailed CCS about this bug today. Hopefully they will fix it in
the next version (which will be 4.108). |
|
|
8051topic
Joined: 05 Nov 2009 Posts: 7 Location: Viet Nam
|
|
Posted: Sun May 09, 2010 2:24 am |
|
|
I tried your code and it worked perfectly. Thank you!
For my code above, when i change CCP_PWM in Code: | setup_CCP1(CCP_PWM,CCP_PWM_H_H | CCP_PULSE_STEERING_A | CCP_PULSE_STEERING_B| CCP_PULSE_STEERING_C | CCP_PULSE_STEERING_D); |
to
Code: | setup_CCP1(CCP_PWM_H_H | CCP_PULSE_STEERING_A | CCP_PULSE_STEERING_B | CCP_PULSE_STEERING_C| CCP_PULSE_STEERING_D); |
then it worked too. |
|
|
meereck
Joined: 09 Nov 2006 Posts: 173
|
|
Posted: Sun May 09, 2010 11:27 am |
|
|
Hi,
I have never used this ECCP unit yet.
Shall I understand it that Single Mode means that it outputs PWM signal either on P1A, P1B, P1C or P1D, or on some of them, or all of them?
In other words, can I use the ECCP module to make a PWM signal on P1A and then switch it to, say, P1B (and force P1A low)?
Cheers
Meereck |
|
|
PCM programmer
Joined: 06 Sep 2003 Posts: 21708
|
|
Posted: Sun May 09, 2010 12:52 pm |
|
|
Yes, by calling the set_pulse_steering() routine shown above, you can
switch the PWM output between the four PWM pins (P1A to P1D), or any
combination of them. |
|
|
meereck
Joined: 09 Nov 2006 Posts: 173
|
|
Posted: Sun May 09, 2010 2:41 pm |
|
|
thanks,
I also noticed that having ECCP module doesn't always mean that the PIC model has got the steering feature. Or at least it is not described in its data sheet - for example 18F1220 has got the ECCP module, but the steering feature is not mentioned in the data sheet.
Am I correct?
Does anybody know how to find a 18-pin PIC (16F/18F) without opening all device data sheets? As I can see, the new 16F18xx provide steering mode
Cheers
Meereck |
|
|
PCM programmer
Joined: 06 Sep 2003 Posts: 21708
|
|
Posted: Sun May 09, 2010 2:58 pm |
|
|
Use the Microchip Part Selector page:
http://www.microchip.com/maps/microcontroller.aspx
In the Prefix section, select PIC18F. Then in the Package section
at the bottom, select 18 pins in both sections. Then go to the top and
look at the search results. |
|
|
meereck
Joined: 09 Nov 2006 Posts: 173
|
|
Posted: Sun May 09, 2010 3:05 pm |
|
|
I know the MAPS, but I just dont know how to view all the PICs with the steering feature. I dont think it is possible.
thanks |
|
|
PCM programmer
Joined: 06 Sep 2003 Posts: 21708
|
|
Posted: Sun May 09, 2010 3:08 pm |
|
|
Do a search like this in Google:
Quote: | site:microchip.com type:pdf "data sheet" pwm steering |
Or you could do it like this, but I don't guarantee that it gets them all:
Quote: | site:microchip.com type:pdf "data sheet" "pulse steering" |
|
|
|
meereck
Joined: 09 Nov 2006 Posts: 173
|
|
Posted: Sun May 09, 2010 3:51 pm |
|
|
thanks for the hint,
I think I will go for 16F1826 - seems to have ECCP, steering and half-bridge features.
Regards
Meereck |
|
|
8051topic
Joined: 05 Nov 2009 Posts: 7 Location: Viet Nam
|
|
Posted: Wed May 12, 2010 8:18 am |
|
|
Hi PCM programmer!
I see CCP_DELAY in setup_ccp1( ) function and it use to set the dead-band delay but I can't use it!
Could you show me how to use it!
Thank you! |
|
|
|