MCP23017 и прерывания
- Войдите на сайт для отправки комментариев
Добрый день, камрады
Взялся мучать MCP23017, возник затык, который победить не получается. Порт B, выводы GPB0-GPB6 в режиме входа с внутренними подтяжками (кнопки), вывод GPB7 в режиме выхода (светодиод). Для GPB0-GPB6 включено прерывание. Инициализация чипа выглядит так:
#define MCP23017_IODIRB 0x01 #define MCP23017_GPPUB 0x0D #define MCP23017_GPINTENB 0x05 send8bitI2C(MCP23017_IODIRB, 0x7F); // устанавливаем входы-выходы порта B send8bitI2C(MCP23017_GPPUB, 0x7F); // включаем подтяжку для входов порта B send8bitI2C(MCP23017_GPINTENB, 0x7F); // включаем прерывания для входов порта B
Включаем мигание светодиодом раз в секунду в loop:
if (actualTime - lastChangeTime > 1000) { static bool lcdState; if (lcdState) { panel.noLed(); } else { panel.led(); } lcdState = !lcdState; lastChangeTime = actualTime; }
Функции led и noLed выглядят так:
void LCD_RTC_Keypad_MCP23017::noLed(void) { uint8_t buf = read8bitI2C(MCP23017_GPIOB); buf &= ~(1 << 7); Serial.print("led off "); Serial.println(buf, BIN); send8bitI2C(MCP23017_GPIOB, buf); } void LCD_RTC_Keypad_MCP23017::led(void) { uint8_t buf = read8bitI2C(MCP23017_GPIOB); buf |= OUT_LED_PIN; Serial.print("led on "); Serial.println(buf, BIN); send8bitI2C(MCP23017_GPIOB, buf); }
В этом варианте светодиод моргает, на выводе INTB микросхемы прерывание происходит как при нажатии кнопки, так и при ее отпускании. Если оставить любую кнопку нажатой, то при изменении состояния светодиода прерывания не происходит (то есть все работает корректно).
Но стоит включить для GPB6 прерывание по нажатию или отпусканию кнопки:
#define MCP23017_DEFVALB 0x07 #define MCP23017_INTCONB 0x09 send8bitI2C(MCP23017_INTCONB, 0x40); send8bitI2C(MCP23017_DEFVALB, 0x40);
то при мигании светодиодом происходит прерывание при каждом изменении светодиода при нажатой кнопке на GPB6 (если не включаем MCP23017_DEFVALB), либо при отпущенной кнопке (если включаем MCP23017_DEFVALB). Есть у кого-нибудь идеи почему так происходит и как это победить?