Project

General

Profile

Statistics
| Branch: | Revision:

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