Reset to aswas
[UnoBLDC.git] / UnoBLDC.cpp
1 #include "arduino.h"
2
3 #define STEP 12
4
5 static const int MARKCONTROL = A0;
6 static const int SPACECONTROL = A1;
7 static const unsigned long DELAY = 100;
8
9 static const unsigned char BSENSEMASK = 0b00000111;
10
11 static unsigned char PortRead = 0;
12
13 // Set SENSEDEBUGCOUNT to 0 for disable
14 static const unsigned char SENSEDEBUGCOUNT = 5;
15 static unsigned char SenseDebugCount = 0;
16 static unsigned char SenseDebug[SENSEDEBUGCOUNT];
17
18
19 static int MarkInput = 0;
20 static int SpaceInput = 0;
21 static unsigned char StepCount = 0;
22 static bool Run = true;
23 static bool Single = false;
24
25 static const unsigned char TRITS = 3;
26
27 #if STEP == 6
28
29 static const char Trinary[][TRITS+1] = {
30     "- +",
31     "-+ ",
32     " +-",
33     "+ -",
34     "+- ",
35     " -+"
36 };
37
38 #elif STEP == 12
39
40 static const char Trinary[][TRITS+1] = {
41     "++-",
42     "+ -",
43     "+--",
44     "+- ",
45     "+-+",
46     " -+",
47     "--+",
48     "- +",
49     "-++",
50     "-+ ",
51     "-+-",
52     " +-" 
53 };
54
55 #endif
56
57 static const unsigned char StepNumber = sizeof (Trinary) / (TRITS+1);
58
59 static unsigned char Polarity[StepNumber];
60 static unsigned char On[StepNumber];
61
62 void KeyPress (const char Character)
63 {
64     switch (Character)
65     {
66         case 'R':
67             Run = true;
68             break;
69         case 'r':
70         DDRB = 0;     // set the direction
71         PORTB = BSENSEMASK;    // set the bits
72             Run = false;
73             break;
74         
75         case ' ':
76             if (!Run)
77             {
78                StepCount = 0;
79                Single = true;
80                Run = true;
81             } 
82             break;
83     
84         default: break;
85     }
86 }
87
88 void UARTReceive (char Character)
89 {
90     KeyPress (Character);
91 }
92
93 inline void SensorChange()
94 {
95     unsigned char ThisRead = PINB;
96
97     if ((ThisRead & BSENSEMASK) == BSENSEMASK)
98         return;
99         
100     PortRead = ThisRead;
101
102     if (SenseDebugCount < SENSEDEBUGCOUNT)
103         SenseDebug[SenseDebugCount++] = PortRead;
104 }
105
106 void setup ()
107 {
108     puts ("Grahams Simple Trinary Test, " __DATE__ " (" __TIME__ ")");
109
110     // Convert trinary to BCT
111     for (unsigned char count = 0; count < StepNumber; count++)
112     {
113         Polarity[count] = 0;
114         On[count] = 0;
115
116         for (unsigned char trit = 0; trit < TRITS; trit++)
117         {
118             Polarity[count] |= ((Trinary[count][trit] == '+') ? (1 << (TRITS - trit - 1)) : 0);
119             On[count] |= ((Trinary[count][trit] != ' ') ? (1 << (TRITS - trit - 1)) : 0);
120         }
121     }
122
123     DDRB  = 0;         // set 8-13 off (input)
124     PORTB = BSENSEMASK;        // set 11-13 low (no pullup) 8-10 high (add pullup)
125 #if 0
126 // PORTD pin 2-7
127     PCICR |= (1 << PCIE0);
128     PCMSK0 = BSENSEMASK;
129 #endif
130     sei();
131 }
132
133 void Gap (const int CONTROL, int &Input)
134 {
135     Input = analogRead (CONTROL);
136
137     for (volatile unsigned long intCount = DELAY * Input; intCount > 0; intCount--);
138 }
139
140 void loop ()
141 {
142     if (Single && StepCount >= StepNumber)
143     {
144         Run = false;
145         Single = false;
146     }
147
148     if (StepCount >= StepNumber)
149         StepCount = 0;
150         
151     if (Run)
152     {
153             DDRB = (On[StepCount] << 3);    // set the direction
154             PORTB = (~Polarity[StepCount] << 3) | BSENSEMASK;    // set the bits
155     }
156
157     Gap (MARKCONTROL, MarkInput);
158
159     fputs ("Step = ", stdout);
160
161     for (unsigned char BitCount = 0b100; BitCount > 0; BitCount >>= 1)
162     {
163         if ((On[StepCount] & BitCount) > 0)
164             putchar (((Polarity[StepCount] & BitCount) > 0) ? '+' : '-');
165         else
166             putchar (' ');
167     }
168
169     printf ("\tMarkInput = %d\tSpaceInput = %d ", MarkInput, SpaceInput);
170     
171     for (unsigned char BitCount = 0b100; BitCount > 0; BitCount >>= 1)
172         putchar (((PortRead & BitCount) > 0) ? '1' : '0');
173         
174     puts("");
175
176     for (unsigned char DebugCount = 0; DebugCount < SenseDebugCount; DebugCount++)
177     {
178         for (unsigned char BitCount = 0b10000000; BitCount > 0; BitCount >>= 1)
179             putchar (((SenseDebug[DebugCount] & BitCount) > 0) ? '1' : '0');
180             
181         puts("");
182     }
183
184     SenseDebugCount = 0;
185 /*
186     DDRB = 0;     // set the direction
187     PORTB = BSENSEMASK;    // set the bits
188
189     Gap (SPACECONTROL, SpaceInput);
190 */
191     PortRead = BSENSEMASK;
192     StepCount++;
193 }
194
195 /*
196     ISR (PCINT0_vect) pin change interrupt for D8 to D13 (PORTB)
197     ISR (PCINT1_vect) pin change interrupt for A0 to A5 (PORTC)
198     ISR (PCINT2_vect) pin change interrupt for D0 to D7 (PORTD)
199 */
200
201 #if 0
202 ISR (PCINT0_vect)
203 {
204     SensorChange();
205 }
206 #endif