robobuggy / arduino / InterruptRCRecieverReference / PinChangeInt / Examples / PinChangeIntTest2 / PinChangeIntTest2.ino @ c5d6b0e8
History | View | Annotate | Download (10.5 KB)
1 |
//#define DISABLE_PCINT_MULTI_SERVICE |
---|---|
2 |
#define PINMODE |
3 |
#define FLASH |
4 |
#include <GetPSTR.h> |
5 |
#include <ByteBuffer.h> |
6 |
#include <PinChangeInt.h> |
7 |
|
8 |
// This example demonstrates a configuration of 6 interrupting pins and 3 interrupt functions. |
9 |
// A variety of interrupting pins have been chosen, so as to test all PORTs on the Arduino. |
10 |
// The pins are as follows: |
11 |
#define tPIN1 2 // port D |
12 |
#define tPIN2 3 |
13 |
#define tPIN3 11 // Port B |
14 |
#define tPIN4 12 |
15 |
#define tPIN5 A3 // Port C, also can be given as "17" |
16 |
#define tPIN6 A4 // starts and stops the count |
17 |
|
18 |
uint8_t pins[6]={ tPIN1, tPIN2, tPIN3, tPIN4, tPIN5, tPIN6 }; |
19 |
uint8_t ports[6]={ 0, 0, 0, 0, 0, 0 }; |
20 |
|
21 |
uint8_t latest_interrupted_pin; |
22 |
uint8_t interrupt_count[20]={0}; // 20 possible arduino pins |
23 |
uint8_t port; |
24 |
uint8_t mode; |
25 |
|
26 |
ByteBuffer printBuffer(200); |
27 |
char charArray[16]; |
28 |
char numBuffer[5] = { 0, 0, 0, 0, 0 }; |
29 |
uint8_t printFull=0; |
30 |
|
31 |
volatile boolean start=0; |
32 |
volatile boolean initial=true; |
33 |
long begintime=0; |
34 |
long now=0; |
35 |
|
36 |
void uint8ToHexString(char *outString, uint8_t theByte) { |
37 |
outString[0]='0'; outString[1]='x'; |
38 |
uint8_t hinybble=theByte>>4; |
39 |
uint8_t lonybble=theByte & 0x0F; |
40 |
if (hinybble < 0x0a) outString[2]=hinybble+48; |
41 |
else outString[2]=hinybble+55; |
42 |
if (lonybble < 0x0a) outString[3]=lonybble+48; |
43 |
else outString[3]=lonybble+55; |
44 |
outString[4]=0; |
45 |
} |
46 |
|
47 |
void uint8ToString(char *outString, uint8_t number) { |
48 |
uint8_t hundreds=0; |
49 |
uint8_t tens=0; |
50 |
uint8_t ones=0; |
51 |
|
52 |
while (number >= 100 ) { |
53 |
hundreds++; |
54 |
number-=100; |
55 |
} |
56 |
while (number >= 10 ) { |
57 |
tens++; |
58 |
number-=10; |
59 |
} |
60 |
ones=number; |
61 |
ones+=48; |
62 |
if (hundreds > 0) { hundreds+=48; tens+=48; outString[0]=hundreds; outString[1]=tens; outString[2]=ones; outString[3]=0; } |
63 |
else if (tens > 0) { tens+=48; outString[0]=tens; outString[1]=ones; outString[2]=0; } |
64 |
else { outString[0]=ones; outString[1]=0; }; |
65 |
} |
66 |
|
67 |
void showMode() { |
68 |
switch (mode) { |
69 |
case FALLING: |
70 |
printBuffer.putString(getPSTR("-F-")); |
71 |
break; |
72 |
case RISING: |
73 |
printBuffer.putString(getPSTR("+R+")); |
74 |
break; |
75 |
case CHANGE: |
76 |
printBuffer.putString(getPSTR("*C*")); |
77 |
break; |
78 |
} |
79 |
} |
80 |
|
81 |
/* |
82 |
void quicfunc0() { |
83 |
latest_interrupted_pin=PCintPort::arduinoPin; |
84 |
mode=PCintPort::pinmode; |
85 |
showMode(); |
86 |
if (start==1) { |
87 |
interrupt_count[latest_interrupted_pin]++; |
88 |
} |
89 |
uint8ToString(numBuffer, latest_interrupted_pin); |
90 |
printBuffer.putString((char *) "f0p"); printBuffer.putString(numBuffer); printBuffer.putString((char *) "-P"); |
91 |
uint8ToString(numBuffer, digitalPinToPort(latest_interrupted_pin)); |
92 |
printBuffer.putString(numBuffer); |
93 |
if (start !=1) printBuffer.putString(getPSTR(" no count")); |
94 |
printBuffer.putString((char *) "\n"); |
95 |
}; |
96 |
|
97 |
void quicfunc1() { |
98 |
latest_interrupted_pin=PCintPort::arduinoPin; |
99 |
mode=PCintPort::pinmode; |
100 |
showMode(); |
101 |
if (start==1) { |
102 |
interrupt_count[latest_interrupted_pin]++; |
103 |
} |
104 |
uint8ToString(numBuffer, latest_interrupted_pin); |
105 |
printBuffer.putString(getPSTR("f1p")); printBuffer.putString(numBuffer); printBuffer.putString((char *) "-P"); |
106 |
uint8ToString(numBuffer, digitalPinToPort(latest_interrupted_pin)); |
107 |
printBuffer.putString(numBuffer); |
108 |
if (start !=1) printBuffer.putString(getPSTR(" (counting off)")); |
109 |
printBuffer.putString((char *) "\n"); |
110 |
}; |
111 |
*/ |
112 |
|
113 |
void quicfunc2() { |
114 |
//*led_port|=led_mask; |
115 |
//*led_port&=not_led_mask; // 2 micros to here (ie, 2 micros used to push registers and call subroutine) |
116 |
latest_interrupted_pin=PCintPort::arduinoPin; |
117 |
mode=PCintPort::pinmode; |
118 |
showMode(); |
119 |
*led_port|=led_mask; // 73 micros to get here from above. Used in "Rigol Timing Example" |
120 |
*led_port&=not_led_mask; |
121 |
//uint8ToString(numBuffer, PCintPort::s_count); printBuffer.putString(numBuffer); |
122 |
*led_port|=led_mask; // 73 micros to get here from above. Second pulse in "Rigol Timing Example" |
123 |
*led_port&=not_led_mask; |
124 |
printBuffer.putString(getPSTR(" f2: P"));/* |
125 |
uint8ToHexString(numBuffer, *portInputRegister(3)); printBuffer.putString(numBuffer);// C port |
126 |
printBuffer.putString(getPSTR(" pin:")); uint8ToString(numBuffer, latest_interrupted_pin); printBuffer.putString(numBuffer); |
127 |
printBuffer.putString(getPSTR(" c")); uint8ToHexString(numBuffer, PCintPort::curr); printBuffer.putString(numBuffer); |
128 |
printBuffer.putString(getPSTR(" l")); uint8ToHexString(numBuffer, PCintPort::s_lastPinView); printBuffer.putString(numBuffer); |
129 |
printBuffer.putString(getPSTR(" r")); uint8ToHexString(numBuffer, PCintPort::s_portRisingPins); printBuffer.putString(numBuffer); |
130 |
printBuffer.putString(getPSTR(" f")); uint8ToHexString(numBuffer, PCintPort::s_portFallingPins); printBuffer.putString(numBuffer); |
131 |
printBuffer.putString(getPSTR(" m")); uint8ToHexString(numBuffer, PCintPort::s_pmask); printBuffer.putString(numBuffer); |
132 |
printBuffer.putString(getPSTR(" P")); printBuffer.put(PCintPort::s_PORT); printBuffer.putString("\r\n"); |
133 |
printBuffer.putString(getPSTR("cp")); uint8ToHexString(numBuffer, PCintPort::s_changedPins); printBuffer.putString(numBuffer); |
134 |
printBuffer.putString(getPSTR(" cXORlpv")); uint8ToHexString(numBuffer, PCintPort::s_currXORlastPinView); printBuffer.putString(numBuffer); |
135 |
printBuffer.putString(getPSTR(" rp_nCurr")); uint8ToHexString(numBuffer, PCintPort::s_portRisingPins_nCurr); printBuffer.putString(numBuffer); |
136 |
printBuffer.putString(getPSTR(" fp_nNCurr")); uint8ToHexString(numBuffer, PCintPort::s_portFallingPins_nNCurr); printBuffer.putString(numBuffer); |
137 |
*/printBuffer.putString("\r\n"); |
138 |
if (PCintPort::pcint_multi > 0) { |
139 |
printBuffer.putString("MULTI!\n"); PCintPort::pcint_multi=0; |
140 |
} |
141 |
if (PCintPort::PCIFRbug > 0) { printBuffer.putString("ERROR: BUG- PCIFR should be reset!"); PCintPort::PCIFRbug=0; } |
142 |
//s_registers, if it existed, could be used to keep a running queue of the latest interrupts that have |
143 |
//been serviced by the PCint(). But generally I don't think it's necessary for debugging at this point (famous last words?) |
144 |
/*if (PCintPort::s_count > 2) { |
145 |
for (uint8_t i=0; i < PCintPort::s_count; i++) { |
146 |
uint8ToHexString(numBuffer, PCintPort::s_registers[i]); printBuffer.putString(numBuffer); printBuffer.putString(" "); |
147 |
} |
148 |
} |
149 |
PCintPort::s_count=0;*/ |
150 |
/* |
151 |
if (start == 1) { |
152 |
printBuffer.putString(getPSTR("STOP Count off\n")); |
153 |
printBuffer.putString(getPSTR("Intr OFF: (")); uint8ToString(numBuffer, tPIN1), printBuffer.putString(numBuffer); |
154 |
printBuffer.putString((char *) " "); uint8ToString(numBuffer, tPIN3), printBuffer.putString(numBuffer); |
155 |
printBuffer.putString((char *) " "); uint8ToString(numBuffer, tPIN5), printBuffer.putString(numBuffer); |
156 |
printBuffer.putString((char *) ")\n"); |
157 |
PCintPort::detachInterrupt(tPIN1); PCintPort::detachInterrupt(tPIN3); PCintPort::detachInterrupt(tPIN5); |
158 |
start=0; |
159 |
} else { |
160 |
start=1; |
161 |
interrupt_count[latest_interrupted_pin]++; |
162 |
printBuffer.putString(getPSTR("START! p")); |
163 |
uint8ToString(numBuffer, latest_interrupted_pin); |
164 |
printBuffer.putString(numBuffer); printBuffer.putString((char *) "-P"); |
165 |
// MIKE put the REAL PORT HERE |
166 |
uint8ToString(numBuffer, digitalPinToPort(latest_interrupted_pin)); |
167 |
printBuffer.putString(numBuffer); printBuffer.putString((char *) "\n"); |
168 |
if (! initial) { |
169 |
PCintPort::attachInterrupt(tPIN1, &quicfunc0, FALLING); |
170 |
PCintPort::attachInterrupt(tPIN3, &quicfunc0, CHANGE); |
171 |
PCintPort::attachInterrupt(tPIN5, &quicfunc1, CHANGE); |
172 |
} else { |
173 |
initial=false; |
174 |
} |
175 |
}*/ |
176 |
}; |
177 |
|
178 |
uint8_t i; |
179 |
char hexBuffer[5]; |
180 |
void setup() { |
181 |
int8_t returncode=1; |
182 |
Serial.begin(115200); |
183 |
Serial.println("Test"); |
184 |
delay(500); |
185 |
for (i=5; i < 6; i++) { |
186 |
pinMode(pins[i], INPUT); digitalWrite(pins[i], HIGH); |
187 |
ports[i]=digitalPinToPort(pins[i]); |
188 |
switch (pins[i]) { |
189 |
/*case tPIN1: |
190 |
#if PCINT_VERSION > 2100 |
191 |
returncode=PCintPort::attachInterrupt(pins[i], &quicfunc0, FALLING); |
192 |
#else |
193 |
PCintPort::attachInterrupt(pins[i], &quicfunc0, FALLING); |
194 |
#endif |
195 |
Serial.println(getPSTR("FIRST FAILURE OK.")); |
196 |
break; |
197 |
case tPIN3: |
198 |
#if PCINT_VERSION > 2100 |
199 |
returncode=PCintPort::attachInterrupt(pins[i], &quicfunc0, CHANGE); |
200 |
#else |
201 |
PCintPort::attachInterrupt(pins[i], &quicfunc0, CHANGE); |
202 |
#endif |
203 |
break; |
204 |
case tPIN2: |
205 |
case tPIN4: |
206 |
#if PCINT_VERSION > 2100 |
207 |
returncode=PCintPort::attachInterrupt(pins[i], &quicfunc0, RISING); |
208 |
#else |
209 |
PCintPort::attachInterrupt(pins[i], &quicfunc0, RISING); |
210 |
#endif |
211 |
break; |
212 |
case tPIN5: |
213 |
#if PCINT_VERSION > 2100 |
214 |
returncode=PCintPort::attachInterrupt(pins[i], &quicfunc1, CHANGE); |
215 |
#else |
216 |
PCintPort::attachInterrupt(pins[i], &quicfunc1, CHANGE); |
217 |
#endif |
218 |
break;*/ |
219 |
case tPIN6: |
220 |
#if PCINT_VERSION > 2100 |
221 |
returncode=PCintPort::attachInterrupt(pins[i], &quicfunc2, FALLING); |
222 |
#else |
223 |
PCintPort::attachInterrupt(pins[i], &quicfunc2, FALLING); |
224 |
#endif |
225 |
break; |
226 |
} |
227 |
#if PCINT_VERSION > 2100 |
228 |
Serial.print(getPSTR("setup(): Interrupt attach ")); |
229 |
if (returncode != 1) Serial.print(getPSTR("unsuccessful ")); |
230 |
else Serial.print(getPSTR("GOOD ")); |
231 |
Serial.print(pins[i], DEC); |
232 |
Serial.print(getPSTR(":pin, code: ")); Serial.println(returncode, DEC); |
233 |
#endif |
234 |
} |
235 |
//Serial.println(printBuffer.getCapacity(), DEC); |
236 |
//Serial.println("*---------------------------------------*"); |
237 |
Serial.print("*---*"); |
238 |
delay(250); |
239 |
begintime=millis(); |
240 |
} |
241 |
|
242 |
void loop() { |
243 |
now=millis(); |
244 |
uint8_t count; |
245 |
char outChar; |
246 |
// uint8_t bufsize; |
247 |
//if (printBuffer.getSize() != 0) { Serial.print("SZ:"); Serial.println (printBuffer.getSize(), DEC); }; |
248 |
//bufsize=printBuffer.getSize(); |
249 |
//if (bufsize > 0) { Serial.print("S:"); Serial.println(bufsize); } |
250 |
while ((outChar=(char)printBuffer.get()) != 0) Serial.print(outChar); |
251 |
if ((now - begintime) > 1000) { |
252 |
Serial.print("."); |
253 |
if (printBuffer.checkError()) { |
254 |
Serial.println(getPSTR("!Some output lost due to full buffer!")); |
255 |
} |
256 |
for (i=0; i < 20; i++) { |
257 |
if (interrupt_count[i] != 0) { |
258 |
count=interrupt_count[i]; |
259 |
interrupt_count[i]=0; |
260 |
Serial.print(getPSTR("Count for pin ")); |
261 |
if (i < 14) { |
262 |
Serial.print("D"); |
263 |
Serial.print(i, DEC); |
264 |
} else { |
265 |
Serial.print("A"); |
266 |
Serial.print(i-14, DEC); |
267 |
} |
268 |
Serial.print(" is "); |
269 |
Serial.println(count, DEC); |
270 |
} |
271 |
} |
272 |
begintime=millis(); |
273 |
} |
274 |
} |
275 |
|