f4fa4ef698e49aa0e0fed6330fe2ca5318b328b8
[UnoBLDC.git] / UnoBLDC.cpp
1 #include "arduino.h"
2
3 #define STEP 12
4
5 static const unsigned char TRITS = 3;
6
7 static const int MARKCONTROL = A0;
8 static const int SPACECONTROL = A1;
9 static const unsigned long DELAY = 100;
10 static const unsigned char NOSTEP = 127;
11
12 static const unsigned char DSENSEMASK = 0b11111100;
13 static const unsigned char BSENSEMASK = 0b00000111;
14
15 #if STEP == 6
16
17 static const char TrinaryStep[][TRITS + 1] = {
18     " -+",
19     "- +",
20     "-+ ",
21     " +-",
22     "+ -",
23     "+- "
24 };
25
26 # define SensePattern0 0b000001
27 # define SensePattern1 0b000010
28 # define SensePattern2 0b000100
29 # define SensePattern3 0b001000
30 # define SensePattern4 0b010000
31 # define SensePattern5 0b100000
32
33 static const unsigned char SensePattern[] =
34 {
35     SensePattern0,
36     SensePattern1,
37     SensePattern2,
38     SensePattern3,
39     SensePattern4,
40     SensePattern5
41 };
42
43 #elif STEP == 12
44
45 static const char TrinaryStep[][TRITS + 1] = {
46     " -+",
47     "--+",
48     "- +",
49     "-++",
50     "-+ ",
51     "-+-",
52     " +-",
53     "++-",
54     "+ -",
55     "+--",
56     "+- ",
57     "+-+"
58 };
59
60 # define SensePattern00 0b000001
61 # define SensePattern01 0b000011
62 # define SensePattern02 0b000010
63 # define SensePattern03 0b000110
64 # define SensePattern04 0b000100
65 # define SensePattern05 0b001100
66 # define SensePattern06 0b001000
67 # define SensePattern07 0b011000
68 # define SensePattern08 0b010000
69 # define SensePattern09 0b110000
70 # define SensePattern10 0b100000
71 # define SensePattern11 0b100001
72
73 static const unsigned char SensePattern[] =
74 {
75     SensePattern00,
76     SensePattern01,
77     SensePattern02,
78     SensePattern03,
79     SensePattern04,
80     SensePattern05,
81     SensePattern06,
82     SensePattern07,
83     SensePattern08,
84     SensePattern09,
85     SensePattern10,
86     SensePattern11
87 };
88
89 #endif
90
91 static const unsigned char StepNumber = sizeof (TrinaryStep) / (TRITS + 1);
92
93 // Set SENSEDEBUGCOUNT to 0 for disable
94 static const unsigned char SENSEDEBUGCOUNT = 0;
95 static unsigned char SenseDebugCount = 0;
96 static unsigned char SenseDebug[SENSEDEBUGCOUNT];
97
98 static int MarkInput = 0;
99 static int SpaceInput = 0;
100 static unsigned char StepCount = 0;
101 static bool Run = true;
102 static bool Single = false;
103 static bool Manual = false;
104
105 static unsigned char Sense = 0;
106 static unsigned int SenseCount = 0;
107
108 static unsigned char P[StepNumber];
109 static unsigned char D[StepNumber];
110
111 void KeyPress (const char Character)
112 {
113     switch (Character)
114     {
115         case 'R':
116             Run = true;
117             break;
118         case 'r':
119             Run = false;
120             DDRB = (0);         // set the direction
121             PORTB = 0b111;     // set the bits (including the pullups)
122             break;
123
124         case ' ':
125             if (!Run)
126             {
127                 Single = true;
128                 StepCount = 0;
129             }
130             break;
131
132         case '0':
133         case '1':
134         case '2':
135         case '3':
136         case '4':
137         case '5':
138             Run = false;
139             Manual = true;
140             DDRB = (D[Character - '0'] << 3);   // set the direction
141             PORTB = (P[Character - '0'] << 3) | 0b111;    // set the bits (including the pullups)
142             break;
143
144         case '6':
145         case '7':
146         case '8':
147         case '9':
148             Run = false;
149             Manual = true;
150             DDRB = (0);         // set the direction
151             PORTB = 0b111;     // set the bits (including the pullups)
152             break;
153
154         default:
155             break;
156     }
157 }
158
159 void Gap (const int CONTROL, int &Input)
160 {
161     Input = analogRead (CONTROL);
162
163     for (volatile unsigned long intCount = DELAY * Input; intCount > 0; intCount--);
164 }
165
166 static unsigned char PortRead = 0;
167
168 void SensorChange()
169 {
170     static unsigned char ThisStep = NOSTEP;
171     
172     PortRead = PIND;
173
174 #if 1
175     Sense = (PortRead >> 2) & 0b111111;
176 #else
177     Sense = (~PortRead >> 2) & 0b111111;
178 #endif
179     
180     if (!Single)
181     {
182         ThisStep = NOSTEP;
183 #if 0
184         for (unsigned char StepIndex = 0; StepIndex < StepNumber; StepIndex++)
185         {
186             if ((Sense & SensePattern[StepIndex]) == 0)
187             {
188                 ThisStep = StepIndex;
189                 break;
190             }
191         }
192 #else
193 # if STEP == 6
194         switch (~Sense & 0b111111)
195         {
196             case SensePattern0: ThisStep = 0; break;
197             case SensePattern1: ThisStep = 1; break;
198             case SensePattern2: ThisStep = 2; break;
199             case SensePattern3: ThisStep = 3; break;
200             case SensePattern4: ThisStep = 4; break;
201             case SensePattern5: ThisStep = 5; break;
202             default: return;
203         }
204 # elif STEP == 12
205         switch (~Sense & 0b111111)
206         {
207             case SensePattern00: ThisStep =  0; break;
208             case SensePattern01: ThisStep =  1; break;
209             case SensePattern02: ThisStep =  2; break;
210             case SensePattern03: ThisStep =  3; break;
211             case SensePattern04: ThisStep =  4; break;
212             case SensePattern05: ThisStep =  5; break;
213             case SensePattern06: ThisStep =  6; break;
214             case SensePattern07: ThisStep =  7; break;
215             case SensePattern08: ThisStep =  8; break;
216             case SensePattern09: ThisStep =  9; break;
217             case SensePattern10: ThisStep = 10; break;
218             case SensePattern11: ThisStep = 11; break;
219             default: return;
220         }
221 # endif
222 #endif
223         if (ThisStep != NOSTEP)
224             StepCount = ThisStep;
225     }
226     
227     if (Run && (ThisStep != NOSTEP))
228     {
229         DDRB = (D[StepCount] << 3); // set the direction
230         PORTB = (P[StepCount] << 3) | 0b111;  // set the bits (including the pullups)
231     }
232     
233     SenseCount++;
234
235     if (SenseDebugCount < SENSEDEBUGCOUNT)
236         SenseDebug[SenseDebugCount++] = Sense;
237 }
238
239 void setup ()
240 {
241     puts ("Grahams Simple Trinary Test, " __DATE__ " (" __TIME__ ")");
242
243     // Convert trinary to BCT
244     for (unsigned char count = 0; count < StepNumber; count++)
245     {
246         P[count] = 0;
247         D[count] = 0;
248
249         for (unsigned char trit = 0; trit < TRITS; trit++)
250         {
251             P[count] |= ((TrinaryStep[count][trit] == '+') ? (1 << (TRITS - trit - 1)) : 0);
252             D[count] |= ((TrinaryStep[count][trit] != ' ') ? (1 << (TRITS - trit - 1)) : 0);
253         }
254     }
255
256     DDRD  &= ~DSENSEMASK;       // set 2-8 input
257     PORTD |=  DSENSEMASK;       // 2-8 add pullup
258
259     DDRB  = 0b00000000 & ~BSENSEMASK;         // set 8-13 off (input)
260     PORTB = BSENSEMASK;        // set 11-13 low (no pullup) 8-10 high (add pullup)
261
262 // PORTD pin 2-7
263     PCICR |= (1 << PCIE2);
264     PCMSK2 |= DSENSEMASK;
265
266     sei();
267 }
268
269 void loop ()
270 {
271     printf ("Step(%2d)=", StepCount);
272
273     for (unsigned char BitCount = 0b100; BitCount > 0; BitCount >>= 1)
274     {
275         if ((D[StepCount] & BitCount) > 0)
276             putchar (((P[StepCount] & BitCount) > 0) ? '+' : '-');
277         else
278             putchar (' ');
279     }
280
281     printf (" MarkInput=%4d SpaceInput=%4d PinInput=", MarkInput, SpaceInput);
282
283     for (unsigned char BitCount = 0b10000000; BitCount > 0; BitCount >>= 1)
284         putchar (((PortRead & BitCount) > 0) ? '1' : '0');
285
286     printf (" SenseCount=%3d\n", SenseCount);
287
288     for (unsigned char DebugCount = 0; DebugCount < SenseDebugCount; DebugCount++)
289     {
290         for (unsigned char BitCount = 0b100000; BitCount > 0; BitCount >>= 1)
291             putchar (((SenseDebug[DebugCount] & BitCount) > 0) ? '1' : '0');
292             
293         puts("");
294     }
295
296     MarkInput = analogRead (MARKCONTROL);
297     SpaceInput = analogRead (SPACECONTROL);
298     
299     SenseCount = 0;
300     SenseDebugCount = 0;
301     
302     delay (100);
303 }
304
305 void UARTReceive (char Character)
306 {
307     KeyPress (Character);
308 }
309
310 ISR (PCINT2_vect)
311 {
312     SensorChange();
313 }