Added trinary definitions of the sequence
authorGraham <dev@netlinux.org.uk>
Tue, 5 Sep 2017 21:51:37 +0000 (22:51 +0100)
committerGraham <dev@netlinux.org.uk>
Tue, 5 Sep 2017 21:51:37 +0000 (22:51 +0100)
UnoBLDC.cpp

index c41d18b..64a5e1e 100644 (file)
@@ -1,6 +1,7 @@
 #include "arduino.h"
 
-#define STEP 6
+#define STEP 12
+#define TRITS 3
 
 static const int MARKCONTROL = A0;
 static const int SPACECONTROL = A1;
@@ -16,26 +17,32 @@ static bool Manual = false;
 
 #if STEP == 6
 
-static const unsigned char Polarity[] = {
-    0b001,
-    0b001,
-    0b010,
-    0b010,
-    0b100,
-    0b100
-};
-
-static const unsigned char On[] = {
-    0b011,
-    0b101,
-    0b110,
-    0b011,
-    0b101,
-    0b110
+static char TrinaryStep[][TRITS + 1] = {
+    " -+",
+    "- +",
+    "-+ ",
+    " +-",
+    "+ -",
+    "+- "
 };
 
 #elif STEP == 12
 
+static char TrinaryStep[][TRITS + 1] = {
+    " -+",
+    "--+",
+    "- +",
+    "-++",
+    "-+ ",
+    "-+-",
+    " +-",
+    "++-",
+    "+ -",
+    "+--",
+    "+- ",
+    "+-+"
+};
+
 static const unsigned char Polarity[] = {
     0b001,
     0b001,
@@ -68,50 +75,54 @@ static const unsigned char On[] = {
 
 #endif
 
-static const unsigned char StepNumber = sizeof (Polarity);
+static const unsigned char StepNumber = sizeof (TrinaryStep) / (TRITS + 1);
+
+static unsigned char P[StepNumber];
+static unsigned char D[StepNumber];
 
 void KeyPress (const char Character)
 {
     switch (Character)
     {
-       case 'R':
-           Run = true;
-           break;
-       case 'r':
-           Run = false;
-           break;
-       
-       case ' ':
-           if (!Run)
-           {
-              Single = 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;
+        case 'R':
+            Run = true;
+            break;
+        case 'r':
+            Run = false;
+            break;
+
+        case ' ':
+            if (!Run)
+            {
+                Single = true;
+                StepCount = 0;
+            }
+            break;
+
+        case '0':
+        case '1':
+        case '2':
+        case '3':
+        case '4':
+        case '5':
+            Run = false;
+            Manual = true;
+            DDRB = (D[Character - '0'] << 3);   // set the direction
+            PORTB = (~P[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;
     }
 }
 
@@ -124,8 +135,21 @@ void setup ()
 {
     puts ("Grahams Simple Trinary Test, " __DATE__ " (" __TIME__ ")");
 
-    DDRD &= ~0b11111100;         // set 2-8 input
-    PORTD |= 0b11111100;        // 2-8 add pullup
+    // Convert trinary to BCT
+    for (unsigned char count = 0; count < StepNumber; count++)
+    {
+        P[count] = 0;
+        D[count] = 0;
+
+        for (unsigned char trit = 0; trit < TRITS; trit++)
+        {
+            P[count] |= ((TrinaryStep[count][trit] == '+') ? (1 << (TRITS - trit - 1)) : 0);
+            D[count] |= ((TrinaryStep[count][trit] != ' ') ? (1 << (TRITS - trit - 1)) : 0);
+        }
+    }
+
+    DDRD &= ~0b11111100;       // set 2-8 input
+    PORTD |= 0b11111100;       // 2-8 add pullup
 
     DDRB = 0b00000000;         // set 8-13 off (input)
     PORTB = 0b00000111;        // set 11-13 low (no pullup) 8-10 high (add pullup)
@@ -144,93 +168,116 @@ static bool Blank = false;
 void loop ()
 {
     Sense = (PIND >> 2) & 0b111111;
-    
+
     if (!Single)
     {
-    
-    Blank = false;
+        Blank = false;
 
 #if STEP == 12
-    if ((Sense & 0b1) == 0)
-       StepCount = 10;
+        if      ((Sense & 0b010000) == 0)
+            StepCount = 2;
 
-    else if ((Sense & 0b10) == 0)
-       StepCount = 7;
+        else if ((Sense & 0b011000) == 0)
+            StepCount = 1;
 
-    else if ((Sense & 0b100) == 0)
-       StepCount = 4;
-#elif STEP == 6
-    Blank = false;
+        else if ((Sense & 0b001000) == 0)
+            StepCount = 0;
+
+        else if ((Sense & 0b001100) == 0)
+            StepCount = 11;
 
-    if ((Sense & 0b10000) == 0)
-       StepCount = 1;
+        else if ((Sense & 0b000100) == 0)
+            StepCount = 10;
 
-    else if ((Sense & 0b1000) == 0)
-       StepCount = 0;
+        else if ((Sense & 0b000110) == 0)
+            StepCount = 9;
 
-    else if ((Sense & 0b100) == 0)
-       StepCount = 5;
+        else if ((Sense & 0b000010) == 0)
+            StepCount = 8;
 
-    else if ((Sense & 0b10) == 0)
-       StepCount = 4;
+        else if ((Sense & 0b000011) == 0)
+            StepCount = 7;
 
-    else if ((Sense & 0b1) == 0)
-       StepCount = 3;
+        else if ((Sense & 0b000001) == 0)
+            StepCount = 6;
+
+        else if ((Sense & 0b100001) == 0)
+            StepCount = 5;
+
+        else if ((Sense & 0b100000) == 0)
+            StepCount = 4;
+
+        else if ((Sense & 0b110000) == 0)
+            StepCount = 3;
+#elif STEP == 6
+        if      ((Sense & 0b010000) == 0)
+            StepCount = 1;
 
-    else if ((Sense & 0b100000) == 0)
-       StepCount = 2;
+        else if ((Sense & 0b001000) == 0)
+            StepCount = 0;
+
+        else if ((Sense & 0b000100) == 0)
+            StepCount = 5;
+
+        else if ((Sense & 0b000010) == 0)
+            StepCount = 4;
+
+        else if ((Sense & 0b000001) == 0)
+            StepCount = 3;
+
+        else if ((Sense & 0b100000) == 0)
+            StepCount = 2;
 #endif
-       
-    else
-       Blank = true;
+        else
+            Blank = true;
     }
 #if 1
     if (StepCount >= StepNumber)
         StepCount = 0;
 
     if (Single && !Run && StepCount == 0)
-       Run = true;
+        Run = true;
 #endif
     if (Run && (!Blank || Single))
     {
-       DDRB = (On[StepCount] << 3);    // set the direction
-       PORTB = (~Polarity[StepCount] << 3) | 0b111;    // set the bits (including the pullups)
+        DDRB = (D[StepCount] << 3); // set the direction
+        PORTB = (~P[StepCount] << 3) | 0b111;  // set the bits (including the pullups)
     }
 #if 1
     Gap (MARKCONTROL, MarkInput);
-    printf ("Step(%d) = ", StepCount);
+    printf ("Step(%2d) = ", StepCount);
 
     for (unsigned char BitCount = 0b100; BitCount > 0; BitCount >>= 1)
     {
-        if ((On[StepCount] & BitCount) > 0)
-            putchar (((Polarity[StepCount] & BitCount) > 0) ? '+' : '-');
+        if ((D[StepCount] & BitCount) > 0)
+            putchar (((P[StepCount] & BitCount) > 0) ? '+' : '-');
         else
             putchar (' ');
     }
 
     printf (" MarkInput = %3d SpaceInput = %3d PinInput = ", MarkInput, SpaceInput);
-    
+
     for (unsigned char BitCount = 0b100000; BitCount > 0; BitCount >>= 1)
         putchar (((Sense & BitCount) > 0) ? '1' : '0');
 
-    puts("");
+    puts ("");
 
     if (!Manual)
     {
-       DDRB = 0b00000000;     // set the direction
-       PORTB = 0b00000111;    // set the bits
-       
+        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;
+        Run = false;
+        Single = false;
     }
 #endif
 }