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);
}
2 Answers 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
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
-
1Thanks, Danny. Yeah I should have known... dork move on my part.Samee87– Samee872017年01月31日 04:49:09 +00:00Commented Jan 31, 2017 at 4:49