AVR242
Динамическое управление светодиодными индикаторами и сканирование клавиатуры 4 x 4 с использованием 8-разрядного AVR-микроконтроллера
Отличительные особенности:
- Опрос состояния 16 клавиш, организованных в матрицу 4 x 4
- Управление четырехразрядным цифровым индикатором в динамическом режиме
- Промышленные часы реального времени/таймер
- Задание времен включения/выключения для двух нагрузок
- Звуковое подтверждение нажатия клавиш пьезокерамическим излучателем
- Предупреждение миганием индикатора о том, что было отключение питания
- Двойственное назначение линий порта ввода-вывода
- Минимальное число внешних компонентов
- Эффективный программный код
- Полный текст программы для AT90S1200
- Возможность применения в составе с любым AVR-микроконтроллером с 20 и более выводами
Введение
В данном документе описывается реализация системы, обеспечивающей опрос состояния клавиатуры 4 x 4, состояние которой служит входом для часов реального времени/таймера с двумя выходами. Данная система управляет внешними нагрузками и четырех разрядным цифровым светодиодным индикатором. Данное приложение разработано для демонстрации универсальности конфигурации портов AVR-микроконтроллеров, а также эффективность обширного набора инструкций. Приложение может работать совместно с любым микроконтроллером с 20 и более выводами, но при этом необходимо обратить внимание на инициализацию стека и размещение таблиц преобразования. Структура программы оптимизирована под трехуровневый аппаратный стек AT90S1200, что тем более не вызовет затруднений при интеграции данного приложения в микроконтроллеры с программным управлением стеком.
Принцип действия
Подключение клавиатуры 4х4, пьезокерамического излучателя, двух светодиодных нагрузок и четырех цифровых индикаторов с динамическим управлением обычно требует 23 линии ввода-вывода. В данном приложении рассматривается как снизить это требование до 15 линий, тем самым позволяя использовать 20-выв. микроконтроллеры. Принципиальная электрическая схема показана на рисунке 2 и является полной за исключением компонентов тактового генератора и цепи сброса, которые были удалены из схемы для большей ясности.
Четыре столбца клавиатуры подключены к младшей тетраде порта В, а четыре строки – к старшей тетраде. Те же 8 разрядов управляют непосредственно сегментными катодами четырехразрядного цифрового светодиодного индикатора через токоограничивающие резисторы R13- R20. Таким образом, эти выводы выполняют две функции: вывод информации для управления индикатором, ввод при опросе клавиатуры. Это стало возможным благодаря высокой гибкости настроек портов ввода-вывода AVR-микроконтроллеров.
Линии порта В длительно нагружены втекающим током 9 мА, что достаточно для непосредственного управления сегментами индикатора. Разряды индикатора переключаются последовательно с интервалом 5 мс через p-n-p транзисторы VT1- VT4 для организации динамического управления. Необходимость применения ключевых транзисторов для управления общими анодами светодиодных индикаторов вызвана коммутацией тока 72 мА(9мА х 8 сегментов), что выходит за пределы нагрузочной способности линий портов. Для этих целей могут быть использованы любые p-n-p-транзисторы с нагрузочной способностью не менее 100 мА (например, BC479). Данную задачу также можно решить путем параллельного соединения двух линий порта для непосредственного управления анодным током одного разряда, но при этом, необходимо большее число линий ввода-вывода, а, следовательно, необходимо использовать микроконтроллер с большим числом выводов.
Перед началом каждого такта развертки индикатора конфигурация порта изменяется для подключения сначала к одной четверке входов (столбцах) подтягивающих резисторов и установке на другой четверке выходов (строках) лог. 0 для определения столбца с нажатой клавишей, а затем наоборот для определения строки с нажатой клавишей. Полученной сумме значений в таблице преобразования соответствует код нажатой клавиши. Между каждым изменением состояния портов вводится короткая задержка для установления уровней на линиях порта. Применение данного метода более эффективно по сравнению с методом построчного сканирования с точки зрения компактности кода.
В процессе переключения общие аноды индикаторов отключаются во избежание подсвечивания сегментов, а по окончании опроса клавиатуры конфигурация портов готова к динамическому управлению индикатором. Основные сервисные функции программируются с помощью клавиатуры.
Часы реально времени организованы с использованием прерываний по таймеру 0, который тактируется системной частотой поделенной на 256. Таймер предварительно загружается числом 176, что задает период генерации прерываний по переполнению таймера каждые 5 мс, обеспечивая высокую точность хода часов, при условии использования качественного кварцевого резонатора. Для обеспечения высокой точности рекомендовано использовать кварцевый резонатор на 4.096 МГц. Программу можно модифицировать для использования кварцевого резонатора на 4 МГц.
Процедура обслуживания прерываний перезагружает таймер и инкрементирует три переменные: переменная счетчика (tOCK), противодребезговая переменная клавиатуры и счетчик секунд. Эти переменные используются в качестве исходных данных для обновления минут и часов, которые в свою очередь отображаются на индикаторе.
Вспомогательная функция реализована для управления двумя нагрузками по времени включения и выключения, подключенных к старшей тетраде порта D. В данном приложении нагрузки моделируются красным и зеленым светодиодами, управляемых втекающим током (активный уровень - низкий). Их можно заменить ключами для управления реле или оптотиристорами для управления мощной нагрузкой.
Клавиатура обеспечивает возможность установки (SET) реального времени и времен включения/выключения (ON/OFF) для каждой нагрузки, а также возмножность одновременного выключения (CLEAR) нагрузок. Пьезокерамический излучатель подключен к старшей линии порта D и сигнализирует о нажатии на клавишу.
При использовании линий порта В необходимо учесть меры предосторожности. Поскольку они выполняют двойное назначение, то необходимо предусмотреть невозможность шунтирования сегментных линий индикатора. Для этого последовательно в каждую линию матрицы клавиатуры включен токоограничивающий резистор. Использование на входах встроенных подтягивающих резисторов сокращает число внешних компонентов. Выбор номиналов резисторов R1- R8 осуществляется исходя из соображений незначительности падающего на них напряжения при нажатии на клавиши. При указанных на схеме значениях и напряжении питания 5В логические уровни составляют 0.6В для лог. “0” и 4.95В для лог. “1”. Резисторы R21 и R22 задают прямой ток через светодиоды и определяются известными методами. Данное приложение было тестировано с использованием резисторов 330 Ом при питании 5В. Светодиоды управляются втекающим током (включение логическим “0”) и требуют прямой ток около 9мА, точное значение которого определяется параметрами используемого типа светодиода.
Реализация
Программа микроконтроллера состоит из двух областей: фоновый процесс, который выполняется при генерации прерывания таймера для выполнения функций в реальном времени, и основной процесс, который состоит из трех секций: процедура обработки сброса для настройки портов, таймера и прерываний; процедура установки реального времени и служебные функции.
Основной процесс
Основной процесс выполняется практически непрерывно и прерывается только на 5.127 мкс (21 цикл) каждые 5мс для обновления переменных, содержащих информацию о реальном времени. Он состоит из трех секций: RESET (обработка сброса), TIME SETTING (задание текущего времени) и HOUSEKEEPING (сервисные функции). Блок-схема показана на рис 1.
Рисунок 1 – Блок-схема основного процесса (часть 1), продолжение на рис.3
Секция сброса
При подаче питания и выполнении условий сброса выполняется процедура сброса (Reset) для инициализации системных устройств. Все линии портов настраиваются на высокий уровень для выключения всех нагрузок. При этом порты настраиваются на выход записью числа 255 в регистры направления обеих портов. Направление порта В в дальнейшем кратковременно меняется для выполнения функции опроса клавиатуры. Для предделителя таймера выбирают коэффициент деления тактовой частоты 256, при этом, если таймер перезагружать кодом 176, период переполнения таймера и генерации прерываний равен 5 мс. Прерывание по переполнению таймера становится активным после разрешения глобальных прерываний (команда sei).
При использовании кварцевого резонатора 4.096 МГц длительность цикла инструкции равна 0.2441 мкс. С учетом этого, при записи числа n в регистр таймера 0 TCNT0 период его переполнения определяется по выражению:
(256-n)*256*02441, мкс
Таким образом запись числа 176 обеспечит период переполнения 5мс с высокой для счета реального времени точностью.
Установка времени
Если обнаруживается, что время неправильно и нуждается в настройке (после сброса или снятия питания), на индикаторах мигает строка EEEE. В этом состоянии ожидается нажатие клавиши SET на клавиатуре, которая вызывает функцию “setrtc” для ввода с клавиатуры и отображения на индикаторе реального времени. После того как время было переустановлено основная служебная функция непрерывно осуществляет обновление времени и управление индикатором, используя переменную секунд “second”, и сканирует клавиатуру для выполнения команд.
Рисунок 2 – Принципиальная электрическая схема блока клавиатуры и индикации
Служебные функции
К служебным функциям относятся: обновление переменных со значениями реального времени под управлением фонового процесса, управление светодиодным индикатором и отображение времени, сканирование клавиатуры для анализа нажатия клавиш и выполнения соответствующих команд, а также сравнение времен включения/выключения нагрузок 1 и 2 с текущим временем. Блок-схема показана на рисунке 3.
Инкрементирование секунд производится в процедуре обслуживания запроса на прерывание, а в основном цикле значение секунд сравнивается с 60. Если текущее значение равно 60, то инкрементируется значение минут, а счетчик секунд сбрасывается в ноль. Аналогично инкрементируются часы при достижении минутами значения 60. Значение часов сравнивается с 24 и по достижение этого значения часы, минуты и секунды сбрасываются в ноль, что означает начало нового дня.
Для экономичного использования оперативной памяти для хранения каждого из значений минут и часов используется один байт. Младшая тетрада – для хранения младшего разряда, старшая тетрада – для хранения старшего разряда. Следовательно, данные хранятся в двоично-десятичном коде.
Счет времени осуществляется в 24-часовом формате. Это означает, что счетчики времени переходят в начальное состояние после инкрементирования значения 23:59. При обновлении значения времени вызывается процедура вывода на индикацию “display”, которая также выполняет функцию сканирования клавиатуры (эта функция описывается далее).
При выходе из процедуры «display» проверяется код клавиатуры и выполняются соответствующие действия, проверяется необходимость включения/выключения нагрузок. По окончании выполнения всех сервисных функций осуществляется переход на начало основного цикла. Примером, результата действия данной процедуры является включение нагрузки 1, когда текущее время равно времени включения нагрузки 1.
Переменная флагов “Flag” используется для хранения бит, выполняющих функцию сигнализации о запросе на выполнение различных действий. В данном приложении требуется 9 бит флагов, что больше одного байта. В целях исключения использования второй ячейки памяти значение 9-го флага хранится в флаге “T” регистра статуса. Также это вносит дополнительные удобства за счет возможности тестирования этого бита с помощью инструкций условного перехода (BRTC, BRTS), делая программирование более простым. По аналогии при проверке остальных флагов могут использоваться инструкции SBRS и SBRC. Активный уровень для флагов – 1, а распределение и назначение показано в табл. 1. Время выполнения основного цикла не влияет на точность хода часов, т.к они управляются по прерыванию, запрос на обработку которого генерируется 4 раза за один проход по основному циклу.
Таблица 1 – Назначение флагов
Номер бита “FLAG” |
Функция |
0 |
Разрешение функции включения нагрузки 1 |
1 |
Разрешение функции включения нагрузки 2 |
2 |
Запрос на задание времени включения нагрузки 1 |
3 |
Запрос на задание времени выключения нагрузки 1 |
4 |
Запрос на задание времени включения нагрузки 2 |
5 |
Запрос на задание времени выключения нагрузки 2 |
6 |
Сигнализация о нажатии клавиши ОК (с подавлением. дребезга) |
7 |
Импульс с периодом 5мс |
Т-флаг |
Запрос на задание реального времени |
Рисунок 3 – Блок-схема основного процесса (часть 2)
Центральный сегмент индикатора (двоеточие) мигает каждые 0.5с. Для этого используется переменная “blink”, которая инкрементируется в фоновом процессе. С ее помощью взводится переменная “Flash”, которая выполняет функцию маски при управлении индикацией. Процедура управления нагрузкой на самом деле более сложная по сравнению с тем, как показано на блок-схеме. Она выполняет тестирование различных управляющих бит в слове “Flag” и выполняет соответствующие действия.
Если поступает команда установки параметров управления нагрузками, то вызывается функция “setrtc” для установки новых значений времени включения/выключения соответствующей нагрузки. При этом используется тот же метод мигания разрядов. Отличие заключатся в последовательности задания разрядов. В данном случае разряды вводятся от старшего к младшему. Команда CLEAR выключает обе нагрузки независимо от предварительного действия команд их включения/выключения. Данные процессы не влияют на работу часов, т.к реальное время продолжает подсчитываться в фоновом процессе.
Функция управления индикацией
Блок-схема показана на рис. 5. Данная функция вызывается процедурой Flashing Reset, функцией “setrtc” и процедурой сервисных функций и предназначена для сканирования клавиатуры и динамического управления индикатором. При использовании более мощных AVR-микроконтроллеров целесообразнее было бы построить функции управления сегментами разряда и вызывать ее до 4 раз. AT90S1200 имеет трехуровневый стек, поэтому, такой подход не может быть реализован.
В начале выполнения данной функции выключаются аноды индикатора и после этого сканируется клавиатура. Для этого изменяются настройки порта В на ввод в тетраде строк и на вывод в тетраде столбцов. Подтягивающие резисторы также разрешаются на 4 входах. На всех четырех выводах столбцов устанавливается лог.0, а состояние строк считывается из регистра PINB. При этом, в переменную “key” записывается число 0, 4, 8 или 12, которое определяет строку с нажатой клавишей, или код 0x10, если не было нажатия клавиш.
Далее конфигурация порта меняется так, чтобы тетрада строк работала на вывод, тетрада столбцов на ввод и на всех строках устанавливается низкий уровень. После короткой задержки на установление состояние столбцов считывается из регистра PINB. При этом, в зависимости от номера столбца нажатой клавиши к переменной “key” добавляется небольшое смещение 0, 1, 2 и 3. Результирующее значение переменной “key” используется как исходные данные для таблицы преобразования со значениями кодов клавиш, хранящихся в ЭСППЗУ. Действительный код клавиши записывается в переменную “key” и может использоваться вызывающей функцией. Данный подход используется из-за произвольности расположения клавиш без логической последовательности. Он также обладает более высокую гибкость для программирования при изменении расположения клавиш. Расположение и назначение кнопок клавиатуры показаны на рисунке 4.
Рисунок 4 – Расположение и назначение кнопок
Если значение кода нажатой клавиши больше 9 устанавливаются соответствующие биты слова “Flag”, использующихся вызывающей функцией. Код 0x10 сигнализирует о том, что не было нажатия клавиш.
Рисунок 5 – Блок-схема сканирования клавиатуры функции “display”
После нажатия клавиши генерируется короткий звуковой сигнал пьезокерамическим излучателем, который подключен к 6-му биту порта D для подтверждения нажатия клавиши.
На обслуживание каждого разряда индикатора выделяется 5 мс. Это время контролируется с помощью флага 5 мс, которые устанавливается в фоновом режиме. Таким образом, частота развертки равна приблизительно 50 Гц. Результирующее изображение характеризуется достаточной яркостью и отсутствием мерцаний (за исключением периода времени на сканирование клавиатуры).
Для управления разрядом цифрового индикатора используется таблица преобразования, которая хранится в ЭСППЗУ. Она выполняет преобразование кода символа, хранящегося в регистре “Temp”, в код семисегментного индикатора. Несколько специальных символов используются для более понятного ввода с клавиатуры. Например, символ “E” мигает при подаче подаче питания, сигнализируя о неправильности текущего времени, символы “o”, “n” и “f” используются для входов установок нагрузок. При использовании более мощных микроконтроллеров таблицы могут храниться в памяти программ, из которой значения можно считывать с помощью индексной адресации.
Мигание двоеточия в центре индикатора обеспечивается путем контроля прохождения 0.5 с и в этом случае изменения маски мигания “Flash”, которая также используется в предыдущих процессах. Мигание двоеточия позволяет определить корректность работы часов.
При выходе из этой функции в переменной “key” хранится код нажатой клавиши.
Рисунок 6 – Блок-схема функции “Display”
Функция установки часов реального времени «Setrtc»
Блок-схема показана на рисунке 7. Данная функция используется всеми процедурами, которые требуют установки времени с вводом клавиатурой и отображением на индикаторе. Необходимость в этом возникает при подаче питания и после сброса для установки реального времени, после нажатия кнопки SET для изменения реального времени и после нажатия любой из кнопок управления временами включения/отключения нагрузок. Она вызывает функцию «display» для опроса клавиатуры и отображения соответствующих разрядов. Процедура использует счетчик дребезга “bounce”, который инкрементируется каждые 5 мс в фоновой процедуре для исключения влияния эффекта дребезга контактов.
Функция выполняется в четыре стадии, начиная с обработки старшего разряда часов по младший разряд минут, при этом, мигая символом “n” в каждом разряде пока не будет введено корректное значение с клавиатуры. Нажатие кнопок, значения которых некорректны для конкретного разряда, игнорируется и ожидается нажатие корректной клавиши.
При корректном вводе значений всех четырех разрядов функция завершает свое действие, при этом результат установки часов хранится в переменной “hiset”, а минут - в “loset”. В дальнейшем значения этих переменных переписываются в другие переменные, соответствующие конкретным сервисным функциям.
Рисунок 7 – Блок-схема функции “setrtc”
Фоновый процесс (ход часов)
Данный процесс вызывается каждые 5 мс при переполнении таймера 0, вызывая прерывание основного процесса независимо от состояния его выполнения. При входе в процедуру сохраняется содержимое регистра статуса, а при выходе восстанавливается, чтобы избежать негативного влияния на основной процесс. Использование в этой процедуре временного регистра “Temp” недопустимо по этим же соображениям.
Логика работы данной функции чрезвычайно проста и заключается в инкрементировании трех счетных регистров при каждом вызове процедуры, установке флага хода часов с периодом появления 5 мс для процедуры управления отображением, перезагрузке таймера 0 и увеличении счетчика секунд часов реального времени при необходимости. Блок-схема показана на рисунке 8.
Рисунок 8 – Блок-схема фонового процесса управления ходом часов
Использование ресурсов
Таблица 2 – Использование ЦПУ и памяти
Функция |
Размер кода, слов |
Циклы |
Используемые регистры |
Прерывание |
Описание |
Reset (сброс) |
17 |
17 циклов |
R16, R31 |
- |
Инициализация |
Timesetting (установка времени) |
9 |
14 циклов |
R1, R2, R18, R19, R24, R25 |
- |
Начальная установка часов |
Housekeeping (служебные функции) |
97 |
52 (типично) |
R1, R2, R16, R17, R18, R19, R20, R21, R24, R25, R28 |
- |
Основной цикл программы, где выводится реальное время на индикатор, выполняются действия по нажатию на клавиши и выполняется управление нагрузками |
Display (отображение) |
158 |
150 (типично) |
R16, R17, R20, R21, R23, R24, R25, R26, R28 |
- |
Сканирование клавиатуры и динамическое управление индикатором |
Setrtc (установка часов) |
47 |
45 (типично) |
R1, R2, R16, R20, R22, R24, R25, R26, R28 |
- |
Установка с клавиатуры реального времени и времен для управления нагрузками |
tick (ход часов) |
15 |
21 цикл |
R0, R31 |
TIMER0 |
Фоновый процесс, вызываемый каждые 5 мс для получения дискретности хода часов 1 с |
Всего |
343 |
- |
R0, R1, R2, R16, R17, R18, R19, R20, R21, R22, R23, R24, R25, R26, R28, R31 |
TIMER0 |
- |
Таблица 3 – Использование периферийных устройств
Устройство |
Описание |
Прерывания |
Таймер 0 |
Счетчик импульсов с периодом 5мс |
Переполнение таймера 0 с предделением на 256 |
16 байт ЭСППЗУ |
Таблица преобразования кода клавиши в код семисегментного индикатора |
- |
8 линий порта В |
Подключение клавиатуры 4х4 и сегментных линий индикатора |
- |
3 линии порта D |
Нагрузки 1 и 2, пьезокерамический излучатель |
- |
4 линии порта D |
Управление анодами 4-разрядного цифрового индикатора |
- |
шкафы-купе
|