Skip to content

detachInterrupt causes Pico to crash #392

@MrE1078

Description

@MrE1078

OS: Windows 10
Board: Raspberry Pi Pico
IDE: Arduino IDE Version: 1.8.19
Mbed OS: Version 2.6.1

Context
I wrote some test code (below) for handling interrupts and my Pico crashes every time the detachInterrupt(pin_num); line is called. The onboard LED begins flashing 3-4 time slowly, then 3-4 time quickly, then repeats.

Problem
Here's the code snippet to reproduce the issue:

int but_in_1 = 12;
int but_in_2 = 13;
int but_in_3 = 14;
int but_in_4 = 15;
int led_out_1 = 16;
int led_out_2 = 17;
bool allow_input = false;
bool is_interrupt = false;

void setup() {
// put your setup code here, to run once:
Serial.begin(9600);
interrupt_pin_enable(but_in_1);
//attachInterrupt(digitalPinToInterrupt(but_in_1),ZeroDetection,FALLING);
//pinMode(but_in_1, INPUT_PULLUP);
pinMode(but_in_2, INPUT_PULLUP);
pinMode(but_in_3, INPUT_PULLUP);
pinMode(but_in_4, INPUT_PULLUP);
pinMode(led_out_1, OUTPUT);
pinMode(led_out_2, OUTPUT);
digitalWrite(led_out_1, HIGH);
digitalWrite(led_out_2, LOW);
}
void loop() {
if (allow_input){
if (digitalRead(but_in_2) == 0){
digitalWrite(led_out_1, !digitalRead(led_out_1));
digitalWrite(led_out_2, !digitalRead(led_out_2));
allow_input = false;
}
}
if ((digitalRead(but_in_3) == 0) && (digitalRead(but_in_4) == 0)){
interrupt_pin_enable(but_in_1);
}
if (allow_input == false){
if ((digitalRead(but_in_2) == 0) && (digitalRead(but_in_4) == 0)){
interrupt_pin_disable(but_in_1);
}
}
Serial.print(F("Button 1 Status: "));
Serial.print(digitalRead(but_in_1));
Serial.print(F(", Button 2 Status: "));
Serial.print(digitalRead(but_in_2));
Serial.print(F(", Button 3 Status: "));
Serial.print(digitalRead(but_in_3));
Serial.print(F(", Button 4 Status: "));
Serial.print(digitalRead(but_in_4));
Serial.print(F(", Interrupt Enabled: "));
Serial.print(is_interrupt);
Serial.print(F(", Allow Input: "));
Serial.println(allow_input);
}
void ZeroDetection(){
allow_input = true;
interrupt_pin_disable(but_in_1);
}
void interrupt_pin_enable(int pin_num){
if (is_interrupt == false){
is_interrupt = true;
attachInterrupt(digitalPinToInterrupt(pin_num),ZeroDetection,FALLING);
pinMode(pin_num, INPUT_PULLUP);
}
}
void interrupt_pin_disable(int pin_num){
if (is_interrupt){
is_interrupt = false;
detachInterrupt(pin_num); <--ISSUE LINE
//pinMode(pin_num, INPUT_PULLUP);
}
}
``

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions