-
-
Notifications
You must be signed in to change notification settings - Fork 219
Description
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);
}
}
``