Update to use position sense
authorGraham <dev@netlinux.org.uk>
Mon, 4 Sep 2017 23:11:35 +0000 (00:11 +0100)
committerGraham <dev@netlinux.org.uk>
Mon, 4 Sep 2017 23:11:35 +0000 (00:11 +0100)
UnoBLDC.cpp

index ea11a3d..c41d18b 100644 (file)
@@ -1,10 +1,10 @@
 #include "arduino.h"
 
-#define STEP 12
+#define STEP 6
 
 static const int MARKCONTROL = A0;
 static const int SPACECONTROL = A1;
-static const unsigned long DELAY = 1000;
+static const unsigned long DELAY = 100;
 
 
 static int MarkInput = 0;
@@ -12,45 +12,47 @@ static int SpaceInput = 0;
 static unsigned char StepCount = 0;
 static bool Run = true;
 static bool Single = false;
+static bool Manual = false;
 
 #if STEP == 6
 
 static const unsigned char Polarity[] = {
     0b001,
+    0b001,
     0b010,
     0b010,
     0b100,
-    0b100,
-    0b001
+    0b100
 };
 
 static const unsigned char On[] = {
+    0b011,
     0b101,
     0b110,
     0b011,
     0b101,
-    0b110,
-    0b011
+    0b110
 };
 
 #elif STEP == 12
 
 static const unsigned char Polarity[] = {
-    0b110,
-    0b100,
-    0b100,
-    0b100,
-    0b101,
     0b001,
     0b001,
     0b001,
     0b011,
     0b010,
     0b010,
-    0b010
+    0b010,
+    0b110,
+    0b100,
+    0b100,
+    0b100,
+    0b101
 };
 
 static const unsigned char On[] = {
+    0b011,
     0b111,
     0b101,
     0b111,
@@ -61,8 +63,7 @@ static const unsigned char On[] = {
     0b101,
     0b111,
     0b110,
-    0b111,
-    0b011
+    0b111
 };
 
 #endif
@@ -83,10 +84,31 @@ void KeyPress (const char Character)
        case ' ':
            if (!Run)
            {
-              StepCount = 0;
               Single = true;
-              Run = true;
-           } 
+              StepCount = 0;
+           }
+           break;
+       
+       case '0':
+       case '1':
+       case '2':
+       case '3':
+       case '4':
+       case '5':
+           Run = false;
+           Manual = true;
+           DDRB = (On[Character - '0'] << 3);    // set the direction
+           PORTB = (~Polarity[Character - '0'] << 3) | 0b111;    // set the bits (including the pullups)
+           break;
+    
+       case '6':
+       case '7':
+       case '8':
+       case '9':
+           Run = false;
+           Manual = true;
+           DDRB = (0);    // set the direction
+           PORTB = 0b111;    // set the bits (including the pullups)
            break;
     
        default: break;
@@ -102,8 +124,11 @@ void setup ()
 {
     puts ("Grahams Simple Trinary Test, " __DATE__ " (" __TIME__ ")");
 
+    DDRD &= ~0b11111100;         // set 2-8 input
+    PORTD |= 0b11111100;        // 2-8 add pullup
+
     DDRB = 0b00000000;         // set 8-13 off (input)
-    PORTB = 0b00000000;        // set 8-13 low (no pullup)
+    PORTB = 0b00000111;        // set 11-13 low (no pullup) 8-10 high (add pullup)
 }
 
 void Gap (const int CONTROL, int &Input)
@@ -113,26 +138,67 @@ void Gap (const int CONTROL, int &Input)
     for (volatile unsigned long intCount = DELAY * Input; intCount > 0; intCount--);
 }
 
+static unsigned char Sense = 0;
+static bool Blank = false;
+
 void loop ()
 {
-    if (Single && StepCount >= StepNumber)
+    Sense = (PIND >> 2) & 0b111111;
+    
+    if (!Single)
     {
-       Run = false;
-       Single = false;
-    }
+    
+    Blank = false;
+
+#if STEP == 12
+    if ((Sense & 0b1) == 0)
+       StepCount = 10;
+
+    else if ((Sense & 0b10) == 0)
+       StepCount = 7;
+
+    else if ((Sense & 0b100) == 0)
+       StepCount = 4;
+#elif STEP == 6
+    Blank = false;
+
+    if ((Sense & 0b10000) == 0)
+       StepCount = 1;
+
+    else if ((Sense & 0b1000) == 0)
+       StepCount = 0;
+
+    else if ((Sense & 0b100) == 0)
+       StepCount = 5;
 
+    else if ((Sense & 0b10) == 0)
+       StepCount = 4;
+
+    else if ((Sense & 0b1) == 0)
+       StepCount = 3;
+
+    else if ((Sense & 0b100000) == 0)
+       StepCount = 2;
+#endif
+       
+    else
+       Blank = true;
+    }
+#if 1
     if (StepCount >= StepNumber)
         StepCount = 0;
-       
-    if (Run)
+
+    if (Single && !Run && StepCount == 0)
+       Run = true;
+#endif
+    if (Run && (!Blank || Single))
     {
        DDRB = (On[StepCount] << 3);    // set the direction
-       PORTB = (~Polarity[StepCount] << 3);    // set the bits
+       PORTB = (~Polarity[StepCount] << 3) | 0b111;    // set the bits (including the pullups)
     }
-
+#if 1
     Gap (MARKCONTROL, MarkInput);
-
-    fputs ("Step = ", stdout);
+    printf ("Step(%d) = ", StepCount);
 
     for (unsigned char BitCount = 0b100; BitCount > 0; BitCount >>= 1)
     {
@@ -142,12 +208,29 @@ void loop ()
             putchar (' ');
     }
 
-    printf ("\tMarkInput = %d\tSpaceInput = %d\n", MarkInput, SpaceInput);
+    printf (" MarkInput = %3d SpaceInput = %3d PinInput = ", MarkInput, SpaceInput);
+    
+    for (unsigned char BitCount = 0b100000; BitCount > 0; BitCount >>= 1)
+        putchar (((Sense & BitCount) > 0) ? '1' : '0');
 
-    DDRB = 0b00000000;     // set the direction
-    PORTB = 0b00000000;    // set the bits
+    puts("");
+
+    if (!Manual)
+    {
+       DDRB = 0b00000000;     // set the direction
+       PORTB = 0b00000111;    // set the bits
+       
 
-    Gap (SPACECONTROL, SpaceInput);
+       Gap (SPACECONTROL, SpaceInput);
+    }
+    
+    if (Single)
+       StepCount++;
 
-    StepCount++;
+    if (Single && Run && StepCount >= StepNumber)
+    {
+       Run = false;
+       Single = false;
+    }
+#endif
 }