![](/img/trans.png)
[英]How to read a rotary encoder with interrupts on ESP32 and global flags
[英]How can I clear any pending interrupts in the NodeMCU ESP32?
我已經構建了一個簡單的硬幣傳感器,帶有兩個銅板,可以檢測硬幣何時擊中它們。 敲擊兩個盤子后,我觸發了一個中斷,如下所示:
attachInterrupt( digitalPinToInterrupt(INPUT_PIN_COIN), Interrupt_CoinDeposit, FALLING );
這很好用,當硬幣撞擊兩個盤子時,我可以撿起來。 為了避免由於接觸反彈而多次注冊同一個硬幣,我在Interrupt_CoinDeposit()
函數中分離了中斷,如下所示:
void IRAM_ATTR Interrupt_CoinDeposit()
{
detachInterrupt(digitalPinToInterrupt(17));
g_crOSCore.EnqueueCoin();
}
EnqueueCoin
只是增加一個計數器並返回到中斷停止的地方。 之后,我檢查計數器是否增加,如果增加,我重新附加中斷。 但是,在重新附加中斷時,它會立即觸發。 我了解到重新附加中斷會完成所有掛起的中斷。 我不希望這種情況發生。 在 Arduino UNO R3 中,我相信您可以通過重置EIFR
來解決這個問題。 我想知道 NodeMCU ESP32 是否有類似的東西?
您可以使用標志而不是禁用中斷。 通過這種方式,您還可以避免在 ISR 中調用 detachInterrupt() 函數。
bool coinRegistered = false;
void IRAM_ATTR Interrupt_CoinDeposit()
{
if (!coinRegistered) {
coinRegistered = true;
g_crOSCore.EnqueueCoin();
}
}
/* ... somewhere else in the code ...*/
coinRegistered = false;
您可以在 ISR 中啟動一個計時器來重置標志,或者您可以手動重置它。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.