Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
AVR / 1_Uniproff / Лабораторный практикум 2.doc
Скачиваний:
44
Добавлен:
20.03.2015
Размер:
395.78 Кб
Скачать

Организация работы с внешними устройствами. Порты ввода/вывода.

Цель работы:изучение программно-аппаратных методов подключения внешних устройств на примере клавиатуры, индикаторов, динамиков.

Краткие сведения из теории

Основное назначение устройств, разработанных на базе микроконтроллеров – оперативная обработка информации. Информация поступает на входы МК, обозначенные как порты ввода/вывода, анализируется микропроцессором, и результат обработки выдается опять в порты ввода/вывода. При этом те или иные порты могут быть запрограммированы как на ввод, так и на вывод. Классическим устройством ввода является кнопка, с помощью которой можно подать сигнал нужного уровня на вывод микросхемы(рис.4.1).

Рис. 4.1. Подключение кнопки к порту ввода

В данном примере на входе порта PB0 будет «висеть» логическая единица, если кнопка SB1 не нажата, а по ее нажатию в порт поступит логический ноль. Более практичным устройством ввода является клавиатура – совокупность кнопок(клавиш). С помощью клавиатуры можно инициировать различные режимы работы МК и, в общем случае, управлять процессом выполнения программы.

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

  1. определение факта нажатия клавиши на клавиатуре

  2. нахождение номера нажатой клавиши

  3. осуществление передачи управления на соответствующую подпрограмму

  4. снятие “дребезга контактов”

  5. определение длительности удержания клавиши

Первые две задачи являются специфическими при организации ввода информации с клавиатуры, и именно им уделим внимание в первую очередь.

Подключение клавиатуры к микроконтроллеру. Наиболее удобно организовывать клавиатуру в виде матрицы размером nm, где n и m – соответственно число строк и столбцов. При таком способе организации к микроконтроллеру можно подключить nm клавиш. Для иллюстрации метода сопряжения клавиатуры с МК рассмотрим клавиатуру 43, представленную на рис.4.2.

Рис.4.2. Подключение клавиатуры к микроконтроллеру

Условимся, что для портов PB0-PB3 установлен режим ввода, а для PB4-PB6 – режим вывода. При программном способе дешифрации нажатой клавиши определение факта нажатия на клавишу может быть осуществлено с помощью такой последовательности операций:

  1. записать нули в разряды портов вывода (PB4-PB6)

  2. считать состояние портов ввода (PB0-PB3)

  3. перейти к пункту 2, если во всех считанных разрядах записаны единицы.

Мы рассмотрели простое решение первой задачи.

Для решения второй задачи (определения номера нажатой клавиши) необходимо воспользоваться следующей последовательностью операций:

  1. Выдать в порт PB4 ноль, в PB5 и PB6 – единицы (опрос столбца “3”, “6”, “9”, “CLR”)

  2. Считать состояние PB0-PB3

  3. Если в каком-либо разряде появился 0, это означает, что замкнута цепь PB4-PBn, где n – номер строки. К примеру, если 0 появился в разряде PB2, это значит что замкнуты контакты клавиши «9».

  4. Если же в разрядах PB0-PB3 нет нуля, то выдать в порт PB5 ноль, а в PB4 и PB6 – единицы (опрос столбца “2”, “5”, “8”, “0”)

  5. Считать состояние PB0-PB3

  6. Снова проверить появление нуля в одном из разрядов. Если, к примеру, ноль появился в разряде PB1, то нажата клавиша «5».

  7. Если в разрядах PB0-PB3 снова нет нуля, то выдать в порт PB6 ноль, а в PB4 и PB5 – единицы (опрос столбца “1”, “4”, “7”, “ENT”)

  8. Считать состояние PB0-PB3

  9. Проверить появление нуля в одном из разрядов. Если, к примеру, ноль появился в разряде PB3, то нажата клавиша «ENT».

  10. Если в разрядах PB0-PB3 нет нуля – перейти к шагу 1.

Таким образом, у нас получается бесконечный цикл опроса состояния клавиатуры – ожидание нажатия клавиши. Однако, это вовсе не означает, что микроконтроллер должен быть постоянно в режиме опроса клавиатуры и не выполнять больше никаких функций. Время реакции человека по нажатию клавиши намного превышает время проверки портов ввода/вывода, поэтому, после «сканирования» порта клавиатуры, можно выполнять другие полезные операции. Все это должно работать в бесконечном цикле, т.к. «завершение программы» будет означать останов работы всего устройства, и, в конечном счете, возникнет необходимость аппаратного сброса.

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

Возьмем самый наглядный пример - вывод символа на экран. Представьте, что после определения номера клавиши, вам нужно вызвать подпрограмму вывода соответствующего символа на экран. И здесь возникает первый «подводный камень» - проблема «дребезга контактов». В то время, когда Вы нажимаете на клавишу, металлические контакты производят не одно замыкание, а множество замыканий и размыканий, в результате чего, в разряды PB0-PB3 порта ввода будут попадать и единицы и нули. Так, что определить факт нажатия и факт отпускания клавиши простым чтением порта не удастся.

Аппаратно проблема решается с помощью RS-триггера на каждой кнопке, но это приведет к удорожанию устройства и усложнению схемы.

