Interrupt firing by itself once

The code should set the controller to sleep, then on pin 3 going low it will wake and turn on the LEDs and go back to sleep. However on startup it displays the LEDs and becomes unresponsive to the button I have connected to the interrupt pin. What have I done wrong?


#include <ezButton.h>
#include "LowPower.h"
//code to run the watch user timer2 micros function and power saving mode

unsigned long ledStarted = 0;
const long interval = 2000000;
int h=1; //set hour
int m=03; //set minute
int s=37; //set second
int flag=1; //PM 1 AM 0
const int buttonpin =3; //button pin PD3 D3
int buttonpress = 0;
static uint32_t last_time, now = 0; // RTC
volatile unsigned long overflowCount;        // Overflow count
const int interruptPin = 3;
ezButton button(buttonpin);
void setinput(){
  pinMode(8, INPUT);
  pinMode(9, INPUT);
  pinMode(10, INPUT);
  pinMode(11, INPUT);
  pinMode(12, INPUT);
  pinMode(13, INPUT);
  pinMode(A0, INPUT);
  pinMode(A1, INPUT);
  pinMode(A2, INPUT);
  pinMode(A3, INPUT);
  pinMode(A4, INPUT);
  pinMode(A5, INPUT);
  pinMode(2, INPUT);
}

