Buongiorno a tutta la board,
stavo cercando di integrare gli interrupt tramite modulo mcp23017, ecco il codice di test, reperito in rete e adattato;
#include <Wire.h>
#include <Adafruit_MCP23017.h>
Adafruit_MCP23017 mcp;
byte ledPin = 0;
byte arduinoIntPin = 23;
volatile boolean awakenByInterrupt = false;
static uint16_t ledState = 0;
byte mcpPinA = 8;
void setup() {
Serial.begin(115200);
Serial.println("MCP23007 Interrupt Test");
pinMode(arduinoIntPin, INPUT);
mcp.begin(1); // use default address 0
mcp.pinMode(ledPin, OUTPUT);
mcp.pinMode(mcpPinA, INPUT);
mcp.pullUp(mcpPinA, HIGH); // turn on a 100K pullup internally
mcp.setupInterrupts(true, false, LOW);
mcp.setupInterruptPin(mcpPinA, FALLING);
mcp.readGPIOAB();
attachInterrupt(digitalPinToInterrupt(arduinoIntPin), intCallBack, FALLING);
}
// The int handler will just signal that the int has happen
// we will do the work from the main loop.
void intCallBack() {
awakenByInterrupt = true;
}
void handleInterrupt() {
uint8_t pin = mcp.getLastInterruptPin();
uint8_t val = mcp.getLastInterruptPinValue();
Serial.println("punto5");//----------------------------------test------------------------
if ( pin == mcpPinA && val == 0) {
if ( ledState ) {
mcp.digitalWrite(ledPin, LOW);
} else {
mcp.digitalWrite(ledPin, HIGH);
}
ledState = ! ledState;
}
while ( !mcp.digitalRead(mcpPinA));
// and clean queued INT signal
cleanInterrupts();
}
void cleanInterrupts() {
Serial.println("punto1");//-----------------------------------test------------------------
delay(50);
mcp.readGPIOAB();
awakenByInterrupt = false;
Serial.println(mcp.readGPIOAB());//------------------------test------------------------
}
void loop() {
if (awakenByInterrupt) handleInterrupt();
}
funziona bene fino a che non si preme un po piu velocemente il pulsante, a questo punto si blocca, ho inserito dei Serial per vedere dove si fermava è ho notato che quando si blocca il valore letto da Serial.println(mcp.readGPIOAB()); è diverso , come si vede sulla lettura della seriale;
punto5
punto1
1795
punto5
punto1
1792
punto5
punto1
1795
punto5
punto1
1536
avete qualche suggerimento ?
buona domenica a tutti
p.s. il codice è caricato su un ESP32
