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

Input not working - Stepper motor control 16f84a

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



Joined: 01 Jun 2012
Posts: 13

View user's profile Send private message

Input not working - Stepper motor control 16f84a
PostPosted: Fri Jun 01, 2012 9:08 pm     Reply with quote

Hello guys, I was hoping that someone could help me with a small problem I have with my code. I'm using V 4.013.

Desired function of code:
Basically I want the 16f84a to run the stepper_FW() function when I press a button on pin A1. What happens now, with the current code is that the motor will turn if A1 is high when I turn him on. And it cycles through the stepper_FW() one time and one time only, even if I give HIGH on A1 again.
Code:

#define w1 PIN_B0
#define w2 PIN_B1
#define w3 PIN_B2
#define w4 PIN_B3
#define time 50

void stepper_FW()
{
   int num=100;
   int i=0;

   for(i=0; i<num; i++)
   {
         output_high(w1);
         output_low(w2);
         output_high(w3);
         output_low(w4);

         delay_ms(time);

         output_low(w1);
         output_high(w2);
         output_high(w3);
         output_low(w4);

         delay_ms(time);

         output_low(w1);
         output_high(w2);
         output_low(w3);
         output_high(w4);

         delay_ms(time);

         output_high(w1);
         output_low(w2);
         output_low(w3);
         output_high(w4);

         delay_ms(time);

   }

}

void main()
{
   setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);

do{
   stepper_FW();
  }while(input(PIN_A1)==1);

return;

}

Thanks
Ttelmah



Joined: 11 Mar 2010
Posts: 19337

View user's profile Send private message

PostPosted: Sat Jun 02, 2012 2:20 am     Reply with quote

First, 'of course it does'. Currently, if pin A1 goes low, the code drops off the end, and dies. 'return' does nothing here - remember, unlike on a PC, where the code is being 'called' from an OS, here the code is everything. Outside there is just (effectively) a 'void' into which if the processor drops, nothing happens. You code has to stay looping whatever the state of pin A1, and do two different things according to whether this is high or low, or look for another pin.

Second comment though. Don't control a stepper with individual bit outputs. Output the whole drive 'byte' in one piece. Problem is that you will be generating moments with extra bits on as you move from state to state, potentially doing nasty things. The bits need to update all in one 'piece', _or_ you must turn off the last bits before switching new ones on.

So:
Code:

#define time (50) //It is good practice to always 'bracket' defines. Can
//avoid some unexpected results when these are substituted.
#define FORWARD TRUE;
#define REVERSE FALSE;

const int8 patterns[4]; = {0b0101,0b0110,0b1010,0b1001);
//The four patterns of drive bits required - from your code.

int16 position=0;

void step(int1 direction) {
    if (direction) position++;
    else position--;
    output_b(patterns[position & 0x3];
}

void stepper_100(int1 direction) {
    int i;
    for (i=0;i<100;i++) {
       step(direction);
       delay_ms(TIME);
    }
}

#define stepper_FW() stepper_100(FORWARD)
#define stepper_BACK() stepper_100(REVERSE)

void main(void) {
   setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);

   do{
      if (input(PIN_A1))
          stepper_FW();
      if (input(PIN_A2)) //have added this to move the opposite way if A2
          stepper_BACK();
   }while(TRUE);
}


Now, have modified the code so it gives 100 steps forward when A1 is made (and will keep doing so, for so long as it is made), or does 100 steps back if A2 is made. Realise that if _both_ are on, the unit will do 100 forward, 100 back, 100 forward, etc....

The comment about 'bracketing defines', is a general one. Basically you can get some unexpected results when values are put into more complex equations using defines, and bracketing helps to avoid these. Just worth being 'aware' of this.

Best Wishes
Tunfiskur



Joined: 01 Jun 2012
Posts: 13

View user's profile Send private message

PostPosted: Sat Jun 02, 2012 7:57 am     Reply with quote

Thanks for the awesome info, it helped alot.
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