void wakeUp()
   {
  setinput();

  switch (h) { //display hour
  case 1: 
   pinMode(A3, OUTPUT);
   pinMode(A4, OUTPUT);
   digitalWrite(A3, LOW);
   digitalWrite(A4, HIGH);
   break;
  case 2: 
   pinMode(A3, OUTPUT);
   pinMode(A4, OUTPUT);
   digitalWrite(A3, HIGH);
   digitalWrite(A4, LOW);
   break;
  case 3: 
   pinMode(A3, OUTPUT);
   pinMode(A5, OUTPUT);
   digitalWrite(A3, LOW);
   digitalWrite(A5, HIGH);
   break;
  case 4: 
   pinMode(A3, OUTPUT);
   pinMode(A5, OUTPUT);
   digitalWrite(A3, HIGH);
   digitalWrite(A5, LOW);
   break;
  case 5: 
   pinMode(A4, OUTPUT);
   pinMode(A5, OUTPUT);
   digitalWrite(A4, LOW);
   digitalWrite(A5, HIGH);
   break;
  case 6: 
   pinMode(A4, OUTPUT);
   pinMode(A5, OUTPUT);
   digitalWrite(A4, HIGH);
   digitalWrite(A5, LOW);
   break;
  case 7: 
    pinMode(A3, OUTPUT);
    pinMode(2, OUTPUT);
    digitalWrite(A3, LOW);
    digitalWrite(2, HIGH);
   break;
  case 8: 
   pinMode(A3, OUTPUT);
   pinMode(2, OUTPUT);
   digitalWrite(A3, HIGH);
   digitalWrite(2, LOW);
   break;
  case 9: 
   pinMode(A5, OUTPUT);
   pinMode(2, OUTPUT);
   digitalWrite(A5, LOW);
   digitalWrite(2, HIGH);
   break;
  case 10: 
   pinMode(A5, OUTPUT);
   pinMode(2, OUTPUT);
   digitalWrite(A5, HIGH);
   digitalWrite(2, LOW);
   break;
  case 11: 
   pinMode(A4, OUTPUT);
   pinMode(2, OUTPUT);
   break;
  case 12: 
   pinMode(A4, OUTPUT);
   pinMode(2, OUTPUT);
   digitalWrite(2, LOW);
   digitalWrite(A4, HIGH);
   break;
  }
switch (m) { //display minute
  case 1: 
   pinMode(8, OUTPUT);
   pinMode(9, OUTPUT);
   digitalWrite(8,HIGH);
   digitalWrite(9,LOW);
   break;
  case 2: 
   pinMode(8, OUTPUT);
   pinMode(9, OUTPUT);
   digitalWrite(8,LOW);
   digitalWrite(9,HIGH);
   break;
  case 3: 
   pinMode(8, OUTPUT);
   pinMode(12, OUTPUT);
   digitalWrite(8,HIGH);
   digitalWrite(12,LOW);
   break;
  case 4: 
   pinMode(8, OUTPUT);
   pinMode(12, OUTPUT);
   digitalWrite(8,LOW);
   digitalWrite(12,HIGH);
   break;
  case 5: 
   pinMode(8, OUTPUT);
   pinMode(13, OUTPUT);
   digitalWrite(8,HIGH);
   digitalWrite(13,LOW);
   break;
  case 6: 
   pinMode(8, OUTPUT);
   pinMode(13, OUTPUT);
   digitalWrite(8,LOW);
   digitalWrite(13,HIGH);
   break;
  case 7: 
   pinMode(8, OUTPUT);
   pinMode(A0, OUTPUT);
   digitalWrite(8,HIGH);
   digitalWrite(A0,LOW);
   break;
  case 8: 
   pinMode(8, OUTPUT);
   pinMode(A0, OUTPUT);
   digitalWrite(8,LOW);
   digitalWrite(A0,HIGH);
   break;
  case 9: 
   pinMode(8, OUTPUT);
   pinMode(A1, OUTPUT);
   digitalWrite(8,HIGH);
   digitalWrite(A1,LOW);
   break;
  case 10: 
   pinMode(8, OUTPUT);
   pinMode(A1, OUTPUT);
   digitalWrite(8,LOW);
   digitalWrite(A1,HIGH);
   break;
  case 11: 
    pinMode(8, OUTPUT);
   pinMode(A2, OUTPUT);
   digitalWrite(8,LOW);
   digitalWrite(A2,HIGH);
   break;
  case 12: 
   pinMode(8, OUTPUT);
   pinMode(10, OUTPUT);
   digitalWrite(8,HIGH);
   digitalWrite(10,LOW);
   break;
  case 13: 
   pinMode(8, OUTPUT);
   pinMode(10, OUTPUT);
   digitalWrite(8,LOW);
   digitalWrite(10,HIGH);
   break;
  case 14: 
   pinMode(8, OUTPUT);
   pinMode(11, OUTPUT);
   digitalWrite(8,HIGH);
   digitalWrite(11,LOW);
   break;
  case 15: 
   pinMode(8, OUTPUT);
   pinMode(11, OUTPUT);
   digitalWrite(8,LOW);
   digitalWrite(11,HIGH);
   break;
  case 16: 
   pinMode(9, OUTPUT);
   pinMode(11, OUTPUT);
   digitalWrite(9,HIGH);
   digitalWrite(11,LOW);
   break;
  case 17: 
   pinMode(9, OUTPUT);
   pinMode(11, OUTPUT);
   digitalWrite(9,HIGH);
   digitalWrite(11,LOW);
   break;
  case 18: 
   pinMode(9, OUTPUT);
   pinMode(12, OUTPUT);
   digitalWrite(9,HIGH);
   digitalWrite(12,LOW);
   break;
  case 19: 
   pinMode(9, OUTPUT);
   pinMode(12, OUTPUT);
   digitalWrite(9,LOW);
   digitalWrite(12,HIGH);
   break;
  case 20: 
   pinMode(9, OUTPUT);
   pinMode(13, OUTPUT);
   digitalWrite(9,HIGH);
   digitalWrite(13,LOW);
   break;
  case 21: 
   pinMode(9, OUTPUT);
   pinMode(13, OUTPUT);
   digitalWrite(9,LOW);
   digitalWrite(13,HIGH);
   break;
  case 22: 
   pinMode(9, OUTPUT);
   pinMode(A0, OUTPUT);
   digitalWrite(9,HIGH);
   digitalWrite(A0,LOW);
   break;
  case 23: 
   pinMode(9, OUTPUT);
   pinMode(A0, OUTPUT);
   digitalWrite(9,LOW);
   digitalWrite(A0,HIGH);
   break;
  case 24: 
   pinMode(9, OUTPUT);
   pinMode(A1, OUTPUT);
   digitalWrite(9,HIGH);
   digitalWrite(A1,LOW);
   break;
  case 25: 
   pinMode(9, OUTPUT);
   pinMode(A1, OUTPUT);
   digitalWrite(9,LOW);
   digitalWrite(A1,HIGH);
   break;
  case 26: 
   pinMode(9, OUTPUT);
   pinMode(A2, OUTPUT);
   digitalWrite(9,HIGH);
   digitalWrite(A2,LOW);
   break;
  case 27: 
   pinMode(9, OUTPUT);
   pinMode(A2, OUTPUT);
   digitalWrite(9,LOW);
   digitalWrite(A2,HIGH);
   break;
  case 28: 
   pinMode(9, OUTPUT);
   pinMode(10, OUTPUT);
   digitalWrite(9,HIGH);
   digitalWrite(10,LOW);
   break;
  case 29: 
   pinMode(9, OUTPUT);
   pinMode(10, OUTPUT);
   digitalWrite(9,HIGH);
   digitalWrite(10,LOW);
   break;
  case 30: 
   pinMode(10, OUTPUT);
   pinMode(11, OUTPUT);
   digitalWrite(10,HIGH);
   digitalWrite(11,LOW);
   break;
  case 31:
   pinMode(10, OUTPUT);
   pinMode(13, OUTPUT);
   digitalWrite(10,HIGH);
   digitalWrite(13,LOW);
   break;
  case 32:
   pinMode(10, OUTPUT);
   pinMode(13, OUTPUT);
   digitalWrite(10,HIGH);
   digitalWrite(13,LOW);
   break;
  case 33:
   pinMode(10, OUTPUT);
   pinMode(13, OUTPUT);
   digitalWrite(10,LOW);
   digitalWrite(13,HIGH);
   break;
  case 34:
   pinMode(10, OUTPUT);
   pinMode(A0, OUTPUT);
   digitalWrite(10,HIGH);
   digitalWrite(A0,LOW);
   break;
  case 35:
   pinMode(10, OUTPUT);
   pinMode(A0, OUTPUT);
   digitalWrite(10,LOW);
   digitalWrite(A0,HIGH);
   break;
  case 36:
   pinMode(10, OUTPUT);
   pinMode(A1, OUTPUT);
   digitalWrite(10,HIGH);
   digitalWrite(A1,LOW);
   break;
  case 37:
   pinMode(10, OUTPUT);
   pinMode(A1, OUTPUT);
   digitalWrite(10,LOW);
   digitalWrite(A1,HIGH);
   break;
  case 38:
   pinMode(10, OUTPUT);
   pinMode(A2, OUTPUT);
   digitalWrite(10,HIGH);
   digitalWrite(A2,LOW);
   break;
  case 39:
   pinMode(10, OUTPUT);
   pinMode(A2, OUTPUT);
   digitalWrite(10,LOW);
   digitalWrite(A2,HIGH);
   break;
  case 40:
   pinMode(10, OUTPUT);
   pinMode(12, OUTPUT);
   digitalWrite(10,HIGH);
   digitalWrite(12,LOW);
   break; 
  case 41:
   pinMode(11, OUTPUT);
   pinMode(A1, OUTPUT);
   digitalWrite(11,HIGH);
   digitalWrite(A1,LOW); 
   break;
  case 42:
   pinMode(11, OUTPUT);
   pinMode(A1, OUTPUT);
   digitalWrite(11,LOW);
   digitalWrite(A1,HIGH); 
   break;
  case 43:
   pinMode(11, OUTPUT);
   pinMode(A2, OUTPUT);
   digitalWrite(11,HIGH);
   digitalWrite(A2,LOW); 
   break;
  case 44:
   pinMode(11, OUTPUT);
   pinMode(A2, OUTPUT);
   digitalWrite(11,LOW);
   digitalWrite(A2,HIGH); 
   break;
  case 45:
   pinMode(11, OUTPUT);
   pinMode(12, OUTPUT);
   digitalWrite(11,HIGH);
   digitalWrite(12,LOW); 
   break;
  case 46:
   pinMode(11, OUTPUT);
   pinMode(12, OUTPUT);
   digitalWrite(11,LOW);
   digitalWrite(12,HIGH); 
   break;
  case 47:
   pinMode(11, OUTPUT);
   pinMode(13, OUTPUT);
   digitalWrite(11,HIGH);
   digitalWrite(13,LOW); 
   break;
  case 48:
   pinMode(12, OUTPUT);
   pinMode(13, OUTPUT);
   digitalWrite(12,HIGH);
   digitalWrite(13,LOW); 
   break;
  case 49:
   pinMode(12, OUTPUT);
   pinMode(13, OUTPUT);
   digitalWrite(12,LOW);
   digitalWrite(13,HIGH);  
   break;
  case 50:
   pinMode(12, OUTPUT);
   pinMode(A0, OUTPUT);
   digitalWrite(12,HIGH);
   digitalWrite(A0,LOW); 
   break; 
  case 51:
   pinMode(12, OUTPUT);
   pinMode(A0, OUTPUT);
   digitalWrite(12,LOW);
   digitalWrite(A0,HIGH); 
   break;
  case 52:
   pinMode(13, OUTPUT);
   pinMode(A1, OUTPUT);
   digitalWrite(13,HIGH);
   digitalWrite(A1,LOW); 
   break;
  case 53:
   pinMode(13, OUTPUT);
   pinMode(A1, OUTPUT);
   digitalWrite(13,LOW);
   digitalWrite(A1,HIGH); 
   break;
  case 54:
   pinMode(13, OUTPUT);
   pinMode(A0, OUTPUT);
   digitalWrite(13,HIGH);
   digitalWrite(A0,LOW); 
   break;
  case 55:
   pinMode(13, OUTPUT);
   pinMode(A0, OUTPUT);
   digitalWrite(13,LOW);
   digitalWrite(A0,HIGH); 
   break;
  case 56:
   pinMode(A0, OUTPUT);
   pinMode(A1, OUTPUT);
   digitalWrite(A0,HIGH);
   digitalWrite(A1,LOW); 
   break;
  case 57:
   pinMode(A0, OUTPUT);
   pinMode(A1, OUTPUT);
   digitalWrite(A0,LOW);
   digitalWrite(A1,HIGH); 
   break;
  case 58:
   pinMode(A0, OUTPUT);
   pinMode(A2, OUTPUT);
   digitalWrite(A0,HIGH);
   digitalWrite(A2,LOW); 
   break;
  case 59:
   pinMode(A0, OUTPUT);
   pinMode(A2, OUTPUT);
   digitalWrite(A0,LOW);
   digitalWrite(A2,HIGH); 
   break;
  case 60:
   pinMode(A1, OUTPUT);
   pinMode(A2, OUTPUT);
   digitalWrite(A1,HIGH);
   digitalWrite(A2,LOW); 
   break;
} 

setinput();
LowPower.idle(SLEEP_FOREVER,ADC_OFF,TIMER2_ON,TIMER1_OFF,TIMER0_OFF,SPI_OFF,USART0_ON,TWI_OFF); 
  
 }





