Ревич, Ю.В. Программирование микроконтроллеров AVR: от Arduino к ассемблеру
Глава 3. Периферийные устройства и прерывания 45 полнительные устройства отключены, а порты работают на вход, причем находятся в состоянии с высоким импедансом (т. е. высоким входным сопротивлением - та кой режим порта еще называют «третьим» состоянием). Работа на выход требует специального указания, для чего в программе нужно установить соответствующий нужному выводу бит в регистре направления данных (этот регистр обозначается DDRx, где х - буква, обозначающая конкретный порт. Например, для порта А это будет DDRA ) . Если бит сброшен (т. е. равен логическому О), то вывод работает на вход (установка по умолчанию), если установлен (т. е. равен логической 1 ) - то на выход. Для установки выхода в состояние 1 нужно отдельно установить, а для установки в О - сбросить, соответствующий бит в регистре данных порта (обозна чается РОRтх ) . Направление работы вывода (вход-выход, регистр DDRx ) и его состоя ние (0- 1 , PORTx ) путать не следует. В Arduino этим установкам соответствуют функции pinМode ( ) (установка направления) и digitalWrite ( ) (состояние вывода) . Регистр данных PORTx фактически есть просто выходной буфер - все, что в него записывается, тут же оказывается на выходе . Но если установить вывод порта на вход (т. е. записать в регистр направления логический О), как это сделано по умол чанию, то регистр данных PORTx будет играть несколько иную роль: установка его разрядов в О (так по умолчанию) означает, что вход находится в третьем состоянии с высоким сопротивлением, а установка в 1 подключит к выводу «подтягивающий» (pull-up) резистор сопротивлением 20-50 кОм. В Arduino этим действиям соответ ствуют константы INPUT и INPUT-PULLUP функции pinМode ( ) . «Подтягивающие» резисторы необходимы при подключении двухвыводной кноп ки, при соединении с выходом с «открытым коллектором» (пример - шина TWIII 2 C) и в ряде других ситуаций. Как и в \:лучае вывода RESET (см. главу 2), необходимо отметить, что несмотря на некоторое снижение сопротивления «подтя гивающего» резистора в современных семействах (в семействе Classic оно состав ляло 3 5- 1 20 кОм), встроенного pull-up-peзиcтopa во многих случаях может оказать ся для надежной работы недостаточно, и лучше устанавливать дополнительный внешний резистор с сопротивлением от 1 до 1 О кОм параллельно этому внутренне му. Не стоит забывать, что каждый такой резистор при установке вывода в состоя ние нуля увеличивает потребление, потому в критичных случаях его величину можно увеличить до 20-30 кОм и дополнительно стоит тщательно продумать поря док перехода к энергосберегающему режиму (подробнее об этом рассказано в гла ве 14) . ЗАМЕТКИ НА ПОЛЯХ Обратите внимание на тот момент (отраженный , кстати , в описаниях контроллеров) , что непосредственное переключение между противоположными состояниями выводов портов (т. е . между состояниями DDRx : PORTx = 1 1 и DDRx : PORTx = 00, а также состоя ниями DDRx : PORTx = 1 О и DDRx : PORTx = 01 ) невозможно. В качестве промежуточных сами собой образуются , пусть и на очень короткое время , состояния , когда пере ключен только один из этих разрядов портов (состояния 01 или 1 0 в первом случае и 1 1 или 00 во втором) . У автора это ни разу не привело к каким-то проблемам, но не обходимо помнить о том , что, например, при переключении из состояния логического нуля на выходе в состояние «на вход» с «подтягивающим» резистором, вся линия на
Made with FlippingBook
RkJQdWJsaXNoZXIy MTExODQxMg==