Give this a try:
NOTE: Completely untested code since i don't have Teensy 2.0
Example: Pin change interrupt test, setup for PIN 0.
Code:
// Pin change interrupt test PCINTn
// Uno Atemga Atmega328-based (PCINT0_vect,8-9-10-11-12-13),(PCINT1_vect, A0-A5),(PCINT2_vect, D0-D7)
// Teensy 2.0 Atmega32u4-based (PCINT0_vect, PINs 0-1-2-3-4-13-14-15) --- (8 PCINT) Pin Change Interrupts
byte Debug_led = LED_BUILTIN; // TEENSY 2.0 LED on pin 11
byte PinChangeI_pin = 0; // USE ONLY PINs 0-1-2-3-4-13-14-15 on Teensy 2.0.
// The elapsedMillis feature is built into Teensyduino.
// For non-Teensy boards, it is available as a library.
elapsedMillis sinceLed;
// --------- Pin change interrupt setup ------------------
// 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
PCMSK0 |= bit (digitalPinToPCICRbit(pin)); // Enable Mask
PCICR |= bit (digitalPinToPCICRbit(pin)); // Enable interrupt
}
void setup() {
// put your setup code here, to run once:
Serial.begin (9600);
pinMode(Debug_led, OUTPUT);
pinMode(PinChangeI_pin, INPUT_PULLUP);
// USE ONLY PINs 0-1-2-3-4-13-14 or 15 on Teensy 2.0.
PciSetup(PinChangeI_pin); // Enable Pin Change Interrupt for pin...
}
void loop() {
// put your main code here, to run repeatedly:
if (sinceLed >= 250) { // run every 0.nnn ms
//sinceLed = 0; // reset since
digitalWrite(Debug_led, LOW);
}
}
// ---------------- ISR ------------------
// Pin change interrupt.
// USE ONLY PINs 0-1-2-3-4-13-14 or 15 on Teensy 2.0.
ISR (PCINT0_vect) //
{
// TODO, responsibility of the single PinChange interrupt service routine.
// determine Which pins changed, and in what direction
sinceLed = 0; // reset since
digitalWrite(Debug_led, HIGH);
}