void setup() 
{
  button.setDebounceTime(100);
  pinMode(interruptPin, INPUT_PULLUP);
  pinMode(buttonpin, INPUT); 
  attachInterrupt(digitalPinToInterrupt(interruptPin), wakeUp, FALLING); 
  TCCR2B = _BV(CS22);                       // Set the timer 2 prescaler to 64
  TCCR2A &= ~_BV(WGM21) & ~_BV(WGM20);      // Set timer2 for normal operation
  TIMSK2 |= _BV(TOIE2); 
  LowPower.idle(SLEEP_FOREVER,ADC_OFF,TIMER2_ON,TIMER1_OFF,TIMER0_OFF,SPI_OFF,USART0_ON,TWI_OFF);                   
}

void loop() {
now = micros2();
 if (now - last_time >= 1000000){
    s=s+1; //increment sec. counting
    last_time = micros2();
  }
button.loop(); // MUST call the loop() function first
  int btnState = button.getState();
// ---- manage seconds, minutes, hours am/pm overflow ----
 if(s==60){
  s=0;
  m=m+1;
 }
 if(m==60)
 {
  m=0;
  h=h+1;
 }
 if(h==13)
 {
  h=1;
  flag=flag+1;
  if(flag==2)flag=0;
 } 
 if (btnState==LOW){
  LowPower.idle(SLEEP_FOREVER,ADC_OFF,TIMER2_ON,TIMER1_OFF,TIMER0_OFF,SPI_OFF,USART0_ON,TWI_OFF);  
 }
}


