@djEban

Почему мой пин постоянно 1?

#define DDR_OUTPUT 0x01
#define LED_ENABLE() PORTB |= 1 << PORTB0
#define LED_DISABLE() PORTB &= ~(1 << PORTB0)

int main(void)
{
    DDRB = DDR_OUTPUT;
    while (1) {
        if (PIND & (1 << PIND2)) {
            LED_ENABLE();
        } else {
            LED_DISABLE();
        }
    }
}


На кнопку подано напряжение 5V. Когда зажима ее, открывается "канал" к параллельной части кнопки, и ток должен течь по красному проводу в PIND2. В коде я проверяю, если в этом пине единичка (то есть достигнут определенный уровень напряжения на этом пине), включи лампочку, иначе выключи.
Когда программа запускается, получается так, что PIND2 уже имеет 1 (условно), и лампочка горит всегда, хотя я еще не зажал кнопку.
Вот сама схема
spoiler
653beb454dc58781008729.jpeg
  • Вопрос задан
  • 229 просмотров
Пригласить эксперта
Ответы на вопрос 2
@vanyamba-electronics
Попробуйте сделать задержку, раз уж решили сэкономить на осциллографе:
while (1) {
        if (PIND & (1 << PIND2)) {
            LED_ENABLE();
        } else {
            LED_DISABLE();
        }
        for (unsigned int i = 65535; i != 0; --i)
            __asm__("NOP");
    }
Ответ написан
@VT100
Embedded hardware & software.
  • Не указаны настройки DDRD и PORTD.
  • Переключите кнопку от 5 В на "общий". Если будет изменение - попробуйте объяснить причину.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы