Added arduino libs
هذا الالتزام موجود في:
@@ -0,0 +1,214 @@
|
||||
// EnableInterrupt example sketch
|
||||
// See the Wiki at http://code.google.com/p/arduino-pinchangeint/wiki for more information.
|
||||
|
||||
// This example demonstrates the use of the EnableInterrupt library on all pins.
|
||||
// It tests the EI_ARDUINO_INTERRUPTED_PIN facility.
|
||||
// The library has only been tested on an Arduino Duemilanove and Mega ADK.
|
||||
|
||||
#define EI_ARDUINO_INTERRUPTED_PIN
|
||||
#include <EnableInterrupt.h>
|
||||
|
||||
volatile uint8_t externalInterruptFlag=0;
|
||||
volatile uint8_t pinChangeInterruptFlag=0;
|
||||
volatile uint8_t pin70Flag=0;
|
||||
|
||||
#ifdef ARDUINO_MEGA
|
||||
|
||||
void interruptFunctionPin70 () {
|
||||
pinChangeInterruptFlag=arduinoInterruptedPin;
|
||||
pin70Flag++;
|
||||
}
|
||||
|
||||
void interruptFunction () {
|
||||
pinChangeInterruptFlag=arduinoInterruptedPin;
|
||||
}
|
||||
|
||||
void interruptExFunction () {
|
||||
externalInterruptFlag=arduinoInterruptedPin;
|
||||
}
|
||||
|
||||
#define disablePCInterrupt(x) \
|
||||
disableInterrupt( x | PINCHANGEINTERRUPT)
|
||||
|
||||
#define setupPCInterrupt(x) \
|
||||
EI_printPSTR("Add PinChange pin: "); \
|
||||
EI_printPSTR(#x); \
|
||||
EI_printPSTR("\r\n"); \
|
||||
pinMode( x, INPUT_PULLUP); \
|
||||
enableInterrupt( x | PINCHANGEINTERRUPT, interruptFunction, CHANGE)
|
||||
|
||||
#define setupInterrupt(x) \
|
||||
EI_printPSTR("Add pin: "); \
|
||||
EI_printPSTR(#x); \
|
||||
EI_printPSTR("\r\n"); \
|
||||
pinMode( x, INPUT_PULLUP); \
|
||||
enableInterrupt( x, interruptFunction, CHANGE)
|
||||
|
||||
#define setupExInterrupt(x) \
|
||||
EI_printPSTR("Add External pin: "); \
|
||||
EI_printPSTR(#x); \
|
||||
EI_printPSTR("\r\n"); \
|
||||
pinMode( x, INPUT_PULLUP); \
|
||||
enableInterrupt( x , interruptExFunction, CHANGE)
|
||||
#else
|
||||
#error This sketch supports 328-based Arduinos only.
|
||||
#endif
|
||||
|
||||
void printIt(char *pinNumber, uint8_t count) {
|
||||
EI_printPSTR(" Pin ");
|
||||
Serial.print(pinNumber);
|
||||
EI_printPSTR(" was interrupted: ");
|
||||
Serial.println(count, DEC);
|
||||
}
|
||||
|
||||
#define PIN70_PORTBITMAP 0b00000100
|
||||
#define PIN71_PORTBITMAP 0b00001000
|
||||
#define PIN72_PORTBITMAP 0b00010000
|
||||
#define PIN73_PORTBITMAP 0b00100000
|
||||
#define PIN74_PORTBITMAP 0b01000000
|
||||
|
||||
#define PIN75_PORTBITMAP 0b01000000
|
||||
#define PIN76_PORTBITMAP 0b10000000
|
||||
// Attach the interrupt in setup()
|
||||
// NOTE: PORTJ2-6 (aka, "Pin '70', '71', '72', '73', '74'" are turned on as OUTPUT.
|
||||
// These are not true pins on the Arduino Mega series!
|
||||
void setup() {
|
||||
Serial.begin(115200);
|
||||
EI_printPSTR("--- START ------------------------------------\r\n");
|
||||
setupInterrupt(SS);
|
||||
setupInterrupt(SCK);
|
||||
setupInterrupt(MOSI);
|
||||
setupInterrupt(MISO);
|
||||
setupInterrupt(10);
|
||||
setupInterrupt(11);
|
||||
setupInterrupt(12);
|
||||
setupInterrupt(13);
|
||||
setupInterrupt(14);
|
||||
setupInterrupt(15);
|
||||
setupInterrupt(A8);
|
||||
setupInterrupt(A9);
|
||||
setupInterrupt(A10);
|
||||
setupInterrupt(A11);
|
||||
setupInterrupt(A12);
|
||||
setupInterrupt(A13);
|
||||
setupInterrupt(A14);
|
||||
setupInterrupt(A15);
|
||||
//// 0b01111100
|
||||
// MIKE- Why turn them all high? I think they should be 0!
|
||||
DDRJ |= PIN70_PORTBITMAP | PIN71_PORTBITMAP | PIN72_PORTBITMAP
|
||||
| PIN73_PORTBITMAP | PIN74_PORTBITMAP ; // Non-Arduino Port J pins all become output.
|
||||
PORTJ &= ~(PIN70_PORTBITMAP | PIN71_PORTBITMAP | PIN72_PORTBITMAP
|
||||
| PIN73_PORTBITMAP | PIN74_PORTBITMAP) ; // Turn them all low.
|
||||
//// 0b11000000
|
||||
DDRE |= PIN75_PORTBITMAP | PIN76_PORTBITMAP; // Non-Arduino Port E pins all become output.
|
||||
PORTE &= ~(PIN75_PORTBITMAP | PIN76_PORTBITMAP); // Turn them all low.
|
||||
// MIKE- replace this if necessary: enableInterrupt(70, interruptFunctionPin70, CHANGE);
|
||||
enableInterrupt(70, interruptFunction, CHANGE);
|
||||
enableInterrupt(71, interruptFunction, CHANGE);
|
||||
enableInterrupt(72, interruptFunction, CHANGE);
|
||||
enableInterrupt(73, interruptFunction, CHANGE);
|
||||
enableInterrupt(74, interruptFunction, CHANGE);
|
||||
// External Interrupts
|
||||
setupExInterrupt(21);
|
||||
setupExInterrupt(20);
|
||||
setupExInterrupt(19);
|
||||
setupExInterrupt(18);
|
||||
setupExInterrupt(2);
|
||||
setupExInterrupt(3);
|
||||
enableInterrupt(75, interruptExFunction, CHANGE);
|
||||
enableInterrupt(76, interruptExFunction, CHANGE);
|
||||
}
|
||||
|
||||
#define IS_PINCHANGE 0
|
||||
#define IS_EXTERNAL 1
|
||||
#define FLIP 0
|
||||
#define FLOP 1
|
||||
uint8_t pin3state=IS_PINCHANGE;
|
||||
uint8_t enabledToggle=FLOP;
|
||||
uint8_t toggleCounter=0;
|
||||
uint16_t loopCounter=0;
|
||||
uint8_t portj_follower = PIN70_PORTBITMAP;
|
||||
uint8_t porte_follower = PIN75_PORTBITMAP;
|
||||
uint8_t current_pin_state = 0;
|
||||
// In the loop, we just check to see where the interrupt count is at. The value gets updated by
|
||||
// the interrupt routine.
|
||||
void loop() {
|
||||
|
||||
/*
|
||||
if (toggleCounter & 0x80) {
|
||||
EI_printPSTR("Toggle 20, 71, 75, A8, 15, MISO...");
|
||||
delay(200);
|
||||
if (enabledToggle==FLOP) {
|
||||
disableInterrupt(20);
|
||||
disableInterrupt(71);
|
||||
disableInterrupt(75);
|
||||
disableInterrupt(15);
|
||||
disableInterrupt(A8);
|
||||
disableInterrupt(MISO);
|
||||
enabledToggle=FLIP;
|
||||
}
|
||||
else {
|
||||
EI_printPSTR("***ON***");
|
||||
setupExInterrupt(20);
|
||||
setupInterrupt(71);
|
||||
setupExInterrupt(75);
|
||||
setupInterrupt(15);
|
||||
setupInterrupt(A8);
|
||||
setupInterrupt(MISO);
|
||||
enabledToggle=FLOP;
|
||||
}
|
||||
toggleCounter=0;
|
||||
}*/
|
||||
loopCounter++;
|
||||
// Starting positions:
|
||||
// portjfollower 00000100 PORTJ 00000000 // Keep track of port j
|
||||
// portefollower 00000000 PORTE 00000000 // Keep track of port e
|
||||
// current_pin_state 0 // track the state of the current pin
|
||||
if (loopCounter == 0x3FFF) {
|
||||
if (portj_follower <= PIN74_PORTBITMAP) {
|
||||
EI_printPSTR("Interrupt fake pins...");
|
||||
// If the pin is on, turn it off, and go to the next pin
|
||||
if (current_pin_state) {
|
||||
PORTJ ^= portj_follower; // turn it off
|
||||
portj_follower <<= 1;
|
||||
current_pin_state=0;
|
||||
} else {
|
||||
// if the pin is off, turn it on
|
||||
PORTJ ^= portj_follower; // turn it on
|
||||
current_pin_state=1;
|
||||
}
|
||||
delay(1); // run a few instructions after triggering the interrupt.
|
||||
} else if (porte_follower >= PIN75_PORTBITMAP) {
|
||||
EI_printPSTR("Interrupt fake pins...");
|
||||
if (current_pin_state) {
|
||||
PORTE ^= porte_follower; // turn it off
|
||||
porte_follower <<= 1;
|
||||
current_pin_state=0;
|
||||
} else {
|
||||
PORTE ^= porte_follower; // turn it on
|
||||
current_pin_state=1;
|
||||
}
|
||||
delay(1); // run a few instructions after triggering the interrupt.
|
||||
} else {
|
||||
portj_follower=PIN70_PORTBITMAP;
|
||||
porte_follower=PIN75_PORTBITMAP;
|
||||
}
|
||||
loopCounter=0;
|
||||
}
|
||||
if (pinChangeInterruptFlag) {
|
||||
//EI_printPSTR("Pin Change interrupt, pin "); Serial.println(arduinoInterruptedPin);
|
||||
EI_printPSTR("pci: "); Serial.println(pinChangeInterruptFlag);
|
||||
EI_printPSTR(", state: "); Serial.println(arduinoPinState);
|
||||
arduinoInterruptedPin=0;
|
||||
pinChangeInterruptFlag=0;
|
||||
toggleCounter++;
|
||||
}
|
||||
if (externalInterruptFlag) {
|
||||
//EI_printPSTR("External interrupt, pin "); Serial.println(arduinoInterruptedPin);
|
||||
EI_printPSTR("ext: "); Serial.println(externalInterruptFlag);
|
||||
EI_printPSTR(", state: "); Serial.println(arduinoPinState);
|
||||
arduinoInterruptedPin=0;
|
||||
externalInterruptFlag=0;
|
||||
toggleCounter++;
|
||||
}
|
||||
}
|
المرجع في مشكلة جديدة
حظر مستخدم