// The micros2() function using timer 2
unsigned long micros2() 
{
  unsigned long m;
  uint8_t oldSREG = SREG, t;
     
  cli();                                    // Disable interrupts
  m = overflowCount;                        // Get the number of overflows
  t = TCNT2;                                // Get the current timer2 value

  if ((TIFR2 & _BV(TOV2)) && (t < 255))     // Check if the timer has just overflowed (and we've missed it)
  {
    m++;                                    // Then in this rare case increment the overflow counter
  }  
  SREG = oldSREG;                           // Enable interrupts
  return ((m << 8) + t) * (64 / clockCyclesPerMicrosecond());   // Return the number of microseconds
}

ISR(TIMER2_OVF_vect)                        // ISR timer 2 overflow callback function
{
  overflowCount++;                          // Increment the overflow count
}


Please post a wiring diagram (hand drawn, not Fritzing).

1 Like

An interrupt might already have been detected before you use attachInterrupt(). The solution is to clear the interrupt flag before you use attachInterrupt().

1 Like

Hi,
How have you got your buttons wired?
If they switch to 5V, do you have a 10k resistor between the controllers input pin and gnd?
If they switch to gnd, do you have a 10k resistor between the controllers input pin and 5V?

It sounds like you have an open circuit, floating input.
You need pull up or pull down resistors.

