1
0
mirror of https://github.com/esp8266/Arduino.git synced 2025-04-22 21:23:07 +03:00

Get pin levels at time of interrupt, rather than the time of calling the handler

current implementation can cause false readings if previous handlers
take more time than the pin holds the level
This commit is contained in:
Me No Dev 2015-11-29 18:15:07 +02:00
parent 5d49085c8c
commit 466fa6f5a9

View File

@ -111,6 +111,7 @@ static uint32_t interrupt_reg = 0;
void interrupt_handler(void *arg) {
uint32_t status = GPIE;
uint32_t levels = GPI;
GPIEC = status;//clear them interrupts
if(status == 0 || interrupt_reg == 0) return;
ETS_GPIO_INTR_DISABLE();
@ -122,7 +123,7 @@ void interrupt_handler(void *arg) {
interrupt_handler_t *handler = &interrupt_handlers[i];
if (handler->fn &&
(handler->mode == CHANGE ||
(handler->mode & 1) == digitalRead(i))) {
(handler->mode & 1) == !!(levels & (1 << i)))) {
// to make ISR compatible to Arduino AVR model where interrupts are disabled
// we disable them before we call the client ISR
uint32_t savedPS = xt_rsil(15); // stop other interrupts