0

I want to cause the external interrupt on digital pin 2 (PD2 on ATmega328). I have chosen any logic change mode. Here is my code:

void setup()
{
 DDRD &= ~( 1 << DDD2 );//PD2 on input mode
 EICRA |= ( 1 << ISC00 );//any logic change
 PORTD |= ( 1 << PORTD2 );//pull-up enable
 EIMSK |= ( 1 << INT0 );//turns on INT0
 DDRD |= ( 1 << DDD5 );//PD5 on output mode
 PORTD |= ( 1 << PORTD5 );//turn on PD5
 SREG |= ( 1 << 7 );//global interrupts enabled
}
void loop()
{
}
ISR( INT0_vect )
{
 if( ( PIND & ( 1 << PIND5 ) ) > 0 )//if turned on
 {
 PORTD &= ~( 1 << PORTD5 );//turn off led
 }
 //and vice-versa
 else
 {
 PORTD |= ( 1 << PORTD5 );
 }
}

Here is how I connect things.

NOTE: I did not find an ordinary button which just connects two contacts ( which I actually use ). Here if I understand correctly the button in the picture connects left pair and right pair of contacts so everything is connected when pushed and disconnects them from each other when released.

enter image description here

The problem is when I push the button no interrupt occurs. What am I doing wrong?

asked Feb 28, 2018 at 6:47
6
  • 2
    If the button isn't pressed, the pin is floating, reacting to all electrical things near it. You habe to usw the resistor as pullup or pulldown. That might be the problem. Google pullup resistor and find a tutorial about it Commented Feb 28, 2018 at 8:24
  • As I know ATmega328 already has pull-up resistors. That is why I turn it on by specifying appropriate bit in PORTD register. Commented Feb 28, 2018 at 8:45
  • 2
    But your fritzing shows, that the button is connected to 3.3V, not to ground. And when you are using the internal pullup, you don't need another resistor Commented Feb 28, 2018 at 8:50
  • And your code doesn't compile, because in the ISR you try writing to register PIND5, which is only a pin, not a register. You have to write to PIND. Also in your last statement you have an extra parenthesis. Commented Feb 28, 2018 at 9:25
  • The setup function is only run once. You get no speed gain by writing directly to registers in the setup function. The gcc compiler has "_BV()" and Arduino has "bit()" to select a bit. You don't use both. The Arduino also enables the global interrupt. You can make it yourself easier with the Arduino functions, and only optimize the ISR if you have to. Commented Feb 28, 2018 at 9:27

1 Answer 1

1

Pin 2 is pulled up by internal R then pulled up when button is pressed? Connect button to GND.

answered Feb 28, 2018 at 11:07
1
  • OMG. I did not understand correctly what pull-up means. Thank you all. Now it works. Commented Feb 28, 2018 at 11:42

Your Answer

Draft saved
Draft discarded

Sign up or log in

Sign up using Google
Sign up using Email and Password

Post as a guest

Required, but never shown

Post as a guest

Required, but never shown

By clicking "Post Your Answer", you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.