digitalRead(), замена, работа через порт

sunjob
sunjob аватар
Offline
Зарегистрирован: 18.07.2013

добрый день

- Atmega328P
- на 3м порту (PD3/INT1) висит кнопка
- порт сконфигурирован на вход, подтяжка установлена
- дребезг контактов давится программно

попытался заменить ардуиновскую функцию digitalRead() на более низкоуровневую:

#define _L( BIT) ( _BV( BIT ) ) 
#define _R(PORT,BIT) ( PORT >> BIT ) 
#define PORTD_GET(BIT) ( _R ( ( PIND & _L(BIT) ) , (BIT) ) ) 
#define D03_GET (PORTD_GET (3))
#define PORT_GET_BTN ( D03_GET )

т.е. в коде
digitalRead(3)
меняется на
PORT_GET_BTN

при быстрой проверке работает нормально, читат все ок, но вот при дотошном прогоне кода, программа начинает подглючивать 

причем при замене макроопределения на след. программа перестает тупить:
#define PORT_GET_BTN (digitalRead(3))

ВОПРОСЫ: 
- привильно ли определен PORT_GET_BTN ?
- из за чего может глючить (хотя бы потенциально) ?
- где то читал, что для кнопок внутреннего подтягивающего сопротивления не достаточно и надо ставить внешние, кто что думает по этому поводу ?

можно ключевые слова, ссылки, в личку итд...
 

sunjob
sunjob аватар
Offline
Зарегистрирован: 18.07.2013

add:

- правомерная ли такая замена?