Программно мы можем решить проблему «дребезга контактов» с помощью временной задержки. Реализуется это достаточно просто:

  1. когда приходит первый ноль в порт ввода PB0-PB3, вызывается подпрограмма задержки (пустой цикл ожидания)

  2. время задержки зависит от частоты работы микроконтроллера и подбирается таким образом, чтобы «пропустить» время «дребезга» контактов до полного нажатия клавиши.

  3. после этого происходит считывание нуля из разряда порта ввода, и ожидание установки его в единицу (ожидание отпускания клавиши)

  4. в режиме ожидания, можно также вести подсчет циклов опроса, и если количество циклов превысит какой-либо установленный предел, это будет означать что «клавиша удерживается» (например в пультах дистанционного управления таким проверкам подвержены клавиши увеличения/уменьшения громкости, яркости, контрастности и т.п.).

Помимо «дребезга» контактов сама схема подключения (рис.4.2) содержит 2 отрицательных момента:

  1. Отсутствует защита портов ввода/вывода. Если, например, в порты PB4-PB6 выдать нули, а в порты PB0-PB3 выдать единицы, то нажатие любой клавиши вызовет «КЗ». При этом, несмотря на подтягивающие резисторы портов, которые способны поглощать ток до 20mA, существует большая вероятность вывода из строя микроконтроллера. Проблема решается установкой дополнительных резисторов на все линии между клавиатурой и микроконтроллером.

  2. Слишком много разрядов портов занято клавиатурой.

Высвобождение разрядов портов критично только в некоторый случаях, но вывод из строя МК программным способом – это проблема, которую нужно решать в первую очередь. Если же рассматривать оба этих момента в совокупности, то можно применить схему сопряжения клавиатуры с МК, приведенную на рис.4.3.

Рис. 4.3. Подключение клавиатуры с высвобождением портов

Опрос клавиатуры с таким подключением выполняется следующим образом:

  1. Разряды порта PB1-PB4 установить в режим ввода.

  2. Один разряд порта установить в режим вывода, и выдать на него 0.

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

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

Подключение устройств индикации. Для отображения вводимой информации, а также подтверждения факта правильного определения нажатой клавиши, к микроконтроллеру можно подключить элементы индикации визуальной(светодиоды и пр.) и звуковой (динамики, наушники и т.п.). Схемы подключения этих устройств приведены на рис.4.4: а).подключение светодиода; б).подключение наушников (стерео); в).подключение динамика к трем каналам.

Рис.4.4. Подключение элементов индикации

На рис.4.4а приведены два варианта подключения светодиода:

  • в случае PA0 – управляющим уровнем будет «0» (в этом случае светодиод включится); гашение осуществляется подачей в порт «1»

  • в случае PA1 - управляющим уровнем будет «1», а при подаче в порт «0» произойдет гашение светодиода (наличие резистора не обязательно в обоих случаях).

На рис.4.4б приведена схема подключения наушников. На линиях портов PA0, PA1 формируются сигналы для левого (L) и правого (R) наушников. Конденсаторы совместно с резисторами образуют фильтры, которые сглаживают форму прямоугольных сигналов, устраняют металлические хрипы и призвуки. Для соблюдения симметрии номиналы элементов должны быть идентичными, кроме того, резисторы уменьшают громкость звука до 40-50 дБ. Уменьшать сопротивление резисторов не рекомендуется.

На рис.4.4в приведена схема подключения динамика, позволяющая получить трехголосное звучание в маломощном динамике (типа PC-Speaker). Звучание каждого из трех голосов управляется портами PA0, PA1 и PA2.

Звучание в динамике (или наушнике) получается за счет изменения уровня напряжения с определенной частотой на линии порта. От частоты смены “1” на “0” (или наоборот) зависит высота звука – тон. Для того чтобы запрограммировать какую-либо мелодию, необходимо представить последовательность звуков в виде частоты звука (тон, нота) и длительности звучания (длительность ноты, паузы). Затем записать полученные данные в энергонезависимую память и написать программу воспроизведения – вывода в нужный порт последовательно единиц и нулей, с выдержкой необходимой длительности.

Однако возможности воспроизведения звука на этом не заканчиваются, а только начинаются. Даже с помощью указанных на рис.4.4, примитивных устройств, можно создавать звуковые эффекты. Например, эффект «вибрато» можно получить, если при воспроизведении какой-либо ноты специально делать отходы от ее частоты на 6-8 Гц. Эффект реверберации (эхо) можно получить если воспроизводить одну и ту же ноту в другом канале с некоторой задержкой. Задержка и будет определять глубину эха.

Программирование портов ввода/вывода будем рассматривать на примере 8-разрядного двунаправленного порта B. Для обслуживания порта отведено 3 регистра:

  • регистр данных - PORTB ($18,[$38])

  • регистр направления данных - DDRB ($17, [$37])

  • ножки порта B – PINB ($16, [$36])

Порт PINB предназначен только для чтения, в то время как PORTB и DDRB для чтения/записи.

Все выводы порта B имеют отдельно подключаемые подтягивающие резисторы. Выходы порта B могут поглащать ток до 20mA и напрямую управлять светодиодными индикаторами.

Если выводы PB0–PB7 используются как входы и замыкаются на землю, при этом если включены внутренние подтягивающие резисторы, то выходы порта являются источником тока.

Соседние файлы в папке 1_Uniproff