首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >连接到MCP23017的ESP32中断问题

连接到MCP23017的ESP32中断问题
EN

Stack Overflow用户
提问于 2021-01-24 01:38:11
回答 1查看 193关注 0票数 0

我有一个问题,我已经有几个月没能摆脱它了。我正在尝试管理灯,我想用8个按钮控制8个继电器,系统工作,但使用中断我不能稳定程序。

所以如果我反复按下草图停止的按钮,也许问题出在我使用IRAM的错误方式上,配置如下: ESP32用MCP23017连接I2C,在草图下,谁能告诉我我做错了什么?

代码语言:javascript
复制
#include <Wire.h>
#include "Adafruit_MCP23017.h"
#include <SPI.h>

byte IntPin = 23; // collegare entrata interrupt mcp A------------------------
volatile boolean awakenByInterrupt = false;
static uint16_t ledState = 0;
boolean led_state[8];
byte pinLed[] = {7, 6, 5, 4, 3, 2, 1, 0};
byte buttons[] = {8, 9, 10, 11, 12, 13, 14, 15};
int i;
  
void IRAM_ATTR intCallBack() {
  awakenByInterrupt = true;
}
    
Adafruit_MCP23017 mcp;
    
void setup() {
  Serial.begin(115200);
  mcp.begin();
  pinMode(IntPin, INPUT);
  for (i = 0; i < (8); i++) {
    mcp.pinMode(buttons[i], INPUT);
    mcp.pinMode(pinLed[i], OUTPUT);
    mcp.pullUp(buttons[i], HIGH); //------------------- da valutare
    mcp.digitalWrite(pinLed[i], LOW);
    led_state[i] = false;
    mcp.setupInterruptPin(buttons[i], RISING);
  }
  mcp.readGPIOAB();
  mcp.setupInterrupts(true, false, LOW);
  attachInterrupt(digitalPinToInterrupt(IntPin), intCallBack, FALLING);
}
    
void handleInterrupt() { // gestione pulsanti da interrupt************************************************************************************
  uint8_t pin = mcp.getLastInterruptPin();
  //uint8_t val = mcp.getLastInterruptPinValue();
  led_state[pin - 8] = ! led_state[pin - 8];
  if (led_state[pin - 8]) 
    mcp.digitalWrite(pinLed[pin - 8], HIGH);
  else 
    mcp.digitalWrite(pinLed[pin - 8], LOW);

  while (!(!mcp.digitalRead(buttons[0]) && ! mcp.digitalRead(buttons[1]) &&  !mcp.digitalRead(buttons[2]) && !mcp.digitalRead(buttons[3]) && !mcp.digitalRead(buttons[4]) && !mcp.digitalRead(buttons[5]) && !mcp.digitalRead(buttons[6]) && !mcp.digitalRead(buttons[7])));
  mcp.readGPIOAB();
  awakenByInterrupt = false;
}
   
void loop() {
  if (awakenByInterrupt)
    handleInterrupt();
}
EN

回答 1

Stack Overflow用户

发布于 2021-04-15 11:35:43

试试这个:

更改:while (!(!mcp.digitalRead(buttons[0]) && ! mcp.digitalRead(buttons[1]) && !mcp.digitalRead(buttons[2]) && !mcp.digitalRead(buttons[3]) && !mcp.digitalRead(buttons[4]) && !mcp.digitalRead(buttons[5]) && !mcp.digitalRead(buttons[6]) && !mcp.digitalRead(buttons[7]))); mcp.readGPIOAB();

使用:while (!(mcp.digitalRead(buttons[0]) && mcp.digitalRead(buttons[1]) && mcp.digitalRead(buttons[2]) && mcp.digitalRead(buttons[3]) && mcp.digitalRead(buttons[4]) && mcp.digitalRead(buttons[5]) && mcp.digitalRead(buttons[6]) && mcp.digitalRead(buttons[7])));

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65862346

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档