****** This code has a problem... the interrupts don't function the way I wrote it. Can't have 2 interrupt routines on one interrupt...
But if you look farther down I have some cleaner code that does work...
Here's the latest code -
I chose to use 2 interrupts on the direction pin as I could simplify the code, and thus make it run faster.
OOPS... That didn't work to well, only got the second one of the 2...
There are 3 step procedures - 2 are commented out, the active one is for half stepping.
Here it is -
/*
Step & Direction Stepper Driver
Pins 9, 10, 11, 12 are tied to transistors
for each of the motor phases.
Pins 2 & 3 are used as interrupts,
Pin 2 as Step and 3 as Direction.
*/
int pin1 =9;
int pin2 = 10;
int pin3 = 11;
int pin4 = 12;
int pinDir = 3;
volatile int ctr;
volatile int dir;
void setup()
{
pinMode(4, OUTPUT);
pinMode(5, OUTPUT);
pinMode(6, OUTPUT);
pinMode(7, OUTPUT);
pinMode(2, INPUT);
ctr=0;
dir = 0;
attachInterrupt(0, Step, RISING);
attachInterrupt(1, DirPos, RISING);
attachInterrupt(1, DirNeg, FALLING);
}
void loop()
{
}
/* This pattern for simple stepping */
/*
void Step()
{
if (dir)
{
ctr-- ;
}
else
{
ctr++ ;
}
ctr = ctr & 3;
switch (ctr){
case 0:
digitalWrite(4,HIGH);
digitalWrite(5,LOW);
digitalWrite(6,LOW);
digitalWrite(7,LOW);
break;
case 1:
digitalWrite(4,LOW);
digitalWrite(5,HIGH);
digitalWrite(6,LOW);
digitalWrite(7,LOW);
break;
case 2:
digitalWrite(4,LOW);
digitalWrite(5,LOW);
digitalWrite(6,HIGH);
digitalWrite(7,LOW);
break;
case 3:
digitalWrite(4,LOW);
digitalWrite(5,LOW);
digitalWrite(6,LOW);
digitalWrite(7,HIGH);
break;
}
}
*/
/* use this sequence for wave stepping */
/*
void Step()
{
if (dir)
{
ctr-- ;
}
else
{
ctr++ ;
}
ctr = ctr & 3;
case 0:
digitalWrite(4,HIGH);
digitalWrite(5,HIGH);
digitalWrite(6,LOW);
digitalWrite(7,LOW);
break;
case 1:
digitalWrite(4,LOW);
digitalWrite(5,HIGH);
digitalWrite(6,HIGH);
digitalWrite(7,LOW);
break;
case 2:
digitalWrite(4,LOW);
digitalWrite(5,LOW);
digitalWrite(6,HIGH);
digitalWrite(7,HIGH);
break;
case 3:
digitalWrite(4,HIGH);
digitalWrite(5,LOW);
digitalWrite(6,LOW);
digitalWrite(7,HIGH);
break;
}
}
*/
/* Use this sequence for half stepping */
void Step()
{
if (dir)
{
ctr-- ;
}
else
{
ctr++ ;
}
ctr = ctr & 7;
switch (ctr){
case 0:
digitalWrite(4,HIGH);
digitalWrite(5,LOW);
digitalWrite(6,LOW);
digitalWrite(7,LOW);
break;
case 1:
digitalWrite(4,HIGH);
digitalWrite(5,HIGH);
digitalWrite(6,LOW);
digitalWrite(7,LOW);
break;
case 2:
digitalWrite(4,LOW);
digitalWrite(5,HIGH);
digitalWrite(6,LOW);
digitalWrite(7,LOW);
break;
case 3:
digitalWrite(4,LOW);
digitalWrite(5,HIGH);
digitalWrite(6,HIGH);
digitalWrite(7,LOW);
break;
case 4:
digitalWrite(4,LOW);
digitalWrite(5,LOW);
digitalWrite(6,HIGH);
digitalWrite(7,LOW);
break;
case 5:
digitalWrite(4,LOW);
digitalWrite(5,LOW);
digitalWrite(6,HIGH);
digitalWrite(7,HIGH);
break;
case 6:
digitalWrite(4,LOW);
digitalWrite(5,LOW);
digitalWrite(6,LOW);
digitalWrite(7,HIGH);
break;
case 7:
digitalWrite(4,HIGH);
digitalWrite(5,LOW);
digitalWrite(6,LOW);
digitalWrite(7,HIGH);
break;
}
}
void DirPos()
{
dir = 0;
}
void DirNeg()
{
dir = -1;
}