• 5.1. Электрические характеристики МК 68HC12
  • 5.1.1. Нагрузочные характеристики
  • 5.1.2. Что произойдет, если Вы должным образом не учтете электрические характеристики периферийных ИС?
  • 5.1.3. Входные и выходные характеристики логических элементов
  • 5.2. Устройства дискретного ввода: кнопки, переключатели, клавиатуры
  • 5.2.1. Кнопки и переключатели
  • 5.2.2. DIP переключатели
  • 5.2.3. Клавиатуры
  • 5.3. Устройства индикации: светодиоды, семисегментные индикаторы, индикаторы логического выхода с тремя состояниями
  • 5.3.1. Светодиоды
  • 5.3.2. Семисегментные индикаторы
  • 5.3.3. Индикаторы для логического выхода с тремя состояниями
  • 5.4. Программное обслуживание дискретных входов и выходов
  • 5.5. Подавление механического дребезга контактов переключателей
  • 5.5.1. Аппаратная защита от механического дребезга контактов
  • 5.5.2. Программная защита от механического дребезга контактов
  • 5.5.3. Пример программной защиты
  • 5.6. Жидкокристаллические индикаторы
  • 5.6.1. Краткие сведения о жидкокристаллических индикаторах
  • 5.6.2. Сопряжение МК с символьным ЖК индикатором
  • 5.6.3 Сопряжение МК с графическим ЖК дисплеем
  • 5.7. Управление электрическим двигателем
  • 5.7.1. Силовые полупроводниковые ключи
  • 5.7.2. Оптоэлектронная потенциальная развязка
  • 5.7.3. Инвертор напряжения
  • 5.8. Кодовый замок
  • 5.8.1. Схема подключения периферийных устройств
  • 5.8.2. Программа управления
  • 5.9. Интерфейс МК с аналоговыми датчиками
  • 5.10. Интерфейс RS-232 
  • 5.11. Заключение по главе 5
  • 5.12. Что еще почитать?
  • 5.13. Вопросы и задания
  • Глава 5

    ОСНОВЫ СОПРЯЖЕНИЯ МК С УСТРОЙСТВАМИ  ВВОДА/ВЫВОДА

    ПОСЛЕ ИЗУЧЕНИЯ ГЛАВЫ ВЫ СМОЖЕТЕ:

    • Описать электрические характеристики портов ввода/вывода МК 68НС12.

    • Определить требования к электрическим характеристикам периферийных компонентов для подключения их к портам ввода/вывода МК;

    • Разработать схему подключения и программу для ввода в МК информации о состоянии переключателей и матричных клавиатур;

    • Грамотно применить методы программной и аппаратной защиты от механического дребезга контактов;

    • Выполнить подключение к МК 68HC12 устройств индикации, таких как светодиоды, светодиодные семисегментные индикаторы, жидкокристаллические цифро-буквенные и графические индикаторы. Написать программы для вывода информации на перечисленные устройства индикации;

    • Разработать схему подключения и алгоритм программного обслуживания датчиков различных физических величин.

    Какие устройства Вы можете подключить к выводам микроконтроллера 68HC12 напрямую, без дополнительных цепей согласования? Есть ли у Вас уверенность, что входные и выходные буферы внутри МК при этом останутся работоспособными? Ваша интуиция подсказывает, что, наверное, без дополнительных цепей согласования могут быть подключены логические ИС, выполненные по той же технологии, что и МК семейства HC12. Например, можно без опаски подключить элемент 74HC00, выполняющий функцию 2И-НЕ. А что Вы скажете о возможном числе этих элементов? Можно ли одновременно подключить 20, 30 или 50 таких элементов? А как насчет элементов другой серии? Например, можно ли подключить к выходу МК 68HC12 всего один элемент И-НЕ модели 74LS00? Основываясь на примерах предыдущей главы, Вы также должны предположить, что управление электрическим двигателем вряд ли возможно непосредственно с выходов МК. Для этого потребуются дополнительные цепи согласования и дополнительный источник электрической энергии, которая будет преобразована двигателем механическую энергию. Как определить технические требования к подобным цепям, а затем разработать их?

    В этой главе мы ответим на поставленные вопросы. Мы подробно исследуем электрические характеристики выходов МК семейства 68HC12. Вы должны детально освоить этот материал, поскольку он является основой для проектирования электронных цепей сопряжения МК с различными устройствами ввода и вывода. Далее мы рассмотрим типовые способы подключения к МК наиболее часто используемых устройств ввода и вывода, научимся составлять программы для взаимодействия МК с этими устройствами. В завершении главы мы рассмотрим пример реализации на МК кодового замка. В процессе изучения мы, как и предыдущих главах, будем использовать МК семейства 68HC12, однако все рассмотренные методики полностью применимы и к МК семейства HCS12.

    5.1. Электрические характеристики МК 68HC12

    Микроконтроллеры 68НС12 принадлежат к семейству интегральных схем HC, выпускаемых компанией Motorola по технологии «high-speed CMOS». CMOS (Complementary Metal Oxide Semiconductor) или в русскоязычной терминологии КМОП — это технология производства цифровых интегральных схем на основе Комплементарных полевых транзисторов со структурой Металл–Окисел–Полупроводник. Семейство HC объединяет цифровые ИС различной степени интеграции: от простых логических элементов, счетчиков, дешифраторов до микроконтроллеров с архитектурой различной сложности. Все элементы, принадлежащие к семейству HC, электрически совместимы, поэтому сопряжение МК 68HC12 с другими элементами семейства HC не вызовет у Вас затруднений. Однако, если в процессе проектирования Вам потребуется подключить к выводам МК 68HC12 интегральные схемы, которые не принадлежат к семейству HC, то Вы должны провести анализ на совместимость электрических характеристик МК и этих ИС.

    Рис. 5.1. Номограмма электрической совместимости логических элементов


    Производители электронных компонентов обычно указывают их электрические и динамические характеристики в справочном листе, Для проведения анализа о возможности сопряжения компонентов Вам потребуются следующие восемь параметров (рис. 5.1):

    • VOH — минимальное выходное напряжение логической 1;

    • VOL — максимальное выходное напряжение логического 0;

    • IOH — максимальный выходной ток логической 1;

    • IOL — максимальный выходной ток логического 0;

    • VIH — минимальное входное напряжение логической 1;

    • VIL — максимальное входное напряжение логического 0;

    • IIH — максимальный входной ток логической 1;

    • IIL — максимальный входной ток логического 0.

    Необходимо знать численные значения параметров из приведенного списка для всех ИС, которые подлежат объединению в систему. В нашем случае одной из таких ИС обязательно является МК семейства 68HC12, численные значения обсуждаемых параметров для которого приведены ниже:

    • VOH = 4,2 В;

    • VOL = 0,4 В;

    • IOH = –0,8 мА;

    • IOL = 1,6 мА;

    • VIH = 3,5 В;

    • VIL = 1,0 В;

    • IIH = 10 мкА;

    • IIL = –10 мкА.

    Обратите внимание, некоторые токи в этом списке указаны со знаком минус. Это означает, что соответствующий ток вытекает из МК. А токи с положительным знаком втекают в МК. Очень легко запомнить это условное обозначение, воспользовавшись аналогией с собственными денежными средствами. Финансовые поступления на ваш счет Вы рассматриваете со знаком плюс, а траты, т.е. вытекающие финансы, — со знаком минус.

    5.1.1. Нагрузочные характеристики

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

    а) Для втекающего тока нагрузки

    б) Для вытекающего тока нагрузки

    Рис. 5.2. Нагрузочные характеристики логического элемента, выполненного по технологии HC CMOS


    Если на выходе МК формируется напряжение низкого логического уровня VOL, то ток нагрузки IOL положительный, т.е. ток нагрузки втекает в МК. Интегральная схема, присоединенная к выводу МК, формирует вытекающий ток IIL, который и является током нагрузки вывода МК. Если величина входного тока ИС IIL превышает указанное в листе электрических характеристик значение максимального тока нагрузки IOL, то выходное напряжение VOL на выходе МК может повыситься. Это явление иллюстрируют выходные характеристики МК в состоянии логического 0 (рис. 5.2,а). При определенном токе нагрузки IOL напряжение на выводе МК может превысить значение входного напряжения логического нуля VIL для периферийной ИС. Тогда периферийная ИС будет поставлена в ненормированный режим работы, ее работа в соответствии с техническим описанием не гарантируется.

    Если на выходе МК формируется напряжение высокого логического уровня VOH, то ток нагрузки IOH отрицательный, т.е. ток нагрузки вытекает из МК. Входной ток IIL присоединенной ИС является втекающим. Таким образом, ток нагрузки IOH вытекает из МК и втекает в периферийную ИС. Если величина входного тока ИС IIH превышает значение максимального тока нагрузки IOH, то выходное напряжение VOH на выходе МК может понизиться. Это явление иллюстрируют выходные характеристики МК в состоянии логической 1 (рис. 5.2,б). При определенном токе нагрузки IOH напряжение на выводе МК может стать ниже минимально допустимого значения входного напряжения логической единицы VIH для периферийной ИС. И мы опять поставим периферийную ИС в ненормированный режим работы, при котором ее функционирование может не соответствовать желаемому.

    В справочных данных компания Motorola/Freescale Semiconductors обычно указывает, что максимальный ток нагрузки для каждого из выводов портов равен ±25 мА. Однако следует понимать, что это всего лишь максимальный ток, который могут выдержать транзисторы выходного буфера линии порта. При таком токе нормированные значения выходного напряжения линии в состоянии логического 0 или логической 1 не гарантируются.

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

    5.1.2. Что произойдет, если Вы должным образом не учтете электрические характеристики периферийных ИС?

    Давайте рассмотрим очень простой пример. Мой близкий друг, доктор Jim Rasmussen (J.R.) работал инженером-электронщиком в течение 20 лет. В свое время, возвратясь из рядов вооруженных сил, он поступил на работу по контракту в одну известную фирму. Его первым заданием было спроектировать панель аварийных состояний. Эта панель должна была иметь несколько логических выходов, состояние которых отображалось светодиодными индикаторами. Одна из возможных схем подключения светодиода к выходу логической ИС показана на рис. 5.3. Давайте предположим, что вместо этой логической схемы используется выход МК семейства 68HC12. Видите ли Вы какие-либо проблемы в этой схеме? Для ее обсуждения давайте сначала более подробно остановимся на электрических характеристиках индикаторных светодиодов.

    Рис. 5.3. Неудачная схема подключения светодиода к логическому элементу


    Светодиоды видимого спектра излучения в настоящее время доступны во множестве цветовых решений. Они могут светиться красным, желтым, зеленым, синим, белым и оранжевым цветами. Светодиодные индикаторы характеризуются относительно малой мощностью потребления в сочетании с большим сроком службы. Светодиод имеет два вывода: анод и катод. Во время излучения напряжение между анодом и катодом должно быть положительным.

    Светодиоды характеризуются двумя основными параметрами: рабочим током и напряжением прямого смещения. Типичные значения рабочих токов светодиодов лежат в диапазоне от 10 до 15 мА, при этом прямое падение напряжения составляет 1,5 В. Для того, чтобы светодиод излучал, необходимо подключить его к источнику напряжения более 1,5 В и при этом обеспечить протекание прямого рабочего тока 10…15 мА.

    Посмотрим, как эти условия выполняются в приведенной схеме (рис. 5.3)? Если на выходе МК формируется напряжение логической 1, то протекание тока через светодиод в требуемом направлении возможно. Величина выходного напряжения логической единицы VOH превышает 1,5 В, поэтому условие по прямому напряжению в этой схеме выполнено. А как насчет тока? Можно рассчитать величину сопротивления R, при которой в цепи светодиода будет протекать ток 10…15 мА, и светодиод будет светиться. Но тогда понизится выходное напряжение VOH, и его величина может стать меньше, чем входное напряжение логической 1 VIH. Тогда подключение к такому выходу других логических схем невозможно, поскольку их надежная работа не гарантируется. Они просто могут не распознать наличие на выходе сигнала высокого логического уровня, и защитные исполнительные устройства не сработают.

    Как выйти из сложившейся ситуации? Мы расскажем, как правильно подключать к МК светодиоды в разделе 5.3.1. А сейчас займемся грамотным сопряжением МК и цифровых ИС.

    5.1.3. Входные и выходные характеристики логических элементов

    В этом параграфе мы рассмотрим, как правильно подключить логический элемент одной серии к элементу другой серии. Электрические характеристики логических элементов, принадлежащих к разным сериям, отличаются друг от друга. Для того, чтобы ответить на вопрос о возможности соединения некоторого количества элементов разных серий, необходимо проделать следующие шаги:

    • Убедиться, что выходные напряжения логической 1 и логического 0 элемента — источника сигнала совместимы со входными напряжениями 1 и 0 подключаемого элемента.

    • Убедиться, что выходные токи элемента — источника сигнала превышают входные токи подключаемого элемента. Необходимо проанализировать как состояние логического 0, так и логической 1.

    • Определить, сколько логических элементов будет подсоединяться к одному выходу элемента — источника сигнала.

    Давайте покажем анализ совместимости электрических характеристик логических элементов на примере.

    Пример 1. Необходимо проанализировать совместимость логических элементов двух серий DP1 и SB2. Входные и выходные параметры элементов приведены ниже:

    DP1:

    VIH = 2,0 В, VIL = 0,8 В, IOH = –0,4 мА, IOL = 16 мА

    VOH = 3,4 В, VOL = 0,2 В, IIH = 40 мкА, IIL = –1,6 мА

    SB2:

    VIH = 2,0 В, VIL = 0,8 В, IOH = –0,4 мА, IOL = 8 мА

    VOH = 2,7 В, VOL = 0,4 В, IIH = 20 мкА, IIL = –0,4 мА

    Могут ли логические элементы серии SB2 быть подключены к элементам серии DP1? Если да, то в каком количестве? Иными словами, чему равен коэффициент разветвления DP1 для SB2?

    Решение. Для ответа на вопрос необходимо сравнить уровни входных и выходных напряжений элементов этих серий, оценить нагрузочную способность элементов серии DP1 по отношению к элементам SB2. Коэффициент разветвления должен быть вычислен как для состояния логического 0, так и для состояния логической 1. Далее следует выбрать наихудший вариант сочетания параметров, и по нему необходимо дать заключение.

    • Сравним напряжения при высоком уровне выходного сигнала. Минимальная величина выходного напряжения логической 1 для серии DP1 составляет VOH=3,4 В. Минимальный уровень входного напряжения логической 1 для серии SB2 — VIH=2,0 В. Сравнивая эти числа, можно сделать вывод, что по напряжению высокого логического уровня эти элементы совместимы. Если элемент серии DP1 сгенерирует на выходе наименьшее возможное напряжение VOH, его величина обязательно превысит минимально необходимый уровень входного напряжения элемента серии SB2. В результате, ошибка распознавания единичного выходного уровня при исправных элементах невозможна.

    • Далее сравним напряжения элементов при низком уровне выходного сигнала. Максимальное значение выходного напряжения логического 0 для элементов серии DP1 составляет VOL=0,2 В. Элементы серии SB2 распознают как уровень логического 0 сигналы с напряжением ниже VOL=0,8 В. Поскольку VOL(DP1)<VIL(SB2), ошибки распознавания низкого логического уровня также невозможна. Следовательно, элементы совместимы по уровням, подключение элемента серии SB2 к выходу элемента серии DP1 не вызовет нарушения передачи логического сигнала.

    • Коэффициент разветвления в состоянии логической 1 равен:

    K1 = IOH(DP1)/IIH(SB2) = 400мкА/20мкА = 20

    • Коэффициент разветвления в состоянии логического 0 равен:

    K0 = IOL(DP1)/IIL(SB2) = 16мА/0,4мА = 40

    • Для заключительного вывода выбираем меньшее из двух полученных чисел. Коэффициент разветвления DP1?SB2 равен 20. Таким образом, к выходу элемента серии DP1 можно подключить 20 элементов серии SB2.

    Пример 2. Определим, чему равен коэффициент разветвления элементов серии HC? То есть, сколько элементов серии HC можно подключить к выходу такого же элемента? Напомним входные и выходные параметры серии HC:

    VIH = 3,5 В, VIL = 1,0 В, IOH = –0,8 мА, IOL = 1,6 мА

    VOH = 4,2 В, VOL = 0,4 В, IIH = 10 мкА, IIL = –10 мкА

    Решение. Ход рассуждений при решении этой задачи аналогичен предыдущей.

    • Сравним напряжения при высоком уровне выходного сигнала. Минимальная величина выходного напряжения логической 1 серии HC составляет VOH=4,2 В. Минимальный уровень входного напряжения логической 1 этих же элементов — VIH=3,5 В. Сравнивая эти числа, можно сделать вывод, что по напряжению высокого логического уровня элементы серии HC выполнены совместимыми, в чем и требовалось убедиться. Иного результата быть не  может, иначе из элементов одной серии невозможно было бы создать схему.

    • Максимальное значение выходного напряжения логического 0 для элементов серии HC составляет VOL=0,4 В. В то время как входное напряжение логического 0 сигналы для этих же элементов не должно быть ниже VOL=1,0 В. Поскольку VOL<VIL, ошибки распознавания низкого логического уровня быть не может. Следовательно, элементы серии HC совместимы сами с собой и по низкому логическому уровню также.

    • Коэффициент разветвления в состоянии логической 1 равен:

    K1 = IOH/IIH = 0,8 мА/10 мкА = 80

    • Коэффициент разветвления в состоянии логического 0 равен:

    K0 = IOL/IIL = 1,6 мА/10 мкА = 160

    • Делаем вывод, что коэффициент разветвления серии элементов HC равен 80.

    Итак, мы научились оценивать входные и выходные электрические характеристики логических элементов. На основе этих характеристик делать выводы о возможности подключения элементов различных серий друг к другу при составлении схемы какого-либо управляющего устройства. Далее мы рассмотрим различные интерфейсные компоненты, которые достаточно часто работают совместно с МК в микропроцессорных системах управления.

    5.2. Устройства дискретного ввода: кнопки, переключатели, клавиатуры

    Любая встраиваемая микропроцессорная система принимает данные из «внешнего мира», преобразует эти данные в управляющие воздействия, а затем «выдает» эти воздействия во внешний мир. Ни одна микропроцессорная система управления не обходится без механических переключателей, которые активируются пользователем, а также без различного рода устройств индикации, которые информируют пользователя о режимах работы самой системы и о состоянии объекта управления. В данном параграфе мы рассмотрим, как подключить к МК различные типы переключателей и простейшие светодиодные индикаторы. Несколько позже, в параграфе 5.6, мы подробно остановимся на вопросах сопряжения МК с жидкокристаллическим дисплеем (далее ЖК индикатор или ЖК дисплей).

    5.2.1. Кнопки и переключатели

    На рис. 5.4,а приведена схема подключения одиночного механического переключателя к МК. Механическая часть переключателя может быть выполнена таким образом, что его замкнутое состояние удерживается только тогда, когда человек нажимает на клавишу. Такой переключатель называют кнопкой. Другие переключатели обладают свойством удерживать замкнутое и разомкнутое состояние контактов при отсутствии внешнего воздействия. Последнее потребуется лишь для того, чтобы изменить состояние переключателя с разомкнутого на замкнутое и наоборот. Такие переключатели называются переключателями с фиксацией положения или тумблерами.

    a) Подключение кнопки к МК НС12

    б) Подключение группы из 8 DIP-переключателей

    Рис. 5.4. Примеры схем подключения механических переключателей к МК


    Возвратимся к нашей схеме (рис. 5.4,а). Когда клавиша отжата, переключатель находится в разомкнутом состоянии, и на входе МК формируется высокий логический уровень сигнала. Когда клавиша нажата, переключатель замыкает контакты, вывод МК подсоединяется к потенциалу общего провода системы GND, и на входе МК формируется логический 0. Резистор R = 10 кОм ограничивает силу тока в цепи переключателя.

    Если бы переключатель был идеальным, то переход потенциала вывода МК из состояния 1 в состояние 0 при нажатии клавиши происходил бы мгновенно. На самом деле это не так. Переход механического переключателя из одного состояния в другое сопровождается механическим дребезгом контактов. Эффект механического дребезга состоит в том, что при смене состояния, например, с разомкнутого на замкнутое, контакты, прежде чем перейти из установившегося разомкнутого состояния в установившееся замкнутое, многократно замыкаются и размыкаются. Тогда, установив щуп осциллографа на вход МК, мы увидим сначала высокий уровень сигнала, затем многократное нерегулярное во времени переключение с 1 на 0, и, наконец, установится низкий уровень сигнала. Частота работы МК (от единиц до сотен МГц) чрезвычайно высока по сравнению с временами переключения механических контакторов (десятки–сотни мс). Поэтому механический дребезг контакта может быть воспринят управляющей программой как его многократное переключение. Существуют аппаратные и программные методы защиты от эффекта дребезга контактов. Один из программных методов заключается в том, что после обнаружения первого изменения логического уровня сигнала программа формирует задержку на 100-200 мс. В течение этого времени дребезг контактов прекращается, и переключатель переходит в новое устойчивое состояние. Мы рассмотрим аппаратные и программные методы противодребезгвой защиты в параграфе 5.5.

    5.2.2. DIP переключатели

    На рис. 5.4,б показана схема, в которой мы распространили идею подключения одного механического переключателя к МК сразу на восемь переключателей. Эти микропереключатели смонтированы на заводе-производителе в корпусе, который по размерам и расположению выводов совпадает с корпусом типа DIP (Dual In-line Package) для интегральных схем. Поэтому их называют DIP-переключатели.

    Каждый переключатель из блока подсоединен к отдельному выводу порта МК. Так же, как и в предыдущем случае, ток цепи каждого переключателя ограничивается резистором. Для блока из восьми переключателей потребуется восемь резисторов. Для уменьшения габаритов печатной платы изделия целесообразно использовать сборку резисторов в одном корпусе. Однако возможно использование и одиночных резисторов.

    В параграфе 5.8 мы рассмотрим пример использования подобной сборки DIP-переключателей для выбора режима работы микропроцессорной системы.

    5.2.3. Клавиатуры

    Во многих приложениях микропроцессорные системы требуют ввода цифровой и буквенной информации. Для таких случаев могут быть использованы блоки из нескольких кнопок, которые объединены конструктивно и соединены электрически по стандартной матричной схеме. Такие блоки называют клавиатурами. На рис. 5.5 показана клавиатура из 16 клавиш, которая позволяет вводить данные в микропроцессорную систему в шестнадцатеричном коде. Изучим представленную на рис. 5.5 схему соединения МК с клавиатурой подробно.


      Код на выходах PORTx[3:0] Код на входах PORTx[7:4]  
    Нажатая клавиша 3 2 1 0 7 6 5 4 Код порта PORTx[7:0]
    0 1 1 1 0 1 1 1 0 0xEE
    1 1 1 1 0 1 1 0 1 0xDE
    2 1 1 1 0 1 0 1 1 0xBE
    3 1 1 1 0 0 1 1 1 0x7E
    4 1 1 0 1 1 1 1 0 0xED
    5 1 1 0 1 1 1 0 1 0xDD
    6 1 1 0 1 1 0 1 1 0xBD
    7 1 1 0 1 0 1 1 1 0x7D
    8 1 0 1 1 1 1 1 0 0xEB
    9 1 0 1 1 1 1 0 1 0xDB
    A 1 0 1 1 1 0 1 1 0xBB
    B 1 0 1 1 0 1 1 1 0x7B
    C 0 1 1 1 1 1 1 0 0xE7
    D 0 1 1 1 1 1 0 1 0xD7
    E 0 1 1 1 1 0 1 1 0xB7E
    F 0 1 1 1 0 1 1 1 0x77
    Не нажата X X X X 1 1 1 1 0xXF

    Рис. 5.5. Схема подключения матричной клавиатуры к МК 68HC12


    Кнопки клавиатуры собраны в матричную схему. Первый ряд составляют кнопки 0, 1, 2 и 3. Второй ряд — кнопки 4, 5, 6, и 7. Следующие восемь кнопок составляют ряд 3 и ряд 4. Выводы левых контактов кнопок одного ряда соединены между собой и подключены к одному из выводов порта PORTx (x — имя порта МК, например, PORTA, PORTB и т.д.). В нашем примере для обслуживания четырех линий клавиатуры использованы четыре линии порта PORTx[0]…..PORTx[3]. Все эти линии работают в режиме вывода.

    Выводы правых контактов кнопок также соединены между собой. Но при этом объединены каждые четыре кнопки по вертикали, которые зрительно составляют единый столбец. Приведенное соединение называют матричным. Из рис. 5.5. можно видеть, что блок клавиатуры из 16 клавиш имеет всего восемь линий связи для подключения к МК. А если бы мы использовали ранее рассмотренные схемы соединения, то для подключения 16 кнопок портебовалось бы 16 линий связи. Четыре вывода столбцов подключаются ко входам порта PORTx[4]…PORTx[7]. Эти линии порта работают в режиме ввода. Каждая линии PORTx[4]…PORTx[7] снабжена подтягивающим к напряжению питания резистором R = 10 кОм.

    Если все клавиши, принадлежащие к одной колонке, отжаты, то на соответствующем входе порта PORTx[4]…PORTx[7] формируется логическая 1. МК использует специальную программу опроса клавиатуры, чтобы обнаружить, какая клавиша в данный момент времени нажата. Эта программа сначала выставляет на линию PORTx[0] логический 0. Тогда все левые выводы клавиш первого ряда оказываются под потенциалом логического 0. Если одну из клавиш этого ряда нажать, то уровень сигнала на одном из входов PORTx[4]…PORTx[7] изменится с 0 на 1. Например, если нажали клавишу «0», то на входе PORTx[4] установится низкий логический уровень, а все остальные входы PORTx[5]…PORTx[7] останутся в 1. Или, если нажать клавишу «2», то в 0 установится вывод PORTx[6], а линии PORTx[4], PORTx[5] и PORTx[7] будут в 1. Таки образом, программа, прочитав состояние линий PORTx[4]…PORTx[7] и обнаружив 0 в каком-либо разряде, сможет установить, какая клавиша нажата.


    Программа опроса клавиатуры последовательно анализирует состояние клавиш каждого ряда, последовательно выставляя логический 0 на выводы PORTx[0]…PORTx[3]. На рис. 5.5 приведена таблица, в которой показаны коды, которые будут на линиях порта при нажатии каждой из клавиш. Эти коды должны быть использованы программой опроса для приведения кода нажатой клавиши к одному из стандартных представлений, например к коду ACSII.

    Рассмотренная нами клавиатура может иметь иные символы на кнопках, в соответствие с функциональным назначением кнопки в устройстве. Например, подобная клавиатура используется для управления насосом бензоколонки. Тогда клавиши могут задавать тип отпускаемого бензина, форму приема платежа и т.д. Микроконтроллер должен распознать, какая клавиша нажата, и перейти к соответствующей подпрограмме.

    Рис. 5.6. Блок-схема алгоритма опроса матричной клавиатуры


    На рис. 5.6 приведена блок-схема алгоритма опроса матричной клавиатуры из 16 клавиш. Этот алгоритм состоит из четырех одинаковых блоков, в которых сначала устанавливается в 0 одна из линий PORTx[0]…PORTx[3], а затем контролируется состояние линий PORTx[4]…PORTx[7]. Если на входах линий PORTx[4]…PORTx[7] логические 1, то ни одна кнопка активизированного ряда не нажата, и следует перейти к опросу следующего ряда. Если на какой-либо из линий PORTx[4]…PORTx[7] обнаружен потенциал логического 0, то по номеру линии и по номеру активизированного ряда программа должна восстановить код нажатой клавиши. Для этого удобно использовать таблицу рис. 5.5. Мы привели лишь общую структуру алгоритма. Детальное ее рассмотрение последует после примера программного кода, и описания ЖК дисплея.

    /*-----------------------------------------------------------*/

    /* filename: keypad.c                                        */

    /* МAIN PROGRAМ: Эта программа производит анализ             */

    /*состояния матричной клавиатуры из 16 клавиш                */

    /*Для подключения клавиатуры использован PORTB               */

    /*Разряды PORTB[0]…PORTB[3] активизируют линии рядов         */

    /*разряды PORTB[4]…PORTB[7]используются для считывания кодов */

    /*колонок                                                    */

    /*-----------------------------------------------------------*/

    /*подключаемые файлы*/

    #include <912b32.h>

    #include <stdio.h>

    #include <math.h>


    /*используемые функции*/

    char keypad(unsigned char keypress, unsigned char row);

    char which_key(unsigned char keypress); /*Function to select key*/


    void main{void) {

     unsigned char keypress;

     /*задание кодов активизации рядов клавиатуры*/

     unsigned char first = 0xFE; /*код активизации первого ряда*/

     unsigned char second = 0xFD; /*код активизации второго ряда*/

     unsigned char third = 0xFB; /*код активизации третьего ряда*/

     unsigned char fourth = 0xF7; /*код активизации четвертого ряда*/

     DDRB = 0x0f; /*линии 0…3 на вывод, линии 4…7 на ввод*/

     while(1) {

      PORTB = 0xFE;

      keypress = PORTB;

      key = keypad(keypress, first);

      PORTB = 0xFD;

      keypress = PORTB;

      key = keypad(keypress, second);

      PORTB = 0xFB;

      keypress = PORTB;

      key = keypad(keypress, third);

      PORTB = 0xF7;

      keypress = PORTB;

      key = keypad(keypress, fourth);

     }

    }


    /*------------------------------------------------------------------------*/

    /*Функция keypad определяет, была ли нажата какая-либо клавиша.           */

    /*Функция сравнивает прочитанное значение порта PORTB с тем значением,    */

    /*которое было выдано на порт PORTB. Если они равны, то ни одна клавиша в */

    /*ряду не нажата                                                          */

    /*------------------------------------------------------------------------*/

    char keypad(unsigned char keypress, unsigned char row) {

     char key1;

     if (keypress != row) { /*какая-то клавиша нажата*/

      key1 = which_key(keypress); /*определить клавишу*/

      putchars(key1); /*передать символ на дисплей*/

     } else if(keypress == row) { /*ни одна из клавиш не нажата*/

      key1 = 'Z';

     }

     return (key1);

    }


    /*------------------------------------------------------------------------*/

    /* Функция char which_key определяет код нажатой клавиши методом перебора */

    /*табличных значений                                                      */

    /*------------------------------------------------------------------------*/

    char witch_key(unsigned char keypress) {

     char key;

     switch(keypress) /*распознавание кода клавиши*/

     {

     case 0xEE:

      key = '0'; /*нажата клавиша "0"*/

      break;

     case 0xDE:

      key = '1'; /*нажата клавиша "1"*/

      break;

     case 0xBE:

      key = '2'; /*нажата клавиша "2"*/

      break;

     case 0x7E:

      key = '3'; /*нажата клавиша "3"*/

      break;

     case 0xED:

      key = '4'; /*нажата клавиша "4"*/

      break;

     case 0xDD:

      key = '5'; /*нажата клавиша "5"*/

      break;

     case 0xBD:

      key = '6'; /*нажата клавиша "6"*/

      break;

     case 0x7D:

      key = '7'; /*нажата клавиша "7"*/

      break;

     case 0xEB:

      key = '8'; /*нажата клавиша "8"*/

      break;

     case 0xDB:

      key = '9'; /*нажата клавиша "9"*/

      break;

     case 0xBB:

      key = 'A'; /*нажата клавиша "A"*/

      break;

     case 0x7B:

      key = 'B'; /*нажата клавиша "B"*/

      break;

     case 0xE7:

      key = 'C'; /*нажата клавиша "C"*/

      break;

     case 0xD7:

      key = 'D'; /*нажата клавиша "D"*/

      break;

     case 0xB7:

      key = 'E'; /*нажата клавиша "E"*/

      break;

     case 0x77:

      key = 'F'; /*нажата клавиша "F"*/

      break;

     default:

      key = 'Z';

     } /*конец распознавание кода клавиши*/

     return(key);

    }

    /*----------------------------------------------------------*/

    Представленный программный код не является полностью завершенной рабочей программой, поскольку в нем отсутствуют элементы защиты от дребезга контактов, отсутствует текст функции вывода символов на ЖК дисплей. Мы исправим эти недостатки несколько позже, в разделе 5.6.

    5.3. Устройства индикации: светодиоды, семисегментные индикаторы, индикаторы логического выхода с тремя состояниями

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

    5.3.1. Светодиоды

    В процессе наладки любой микропроцессорной системы крайне удобно использовать светодиоды для индикации состояния тех или иных логических выходов. Светодиод имеет два вывода: анод (+) и катод (–). Для того, чтобы светодиод излучал, напряжение между анодом и катодом должно быть положительным. Светодиоды характеризуются двумя основными параметрами: рабочим током и напряжением прямого смещения. Типичные значения рабочих токов светодиодов лежат в диапазоне от 10 до 15 мА, при этом прямое падение напряжения составляет 1,5 В.

    а) Подключение светодиода

    б) Подключение «линейки» из восьми светодиодов

    в) Подключение семисегментного индикатора

    Рис. 5.7. Примеры схем подключения светодиодных индикаторов к МК


    На рис. 5.7,a показана схема подключения светодиода к выводу МК. В параграфе 5.1.2 мы убедились в невозможности подключения светодиода непосредственно к выводу МК. Выходные буферы МК не способны обеспечить величины тока светодиода, достаточной для свечения с приемлемой для человеческого глаза яркостью. Поэтому в приведенной схеме использован буферный элемент 7404. При выборе буферного элемента следует убедиться, что максимальное значение выходного тока нуля IOL этого элемента не ниже номинального значения прямого тока светодиода 10…15 мА. Так для выбранной модели элемента 7404 максимальное значение выходного тока логического нуля составляет 16 мА.

    В схеме рис. 5.7,a логический элемент должен обязательно быть с инверсией на выходе. Тогда если выход МК в состоянии логической 1, выход элемента в 0, по цепи светодиода протекает ток, и светодиод светится. Наоборот, если на выходе МК логический 0, выход логического элемента в 1, и светодиод погашен. Для правильной работы схемы напряжение VCC должно обязательно превышать напряжение прямого смещения светодиода 1,5 В. Для выбранного значения VCC подбирается резистор R, величина которого ограничивает ток светодиода. Выбирая величину VCC отличной от напряжения питания МК, необходимо помнить, что, если в цепи светодиода ток отсутствует, то напряжение VCC прикладывается к выходному буферу логического элемента. Для обычных логических элементов это напряжение не превышает 5,0 В, а для элементов с повышенным коллекторным напряжением — 15 В.

    Пример. Определите величину сопротивления резистора R на рис. 5.7,а. Предположите, что прямой ток светодиода должен быть равным 15 мА.

    Решение. Падение напряжения на резисторе R в цепи рис. 5.7,а составляет:

    VR = VCC VD VOL = 5,0 – 1,5 – 0,4 = 3,1 В

    Тогда величина сопротивления резистора определяется неравенством:

    R ? VR / ID = 3,1 В/15 мА = 206 Ом.

    Выбираем ближайший к расчетному значению номинал резистора 220 Ом.

    Очень часто разработчик желает индицировать состояние всех линий какого-либо порта. Для этой цели удобно использовать так называемые линейки светодиодов, которые подобно DIP переключателям сгруппированы по 8 и смонтированы в корпусе, который размещается на посадочное место для DIP. Схема подключения такой линейки светодиодов показана на рис. 5.7,б. С точки зрения конструктивного исполнения для такой схемы целесообразно использовать резисторную сборку, что и отражено на рис. 5.7,б.

    5.3.2. Семисегментные индикаторы

    Многие микропроцессорные устройства требуют вывода информации в символах десятичной или шестнадцатеричной системы счисления. Наиболее подходящим индикатором для этого является светодиодный семисегментный индикатор. Внешний вид семисегментного индикатора показан на рис. 5.7,в. Каждый сегмент индикатора — это светодиод, вмонтированный в пластмассовый корпус с поверхностью рассеивания света в виде того или иного сегмента. Сегменты именуются стандартным способом, латинскими буквами от a до g. Комбинация светящихся сегментов образует цифру, или букву. Например, чтобы высветить цифру 1, необходимо зажечь сегменты b и c, цифру 2 — сегменты a, b, d, e, g, букву F — сегменты a, e, f, g. Подключение семисегментного индикатора к выходам порта МК показано на рис. 5.7,в. В схеме для усиления по току использованы не отдельные логические элементы, а специальная буферная ИС 74ALS244. Ток в цепи светодиодов каждого сегмента ограничивают резисторы сопротивлением 100 Ом. В этом примере использован семисегментный индикатор с общим анодом. В соответствии с названием, аноды всех сегментов индикатора объединены внутри корпуса и выведены на одну ножку. Выпускаются также индикаторы с общим катодом.

    5.3.3. Индикаторы для логического выхода с тремя состояниями

    В этом параграфе мы рассмотрим схему отображения для восьми линий порта с тремя состояниями. Сначала напомним читателю, как работают выходные логические буферы с тремя состояниями.

    Выходной логический буфер с тремя состояниями может формировать на выходе напряжение высокого уровня, которое соответствует логической 1, напряжение низкого уровня, которое соответствует логическому 0, и может находиться в так называемом третьем состоянии или иначе «Z» состоянии, которое характеризуется очень высоким выходным сопротивлением (рис. 5.8.). Это сопротивление столь велико, что можно считать, что внутренние цепи логического элемента отсоединены от соответствующего вывода корпуса этого элемента. Это свойство буферов с тремя состояниями позволяет подсоединять к одному электрическому проводнику печатной платы сразу несколько выводов ИС.


    Вход разрешения работы Вход Выход
    L L Z
    L H Z
    H L L
    H H H

    Рис. 5.8. Логические элементы с тремя состояниями на выходе


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

    Рис. 5.9. Функциональная схема 8 индикаторов для выходов с тремя состояниями


    Вернемся к рассмотрению схемы индикации. Она представлена на рис. 5.9. Индикатор каждого разряда состоит из двух светодиодов: зеленого и красного. Если на выходе порта PORTx[i] формируется высокий логический уровень сигнала, то благодаря усилителю с большим коэффициентом усиления, который выполнен на операционном усилителе LM324, открывается транзистор 2N2907. Для зеленого светодиода создается прямое смещение напряжения и путь для протекания тока. В результате, зеленый светодиод светится и информирует пользователя о наличии высокого логического уровня на соответствующем выходе. Если на выходе порта PORTx[i] формируется низкий логический уровень сигнала, то открывается транзистор 2N2222, и светится красный светодиод. Если же выход порта PORTx[i] установлен в третье состояние, то пути для протекания токов светодиодов нет, они оба погашены.

    5.4. Программное обслуживание дискретных входов и выходов

    Для написания программного кода предположим, что входы порта PORTA подключены к блоку DIP переключателей, а выходы порта PORTB — к 8-разрядному светодиодному индикатору по схеме рис. 5.9. Необходимо считать байт данных с порта PORTA и вывести этот байт данных на порт PORTB.

    .

    .

    unsigned char INМASK = 0х00;

    unsigned char OUTМASK = 0xff;

    unsigned char PORTA_value;

    DDRA = INМASK; /*порт PORTA на ввод*/

    DDRB = OUTМASK; /*порт PORTB на вывод*/

    PORTA_value = PORTA; /*cчитать портPORTA*/

    PORTB = PORTA_value; /*записать в порт PORTB*/

    .

    .

    5.5. Подавление механического дребезга контактов переключателей

    Ранее, в параграфе 5.2, Вы познакомились с различными типами механических переключателей. Переключатели обладают двумя устойчивыми состояниями, в которых замыкаются или размыкаются электрические контакты. Включенный по схеме рис. 5.4,а переключатель обеспечивает высокий логический уровень сигнала на входе МК, если пара его контактов разомкнута. В нажатом состоянии контакты замыкаются, и на входе МК формируется напряжение низкого логического уровня.

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

    Однако реальные переключатели ведут себя иначе. Так при нажатии клавиши рис. 5.4,а контакты многократно замыкаются и размыкаются, пока не окажутся в установившемся замкнутом состоянии. Это явление называется механическим дребезгом переключателя. Микроконтроллеры работают на частотах в несколько МГц, что остаточно для того, чтобы зафиксировать многократное изменение состояния переключателя во время дребезга. Однако реакция программы управления на каждое переключение во время дребезга было бы ошибкой. Поэтому следует применять специальные методы подавления эффекта механического дребезга. Различают аппаратные и программные способы подавления дребезга контактов. Мы рассмотрим несколько вариантов для каждого из этих способов.

    5.5.1. Аппаратная защита от механического дребезга контактов

    На рис. 5.10 представлена схема, которая осуществляет защиту от дребезга механических переключателей [Horowitz и Hill, 1989]. Основным элементом этой схемы является триггер Шмитта (74HC14).

    Триггер Шмита отличается от других логических элементов, во-первых, тем, что на его входы можно подавать аналоговые сигналы. И если для обычного логического элемента время изменения входного сигнала из состояния 0 в состояние 1 должно составлять всего несколько наносекунд, то для триггера Шмитта это время может быть любым, в том числе несколько десятков или сотен миллисекунд, которые потребуются нам для устранения дребезга контактов. Во-вторых, передаточная характеристика триггера Шмитта обладает гистерезисом: уровень входного напряжения, при котором выход триггера переключается из 0 в 1, превышает уровень напряжения переключения из 1 в 0 примерно на 0,5…0,8 В. Эффект гистерезиса позволяет подавить звон входного сигнала. Незначительные по амплитуде высокочастотные колебания, наложенные на монотонно изменяющуюся постоянную составляющую входного сигнала, не будут приводить к многократному изменению выходного сигнала, поскольку абсолютная величина входного сигнала окажется внутри петли гистерезиса.

    Рассмотрим работу схемы подавления дребезга контактов переключателя. При разомкнутых контактах напряжение конденсатора равно VCC, на выходе триггера Шмита формируется низкий логический уровень, поскольку все триггеры Шмитта в интегральном исполнении инвертируют входной сигнал. Если клавишу только что нажали, то конденсатор начинает разряжаться через резистор и замкнутые контакты переключателя. Время его разряда определяется постоянной времени RC. Для приведенных на рис. 5.10,a номиналов постоянная времени равна 47 мс. Напряжение на конденсаторе будет убывать немонотонно, поскольку на интервале дребезга контакты то замкнутся, то разомкнутся. В соответствии с их положением конденсатор то разряжается, то заряжается. Но большая постоянная времени цепей разряда и заряда не позволяет напряжению на конденсаторе измениться во время дребезга столь сильно, чтобы произошло переключение триггера Шмитта. И лишь когда дребезг закончится и произойдет длительное замыкание контактов переключателя, конденсатор разрядится до нуля, и на выходе триггера Шмитта установится высокий логический уровень. При размыкании контактов переключателя процесс будет происходить в обратном порядке. Эффект подавления дребезга в рассмотренной схеме будет наблюдаться только тогда, когда постоянная времени цепей разряда и заряда конденсатора будет сравнима с длительностью самого эффекта механического дребезга. Для маломощных переключателей его длительность измеряется единицами и десятками мс, поэтому в нашем примере номиналы резисторов и конденсатора выбраны правильно.

    Если Вы желаете иметь на выходе цепи подавления дребезга инверсную логику, то следует использовать дополнительный инвертор (рис. 5.10,б). Тогда при разомкнутом переключателе на выходе инвертора будет низкий логический уровень, а при замкнутом — высокий.

    5.5.2. Программная защита от механического дребезга контактов

    Существует несколько методов программной защиты от эффекта дребезга механических контактов. Мы кратко остановимся на двух наиболее часто используемых:

    • Прикладная программа проводит мониторинг состояния контакта, опрашивая линию порта и контролируя уровень логического сигнала. Как только программа зафиксировала изменение сигнала, она фиксирует это изменение и формирует задержку 100…200 мс. За это время дребезг закончится, и контакт зафиксируется в установившемся состоянии. Если это новое состояние совпадет с первым зафиксированным изменением, то произошло переключение контакта. В противном случае имела место помеха.

    • Прикладная программа также производит мониторинг контакта. После обнаружения первого переключения программа продолжает постоянно опрашивать контакт в течение тех же 100…200 мс. Если к концу интервала опроса состояние не стабилизировалось и постоянно считывается то 0 то 1, то это помехи, а если установилось в одном из состояний, то произошло переключение.

    а) При нажатии клавиши на выходе формируется высокий логический уровень

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

    Рис. 5.10. Примеры схем подавления механического дребезга контактов 

    5.5.3. Пример программной защиты

    Для того чтобы продемонстрировать пример реального программного кода для ввода и вывода дискретных управляющих воздействий, предположим, что восемь DIP переключателей подключены к порту PORTB микроконтроллера, а состояние выходов порта PORTC индицируются с использованием схемы двухцветного индикатора. Общая структура микропроцессорной системы нашего примера представлена на рис. 5.11. В примере мы используем аппаратную защиту и программную защиту от дребезга контактов. Программная защита реализуется по второму способу.

    Рис. 5.11. Функциональная схема аппаратных средств для примера 5.3.3


    /*----------------------------------------------------------------------*/

    /*filename: debounced_swith.c                                           */

    /*осуществляет опрос 8 переключателей с программной защитой от дребезга */

    /*выполняет специальные действия для каждого нажатого переключателя     */

    /*зажигает зеленый светодиод в разряде активизированного переключателя  */

    /*----------------------------------------------------------------------*/

    /*подключаемые файлы*/

    #include <912b32.h>


    /*используемые функции*/

    int process_valid_input(unsigned char input_value); //управление

                                                        //процессом опроса в реальном времени

    void initialize_ports(void); //инициализация портов

    void timer_init(void); //инициализация таймера


    //глобальные переменные

    int keep_going=1; //переменная цикла

    unsigned char old_PORTB= 0xff; //предыдущее значение порта PORTB

    unsigned char new_PORTB; //новое значение порта PORTB


    void main{void) {

     initialize_ports();

     timer_init();

     while(keep_going) {

      new_PORTB=PORTB; //читать порт PORTB

      if (new_PORTB != old_PORTB) {

       //выполнять, если значение порта изменилось

       swith(new_PORTB) {

       case 0xFE: //переключатель PB0

        if (process_valid_input(new_PORTB)) //процедура

                                            //антидребезга

        { //выполнять действия, связанные

         : //с нажатием клавиши PB0

         :

         PORTC = 0х01;//зажечь зеленый в разряде PB0

         keep_going = 1;

        }

        break;

       case 0xFD: // переключатель PB01

        if (process_valid_input(new_PORTB)) // процедура

                                            // антидребезга

        { //выполнять действия, связанные

         : //с нажатием клавиши PB1

         PORTC = 0х02; //зажечь зеленый в разряде PB1

         keep_going = 1;

        }

        break;

       case 0x7F: // переключатель PB7

        if (process_valid_input(new_PORTB)) // процедура

                                            //антидребезга

        { //выполнять действия, связанные

         : //с нажатием клавиши PB7

         PORTC = 0х80; //зажечь зеленый в разряде PB7

         keep_going = 1;

        }

        break;

       default:

        ; //аll other cases

       } //окончание распозвания, какая клавиша нажата (switch(new_PORTB))

      } //окончание обработки нажатой клавиши (if new_PORTB)

      old_PORTB = new_PORTB; //обновить PORTB

     } //окончание (while(keep_going))

    } //окончание (main)


    /*-----------------------------------------------------------------*/

    /* Функция void initialize_ports устанавливает режим работы портов */

    /*-----------------------------------------------------------------*/

    void initialize_ports(void) {

     DDRC=0xff; //порт PORTC на вывод

     PORTC=0x00; //выходы порта PORTC в 0, зажгутся красные светодиоды

     DDRB=0x00; //порт PORTB на ввод

    }


    /*--------------------------------------------------------------------*/

    /* process_valid_input: проверка стабильности PORTB в течение периода */

    /* переполнения таймера                                               */

    /*--------------------------------------------------------------------*/

    int process_valid_input(unsigned char portx) {

     int valid_input; //флаг результата опроса порта

     int int_value; //время входа в процедуру

     valid_input = TRUE; //установить флаг

     int_value = TCNT; //читать текущий момент времени

     while (int_value != TCNT) //повторять пока значения времени снова не

                               //сравняются

     {

      if (portx==PORTB) //порт PORTB остается стабильным

       valid_input = TRUE;

      else //порт PORTB изменил состояние

       valid_input = FALSE;

      if (!valid_input) //если порт изменил состояние, то выйти

                        //из цикла

       break;

     }

     return valid_input;

    }


    /*------------------------------------------------------------------------*/

    /* Функция timer_init инициализирует таймер. Частота системной шины равна */

    /*8*МГц                                                                   */

    /*------------------------------------------------------------------------*/

    void timer_init(void) {

     TMSK1 = 0х00; //запретить прерывания

     TMSK2 = 0х02; //частота тактировании 2 МГц

     TSCR = 0х80; //разрешить работу модуля таймера

    }

    /*-------------------------------------------------------------------------*/

    5.6. Жидкокристаллические индикаторы

    В этом разделе мы подробно рассмотрим, как подключить жидкокристаллический индикатор к МК 68HC12. Мы начнем с краткого обзора принципа действия ЖК индикаторов. Далее изучим реальный однострочный символьный индикатор на 16 знакомест со встроенным контроллером управления. Рассмотрим, как выполнить аппаратное подключение этого индикатора к МК, а затем приведем пример программы управления.

    5.6.1. Краткие сведения о жидкокристаллических индикаторах

    Жидкокристаллический индикатор — почти идеальное устройство отображения информации. Этот тип индикаторов использует для своей работы те же напряжения, что и микроконтроллеры, но при этом потребляет энергию на несколько порядков меньшую, чем светодиодные индикаторы. Именно поэтому жидкокристаллические (далее ЖК) индикаторы нашли чрезвычайно широкое применение в переносных устройствах с автономным питанием. В электронных часах, калькуляторах и стационарных телефонах принято использовать монохромные ЖК индикаторы, в то время как современные мобильные телефоны, фотоаппараты и видеокамеры немыслимы без малогабаритного цветного ЖК-дисплея. По способу отображения информации ЖК индикаторы также подразделяются на цифро-буквенные и графические.

    Для понимания технологических особенностей создания современных ЖК индикаторов и дисплеев следует коротко остановиться на основных свойствах жидких кристаллов. Жидкие кристаллы представляют собой почти прозрачные субстанции, проявляющие одновременно свойства кристалла и жидкости. Есть две главные особенности жидких кристаллов, благодаря которым возможно создание на их основе устройств отображения информации: способность молекул жидких кристаллов переориентироваться во внешнем электрическом поле и изменять поляризацию светового потока, проходящего через их слои.

    Основой ЖК индикатора являются две параллельные стеклянные пластины с нанесенными на них поляризационными пленками. Различают верхний и нижний поляризаторы, сориентированные перпендикулярно друг другу. На стеклянные пластины в тех местах, где в дальнейшем будет формироваться изображение, наносится прозрачная металлическая окисная пленка, которая в дальнейшем служит электродами. На внутреннюю поверхность стекол и электроды наносятся полимерные выравнивающие слои, которые затем полируются, что способствует появлению на их поверхности, соприкасающейся с жидкими кристаллами, микроскопических продольных канавок. Пространство между выравнивающими слоями заполняют жидкокристаллическим веществом. В результате молекулы жидких кристаллов выстраиваются в направлении полировки полимерного слоя. Направления полировки верхнего и нижнего слоев полимера перпендикулярны (подобно ориентации поляризаторов). Это нужно для предварительного "скручивания" слоев молекул жидких кристаллов между стеклами на 90°. Когда напряжение на управляющие электроды не подано, поток света, пройдя через нижний поляризатор, двигается через слои жидких кристаллов, которые плавно меняют его поляризацию, поворачивая её на угол 90°. В результате поток света после выхода из ЖК материала беспрепятственно проходит через верхний поляризатор (сориентированный перпендикулярно нижнему) и попадает к наблюдателю. Никакого формирования изображения не происходит. При подаче напряжения на электроды между ними создается электрическое поле, что вызывает переориентацию молекул жидких кристаллов. Молекулы стремятся выстроиться вдоль силовых линий поля в направлении от одного электрода к другому. Вследствие этого пропадает эффект «скручивания» поляризованного света, под электродом возникает область тени, повторяющая его контуры. Создается изображение, формируемое светлой фоновой областью и темной областью под включенным электродом. Путем варьирования контуров площади, занимаемой электродом, можно формировать самые различные изображения: буквы, цифры, иконки и пр. Так создаются символьные ЖКИ. А при создании массива электродов (ортогональной матрицы) можно получить графический ЖКИ с разрешением, определяемым количеством задействованных электродов

    Большинство современных ЖК индикаторов и дисплеев управляются от микроконтроллеров, которые располагаются на обратной стороне индикатора. Микроконтроллер преобразует цифровые коды, содержащие информацию об отображаемом объекте, в последовательность импульсов напряжения для электродов индикатора. В постоянной памяти этого МК записаны образы символов, которые могут отображаться индикатором (функция знакогенератора). В оперативной памяти МК размещаются коды тех символов, которые высвечиваются на экране индикатора в текущий момент времени. Поэтому, когда Вы производите подключение ЖК индикатора к МК, Вы фактически устанавливаете связь между двумя микропроцессорными системами.

    В следующем параграфе мы рассмотрим цифро-буквенный ЖК индикатор с управлением от стандартного контроллера AND671GST с параллельным интерфейсом обмена. Мы также приведем пример программного кода для управления этим индикатором.

    5.6.2. Сопряжение МК с символьным ЖК индикатором

    AND671GST — однострочный цифро-буквенный дисплей на 16 знакомест. Для управления такими дисплеями используются интегральные схемы контроллеров HD44100H или HD44780. Контроллер с сопутствующими элементами размещается на печатной плате, которая помешается за индикатором и образует с ним единую конструкцию. На плате контроллера смонтирован разъем на 14 контактов. На разъем выведены сигналы стандартизованного параллельного интерфейса для сопряжения символьных ЖК индикаторов с микропроцессорными системами. Назначение сигналов этого интерфейса, имена линий и соответствующие им номера контактов разъема приведены на рис. 5.12,a.

    Номер вывода Обозначение Функция
    1 GND Общий вывод источника питания
    2 VDD Напряжение питания контроллера 5,0 В
    3 V0 Напряжение питания ЖК матрицы
    4 RS Выбор регистра контроллера: 0 — регистр управления, 1 — регистр данных
    5 R/W Выбор режима обмена чтение/запись: 0 — запись, 1 — чтение
    6 E Разрешение обмена
    7 DB0 Двунаправленная магистраль данных контроллера ЖК индикатора
    8 DB1
    9 DB2
    10 DB3
    11 DB4
    12 DB5
    13 DB6
    14 DB7

    а) Описание выводов контроллера ЖК индикатора

    б) Схема подключения ЖК индикатора к МК

    в) Временные диаграммы обмена в режиме записи

    Рис. 5.12. Цифро-буквенный ЖК индикатор


    Схема подключения индикатора к МК семейства 68HC12 представлена на рис. 5.12,б. Обмен данными в параллельном однобайтовом формате производится через порт PORT P. В нашем примере мы будем только записывать данные в контроллер индикатора, поэтому порт может быть однонаправленным. В реальных задачах иногда приходится читать информацию из памяти контроллера управления дисплеем, тогда следует использовать двунаправленный порт. Для управления режимами обмена информацией с контроллером используются два дополнительных сигнала: E — разрешение обмена, и RS — выбор регистра для обмена. Эти две линии подключены к линиям другого порта вывода МК. Третий сигнал управления обменом — линия выбора направления обмена (чтение или запись) подключена к общему выводу, поскольку в примере мы будем использовать только режим записи.

    Три контакта разъема индикатора предназначены для подключения двух источников напряжения: VDD — напряжение питания цифровой части (схемы управления индикатора), VO — напряжение смещения электродов. Последнее называют напряжением управления контрастностью индикатора. Вывод VO подключен к средней точке потенциометра, поэтому напряжение VO может изменяться от 0 до 5,0 В, обеспечивая таким образом выбор наилучшего режима отображения.

    Временные диаграммы обмена. Различают два типа данных, которые может передать МК контроллеру индикатора: команды управления и данные, т.е. коды символов для отображения. В режиме чтения МК может получить от контроллера управления дисплеем слово-состояние и данные из внутреннего ОЗУ символов. В нашем примере мы не будем пользоваться режимом чтения.

    Временные диаграммы одного цикла записи в контроллер дисплея приведены на рис. 5.12,в. Приведенные на рисунке длительности временных интервалов определяются конкретным типом выбранного индикатора, поэтому могут достаточно существенно различаться. Об этом следует помнить при использовании ранее написанного и отлаженного программного кода для управления индикатором в последующих разработках. Если очередной индикатор требует больших времен установления по сравнению с предыдущим, то программный код может оказаться неработоспособным.

    В соответствии с приведенными временными диаграммами (рис. 5.12,в) должна сгенерировать следующую последовательность сигналов на выходах портов МК:

    • Линия RS должна быть установлена в соответствии с типом передаваемых данных: 1 — запись данных, 0 — запись команды;

    • С задержкой в 140 нс относительно сигнала RS должна быть установлена в 1 линия разрешения обмена E;

    • Длительность импульса на линии E не должна быть менее 450 нс;

    • Байт данных должен быть выставлен на линии DB0…DB7 не позднее, чем за 195 нс до спадающего фронта сигнала E. Это время называют временем предустановки данных относительно сигнала разрешения E;

    • Данные на линиях DB0…DB7 должны оставаться неизменными в течение не менее 10 нс после перехода сигнала E в неактивное (логический 0) состояние. Это время называют временем сохранения данных относительно сигнала E;

    • Период сигнала E не должен быть менее 1000 нс.

    Основываясь на требованиях временной диаграммы обмена, следующий алгоритм должен быть реализован микроконтроллером для выполнения одного цикла записи в контроллер дисплея:

    1. Установить линию RS в 1 или в 0 (1 — для записи кода символа, 0 — для записи кода команды управления дисплеем);

    2. Установить активный уровень на линии разрешения E (логическая 1);

    3. Выдать на порт PORT P байт данных (код символа или команда управления);

    4. Перевести линию E в неактивное состояние (логический 0).

    В процессе создания на основе этого алгоритма программы управления следует учесть все перечисленные ранее задержки между сигналами.

    Программа управления ЖК индикатором. Структура программы управления символьным ЖК индикатором представлена на рис. 5.13,а. Программа включает коллекцию функций, каждая из которых выполняет законченное смысловое действие. Разбиение задачи на отдельные функции — искусство разработчика. От выбранного набора функций и способов передачи параметров между ними зависит число возможных ошибок при последующем использовании этих функций в прикладной программе и компактность файла исполняемых кодов.

    а) Набор функций управления

    б) Блок-схема алгоритма инициализации

    Рис. 5.13. Программное обеспечение для управления цифро-буквенным ЖК индикатором


    Блок-схема функции инициализации дисплея представлена на рис. 5.13,б. Она реализует алгоритм начальной установки дисплея, который разработан в соответствии с техническими рекомендациями производителя.

    Ниже приведен текст программы на Си для всех функций рис. 5.13,а.

    /*------------------------------------------------------------------*/

    /*filename: lcd.c                                                   */

    /*содержит программный код для шести функций управления ЖК дисплеем */

    /*------------------------------------------------------------------*/


    /*-----------------------------------------------------------------------*/

    /* Функция initialize_lcd производит начальную установку режимов дисплея */

    /*-----------------------------------------------------------------------*/

    void initialize_lcd(void) {

     delay_5ms();

     delay_5ms();

     delay_5ms(); //задержка 15 мс

     putcommands(0x38); //команда установки формата интерфейса обмена

     delay_5ms();

     putcommands(0x38);

     delay_l00us();

     putcommands(0x38);

     putcommands(0x38) ;

     putcommands(0x0C);

     putcommands(0x01); //очистить дисплей

     putcommands(0x06); //установить режим ввода с автоматическим

                        //увеличением адреса

                        //символа на 1

     putcommands(0x0E); //включить дисплей, режим курсора мигающий

     putcommands(0x02); //установить курсор на первое знакоместо

    }


    /*---------------------------------------------------------------------*/

    /* Функция putchars производит запись одного кода символа в контроллер */

    /*дисплея                                                              */

    /*---------------------------------------------------------------------*/

    void putchars(unsigned char с) {

     DDRP = 0xFF; //установить порт PORT P на вывод

     DDRDLC = DDRDLC | 0x0C; //установить разряды 2 и 3 порта PORT DLC на

                             //вывод

     PORTP = с; //Выдать в порт PORT P код символа с

     PORTDLC = PORTDLC | 0x08; //установить линию RS в 1

     PORTDLC = PORTDLC | 0x04; //установить линию E в 1

     PORTDLC = 0; //установить E и RS в 0

     delay_5ms(); //задержка 5 мс

    }


    /*-----------------------------------------------------------------------*/

    /*Функция putcommands производит запись одного кода команды в контроллер */

    /*дисплея                                                                */

    /*-----------------------------------------------------------------------*/

    void putcommands(unsigned char d) {

     DDRP = 0xFF; //установить порт PORT P на вывод

     DDRDLC = DDRDLC|0x0C; //установить разряды 2 и 3 порта PORT DLC на

                           //вывод

     PORTDLC = PORTDLC & 0xF7; //установить линию RS в 0

     PORTP = d; //Выдать в порт PORT P код команды d

     PORTDLC = PORTDLC | 0x04; //установить линию E в 1

     PORTDLC = 0; //установить E и RS в 0

     delay_5ms(); //задержка 5 мс

    }


    /*-----------------------------------------------------------------*/

    /*Функция lcdprint производит запись строки символов в ОЗУ дисплея */

    /*-----------------------------------------------------------------*/

    void lcdprint(char *string) {

     putcommands(0x02); //команда установки адреса на начало строки

     while(*(string) != '\0') //вывести последовательно кода символов

     { //из памяти МК

      putchars(*string);

      string++;

     }

    }


    /*-------------------------------------------*/

    /* Функция delay_5ms формирует задержку 5 мс */

    /*-------------------------------------------*/

    void delay_5ms(void) {

     int i;

     for(i=0; i<50; i++) {

      delay_l00us();

     }

    }


    /*-----------------------------------------------------*/

    /* Функция void delay_100us формирует задержку 100 мкс */

    /*Частота системной шины равна 8 МГц                   */

    /*-----------------------------------------------------*/

    void delay_100us(void) {

     int i;

     for(i=0; i<50; i++) {

      asm("nop"); //команда nop занимает 2 цикла

     }

    }

    /*-----------------------------------------------------*/

    5.6.3 Сопряжение МК с графическим ЖК дисплеем

    В этом разделе мы рассмотрим типовой графический ЖК дисплей. Следуя логике предыдущего параграфа, мы сначала обсудим информационную модель графического дисплея, затем изучим электрические характеристики и временные диаграммы обмена встроенного контроллера управления этим дисплеем, в завершении — элементы программы для передачи данных из МК в контроллер дисплея. В конце параграфа мы предложим Вам набор полезных для обслуживания графического дисплея функций. При рассмотрении мы будем использовать конкретную модель дисплея AND1391ST. Однако полученные знания Вы сможете легко применить к другим распространенным моделям дисплеев. В главе 7 мы предложим Вам подробный полностью завершенный пример с графическим дисплеем (разд. 7.).

    Информационная модель. AND1391ST — ЖК дисплей с разрешающей способностью экрана 128?128 пикселов. Встроенный контроллер управления обеспечивает работу дисплея как в символьном, так и в графическом режиме отображения. Возможно также сочетание этих двух режимов работы при выводе одной и той же картинки. При использовании символьного режима поле экрана дисплея делится на 16 строк по 16 символов в каждой строке (рис. 5.14). Для отображения каждого символа предоставляется поле знакоместа размером 8?8 точек, как показано на рис. 5.15. В качестве дополнительного может быть использован режим символьного отображения, при котором поле экрана дисплея делится на 16 строк по 21 символу в строке. В этом случае каждое знакоместо будет состоять из 6?8 точек. Размер знакоместа задается уровнем сигнала на входе FS контроллера дисплея. Набор кодов для формирования образа каждого символа (знакогенератор) хранится в постоянной памяти контроллера дисплея.

    Рис. 5.14. Информационная модель графического ЖК дисплея в символьном режиме


    Контроллер дисплея воспроизводит на экране образы символов, коды которых хранятся в ячейках оперативной памяти контроллера. Каждому знакоместу на экране дисплея поставлена в соответствие ячейка ОЗУ с определенным адресом. В процессе инициализации контроллера дисплея МК записывает адрес начала ОЗУ экрана. На рис. 5.14 этот адрес равен $1000. Все остальные адреса для ячеек символов вычисляются посредством указанных на рис. 5.14 кодов смещения. В процессе инициализации также указывается число символов в строке. В нашем примере мы используем режим отображения с 16 символами в строке. При этом размер знакоместа для символа (8?8) уже выбран на аппаратном уровне: вход FS контроллера присоединен к общему выводу источника питания.

    старший полубайт младший полубайт
    0 1 2 3 4 5 6 7 8 9 A B C D E F
    0   ! " # $ % & ' ( ) * + , - . /
    1 0 1 2 3 4 5 6 7 8 9 : ; < = > ?
    2 @ A B C D E F G H I J K L M N O
    3 P Q R S T U V W X Y Z [ \ ] ^ _
    4 ` a b c d e f g h i j k l m n o
    5 p q r s t u v w x y z { | } ~  

    Рис. 5.15. Таблица кодов символов для графического ЖК дисплея


    Схема подключения дисплея AND1391ST к МК семейства 68HC12 представлена на рис. 5.16, а. Наименование и краткое описание выводов контроллера управления дисплеем AND1391ST приведены в таблице рис. 5.16, б.

    а) Схема подключения ЖК дисплея к МК

    Номер вывода Обозначение Функция
    1 FGND Вывод корпуса
    2 GND Общий вывод источника питания
    3 VDD Напряжение питания контроллера 5.0 В
    4 VEE Напряжение питания ЖК матрицы –14 В ± 3 В
    5 WR Линия управления «запись»
    6 RD Линия управления «чтение»
    7 CE Линия управления «разрешение обмена»
    8 C/D Выбор режима обмена: 0 — чтение/запись данных, 1 — чтение регистра состояния/запись команды
    9 NC Не подсоединен
    10 RESET Начальная установка контроллера
    11 DB0 Двунаправленная магистраль данных контроллера ЖК индикатора
    12 DB1
    13 DB2
    14 DB3
    15 DB4
    16 DB5
    17 DB6
    18 DB7
    19 FS Выбор размера символа
    20 NC Не подсоединен

    б) Описание выводов контроллера графического ЖК дисплея

    Рис. 5.16. Сопряжение графического ЖК дисплея с МК


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

    В нашем примере мы использовали линии портов PORTP и PORTDLC для обмена данными между МК и дисплеем. Двунаправленная магистраль данных контроллера дисплея D[7…0] подключена к линиям PORTP[7…0] двунаправленного порта PORTP (рис. 5.16, а). В отличие от предыдущего примера, обмен данными между МК и контроллером дисплея происходит в двух направлениях. Поэтому в процессе взаимодействия с дисплеем МК многократно перепрограммирует регистр направления передачи DDRP, изменяя режим работы линий порта PORTP (ввод или вывод).

    Для управления режимами обмена информацией с контроллером используются четыре дополнительных сигнала, которые формируются МК на линиях PORTDLC[3…0] порта PORTDLC (рис. 5.16, а). Назначение и краткое описание сигналов управления дисплеем приведено в таблице рис. 5.16, б. Там же показаны комбинации управляющих сигналов, которые следует использовать при обмене с дисплеем различными типами данных.

    Рис. 5.17. Временные диаграммы обмена контроллера графического ЖК дисплея


    Временные диаграммы обмена. Временные диаграммы обмена с контроллером управления графическим ЖК дисплеем приведены на рис. 5.17. Они аналогичны рассмотренным ранее диаграммам обмена с контроллером цифро-буквенного индикатора. Так же, как и в предыдущем случае, мы будем генерировать сигналы управления в соответствие с приведенной временной диаграммой, последовательно переключая линии порта PORTDLC в программе управления дисплеем.

    Набор функций управления графическим ЖК дисплеем. Мы предлагаем Вашему вниманию набор функций на Си, которые могут быть использованы в других программах для эффективного управления графическим ЖК дисплеем. Для каждой функции приведено описание и исходный текст программы на Си. На рис. 5.18 показана структура программного обеспечения для управления графическим дисплеем, в которой отражены полный набор функций управления и их взаимосвязь. В одном из самостоятельных заданий к этой главе мы попросим Вас разработать блок-схемы алгоритмов для реализации каждой из перечисленных функций управления.

    Рис. 5.18. Структура программного обеспечения графического ЖК дисплея

    //---------------------------------------------------------------------

    //filename: 2D_LCD.c содержит программный код для 14 функций управления

    //графическим ЖК дисплеем

    //---------------------------------------------------------------------

    //Схема подключения дисплея AND1391ST к МК 68HC12

    // PORTDLC[3] C/D

    // PORTDLC[2] CE

    // PORTDLC[1] RD

    // PORTDLC[0] WR

    // PORTP[7…0] D[7…0]

    // вывод RESET дисплея AND1391ST через резистор 4,7 кОм к источнику питания

    // вывод FS дисплея AND1391ST к общему выводу источника питания


    // ------------------------------------------------------------------------

    // Функция initialize_lcd производит начальную установку режимов

    //графического дисплея

    // ------------------------------------------------------------------------

    void initialize_lcd(void) {

     char temp = 0x00;

     PORTDLC = 0xFF; //установить 1 на всех выходах порта: запрет всех

                     //действий с дисплеем

     PORTDLC = PORTDLC & 0xEF; //сброс экрана, RESET=0

     delay(2000); //задержка 2 мс

     PORTDLC = 0x7F; //установить вывод RESET в 1

     write(); //установить WR=0

     command(0x80); //установить режим работы текстовый

     data(0x00); //слово управления

     data(0х10); //слово управления

     command(0х40); //установить адрес начала текста

     data(0х10); // слово управления

     data(0x00); // слово управления

     command(0х41); // установить область текста: 16 знаков

     command(0x94); //выключить дисплей, курсор мигает

     command(0хА7); //установить курсор 8?8 точек

     data(0x01); // слово управления

     data(0х01); // слово управления

     command(0х21) ; //установить позицию курсора

    }


    // ----------------------------------------------------------------------------

    // Функция read конфигурирует линии порта PORTP для ввода данных от контроллера

    // дисплея.

    // ----------------------------------------------------------------------------

    void read() {

     DDRP = 0х00; //порт PORTP на ввод

    }


    // ------------------------------------------------------------------------

    // Функция Clearscreen производит очистку экрана дисплея посредством записи

    //во все ячейки памяти буфера экрана кода символа " "

    // ------------------------------------------------------------------------

    void Clearscreen() {

     int i,j;

     Reset_cursor();

     // выполнить для каждой строки (i), для каждого знакоместа в строке (j)

     for(i=0; i<16; i++) for(j=0; j<16; j++) LCD_char(' ');

     Reset_cursor();

    }


    // -------------------------------------------------------------------------

    // Функция newline производит запись во все знакоместа одной код символа " "

    // -------------------------------------------------------------------------

    void newline() {

     int i;

     for(i=0; i<16; i++) LCD_char(' ');

    }


    // ------------------------------------------------------------------------

    // Функция LCD_output производит преобразование кодов ASCII строки символов

    //в коды табл. рис. 5.15 для отображения на дисплее и передает эту строку в

    //ОЗУ буфера экрана дисплея

    // ------------------------------------------------------------------------

    void LCD_output(char s[]) {

     int n = 0;

     while (s[n] != '\0') {

      LCD_char(s[n]);

      ++n;

     }

    }


    // --------------------------------------------------------------------

    // Функция delay формирует временную задержку длительностью в указанное

    //число мкс

    // --------------------------------------------------------------------

    void delay(int usec) {

     int i,j;

     for(i=0; i<usec; i++) {

      for(j=0; j < 7; j++) { }

     }

    }


    // ------------------------------------------------------------------

    // Функция write конфигурирует линии порта PORTP для вывода данных на

    // дисплей

    // ------------------------------------------------------------------

    void write() {

     DDRP = 0xFF; //Порт PORTP на вывод

    }


    // -------------------------------------------------------------------------

    // Функция data производит запись одного символа в ОЗУ данных дисплея. Перед

    // обменом с контроллером дисплея контролируется бит состояния, который

    // свидетельствует о том, закончил контроллер выполнение предыдущей команды

    // управления или нет. Затем на порт PORTP выставляется код символа и

    // формируются необходимые сигналы управления

    // -------------------------------------------------------------------------

    void data(unsigned char n) {

     status_wait();

     PORTP = n;

     PORTDLC = 0xFF;

     PORTDLC = PORTDLC & 0xF7; //C/D в 0

     PORTDLC = PORTDLC & 0xFE; //WR в 0

     PORTDLC = PORTDLC & 0xFB;

     enable();

     disable();

    }


    // -------------------------------------------------------------------

    // Функция command производит передачу команды управления в контроллер

    // дисплея

    // -------------------------------------------------------------------

    void command(unsigned char n) {

     status_wait();

     PORTP = n;

     PORTDLC = 0xFF;

     PORTDLC = PORTDLC & 0xFE;

     enable();

     disable();

    }

    5.7. Управление электрическим двигателем

    В главе 4 мы рассмотрели применение способа широтно-импульсной модуляции для регулирования напряжения, приложенного к обмоткам электрического двигателя. Изменяя коэффициент модуляции, мы изменяли длительность импульсов напряжения на двигателе, сохраняя частоту следования этих импульсов неизменной. В результате, изменялось среднее значение напряжения на двигателе, и, как следствие, скорость его вращения. При обсуждении мы отметили, что ШИМ-сигнал может быть сформирован на одном из выходов МК, однако его мощности не будет достаточно для приведения двигателя во вращение. Поэтому между выходом МК и двигателем должны быть специальные электронные цепи, которые позволяют усилить по мощности, формируемый микроконтроллером ШИМ-сигнал. Мы рассмотрим примеры таких цепей в данном параграфе.

    5.7.1. Силовые полупроводниковые ключи

    Для подключения к обмоткам двигателя под управлением МК источника напряжения достаточной мощности могут быть использованы различные приборы: электромагнитные реле, твердотельные реле, биполярные транзисторы и некоторые другие типы транзисторов. В нашем примере мы будем использовать для этой цели мощные полевые транзисторы. В русскоязычной литературе их называют мощными МДП-транзисторами (МДП — Металл-Диэлектрик-Полупроводник), в англоязычной литературе используют аббревиатуру MOSFET (Metal Oxide Semiconductor Field-Effect Transistor). Мы остановились на этом типе полупроводниковых приборов потому, что в современных коммутаторах для двигателей малой и средней мощности используются именно эта элементная база.

    Перед тем, как исследовать электронную схему усиления мощности, необходимую для управления электрическим двигателем от микроконтроллера, рассмотрим принцип действия МДП-транзистора.

    МДП-транзистор — это управляемый напряжением полупроводниковый ключ. Он обладает очень высоким сопротивлением цепи управления, что удобно для микроконтроллера, который не может формировать больших вытекающих токов. В открытом состоянии падение напряжения на транзисторе мало по сравнению с другими типами полупроводниковых ключей аналогичной мощности. Поэтому энергия, рассеиваемая МДП-транзистором в режиме проводимости, также относительно невелика, что обеспечивает высокий коэффициент полезного действия полупроводникового коммутатора.

    МДП-транзистор может работать как в режиме усиления сигнала, так и в ключевом режиме. Мы будем использовать МДП-транзистр в ключевом режиме для коммутации напряжения питания к обмотке двигателя во время длительности импульса ШИМ-сигнала.

    МДП-транзистор имеет три электрода: сток (Drain), исток (Souse) и затвор (Gate). Затвор — это управляющий электрод транзистора, в то время как сток и исток — это электроды, по которым протекает коммутируемый транзистором ток. Схемное обозначение МДП-транзистора с каналом n-типа приведено на рис. 5.19,а. При отсутствии напряжения между затвором и стоком канал для протекания тока между стоком и истоком внутри полупроводниковой структуры транзистора отсутствует. Если на затвор подать положительное напряжение относительно истока, то внутри транзистора формируется канал для протекания тока от стока к истоку. Если снять с затвора напряжение, то этот канал исчезнет, и транзистор не сможет проводить ток между истоком и стоком. Мы получили управляемый полупроводниковый ключ!

    а) Условное графическое обозначение n-канального МДП-транзистора (MOSFET)

    б) Схема полупроводникового коммутатора для управления электрическим двигателем от МК

    в) Схема управления МДП-транзистором с использованием твердотельного реле

    Рис. 5.19. Управление электрическим двигателем от МК


    В нашем примере мы использовали МДП-транзисторы IRF530 компании International Rectifier. Максимальное значение тока стока ID для этого транзистора равно 14 А. Это означает, что мы можем коммутировать нагрузку с номинальным током 14 А под управлением маломощного сигнала с выхода микроконтроллера. Отметим, что в настоящее время подобные мощные МДП-транзисторы с каналами n- и p-типа выпускаются на токи свыше 100 А.

    На рис. 5.19,б показана схема включения электрического двигателя с управлением от микроконтроллера. Резистор R = 10 кОм в цепи управления обеспечивает путь для рассасывания заряда из области управляющего электрода, когда напряжение на затворе становится равным нулю. Также в схеме присутствует защитный диод, который установлен параллельно двигателю. Мы обсудим назначение этого диода несколько позже, при изучении схемы инвертора (раздел 5.7.3). В нашем примере на затвор транзистора подается управляющее напряжение около 5 В. При этом транзистор IRF530 может проводить ток около 4 А. Для увеличения тока нагрузки до 14 А следует повысить управляющее напряжение. Однако используемый в примере электрический двигатель приводится во вращение напряжением 12 В при токе нагрузки 1 А. Поэтому параметры напряжения управления от микроконтроллера для нашего случая вполне удовлетворяют требованиям МДП-транзистора.

    5.7.2. Оптоэлектронная потенциальная развязка

    Электрический двигатель — печально известный для инженеров-электроников источник электромагнитных помех. В процессе регулирования скорости вращения электрического двигателя, помехи в равной мере генерируются как самим двигателем, так и импульсным источником питания. Транзисторный коммутатор формирует на обмотке двигателя импульсы напряжения требуемой длительности. В момент выключения мощного МДП-транзистора реактивные элементы схемы сбрасывают накопленную во время протекания тока энергию в питающую сеть. В результате генерируются кратковременные выбросы напряжения в питающую сеть. Последнее может неблагоприятно сказаться на работе управляющего МК. В частности, из-за помех может произойти нарушение последовательности исполнения команд программы управления, или сбой в системе тактирования МК. И случится нарушение работы всей системы в целом.

    Чтобы избежать столь неблагоприятного прогноза в работе системы, следует изолировать цепи управления, т.е. плату с МК 68HC12, от силовых цепей установки. Для этого могут быть использованы оптроны (рис. 5.19,в). Управляющая цепь МК подключается к цепи излучающего светодиода оптрона. Когда МК формирует сигнал на включение МДП-транзистра, через светодиод протекает ток. Энергия излучения светодиода по оптическому каналу, расположенному внутри ИС оптрона, достигает полупроводникового прибора на вторичной стороне, и переводит его в открытое состояние. Одним из приборов, относящихся к классу оптронов, является твердотельное реле (рис. 5.19,в). На вторичной стороне этого прибора установлен маломощный МДП-транзистор. Когда светодиод излучает, МДП-транзистор открывается, по цепи резистора протекает ток, и на затворе основного транзистора формируется положительное напряжение относительно истока. Основной транзистор включается, и к обмотке двигателя подключается напряжение источника питания.

    Для подключения светодиода оптрона к выходу МК следует воспользоваться изученным ранее способом подключения обычного светодиода. Мы попросим Вас выполнить такое подключение в задании №8 в конце данной главы.

    5.7.3. Инвертор напряжения

    В предыдущем параграфе Вы научились управлять скоростью вращения электрического двигателя при помощи мощных полупроводниковых ключей. Этот способ отличается высоким коэффициентом полезного действия, поскольку потери в МДП-транзисторе во время протекания тока невелики. А как насчет изменения направления вращения двигателя? Если прикладная задача требует не только регулирования скорости вращения двигателя, но и изменения направления вращения, то предыдущая схема на одном МДП-транзисторе не может быть использована. Однако, увеличив число управляемых ключей схемы до четырех, мы получим необходимое решение.

    На рис. 5.20,а представлена схема однофазного мостового инвертора напряжения, которая позволяет регулировать скорость вращения двигателя методом ШИМ при любом направлении вращения двигателя. В англоязычной литературе эту схему называют «H bridge», что в переводе означает «мост в форме буквы H».

    а) Схема однофазного мостового инвертора напряжения. Полупроводниковые ключи SW1…SW4 могут находиться в замкнутом или разомкнутом состоянии.

    б) Состояние ключей инвертора при вращении двигателя по часовой стрелке

    в) Состояние ключей инвертора при вращении двигателя против часовой стрелки

    г) Состояние ключей инвертора при остановленном двигателе

    Рис. 5.20. Однофазный мостовой инвертор напряжения


    В каждом плече моста установлен управляемый полупроводниковый ключ. Обмотка двигателя подключена между двумя средними точками. При включенных транзисторах sw1 и sw4 обмотка двигателя подключается левым концом к положительной шине питания, а правым — к отрицательной. Ток протекает в указанном на рис. 5.20,б направлении, и двигатель вращается по часовой стрелке. Если транзисторы sw1 и sw4 выключить, и включить транзисторы sw2 и sw3, то ток будет протекать в противоположном направлении (рис. 5.20,в), а двигатель будет вращаться против часовой стрелки. Если одновременно включить одну из пар транзисторов sw1 и sw2 или sw3 и sw4, то обмотка двигателя будет закорочена, и он постепенно остановит свое вращение. Ни в коем случае нельзя одновременно включать пары транзисторов sw1 и sw3 или sw2 и sw4. Произойдет короткое замыкание источника питания.

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

    В заключение отметим, что малые потери в МДП-транзисторах позволяют разместить мостовую схему инвертора в корпусе DIP16! Так ИС SN754410NE компании Texas Instruments содержит в себе сразу два таких моста. Она позволяет коммутировать напряжения от 4,5 до 36 В при максимальном токе нагрузки 1 А. Упрощенная схема одного мостового инвертора в составе SN754410NE приведена на рис. 5.21.

    а) Функциональная схема

    Входы Состояние двигателя
    0 0 Обмотка не подключена, возможно свободное вращение
    0 1 Вращение против часовой стрелки
    1 0 Вращение по часовой стрелке
    1 1 Запрещенное состояние

    б) Таблица состояний

    Рис. 5.21. Функциональная схема однофазного мостового инвертора в составе специализированной ИС SN754410NE

    5.8. Кодовый замок

    В этом заключительном примере мы объединили ранее полученные знания по аппаратному подключению и программному обслуживанию различных устройств ввода и вывода информации. В каждом параграфе данной главы мы рассмотрели какой-то отдельный тип устройства ввода/вывода. И для каждого устройства привели фрагмент программного кода, который необходим для его обслуживания. Эти фрагменты могут быть использованы Вами в реальных разработках. На примере электронного кодового замка мы покажем Вам, как воспользоваться полученными ранее знаниями.

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

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

    5.8.1. Схема подключения периферийных устройств

    Электрическая схема подключения клавиатуры на 16 клавиш и символьного ЖК индикатора к выводам портов МК семейства 68HC12 приведена на рис. 5.22. Линии порта PORT B обслуживают матричную клавиатуру. В соответствии с электрической схемой линии PORTB[0]…PORTB[3] должны работать в режиме вывода, а линии PORTB[4]…PORTB[7] — в режиме ввода. Восьмиразрядная шина данных интерфейса индикатора подключена к выводам порта PORT P. Так же, как и в примере параграфа 5.6.2, мы будем производить только операции записи в контроллер управления индикатором. Поэтому порт PORT P будет постоянно работать в режиме вывода. Линии управления индикатором подключены к выводам PORTDLC2: PORTDLC3.

    Рис. 5.22. Функциональная схема аппаратных средств для системы кодового замка


    Можно убедиться, что рассмотренные ранее по отдельности схемы подключения клавиатуры и ЖК индикатора полностью повторены, вплоть до конкретных выводов портов. Поэтому мы сможем воспользоваться ранее приведенными программами управления без каких-либо изменений.

    5.8.2. Программа управления

    На рис. 5.23 представлена блок-схема алгоритма управления кодовым замком. Ниже приведен полный текст программного кода программы управления, составленный по этой блок-схеме алгоритма.

    Рис. 5.23. Блок-схема алгоритма управления кодовым замком


    /*------------------------------------------------------------------------*/

    /* filename: lock.c программа управления электронной системой доступа     */

    /* Число символов кода доступа равно 4. Правильная кодовая комбинация:C963*/

    /* Аппаратная конфигурация:                                               */

    /* PORTB 8 линий интерфейса клавиатуры                                    */

    /*PORTP 8 линий шины данных интерфейса ЖК индикатора                      */

    /*PORTDLC2 RD/WR, PORTDLC3 E.                                             */

    /*------------------------------------------------------------------------*/

    /*подключаемые файлы*/

    #include <912b32.h>

    #include <stdio.h>

    #include <math.h>


    /*используемые функции*/

    char which_key(unsigned int keypress); //определение, какая клавиша

                                           //нажата

    void delay_100us(void); //задержка 100 мкс

    void delay_5ms(void); //задержка 5 мс

    void initialize_lcd(void); //инициализация контроллера ЖК

                               //индикатора

    void initialize_key(void); //инициализация портов для

                               //клавиатуры

    void putchars(unsigned char с); //запись одного символа в индикатор

    void putcommands(unsigned char d); //запись одной команды в индикатор

    void lcd_print(char *string); //запись в индикатор строки символов

    char keypad(unsigned int keypress, int row);


    void main(void) {

     int first = 0х01; //инициализация служебных переменных для опроса

     int second = 0х02; //клавиатуры

     int third = 0х04;

     int fourth = 0х08;

     int i,j,k, count = 0;

     unsigned int keypress;

     char key;

     int length=4;

     char pin[] = {'С', '9', '6', '3'}; //задание эталонной последовательности

                                        //символов

     char code[4]; //массив для введенной пользователем

                   //последовательности символов

     initialize_lcd() ; //инициализация ЖК индикатора

     initialize_key(); //инициализация портов для клавиатуры

     for (k=0; k<4; k++) //разрешает 4 раза ввести комбинацию из

     { //4 символов

      count = 0;

      putcommands(0x01);

      lcd_print("Enter Code:");

      while (count < length) //обработка 4 нажатий клавиатуры

      {

       for(i=0; i<=50; i++) //ожидание ввода символа

       {

        PORTB = 0х01; //опрос первого ряда клавиатуры

        keypress = PORTB;

        key = keypad(keypress, first);

        if (key != 'Z') //если клавиша нажата

        {

         printf("%c", key);

         code[count] = key; //записать очередной символ в

                            //массив ввода

         count++; //перейти к сканированию следующего

                  //символа

        }

       }

       for(i=0; i<= 50; i++) // ожидание ввода символа

       {

        PORTB = 0х02; //опрос второго ряда клавиатуры

        keypress = PORTB;

        key = keypad(keypress, second);

        if (key != 'Z') {

         printf("%с", key);

         code[count] = key; //записать очередной символ в

                            //массив ввода

         count++; //перейти к сканированию следующего

                  //символа

        }

       }

       for(i=0; i<= 50; i++) //ожидание ввода символа

       {

        PORTB = 0х04; //опрос третьего ряда клавиатуры

        keypress = PORTB;

        key = keypad(keypress, third);

        if (key != 'Z') {

         printf("%c", key);

         code[count] = key; //записать очередной символ в

                            //массив ввода

         count++; //перейти к сканированию следующего

                  //символа

        }

       }

       for(i=0; i<= 50; i++) //ожидание ввода символа

       {

        PORTB = 0х08; //опрос четвертого ряда клавиатуры

        keypress = PORTB;

        key = keypad(keypress, fourth);

        if (key != 'Z') {

         printf("%c", key);

         code[count] = key; //записать очередной символ в

                            //массив ввода

         count++; //перейти к сканированию следующего

                  //символа

        }

       }

      } //очередные 4 символа введены, можно сверять с эталонными

      /*Проверка соответствия кода на эталонный*/

      j = 0;

      for(i=0;i<3;++i) //проверка по каждому символу эталонной

                       //последовательности

      {

       if(pin[i]==code[i]) //очередной символ правильный

       {

        j++;

       } else //очередной символ неправильный

       {

        j--;

       }

      }

      if (j == (length - 1)) //если j=3, то все символы введены правильно

      {

       putcommands(0x01);

       lcd_print("Access Granted");

      }

      else //символы введены неправильно

      {

       putcommands(0x01);

       lcd_print("Access Denied");

      }

     }

     putcommands(0x01);

     lcd_print(" Goodbye ! "); //конец попыток ввода

    }


    /*--------------------------------------------------------------------*/

    /*Перечень функций, которые использованы в этой программе             */

    /*--------------------------------------------------------------------*/

    /* Функции, программный код которых был приведен ранее по тексту главы*/

    char which_key(unsigned int keypress);

    void delay_5ms(void);

    void delay_100us(void);

    void initialize_lcd(void);

    void putchars(unsigned char с);

    void putcommands(unsigned char d);

    void lcdprint(char *string);

    char keypad(unsigned int keypress, int row);


    //Функция, которая приведена ниже

    void initialize_key(void)

    /*------------------------------------------------------------------------*/

    /* Функция initialize_key устанавливает направление передачи линий портов */

    /* для обслуживания клавиатуры                                            */

    /*------------------------------------------------------------------------*/

    void initialize_key(void) {

     DDRB = 0x0F; //линии PORTB[0]…PORTB[3] на вывод

                  //линии PORTB[4]…PORTB[7] на ввод

     PORTB = 0х00; //четыре младших линии порта PORTB в 0

    }

    /*-------------------------------------------------------------------------*/
     

    5.9. Интерфейс МК с аналоговыми датчиками

    Датчик — это устройство, которое преобразует некоторую физическую величину в электрический сигнал. Существуют датчики температуры, давления, ускорения, напряженности электрического поля, механического момента, и т.д. В главе 2 мы рассмотрели пример метеостанции, в которой выходы датчиков, поставляющих информацию о погоде, были подключены к МК семейства 68HC12. В том примере мы по умолчанию предположили, что датчики допускают непосредственное подключение ко входам МК. Однако на практике это условие почти всегда не выполняется. Поэтому необходимо разрабатывать дополнительную схему сопряжения, которая, в общем случае, состоит из усилителя со смещением уровня и фильтра. Подробное изучение способов преобразования аналоговых сигналов выходит за рамки данного раздела. Читатель может познакомиться с ними по книгам, приведенным в параграфе дополнительной литературы для данной главы. Мы остановимся только на общем рассмотрении масштабирования сигнала с выхода датчика.

    На рис. 5.24 приведена обобщенная функциональная схема интерфейса для подключения аналогового датчика ко входу встроенного АЦП микроконтроллера. Датчик преобразует некоторую величину X в напряжение на выходе электронного преобразователя датчика. В последующих рассуждениях мы предположим, что электронный преобразователь имеет линейную передаточную характеристику. Если на входе присутствует некоторая физическая величина X1, то на выходе электронного преобразователя формируется напряжение V1min. При этом величина X1 соответствует минимальному значению, которое может преобразовать рассматриваемый датчик. Если на входе датчика присутствует величина X2, то на выходе электронного преобразователя формируется напряжение V2min. И X2 соответствует максимальному значению датчика. Все промежуточные значения величины X могут быть восстановлены по величине напряжения на выходе преобразователя V1min < V < V2min.

    Рис. 5.24. Обобщенная функциональная схема интерфейса для подключения аналогового датчика ко входу встроенного АЦП МК


    Для того чтобы значение напряжения на выходе датчика могло быть использовано в управляющей программе, его необходимо преобразовать в цифровой код при помощи модуля АЦП. Преобразование будет выполнено с максимально возможным разрешением, если V1min будет равно 0 В, а V2min — 5,0 В. Поэтому между выходом датчика и входом АЦП следует установить дополнительный электронные усилитель со смещением уровня (рис. 5.24). Обозначим коэффициент усиления этого усилителя K, напряжение смещения — B. Для определения численных значений K и B составим два уравнения:

    V2max = V2min ? K + B

    V1max = V1min ? K + B,

    где V2max и V1max напряжения верхнего и нижнего уровня шкалы на выходе усилителя со смещением. Решив уравнения, можно получить численные значения коэффициента усиления и напряжения смещения, а затем реализовать необходимую схему на операционных усилителях.

    Пример. Представьте себе, что Вам необходимо подключить барометр метеостанции к микроконтроллеру 68HC12 для автоматизированного учета показаний прибора. Диапазон допустимых напряжений сигнала АЦП микроконтроллера составляет 0…5,0 В. Минимальная величина показаний барометра равна 64 см ртутного столба, максимальная — 81 см. Барометр снабжен электронной схемой преобразования сигнала, которая формирует на выходе для показания 64 см напряжение –100 мВ, а для показания 81 см — напряжение +300 мВ. Передаточная характеристика этой электронной схемы преобразования линейная. Необходимо определить параметры дополнительного электронного преобразователя для сопряжения предоставленного барометра с МК семейства 68HC12.

    В соответствие с ранее введенными обозначениями, можно записать: V1min = –100 мВ, V2min = 300 мВ, V1max = 0 В, V2max = 5,0 В. Подставим эти численные значения в уравнения для определения коэффициента усиления и напряжения смещения дополнительного электронного преобразователя сигнала:

    5 В = 300 мВ ? K + B

    0 В = –100 мВ ? K + B

    Решив два уравнения совместно, получим, что коэффициент усиления K = 12,5, напряжение смещения B = 1,25 В. Проверьте полученный результат, подставив полученные значения в исходные уравнения. Составьте схему на операционном усилителе, реализующую необходимые преобразования.

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

    5.10. Интерфейс RS-232 

    В главе 4 мы рассмотрели периферийные модули МК семейства 68HC12/HCS12, в том числе контроллеры последовательного обмена. Напомним, что МК 68HC12/HCS12 имеют в своем составе, как минимум, один контроллер асинхронного последовательного обмена SCI и один контроллер синхронного последовательного обмена SPI. Каждый из этих контроллеров формирует на выходе логические сигналы с напряжением около 5 В для логической 1 и около 0 В для логического 0. Однако если систему с МК необходимо соединить с другим устройством посредством интерфейса RS-232, то обмен с использованием логических уровней сигналов уже невозможен, и необходимо дополнительное согласование уровней.

    Стандарт EIA-232-D устанавливает правила организации последовательного обмена данными для интерфейса RS-232 (EIA — Electronic Industries Alliance). Стандарт определяет число линий связи и их функциональное назначение, электрические характеристики сигналов в линиях, формат кадра обмена и механические соединители.

    Переход от логических уровней сигналов к сигналам стандарта RS-232 может быть выполнен с использованием всего одной ИС трансивера RS-232. На рис. 5.25 приведен пример такой ИС компании MAXIM-IC. Трансивер позволяет выполнить преобразования двух сигналов с логическими уровнями TTL/CMOS к уровням сигналов интерфейса RS-232 и наоборот. Логическая 1 преобразуется этой ИС в отрицательное напряжение –10 В, логический 0 — в положительное напряжение +10 В. И при этом ИС требует всего одного источника питания для своей работы с напряжением 5,0 В ± 10%.

    Рис. 5.25. Функциональная схема трансивера RS-232 

    5.11. Заключение по главе 5

    Мы начали эту главу с анализа электрических характеристик входов и выходов микроконтроллеров и других ИС, выполненных по технологии HC CMOS. Это позволило нам понять, каким требованиям должны удовлетворять входные и выходные устройства, которые подключаются к выводам МК. Далее мы изучили конкретные типы устройств ввода и вывода, такие, как светодиоды, переключатели, клавиатуры, различные типы ЖК индикаторов. Мы рассмотрели особенности реальных устройств ввода/вывода: эффект дребезга механических переключателей, генерацию помех при работе электрического двигателя с силовым полупроводниковым коммутатором. Мы также показали, как преобразовать логические сигналы МК к уровням сигналов интерфейса RS-232. Все эти знания будут использованы нами далее в главе 6 в процессе изучения реальных встраиваемых систем на микроконтроллерах семейства 68HC12/HCS12.

    5.12. Что еще почитать?

    1. Horowitz, Р., W. Hill. The Art of Electronics, 2nd ed. Cambridge, England: Саmbridge University Press, 1989.

    2. Furlow, Bill. Circuit Design Idea Handbook. Boston: Cahners, 1975.

    3. Sheingold, Daniel H., ed. Analog-Digital Conversion Handbook. Norwood, МА: Analog Devices, 1976.

    4. «Transducers», Omega Engineering Inc., 1 Omega Drive, Stamford, СТ, 06907

    5. Stout, David F., Milton Kaufman. Handbook of Operational Amplifier Circuit Design. New York: McGraw-Нill, 1976.

    6. Hollander, M. А. Electrical signals and systems. New York: McGraw-Нill.

    5.13. Вопросы и задания

    Основные

    1. Что означают буквы «HC» в названии семейства микроконтроллеров 68HC12?

    2. Назовите и определите физический смысл 8 электрических параметров для входов и выходов серии логических элементов. Включите в свой ответ диаграммы входных и нагрузочных характеристик.

    3. Назовите 8 электрических параметров, характеризующих входы и выходы МК семейства 68HC12. Приведите диаграммы, которые связывают эти параметры.

    4. Какова максимальная нагрузка по току входов и выходов МК семейства 68HC12?

    5. Что произойдет с VOH и VOL, если будет превышена нагрузка по току?

    6. Какие два условия должны быть выполнены, чтобы светодиод светился?

    7. Почему схема сопряжения со светодиодом, представленная на рис. 5.3, не будет работать? Предложите рабочий вариант схемы при условии, что прямой ток светодиода 15 мА, а прямое падение напряжения 1,7 В?

    8. Опишите два способы защиты от дребезга механических контактов.

    9. Что такое выход с тремя состояниями?

    10. Как работает твердотельное реле? В каких случаях его следует использовать?

    Более сложные

    1. В тексте главы были введены две виртуальные серии логических элементов (DP1 и SB2). Для этих серий были приведены электрические параметры для входов и выходов:

    DP1:

    VIH = 2,0 В, VIL = 0,8 В, IOH = –0,4 мА, IOL = 16 мА

    VOH = 3,4 В, VOL = 0,2 В, IIH = 40 мкА, IIL = –1,6 мА

    SB2:

    VIH = 2,0 В, VIL = 0,8 В, IOH = –0,4 мА, IOL = 8 мА

    VOH = 2,7 В, VOL = 0,4 В, IIH = 20 мкА, IIL = –0,4 мА

    Определите, могут ли логические элементы серии DP1 быть подключены к элементам серии SB2? Если да, то чему равен коэффициент разветвления SB2 для DP1?

    2. Можно ли подключать элементы серии DP1 к выходам МК семейства 68HC12?

    3. Можно ли подключать элементы серии SB2 к выходам МК семейства 68HC12?

    4. На рис. 5.5 подтягивающие резисторы подключены к напряжению питания VCC. Представьте, что схему изменили, и эти же резисторы подключили к общему выводу. Как должна измениться таблица рис. 5.5?

    5. На рис. 5.5 была приведена схема подключения к МК клавиатуры из 16 клавиш. Разработайте аппаратную схему декодирования кода клавиш подобной клавиатуры. На выходе схемы должен формироваться ASCII код нажатой клавиши. МК не должен использоваться для решения поставленной задачи.

    6. Опишите своими словами принцип действия схем противодребезговой защиты, приведенных на рис. 5.10.

    7. Разработайте блок-схемы алгоритмов для каждой из функций программы управления ЖК дисплеем из разделов 5.6.2 и 5.6.3.

    8. Разработайте схему сопряжения МК с твердотельным реле (рис. 5.19), считая, что прямое падение напряжения на светодиоде равно 1,7 В, прямой ток светодиода равен 20 мА.

    9. Опишите, как работает МДП-транзистор.

    10. Используя дополнительные источники и Интернет (www.irf.com), составьте реферат о параметрах современных мощных МДП-транзисторов.

    11. Некоторый датчик формирует на выходе в нижней точке шкалы измерения напряжение 30 мВ, в верхней точке шкалы — 500 мВ. Разработайте интерфейс сопряжения этого датчика с МК семейства 68HC12.

    12. Повторите задание предыдущего вопроса, но при условии, что в нижней точке шкалы измерения напряжение равно 500 мВ, а в верхней точке шкалы выходное напряжение составляет –30 мВ.

    Исследовательские

    1. На рис. 5.5 подтягивающие резисторы подключены к напряжению питания VCC. Представьте, что схему изменили, и эти же резисторы подключили к общему выводу. Разработайте программу формирования кода нажатой клавиши для такой схемы подключения клавиатуры.

    2. Разработайте алгоритм и блок-схему программы для аппаратного подключения переключателей и светодиодов рис. 5.11. Зеленый светодиод на выходе PC0 должен светиться, если нажата кнопка на входе PB0. На остальных выводах порта PC0 должны гореть красные светодиоды. Если нажата кнопка на входе PB1, должны светиться зеленые светодиоды на выходах PC0 и PC1. И так далее, для всех кнопок, заканчивая PB7, при нажатии которой должны загореться 8 зеленых светодиодов.

    3. Измените текст программы параграфа 5.8.2, разрешив доступ по комбинации из шести правильных символов.









    Главная | В избранное | Наш E-MAIL | Добавить материал | Нашёл ошибку | Наверх