Регистр данных PORTх фактически есть просто выходной буфер, все, что в него записывается, тут же оказывается на выходе. Но если установить вывод порта на вход (т. е. записать в регистр направления логический ноль), как это сделано по умолчанию, то регистр данных DDRх будет играть несколько иную роль — установка его в «0» (так по умолчанию) означает, что вход находится в третьем состоянии с высоким сопротивлением, а установка в «1» подключит к выводу «подтягивающий» (pull-up) резистор сопротивлением около 35 кОм (подобно рис. 11.3, а ; вернитесь к описанию работы подобного выходного каскада на «общую шину» в главе 11 — и вы поймете, зачем он нужен).
Сразу отметим, что встроенный pull-up-резистор лучше употреблять при работе на «общую шину» в пределах одной платы, но в большинстве случаев, когда требуется такой резистор (например, если вы подключаете ко входу выносную кнопку с двумя выводами, которая коммутируется на «землю», или при работе на «общую шину» с удаленными устройствами), лучше устанавливать дополнительный внешний резистор параллельно этому внутреннему, с сопротивлением от 1 до 5 кОм (в критичных для потребления случаях его величину можно увеличить до 20–30 кОм). В ответственных устройствах такой резистор следует устанавливать на выводе 9 (Reset) и на выводах 6, 7 и 8, которые служат для программирования и подключены к программирующему разъему ISP (см. главу 13 ), поскольку их также следует «подтягивать» к напряжению питания (тем более что довольно часто они также используются в качестве обычных входных/выходных линий, что процессу программирования, как правило, не мешает).
Заметки на полях
Установка дополнительного резистора к питанию (как и конденсатора — к «земле») по входу Reset для более надежного сброса рекомендовалась для самых первых моделей AVR, однако в описаниях современных типов вы такого не встретите. Но даже для старых моделей не оговаривалась установка внешних резисторов по другим выводам. Однако для более надежной работы устройства в условиях помех автор настоятельно советует следовать изложенным рекомендациям — хуже от этого не будет. Сопротивление «родного» резистора (который на самом деле представляет собой, разумеется, полевой транзистор) слишком велико для того, чтобы электромагнитные помехи («наводки») на нем эффективно «садились», и у вас могут происходить ложные срабатывания, перезапуски системы, а при очень мощных помехах— даже порча программы в памяти программ. Это, конечно, не касается ситуации, когда порт в режиме входа подсоединен к низкоомному выходу другой микросхемы или, скажем, транзисторного ключа (см. главу 12 ), т. к. у них на выходе всегда имеется какой-то сигнал, и резистор тогда не потребуется вообще, лучше всего ставить вывод микросхемы в третье состояние. Не забывайте только об этих резисторах при работе в режимах экономии питания — нужно тщательно проанализировать схему на предмет того, чтобы исключить ситуации, при котором через эти резисторы протекает ток.
Добавим еще, что, как вы, очевидно, уже поняли из изложенного, выводы портов в достаточной степени автономны, и их режим может устанавливаться независимо друг от друга. Кстати, а как прочесть уровень на выводе порта, если он находится в состоянии работы на вход? Возникает искушение прочесть данные из регистра данных PORTх, но это ничего не даст — вы прочтете только то, что там записано вами же. А для чтения того, что действительно имеется на входе (непосредственно на выводе микросхемы), предусмотрена другая возможность. Чтение происходит из буферного элемента, который в первом приближении соответствует элементу В на схемах по рис. 11.3, т. е. для чтения нужно обратиться к некоторому массиву, который обозначается PINх. Обращение осуществляется так же, как и к отдельным битам обычных регистров (см. главу 13 ), но PINх не есть регистр, это просто некий диапазон адресов, чтение по которым предоставляет доступ к информации из буферных элементов на входе порта. Записывать что-то по адресам PINx, естественно, нельзя.
Прерывания
Как и в ПК, прерывания (interrupts) в микроконтроллерах бывают двух видов. Но если в ПК прерывания делятся на аппаратные (например, от таймера или клавиатуры) и программные (фактически не прерывания, а подпрограммы, записанные в BIOS — с распространением Windows это понятие почти исчезло из программистской практики), то в МК, естественно, все прерывания являются аппаратными, а делятся они на внутренние и внешние. Любое прерывание, а также вообще возможность их возникновения требует отдельно предварительного специального разрешения. Учтите, что для инициализации прерываний в программе необходимо сделать два действия: разрешить соответствующее прерывание (предполагаем, все прерывания вообще уже разрешены) и установить для него один из доступных режимов. И, конечно, написать подпрограмму-обработчик, иначе все это будет происходить вхолостую (подробнее см. главу 13 ).
Читать дальше
Конец ознакомительного отрывка
Купить книгу