Программирование через регистры atmega328p
- Войдите на сайт для отправки комментариев
Сб, 23/05/2020 - 19:44
Здравствуйте, уважаемые форумчане!
Учусь программировать через регистры, мк atmega328p, и в одном коде нашел следующую запись:
DDRC |= ( 1<<PORTC1 ); DDRD &= ~( 1<<PORTD5 );
Что означает данная запись? Есть ли тут ошибка? Очень смущает, что в скобках написано "PORT". Разве там не должно быть название бита? Или двоичного/шестьнадцатеричного числа? Кому несложно, объясните, пожалуйста.
А вы напечатайте в Serial Monitor этот PORTD5, как число, и сразу поймете - похож он на номер бита или нет.
PC1 кофигурируется как OUTPUT, а PD5 - как INPUT.
Откуда же нам знать? Ошибка - это когда код делает не то, что хотел сделать автор. А мы ведь не знаем что автор хотел сделать.
Так нету Serial Monitor, код написан на Atmel Studio 7.
Просто насколько я понял есть три регистра для управления пинами (DDR, PORT и PIN). И если записывать PORT то только с левой стороны. Или это какой-то другой PORT? Не регистр а типа как переменная?
Вот например, код для мигания сведодиодом:
тут DDR настраивает пин D2 на выход, а PORT управляет состоянием выхода D2.
Вот например, код для мигания сведодиодом:
код мигалки можно написать вдвое короче
Так нету Serial Monitor, код написан на Atmel Studio 7.
Тогда еще проще. Правой кнопкой мыши щелкнуть на PORTC1 и выбрать верхний пункт "Go Implementation".
Эка мы писать в регистры только для чтения.
Здравствуйте, уважаемые форумчане!
Учусь программировать через регистры, мк atmega328p, и в одном коде нашел следующую запись:
Что означает данная запись? Есть ли тут ошибка? Очень смущает, что в скобках написано "PORT". Разве там не должно быть название бита? Или двоичного/шестьнадцатеричного числа? Кому несложно, объясните, пожалуйста.
я перепишу ПОЛНОСТЬЮ эквивалентно и ты, возможно, сам посмеёшься над своим вопросом:
Дошло? PORC1 и PORTD5 - просто константы, определенные дефайном (или другим способом), со значениями 1 и 5.
Вот например, код для мигания сведодиодом:
тут DDR настраивает пин D2 на выход, а PORT управляет состоянием выхода D2.
Ну, и?
А если я Ваш пример вот так перепишу:
Будет неправильно?
Там просто определены константы для каждого бита. И они НЕ ТАКИЕ ЖЕ как названия портов.
Эка мы писать в регистры только для чтения.
ркит! Не позорься! Мне кажется, что на этом тебя уже ловили?
PINx = 1 это TOGGLE порта. В атмеге любой (я не встречал других) 8ми битной.
Эка мы писать в регистры только для чтения.
Почему только?
Это нормальная операция инвертирования пина на многих АВР-ках (включая и 328P, и 2561, и Tiny85)
https://static.chipdip.ru/lib/549/DOC001549488.pdf стр 97
I/O memory address locations are allocated for each port, one each for the Data Register – PORTx, DataDirection Register – DDRx, and the Port Input Pins – PINx. The Port Input Pins I/O location is read only,while the Data Register and the Data Direction Register are read/write. However, writing '1' to a bit in thePINx Register will result in a toggle in the corresponding bit in the Data Register. In addition, the Pull-upDisable – PUD bit in MCUCR disables the pull-up function for all pins in all ports when set.
Чёт мы с тобой одновременно одно и тоже пишем :-)
Женя! Эко мы с тобой синхронно! ;))))
Блин!
:-)
Ну а в описании самого регистра решили написать не RW, а R.
Влад и Женя, быстро вы... я даж насладится торжеством не успел :)
Цитата из даташита на Атмегу328
18.2.2. Toggling the Pin
Writing a '1' to PINxn toggles the value of PORTxn, independent on the value of DDRxn. The SBI
instruction can be used to toggle one single bit in a port.
:-)
Лехаим! С отменой пропусков тебя!
Ну а в описании самого регистра решили написать не RW, а R.
тут всё просто - регистр только для чтения. При записи 1 в него, его содержимое не изменяется само по себе, но происходит сторонее действие - переключение состояния выходного пина.
регистр только для чтения. При записи в него
Понятно
А я не в Москве, у нас их и не было.
Захожу тут в магазин, тётка-сотрудница наезжает "Чего не в наморднике?", а у самой намордник просто за уши зацеплен, а сам ниже подбородка болтается. Ничего не ответил, улыбнулся, она мне в ответ. Вот так и прорвёмся!
Да и вправду смешно). Дошло), спасибо.
Теперь все понятно, спасибо.
Понятно
Ркит, так откройте даташит и прочитайте сами. Если есть претензии - обращайте их к Атмелу, а не ко мне :)
А если я Ваш пример вот так перепишу:
Будет неправильно?
Правильно, но работать не будет.)
Так нету Serial Monitor, код написан на Atmel Studio 7.
Ну так откройте External Dependencies и посмотрите в iom328p.h что означает ваш PORTC1 и подобные.
Не бывает программ, которые не работают - все они что-то да делают. Эта будет делать ровно тоже самое, что программа ТС, с которой эта переписывалась.
Да, да, всё верно, работать будет). Только будет делать немножко не то что ожидает ТС.