// Install Pin change interrupt for a pin, can be called multiple times
void pciSetup(byte pin)
{
*digitalPinToPCMSK(pin) |= bit (digitalPinToPCMSKbit(pin)); // enable pin
PCIFR |= bit (digitalPinToPCICRbit(pin)); // clear any outstanding interrupt
PCICR |= bit (digitalPinToPCICRbit(pin)); // enable interrupt for the group
}
volatile unsigned char tB;
volatile unsigned char oldB = 0; // well, it doesn't.
ISR (PCINT0_vect) // handle pin change interrupt for port B
{
//*
static unsigned long lastTime;
unsigned long now = millis();
if (now - lastTime < 50) return;
lastTime = now;
//*/
unsigned char newB = PINB;
tB = (oldB ^ newB); // & ~nB;
oldB = newB;
}
void setup() {
int i;
Serial.begin(1152300);
Serial.println("WTIF");
pinMode(9, INPUT_PULLUP);
pinMode(10, INPUT_PULLUP);
pinMode(11, INPUT_PULLUP);
pinMode(2, OUTPUT);
pinMode(3, OUTPUT);
pinMode(4, OUTPUT);
digitalWrite(2, LOW);
digitalWrite(3, LOW);
digitalWrite(4, LOW);
pciSetup(9);
pciSetup(10);
pciSetup(11);
PORTB = 0xff; // first time glitch?
}
int counter;
void loop() {
unsigned char myTB;
unsigned char theValue;
// delay(50);
cli();
myTB = tB;
theValue = myTB & oldB;
tB = 0; // wasn't safely
sei();
if (myTB) {
if (0) {
Serial.print(counter); Serial.print(" "); counter++;
Serial.print(tB, HEX); Serial.print(" ");
Serial.print(theValue, HEX);
Serial.println(" ");
}
switch (myTB) {
case 2 :
digitalWrite(2, !digitalRead(2));
break;
case 4 :
digitalWrite(3, !digitalRead(3));
break;
case 8 :
digitalWrite(4, !digitalRead(4));
break;
}
}
}