Added interrupt based sensing
authorGraham <dev@netlinux.org.uk>
Wed, 6 Sep 2017 08:57:08 +0000 (09:57 +0100)
committerGraham <dev@netlinux.org.uk>
Wed, 6 Sep 2017 08:57:08 +0000 (09:57 +0100)
UnoBLDC.cpp

index b5bda13..0dfab5d 100644 (file)
@@ -2,6 +2,7 @@
 
 #define STEP 12
 #define TRITS 3
+#define SENSEINTERRUPTS
 
 static const int MARKCONTROL = A0;
 static const int SPACECONTROL = A1;
@@ -101,6 +102,8 @@ void UARTReceive (char Character)
     KeyPress (Character);
 }
 
+static const unsigned char SENSORMASK = 0b11111100;
+
 void setup ()
 {
     puts ("Grahams Simple Trinary Test, " __DATE__ " (" __TIME__ ")");
@@ -123,6 +126,13 @@ void setup ()
 
     DDRB  = 0b00000000;         // set 8-13 off (input)
     PORTB = 0b00000111;        // set 11-13 low (no pullup) 8-10 high (add pullup)
+#ifdef SENSEINTERRUPTS
+// PORTD pin 2-7
+    PCICR |= (1 << PCIE2);
+    PCMSK2 |= SENSORMASK;
+    
+    sei();
+#endif
 }
 
 void Gap (const int CONTROL, int &Input)
@@ -134,11 +144,14 @@ void Gap (const int CONTROL, int &Input)
 
 static unsigned char Sense = 0;
 static bool Blank = false;
+static unsigned int SenseCount = 0;
 
-void loop ()
+void SensorChange()
 {
-    Sense = (PIND >> 2) & 0b111111;
+    SenseCount++;
 
+    Sense = (PIND >> 2) & 0b111111;
+    
     if (!Single)
     {
         Blank = false;
@@ -201,19 +214,126 @@ void loop ()
         else
             Blank = true;
     }
-#if 1
+    
+    if (Run && (!Blank || Single))
+    {
+        DDRB = (D[StepCount] << 3); // set the direction
+        PORTB = (~P[StepCount] << 3) | 0b111;  // set the bits (including the pullups)
+    }
+#if 0
+    else if (!Manual)
+    {
+        DDRB = 0b00000000;     // set the direction
+        PORTB = 0b00000111;    // set the bits
+    }
+#endif
+}
+
+void loop ()
+{
+#ifdef SENSEINTERRUPTS
+    printf ("Step(%2d)=", StepCount);
+
+    for (unsigned char BitCount = 0b100; BitCount > 0; BitCount >>= 1)
+    {
+        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');
+
+    printf (" SenseCount=%3d\n", SenseCount);
+    
+    MarkInput = analogRead (MARKCONTROL);
+    SpaceInput = analogRead (SPACECONTROL);
+    
+    SenseCount = 0;
+    
+    delay (100);
+    
+#else
+    Sense = (PIND >> 2) & 0b111111;
+
+    if (!Single)
+    {
+        Blank = false;
+
+# if STEP == 12
+        if      ((Sense & 0b010000) == 0)
+            StepCount = 2;
+
+        else if ((Sense & 0b011000) == 0)
+            StepCount = 1;
+
+        else if ((Sense & 0b001000) == 0)
+            StepCount = 0;
+
+        else if ((Sense & 0b001100) == 0)
+            StepCount = 11;
+
+        else if ((Sense & 0b000100) == 0)
+            StepCount = 10;
+
+        else if ((Sense & 0b000110) == 0)
+            StepCount = 9;
+
+        else if ((Sense & 0b000010) == 0)
+            StepCount = 8;
+
+        else if ((Sense & 0b000011) == 0)
+            StepCount = 7;
+
+        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 & 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;
+    }
+# if 1
     if (StepCount >= StepNumber)
         StepCount = 0;
 
     if (Single && !Run && StepCount == 0)
         Run = true;
-#endif
+# endif
     if (Run && (!Blank || Single))
     {
         DDRB = (D[StepCount] << 3); // set the direction
         PORTB = (~P[StepCount] << 3) | 0b111;  // set the bits (including the pullups)
     }
-#if 1
+# if 1
     Gap (MARKCONTROL, MarkInput);
     printf ("Step(%2d) = ", StepCount);
 
@@ -237,7 +357,6 @@ void loop ()
         DDRB = 0b00000000;     // set the direction
         PORTB = 0b00000111;    // set the bits
 
-
         Gap (SPACECONTROL, SpaceInput);
     }
 
@@ -249,5 +368,16 @@ void loop ()
         Run = false;
         Single = false;
     }
+# endif
 #endif
 }
+
+/*
+    ISR (PCINT0_vect) pin change interrupt for D8 to D13
+    ISR (PCINT1_vect) pin change interrupt for A0 to A5
+    ISR (PCINT2_vect) pin change interrupt for D0 to D7
+*/
+ISR (PCINT2_vect)
+{
+    SensorChange();
+}