Thanks.. Tom.. :smiley: :+1: :coffee: :australia:

Yep there is a pull up on the button

Hi,
Have you written your code in stages?

Do you have code that JUST has a read sequence of your buttons?
To prove you are reading them as stable inputs.

I have seen charlieplexing of LEDs but not of buttons as an input.

Can you post a schematic with the charlieplexed buttons in your circuit?

Thanks.. Tom... :smiley: :+1: :coffee: :australia:

Its leds that are being charlieplexed

Where in your circuit have you drawn the button?
That is what is confusing.
Is there a reason you are not using the Charlieplexing library?
https://playground.arduino.cc/Code/Charlieplex/

I would make life so much easier I'd think.

Tom... :smiley: :+1: :coffee: :australia:

Its between pin 3 and gnd, no reason, just trying to get it to work before I involve more libraries.

Are these the commands you mean?

noInterrupts ();  // or ...
cli ();           // clear interrupts flag

Would I then enable them after the attachInterrupt()?

Well I'd be writing code just to get the charlieplexing working on its own first before adding all the other stuff.

Start with the library, it will make things so much easier, especially when your other bits of working code is integrated into your first code.
You did write your code in stages, each stage a different Input or Output feature.
Then when each worked, adding them together one at a time.
Each time getting to code to work before adding the next?

Tom..... :smiley: :+1: :coffee: :australia:

No. There is a register called EIFR that holds the flag of an external interrupt that occured. For the 328P there are two flags, INTF1 (for external interrupt 1 that is associated with pin 3) and INTF0 (for external interrupt 1 that is associated with pin 2). You need to clear INTF1 by writing a 1 to it.

From the datasheet of the 328P

EIFR |= 2 should do the trick.

Note on your code

  pinMode(interruptPin, INPUT_PULLUP);
  pinMode(buttonpin, INPUT);

interruptPin and buttonPin are the same pin; make up your mind if you want to use INPUT_PULLUP or not :wink: If you have an external pull-up resistor as you do, INPUT is sufficient.

The charlieplexing is completely fine, it has been tested before alone. I'm currently in the stage of intergrating sleep code with interrupts into the charlieplexing code.

Yep alright thanks for you help, I'll give that a crack tonight.

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.