View previous topic :: View next topic |
Author |
Message |
Gerhard
Joined: 30 Aug 2007 Posts: 144 Location: South Africa
|
CCP1 not switching off. |
Posted: Wed Oct 10, 2007 5:28 am |
|
|
Hi. I have been sitting with the same problem for about 2 days now and i cant seem to figure out what the problem is. I have got a joystic conected to an1 for forward reverse motion and a joystic on an2 to read the left right motion. If i move an1 forward and back the pwm output works fine and if i push an2 left and right the other pwm uotput works works fine but if i push an2 left or right while pushing an1 forwar and back both the pwm indication led's goes on and even when returning both sticks to there original middle position the pwm led's does not want to swtch of. Please see if anyone can find a hole in the program or some other error. I am using a 16f886 pic.
Code: | set_tris_a(TRISA | 0b00001110);
set_tris_a(TRISA & 0b11001111);
set_tris_b(trisb & 0b11000001);
output_low(PIN_A4);
output_low(PIN_A5);
output_low(PIN_B1);
output_low(PIN_B2);
output_low(PIN_B3);
output_low(PIN_B4);
output_low(PIN_B4);
setup_adc_ports(sAN1);
setup_adc_ports(sAN2);
setup_adc_ports(sAN3);
setup_adc( ADC_CLOCK_DIV_8 );
#define P1C PIN_B1
#define P1b PIN_B2
setup_timer_2(T2_DIV_BY_4, 124, 1); // 1000 Hz
output_low(P1C);
//////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////
while(1){
///part were weapon is actvated
//xxxxxxxxxxxxxxxxxxxxxxxxxxx
//////////////////////////////////////Joystick pushed right ////////////////////////////////////////
set_adc_channel(2);
delay_us(20);
value1 = read_adc();
if(value1 > 245 ){
setup_ccp1(CCP_OFF);
output_high(pin_A4);
output_low(pin_b5);
output_low(pin_b3);
PutCC1000(PREAMBLE);
PutCC1000(0x1A);
}
else if(value1 > 210 && value1 < 246 ){
set_pwm1_duty(0);
setup_ccp1(CCP_OFF); ////switch off ccp1(pwm)
output_low(pin_A4);
output_low(pin_b5);
output_low(pin_b3);
PutCC1000(PREAMBLE);
PutCC1000(0x1B);
}
///////////////////////////////////////////Joystick pushed left////////////////////////////////////////////
if(value1 > 10 && value1 < 90 ){
//set_pwm1_duty(0);
setup_ccp1(CCP_OFF); ////switch off ccp1(pwm)
output_low(pin_A5);
output_low(pin_b5);
output_low(pin_b3);
PutCC1000(PREAMBLE);
PutCC1000(0x2A);
}
else if(value1 < 11 ){
set_pwm1_duty(80);
setup_ccp1(CCP_PWM_H_H | CCP_PULSE_STEERING_B);
output_high(pin_A5);
output_low(pin_b5);
output_low(pin_b3);
PutCC1000(PREAMBLE);
PutCC1000(0x2B);
}
//////////////////////////////joystic pushed forward /////////////////////////////////////////////////
if(value1 > 90 && value1 <211){
output_low(pin_A4);
output_low(pin_A5);
set_adc_channel(1);
delay_us(20);
value = read_adc();
if(value > 110 && value < 116 ) {
set_pwm1_duty(25);
setup_ccp1(CCP_PWM_H_H | CCP_PULSE_STEERING_C);
output_high(pin_b3);
PutCC1000(PREAMBLE);
PutCC1000(0x3E);
}
//////////////Joystic in the middle////////
else if(value > 115 && value < 161 ) {
setup_ccp1(CCP_OFF); ////switch off ccp1(pwm)
output_low(pin_b5);
output_low(pin_b3);
PutCC1000(PREAMBLE);
PutCC1000(0x4A);
}
/////////////////joystick pushed back////////////
else if(value > 160 && value < 181 ) {
set_pwm1_duty(25);
setup_ccp1(CCP_PWM_H_H | CCP_PULSE_STEERING_C);
output_high(pin_b5);
PutCC1000(PREAMBLE);
PutCC1000(0x5A);
}
}
} |
|
|
|
jecottrell
Joined: 16 Jan 2005 Posts: 559 Location: Tucson, AZ
|
|
Posted: Wed Oct 10, 2007 8:03 am |
|
|
While many of the experts here can read through code and pick out errors with amazing results, it will be easier, in the long run, for you to learn some debugging techniques. If you have some way to output information, preferably a rs232 but an LED will work in a pinch. (Many use an ICD, CCS or Microchip.... my CCS ICD quit after a while and I didn't go back to it.) Anyway, adding debug statements to test conditions and output rs232 values or illuminate or not illuminate an LED can be used to your advantage.
You may also want to use the #case directive. I notice you have variety of formats of P1C P1b PIN_B1 pin_b5 etc. The #case directive can prevent some pretty frustrating problems.
John |
|
|
PCM programmer
Joined: 06 Sep 2003 Posts: 21708
|
|
Posted: Wed Oct 10, 2007 9:14 am |
|
|
Quote: |
setup_adc_ports(sAN1);
setup_adc_ports(sAN2);
setup_adc_ports(sAN3);
setup_adc( ADC_CLOCK_DIV_8 ); |
This is a bug. The setup_adc_ports() function does not work with
sequential calls. The only call that will take effect is the last one.
If you want to define several analog pins, you should 'OR' them
together with the bitwise 'OR' operator '|', and do it in only one
call to the setup_adc_ports() function. |
|
|
Gerhard
Joined: 30 Aug 2007 Posts: 144 Location: South Africa
|
|
Posted: Wed Oct 10, 2007 11:52 am |
|
|
Thanks.
I changed the setup of the adc although it did work the other way as well i think it is more stable now.
I changed the
setup_ccp1(CCP_OFF); statement to
set_pwm1_duty(0);
setup_ccp1(CCP_PWM_H_H | CCP_PULSE_STEERING_B);
and now it seems to work. Is there a logical reason that ccp_off doesn't work in this program corectly? |
|
|
Gerhard
Joined: 30 Aug 2007 Posts: 144 Location: South Africa
|
|
Posted: Wed Oct 10, 2007 12:07 pm |
|
|
I think i found my mistake.
It should be ccp_off
then output_low(pwm pin)
Thanks |
|
|
|