Evaluate button with interrupt

For Adafruit customers who seek help with microcontrollers

Moderators: adafruit_support_bill, adafruit

Please be positive and constructive with your questions and comments.
Locked
User avatar
noldwil
 
Posts: 15
Joined: Wed Jul 01, 2020 4:52 am

Evaluate button with interrupt

Post by noldwil »

Hi,
I am using Adafruit Feather M0 Radio with RFM69 Packet Radio and Adafruit 8x16 LED Matrix FeatherWing.
and I woult like to use 8 interrupts for handling Buttons. Unfortunately only 6 interrupts are working. Maybe someone can explain me why?

Code: Select all

#define BtnA      A4  // Button_A
#define BtnB      11  // Button_B
#define BtnC      A3  // Button_C
#define BtnD      10  // Button_D
#define BtnE      A2  // Button_E
#define BtnF       9  // Button_F
#define BtnG      12  // Button_G
#define BtnH       5  // Button_H

volatile unsigned long timerBtnApressed=0;        //Timebase for Button-Debouncing
volatile unsigned long timerBtnBpressed=0;        
volatile unsigned long timerBtnCpressed=0;        
volatile unsigned long timerBtnDpressed=0;        
volatile unsigned long timerBtnEpressed=0;        
volatile unsigned long timerBtnFpressed=0;        
volatile unsigned long timerBtnGpressed=0;       
volatile unsigned long timerBtnHpressed=0;        

volatile bool flagBtnA = false;           
volatile bool flagBtnB = false;          
volatile bool flagBtnC = false;          
volatile bool flagBtnD = false;          
volatile bool flagBtnE = false;         
volatile bool flagBtnF = false;          
volatile bool flagBtnG = false;          
volatile bool flagBtnH = false;          

void setup()
{ 
  Serial.begin(9600);
  Serial.println("ONLY FOR DEBUGGING");

  pinMode(BtnA,  INPUT_PULLUP);
  pinMode(BtnB,  INPUT_PULLUP);
  pinMode(BtnC,  INPUT_PULLUP);  
  pinMode(BtnD,  INPUT_PULLUP);
  pinMode(BtnE,  INPUT_PULLUP);
  pinMode(BtnF,  INPUT_PULLUP);
  pinMode(BtnG,  INPUT_PULLUP);
  pinMode(BtnH,  INPUT_PULLUP);

  attachInterrupt(digitalPinToInterrupt(BtnA), Button_A_pressedISR, CHANGE);
  attachInterrupt(digitalPinToInterrupt(BtnB), Button_B_pressedISR, CHANGE);
  attachInterrupt(digitalPinToInterrupt(BtnC), Button_C_pressedISR, CHANGE);
  attachInterrupt(digitalPinToInterrupt(BtnD), Button_D_pressedISR, CHANGE);
  attachInterrupt(digitalPinToInterrupt(BtnE), Button_E_pressedISR, CHANGE);
  attachInterrupt(digitalPinToInterrupt(BtnF), Button_F_pressedISR, CHANGE);
  attachInterrupt(digitalPinToInterrupt(BtnG), Button_G_pressedISR, CHANGE);
  attachInterrupt(digitalPinToInterrupt(BtnH), Button_H_pressedISR, CHANGE);

}



void loop() //Endloss-Loop
{ 

  if(flagBtnA)
  {
    flagBtnA=false;
    Serial.println("Button A");
  }

  if(flagBtnB)
  {
    flagBtnB=false;
    Serial.println("Button B");
  }

  if(flagBtnC)
  {
    flagBtnC=false;
    Serial.println("Button C");
  }

  if(flagBtnD)
  {
    flagBtnD=false;
    Serial.println("Button D");
  }

  if(flagBtnE)
  {
    flagBtnE=false;
    Serial.println("Button E");
  }

  if(flagBtnF)
  {
    flagBtnF=false;
    Serial.println("Button F");
  }

  if(flagBtnG)
  {
    flagBtnG=false;
    Serial.println("Button G");
  }

  if(flagBtnH)
  {
    flagBtnH=false;
    Serial.println("Button H");
  }

}



void Button_A_pressedISR()
{ if((millis() - timerBtnApressed) > 400) //Button debouncing
  { timerBtnApressed = millis();         
    flagBtnA=true;
} }

void Button_B_pressedISR()
{ if((millis() - timerBtnBpressed) > 400) 
  { timerBtnBpressed = millis();         
    flagBtnB=true;
} }

void Button_C_pressedISR()
{ if((millis() - timerBtnCpressed) > 400) 
  { timerBtnCpressed = millis();          
    flagBtnC=true;
} }

void Button_D_pressedISR()
{ if((millis() - timerBtnDpressed) > 400) 
  { timerBtnDpressed = millis();          
    flagBtnD=true;
} }

void Button_E_pressedISR()
{ if((millis() - timerBtnEpressed) > 400) 
  { timerBtnEpressed = millis();          
    flagBtnE=true;
} }

void Button_F_pressedISR()
{ if((millis() - timerBtnFpressed) > 400) 
  { timerBtnFpressed = millis();          
    flagBtnF=true;
} } 

void Button_G_pressedISR()
{ if((millis() - timerBtnGpressed) > 400) 
  { timerBtnGpressed = millis();         
    flagBtnG=true;
} }

void Button_H_pressedISR()
{ if((millis() - timerBtnHpressed) > 400) 
  { timerBtnHpressed = millis();          
    flagBtnH=true;
} }

User avatar
dastels
 
Posts: 15667
Joined: Tue Oct 20, 2015 3:22 pm

Re: Evaluate button with interrupt

Post by dastels »

Which 2 aren't working? And what exactly do you mean by not working?

This article from Sparkfun about handling buttons using interrupts might be useful to you... especially the part about debouncing.

Dave

Locked
Please be positive and constructive with your questions and comments.

Return to “Microcontrollers”