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 support@ccsinfo.com

rc hobby servo and button

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



Joined: 29 Dec 2010
Posts: 37

View user's profile Send private message

rc hobby servo and button
PostPosted: Thu Feb 24, 2011 11:00 am     Reply with quote

This is a code using button to control the direction of the hobby servo motor. But the code can't be compiled. Is there anything that I did wrong with the code? Thanx a lot Smile
Code:

#include <16F877A.h>
#device adc=10
#use delay(clock=20000000)
#define   XTAL_FREQ   200000000

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#FUSES HS, NOWDT,NOPROTECT,NOLVP,NOWDT,PUT,NOBROWNOUT

#define C0 PIN_C0
#define C1 PIN_C1
#define C2 PIN_C2
#define B1 PIN_B1

void main()
{
while(TRUE)
{
if (input C0==1)
{
output_high(B1);
delay_us(750);
output_low(B1);
delay_us(19250);
}

else if (inputC1==1)
{
output_high(B1);
delay_us(900);
output_low(B1);
delay_us(19100);
}

else if (input C2==1)
{
output_high(B1);
delay_us(1200);
output_low(B1);
delay_us(18800);

}

}
}
temtronic



Joined: 01 Jul 2010
Posts: 9174
Location: Greensville,Ontario

View user's profile Send private message

PostPosted: Thu Feb 24, 2011 12:11 pm     Reply with quote

Since you're not using anything inside these...
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
I'd delete them.
Also
#device adc=10 is not required.

May not make a difference, depending on the version of the compiler, but why not just start with the minimum code? Easier to debug.

The delay_us(xxxxx); might not be correct, again version dependent.

It'd help if you supplied the version as well as the actual error message.

If using MPLAB you'll have to chnage the build configuration in the project's pulldown menu from 'debug' to 'release' and recompile, before you burn a PIC with a PICSTARTPlus programmmer..
dyeatman



Joined: 06 Sep 2003
Posts: 1924
Location: Norman, OK

View user's profile Send private message

PostPosted: Thu Feb 24, 2011 5:00 pm     Reply with quote

Several things:
1. this line is not valid.
Code:
(input C0==1) 
Look in the CCS manual for the input comand.

2. As temtronic said get rid of the includes. You don't need them in this case. They are way too soon in the program anyway.

3. You need to organize your program as follows:
Device Includes (PIC device header must always be first line)
Fuses
use delay() statement
use RS232 statement(s)
defines
<library.h includes> // if you need them
global variables
Main routine

There are a few exceptions to #3 but it's a good basic outline.
_________________
Google and Forum Search are some of your best tools!!!!
Gabriel



Joined: 03 Aug 2009
Posts: 1067
Location: Panama

View user's profile Send private message

PostPosted: Fri Feb 25, 2011 7:04 am     Reply with quote

Hi,

I'm sure a 200 Mhz Crystal frequency doesnt help either.

Quote:
#define XTAL_FREQ 200000000

hope that helps,

G
_________________
CCS PCM 5.078 & CCS PCH 5.093
wind88



Joined: 29 Dec 2010
Posts: 37

View user's profile Send private message

PostPosted: Fri Feb 25, 2011 10:04 am     Reply with quote

Code:
#include <16F877A.h>
#use delay(clock=20000000)
#define   XTAL_FREQ   20000000


#FUSES HS, NOWDT,NOPROTECT,NOLVP,NOWDT,PUT,NOBROWNOUT

#define C0 PIN_C0
#define C1 PIN_C1
#define C2 PIN_C2
#define B1 PIN_B1

void main()
{
while(TRUE)
{
if (input C0==1)
{
output_high(B1);
delay_us(750);
output_low(B1);
delay_us(19250);
}

else if (inputC1==1)
{
output_high(B1);
delay_us(900);
output_low(B1);
delay_us(19100);
}

else if (input C2==1)
{
output_high(B1);
delay_us(1200);
output_low(B1);
delay_us(18800);

}

}
}

Thanx everyone.
I'm using ccs 4.093 version
I will look through in the ccs built in for the (input C0==1) function. thanx
wind88



Joined: 29 Dec 2010
Posts: 37

View user's profile Send private message

PostPosted: Sun Feb 27, 2011 3:50 am     Reply with quote

Code:
#include <16F877A.h>
#use delay(clock=20000000)
#define   XTAL_FREQ   20000000

#FUSES HS, NOWDT,NOPROTECT,NOLVP,NOWDT,PUT,NOBROWNOUT

#define C0 PIN_C0
#define C1 PIN_C1
#define C2 PIN_C2
#define B1 PIN_B1

void main()
{
while(TRUE)
{
if( input(PIN_C0) )
output_high(B1);
delay_us(750);
output_low(B1);
delay_us(19250);


if( input(PIN_C1) )

output_high(B1);
delay_us(900);
output_low(B1);
delay_us(19100);


if ( input(PIN_C2) )

output_high(B1);
delay_us(1200);
output_low(B1);
delay_us(18800);

}
}

this code is still not workable on my hardware:(
Gabriel



Joined: 03 Aug 2009
Posts: 1067
Location: Panama

View user's profile Send private message

PostPosted: Sun Feb 27, 2011 7:06 am     Reply with quote

hi,

you have 3 buttons and i see no debounce routine.

also, your pulse to the servo is off.
the TOTAL pulse for a servo is about ~2ms(position pulse) , EVERY ~20ms(refresh rate)
you position pulse is 20ms(total), thus your servo has no idea what the hell is going on....

hope that helps.

Gabriel.
_________________
CCS PCM 5.078 & CCS PCH 5.093
wind88



Joined: 29 Dec 2010
Posts: 37

View user's profile Send private message

PostPosted: Sun Feb 27, 2011 9:27 am     Reply with quote

thanx.
But to set the location of the servo I just need 1 pulse. Is that correct? Or do I need to constantly sending a pulse to the servo motor?

And from this http://www.servocity.com/html/how_do_servos_work_.html
I do need to constantly send pulses to the servo motor. I think the timeframe is correct. Just I need to keep on sending the pulse to it.
dyeatman



Joined: 06 Sep 2003
Posts: 1924
Location: Norman, OK

View user's profile Send private message

PostPosted: Sun Feb 27, 2011 9:34 am     Reply with quote

First, you still need to move your FUSES above the Use Delay line
Second, are you sure the PIC is running?
Put in a simple LED blink code to verify it is running and it is
running at the right speed.

Add the following code at the beginning of Main before the other While TRUE statement
Code:

while(TRUE)
{
output_toggle(Pin_B2);
delay_ms(1000);
}


Put an LED on B2 and see if it blinks at a 1 second rate. Once you get that
working then remove this code and work on your other code.
_________________
Google and Forum Search are some of your best tools!!!!
wind88



Joined: 29 Dec 2010
Posts: 37

View user's profile Send private message

PostPosted: Sat Mar 05, 2011 9:07 pm     Reply with quote

Thanx for the tip. I think my code is working now. Thanx.
wind88



Joined: 29 Dec 2010
Posts: 37

View user's profile Send private message

PostPosted: Tue Mar 15, 2011 2:18 pm     Reply with quote

Why if I put a for(;;) or while(1) then the hobby servo will keep on rotating the 3 diff direction without stopping?

Is there any method to make it stop? And only move if I press a button?
Thank you.
wind88



Joined: 29 Dec 2010
Posts: 37

View user's profile Send private message

PostPosted: Tue Mar 15, 2011 2:39 pm     Reply with quote

http://pic-c.ccsinfo.com/forum/viewtopic.php?p=63318

i found a code around the same as mine.i tried it and the same thing happen.
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