1

I'm learning about accessing ports directly on the ATMEGA 328 using an Arduino Uno. The program sets up pin 13 as an output and pin 2 as an input. I then enable the pull up resistor on pin 2.

I read Pin 2 and set the LED high or low depending on if pin 2 is high or low.

Why is it that I cannot seem to use == HIGH in my if statement instead of != LOW?

void setup() {
 MCUCR &= ~(1 << 4); //disables pull-up disable (redundant as default is off)
 DDRB |= (1 << 5); //sets pin 13 (B5 on ATMEGA 328) as output
 DDRD &= ~(1 << 2); //sets pin 2 (D2 on ATMEGA 328) as input (redundant as default is input)
 PORTD |= (1 << 2); //since it's an input sets pull-up resistor ON
 PORTB &= ~(1 << 5); //sets pin 13 (B5 on ATMEGA 328) as LOW
}
void loop() {
 if ((PIND & (1 << 2)) != LOW) PORTB |= (1 << 5); //sets pin 13 (B5 on ATMEGA 328) as HIGH
 else PORTB &= ~(1 << 5); //sets pin 13 (B5 on ATMEGA 328) as LOW
 delay(100);
}
asked Jan 30, 2017 at 22:14

2 Answers 2

2

Because

((PIND & (1 << 2)) != LOW)

means exactly

(PIND & 4) != 0

and that is true if PIND is 4, 5, 6, 7, 12, 13, ... (any number having 4 in it binary), so it yelds

4 != 0 

Which is definitively not equal

4 == 1

BTW: in C any integer != 0 is true and 0 is false, so you can as well write:

if (PIND & (1 << 2)) PORTB |= (1 << 5); //sets pin 13 (B5 on ATMEGA 328) as HIGH
answered Jan 30, 2017 at 22:25
0
1
if ((PIND & (1 << 2)) != LOW) PORTB |= (1 << 5); //sets pin 13 (B5 on ATMEGA 328) as HIGH
 else PORTB &= ~(1 << 5); //sets pin 13 (B5 on ATMEGA 328) as LOW

PIND & (1<<2) will return a value of either (1<<2) if PD.2 is high, or 0 if PD.2 is low.

So it basically says that if PD2 is high, set PB5; otherwise, clear PB5.enter code here

answered Jan 31, 2017 at 0:29
1
  • 1
    Thanks, Danny. Yeah I should have known... dork move on my part. Commented Jan 31, 2017 at 4:49

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.