
- •Задание на курсовую работу
- •2. Описание алгоритма программы
- •2.1 Использование ресурсов
- •2.2 Основная программа
- •2.3 Подпрограмма обработки прерывания таймера
- •2.4 Подпрограмма обработки прерывания таймера 0. Режимы работы устройства
- •2.5. Подпрограммы индикации
- •2.6. Подпрограмы счета времени
- •2.7. Опрос клавиатуры
- •3. Дополнительное задание
2.3 Подпрограмма обработки прерывания таймера
В Algorithm Builder это подпрограмма с именем Timer_0_Overflow (рис.2.4.1). Вызов этой подпрограммы осуществляется при переполнении таймера/счетчика. В качестве таймера в данном случае может быть использован имеющийся в микроконтроллере AT90S8515 таймер_0. При выборе частоты тактирования CK/256, где СК – частота тактового генератора равная 8 МГц, период переполнения равен 8.192 мс. Для получения времени переполнения в 5 мс необходимо в регистр TCNT0 занести число $64 (100), исходя из следующих соображений:
Тпереп
= 256(256-N)
=256(256-100)
5
мс.
При входе в эту подпрограмму необходимо реализовать сохранение важных переменных и регистра флагов SREG в стеке, а при выходе из нее восстановить эти значения. Теперь можно организовать счетчик, который будет фиксировать число входов в данную п/п. Когда этот счетчик станет равным 200, то это будет означать, что прошла 1с (200*5мс=1с) и при этом необходимо увеличить текущее значение секунд на 1. Данный счетчик можно использовать в п/п счета времени. Затем необходимо реализовать вызов подпрограмм счета времени, если мы находимся не в режиме ввода, сканирования клавиатуры и вывода на индикацию.
2.4 Подпрограмма обработки прерывания таймера 0. Режимы работы устройства
В Algorithm Builder это подпрограмма с именем Timer_0_Overflow. Вызов этой подпрограммы осуществляется при переполнении таймера/счетчика 0, в нашем случае каждые 5мс.
Работу устройства можно разделить на 3 режима:
Рис. 2.4.1 –Подпрограмма Timer_0_Overflow
Каждые 5 мс счетчик tcount инкриминируется. Режим 0 – ввод времени часов, мигают разряды по очереди в зависимости от переменной mode. При mode=1 мигает 1 разряд, ожидается ввод десятков часов, mode=2 – ввод единиц часов, mode=3 – ввод десятков минут, mode=4 – ввод единиц минут.
На рис 2.6.2 приведена подпрограмма записи в регистры минут, часов и секунд при вводе в определенный разряд. Здесь учитывается: когда вводятся десятки минут, то можно вводить только 0, 1, 2, иначе ничего не происходит, также если введена 2 в десятки часов, то в единицы часов можно ввести только 0, 1, 2, 3, в десятки минут можно вводить только числа<6. После ввода времени, часы(hour) и минуты(minut) заносятся в переменные thour и tminut, соответственно, для последующего сравнения с ними, после этого – обнуляются.
Режим 1 – часы работают, мигает 8-й сегмент 2-го разряда.
Режим 2 – Таймер завершил отсчет времени. Мигают все 4 разряда и строчка светодиодов.
2.5. Подпрограммы индикации
Динамическая индикация осуществляется следующим образом: вначале в порт А выводится код, который зажигает сегменты индикатора, при которых светится требуемая цифра (0, 1, 2 …) и открывается первый транзисторный ключ, путем посылки 0 в PORTD.4. При этом будет отображаться только первый разряд индикатора. Через 5 мс необходимо закрыть первый транзисторный ключ, вывести в порт А код, который соответствует цифре, выводимой на второй разряд и открыть второй разряд индикатора. Далее эта процедура транзисторный ключ. При этом будет отображаться только повторяется для каждого разряда и после отображения четвертого разряда снова выводится первый разряд. Таким образом, время обновления каждого разряда составляет 5мс * 4 = 20 мс, при такой частоте обновления человеческий глаз не замечает мерцания и воспринимает индикацию как статическую.
Для выполнения этих действий целесообразно использовать уже настроенный ранее таймер на 5 мс. Поэтому в подпрограмме обработчика прерывания по переполнению таймера будем вызываться функция, которая и будет выполнять все вышеперечисленные действия.
Для режимов существует 3 подпрограммы для вывода на индикатор.
Рис.2.5.1 -Подпрограмма INDICATION_reg1
Рис. 2.5.2- Массив CODETABLE
Рассмотрим подпрограмму INDICATION_reg1. Используется для режима 1. Выводит на все разряды индикатора значения десятков и единиц минут и часов, а также каждую секунду мигает 8-й сегмент 2-го разряда. Работа с массивом CODETABLE (рис. 2.5.2) осуществляется при помощи следующей последовательности команд.
Сначала определятся адрес памяти, по которому расположен массив. Для этого используется регистр Z, который выступает в качестве индекса массива. Затем находится индекс необходимого элемента из массива путем сложения с регистром Z рабочего регистра r16 или r17 (в зависимости единицы вводятся или десятки), в котором записан номер нажатой клавиши. С помощью команды LPM в регистр r0 загрузится байт из программной памяти по адресу Z. Т.е. в r0 запишется элемент массива, в соответствии с индексом. В конце записывается информация с регистра r0 в ячейку активного разряда. Определение ячейки оперативной памяти, которую необходимо вывести на активное знакоместо, осуществляется следующим образом. Всего мы имеем 4-ре ячейки, которые соответствуют 4-м разрядам индикатора. Поэтому если активен первый разряд, необходимо выводить первую ячейку, второй – вторую и т.п. Это достигается следующим: в регистр Х записывается адрес нулевой ячейки массива indktr. К нему прибавляется номер текущего активного знакоместа stroka. Номер имеет значение от 0 до 3, что позволяет непосредственно его использовать в определении адреса ячеек(прибавив к адресу 0, что соответствует первому активному знакоместу, получим адрес первого значения в массиве, 1 – второе и т.д.). Далее получаем непосредственное значение, хранимое в массиве, и переписываем его в порт А.
Рис. 2.5.3- Подпрограмма INDICATION_reg0.
Рассмотрим подпрограмму INDICATION_reg0. Используется для режима 0, при вводе значений часов оно выводит его на индикатор, с мигающим знакоместом. В этой подпрограмме все происходит также, как и в предыдущей, только добавляются условия на мигание знакоместа каждую секунду. Условия состоят в том, что в зависимости от активного знакоместа (ему соответствует свое значение регистра mode) мигает число для записи: 200 циклов подпрограммы Timer_0_Overflow счетчик tcount обнуляется, для мигания активного знакоместа на индикаторе (когда 101<tcount<200, то ничего не горит на индикаторе, если 0<tcount<101 то горит то число которое было записано в эту переменную).
.
Рис. 2.5.4 -Подпрограмма INDICATION_reg
Рассмотрим подпрограмму INDICATION_reg2. Используется для режима 2. При завершении отсчета времени таймером, начинают мигать все 4 знакоместа каждую секунду.Мигает 8-ой сегмент 2-го разряда. Так же мигает строка светодиодов. Мигание происходит аналогичным образом как и в подпрограмме INDICATION_reg0. Мигание продолжается до перехода в другой режим.