Skip to content

Commit

Permalink
Get pin levels at time of interrupt, rather than the time of calling …
Browse files Browse the repository at this point in the history
…the handler

current implementation can cause false readings if previous handlers
take more time than the pin holds the level
  • Loading branch information
Me No Dev committed Nov 29, 2015
1 parent 5d49085 commit 466fa6f
Showing 1 changed file with 2 additions and 1 deletion.
3 changes: 2 additions & 1 deletion cores/esp8266/core_esp8266_wiring_digital.c
Original file line number Diff line number Diff line change
Expand Up @@ -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();
Expand All @@ -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
Expand Down

0 comments on commit 466fa6f

Please sign in to comment.