Помогите сделать так, чтобы при первом нажатии кнопки светодиод загорался, а при втором потухал

в это строчке прелестно все, как недавно писал @Estorsky

Почему DDR, если это пин выхода?
Почему ПортВ, если пин на порте Д?

Да и вообще, инвертирование пина делается не так

PIND = (1 << 4); // инвертируем D4

потому что “три” нельзя, надо восемь :slight_smile:

Если я не так понял, поясните пожалуйста, по таблице из даташита на Мегу328р.
Таблица 13-1 конфигурации портов , страница 60.

Точно. DDRD надо.

Ну ты явно «не адепт» )))
PIND - это чтение с пина на порту D. Только присваивать ему ничего не нужно, нужно для чтения маску применить.

Дай ссылку на тот материал, что ты читаешь.

Почему так инвертируется? PIND разве не только для чтения?

1 лайк

Афигеть!

https://ww1.microchip.com/downloads/en/DeviceDoc/Atmel-7810-Automotive-Microcontrollers-ATmega328P_Datasheet.pdf

уверен? :slight_smile:

Если ты про эту таблицу, то ты её не верно понял:

У новых чипов (мега8 старый), присвоение PIN-у инвертирует разряды PORT-а.
Да. 13.2.2.

Я ни в чем не уверен, стараюсь опираться на факты в документации. Надо перечитать. Но, к слову, никогда этот регистр так не использовал как ты привел. Да и не видел нигде. Минутку, я освежу память.

п 13.2.2 даташита на Атмегу328

Кста, прям на твоей картинке из #51 это и написано… в самом верху страницы

2 лайка

Ну вот далеко ходить и не пришлось. Честно говоря под 328ю никогда не писал в студии, атмеги8 хватает. А для по серьезнее решил уже сразу стм32 использовать.

Да, я увидел. Спасибо. Буду знать)

Там даже пример асма и си есть, ниже. Не вижу как понять иначе

эта тема становится отдельным форумом

Да в общем то, это не так уж и важно. Что PIND = 1<<3, что PORTD ^= 1<<3. Первая атомарна.

1 лайк

Очень просто. В таблице написано, что если ты на порту D настроишь 1 пин на вход (DDRD &= ~(1<<1) и при этом на PORTD в том же первом бите установишь 1 (PORTD |= (1 << 1), то получишь внутреннюю подтяжку (pullup). Это вторая строка таблицы. Ну и так далее…