Автор: Пользователь скрыл имя, 25 Февраля 2013 в 11:15, контрольная работа
Задание: разработать часы реального времени на базе микроконтроллера AT90S8515. Время отображается с помощью четырех восьмисегментных индикаторов, управление осуществляется с помощью клавиатуры (3х4 – 12 кнопок). Программирование и прошивка МК осуществляется с помощью приложения Algorithm Builder.
Задачи устройства: при подаче питания на индикаторе отображается 00 часов 00 минут и часы начинают “идти”. При этом должна мигать точка второго разряда индикатора с периодом 1 сек (0.5с горит, 0.5с не горит). При нажатии кнопки “*” включается режим ввода времени, при котором последовательно задаются часы и минуты и после ввода последней цифры начинается ход часов. При вводе времени должна осуществляться проверка на некорректный ввод (например, при вводе первой цифры можно ввести только “0”, “1” или “2” остальные кнопки должны игнорироваться).
1. Описание принципиальной схемы 3
2. Описание возможного варианта алгоритма программы 4
2.1. Использование ресурсов 5
2.2. Основная программа 5
2.3. Режимы работы устройства 6
2.4. Подпрограмма обработки прерывания таймера 6
2.5. Подпрограмма счета времени 7
2.6. Вывод времени на индикацию 8
2.7. Опрос клавиатуры 10
Содержание
Задание: разработать часы реального времени на базе микроконтроллера AT90S8515. Время отображается с помощью четырех восьмисегментных индикаторов, управление осуществляется с помощью клавиатуры (3х4 – 12 кнопок). Программирование и прошивка МК осуществляется с помощью приложения Algorithm Builder.
Задачи устройства: при подаче питания на индикаторе отображается 00 часов 00 минут и часы начинают “идти”. При этом должна мигать точка второго разряда индикатора с периодом 1 сек (0.5с горит, 0.5с не горит). При нажатии кнопки “*” включается режим ввода времени, при котором последовательно задаются часы и минуты и после ввода последней цифры начинается ход часов. При вводе времени должна осуществляться проверка на некорректный ввод (например, при вводе первой цифры можно ввести только “0”, “1” или “2” остальные кнопки должны игнорироваться).
Рисунок 1 – Принципиальная электрическая схема блока клавиатуры и индикации.
1. Описание принципиальной схемы
На рисунке представлена принципиальная электрическая схема часов. Микроконтроллер является основной и единственной микросхемой, используемой в данной разработке. Для задания тактовой частоты контроллера используется кварцевый резонатор на 8 МГц. В качестве устройства отображения использованы четыре индикатора красного цвета свечения с общим анодом, каждый индикатор содержит 8 сегментов.
Индикация текущего времени осуществляется динамически, в данный конкретный момент времени отображается лишь одна цифра, что позволяет значительно снизить аппаратные затраты. Аноды каждой из четырех цифр являются раздельными, что позволяет в данный момент времени подключить к источнику питания только один анод и отобразить одну цифру. Для этого часы имеют четыре транзисторных ключа. Ключи управляются микроконтроллером, причем соответствующий ключ открыт, если на выводе контроллера присутствует логический ноль. Одноименные сегменты всех четырех цифр соединены вместе и через токоограничивающие резисторы подключены к выводам порта "А" (выводы PА.0 … PА.7). Управляющая программа один за другим подключает разряды индикатора к источнику питания и одновременно на соответствующие выводы порта "А" выставляется код отображаемой цифры. Поскольку сканирование индикатора происходит очень быстро, мерцание цифр становится незаметным. Как видно из схемы, линии сканирования клавиатуры и индикации общие, что позволяет уменьшить число используемых выводов. Питаются часы от стабилизированного источника питания напряжением 5В. Сразу после включения часов программа разрешает прерывания, настраивает порты контроллера соответствующим образом и устанавливает указатель стека на старшие адреса внутренней памяти данных. Далее программа переводит устройство в режим часов и запускает цикл сканирования клавиатуры, индикатора и цикл счета времени. Основой программы является обработчик прерываний от таймера.
2. Описание алгоритма программы
Часы реального времени организованы с использованием прерываний по таймеру 0, который тактируется системной частотой поделенной на 256. Таймер предварительно загружается числом 100, что задает период генерации прерываний по переполнению таймера каждые 5 мс, обеспечивая высокую точность хода часов, при условии использования качественного кварцевого резонатора. При использовании кварцевого резонатора 8 МГц длительность цикла инструкции равна 0.125 мкс. С учетом этого, при записи числа n в регистр таймера 0 TCNT0 период его переполнения определяется по выражению:
(256-n)*256*0,125 мкс
Таким образом, запись числа 100 обеспечит период переполнения 5мс с высокой для счета реального времени точностью:
(256-100)*256*0,125*
Всю программу можно разбить на несколько частей – это основная программа и подпрограммы прерывания по переполнению таймера/счетчика, счета времени, вывода на индикацию, сканирования клавиатуры и режимов ввода времени.
В основной программе настраивается
МК и ожидается нажатие клавиши,
если клавиша нажата, то определяется
ее код и происходит переход к
одной из подпрограмм ввода, где
анализируется какая цифра
2.1. Использование ресурсов
Использование периферийных устройств:
Таймер/счетчик0 – счетчик импульсов с периодом 5мс;
7 линий порта D – подключение клавиатуры 3х4 и управление анодами цифровых индикаторов;
8 линий порта A – сегментные линии индикаторов;
Используемые регистры:
R0 – используется при работе с таблицей данных, в нем содержится считанное значение из таблицы данных по адресу Z;
R1 – число секунд;
R2 – число минут;
R3 – число часов;
R4 – выводится на первый индикатор;
R5 – выводится на второй индикатор;
R6 – выводится на 3-й индикатор;
R7 – выводится на 4-й индикатор;
R8 – номер индикатора на который в данный момент будет выводиться информация;
R9 – счетчик срабатывания таймера;
R10, R11, R12 – используются в подпрограмме для сканирования клавиатуры;
R13, R14 - дребезг при нажатии или отжатии кнопки;
R15 - счетчик блокировки;
R18 – вспомогательный регистр, для разделения десятков и единиц.
2.2. Основная программа
При подаче питания и выполнении условий сброса выполняется процедура сброса (Reset) для инициализации системных устройств. Линии портов настраиваются на нужные уровни. Порт А необходимо настроить на выход, старшую тетраду порта D на выход и младшую на вход. Старшая тетрада порта D используется и для реализации индикации. Т.е. подавая на один из этих выходов логический “0” сканируется клавиатура и одновременно зажигается нужный индикатор. Далее обнуляются используемые в программе регистры или заносятся в них нужные значения. Настраивается таймер, и заносятся нужные значения в регистры управления МК. Прерывание по переполнению таймера становится активным после разрешения глобальных прерываний. Далее программа ждет нажатия клавиши и если клавиша нажата, то переходит к обработке подпрограммы соответствующей данному нажатию. Реализовать распознавание нажатия клавиши удобно с помощью 16-разрядного регистра, т.к. клавиш 12, то будет использоваться 12 его младших разрядов.
Инициализация стека – это запись старшего адреса ОЗУ ($25F) в указатель стека SP.
Настройка таймера: запись числа $04 в регистр управления таймером TCCR0, запись числа 100 ($64) в таймер TCNT0 чтобы он переполнился через 5мс, запись числа $02 в регистр TIMSK (разрешение прерывания по переполнению таймера 0).
Далее заносится 1 в бит I (разрешение глобального прерывания).
2.3. Режимы работы устройства
Работу устройства можно разделить на 5 режимов:
Режим 0 – обычный ход часов, все разряды горят без мигания.
Режим 1 – мигает первый разряд, ожидается ввод часов
Режим 2 – мигает второй разряд, ожидается ввод часов
Режим 3 – мигает третий разряд, ожидается ввод минут
Режим 1 – мигает четвертый разряд, ожидается ввод минут.
Таким образом реагировать на нажатия клавиш в разных режимах необходимо по-разному, поэтому для каждого режима существует своя подпрограмма обработки нажатия клавиши. Регистр r12 определен как переменная режима, в которой хранится номер текущего режима. При нажатии кнопки в режиме 2 необходимо записать введенное значение часов в регистр r3 (текущее значение часов), а при нажатии кнопки в режиме 4 нужно выполнить те же действия с минутами.
2.4. Подпрограмма обработки прерывания таймера
В Algorithm Builder это подпрограмма с именем Timer_0_Overflow. Вызов этой подпрограммы осуществляется при переполнении таймера/счетчика 0, в нашем случае каждые 5мс. При входе в эту подпрограмму необходимо реализовать сохранение важных переменных и регистра флагов SREG в стеке, а при выходе из нее восстановить эти значения. Далее организован счетчик (регистр R9), который фиксирует число входов в данную п/п. Когда этот счетчик становится равным 200, это значит, что прошла 1с (200*5мс=1с) и при этом увеличивается текущее значение секунд на 1. Затем реализуется вызов подпрограмм счета времени, если мы находимся не в режиме ввода, сканирование клавиатуры и вывод на индикацию. Алгоритм реализации подпрограммы таймера приведен на рисунке 2.
Рисунок 2 – Алгоритм подпрограммы таймера/счетчика
2.5. Подпрограмма счета времени
В этой п/п в регистре R1 содержится число секунд, в R2 – число минут и в R3 – число часов. R9 – это счетчик, который инкрементируется каждый раз при вызове подпрограммы обработки прерывания по переполнению таймера 0, т.е. R9 увеличивается каждые 5 мс. Таким образом, когда R9 достигает 200 (проходит 1 сек.), обнуляется R9 и увеличивается текущее число секунд на 1. Естественно еще выполняется проверка секунд на равенство 60 и, если необходимо, увеличиваются минуты и часы.
При организации индикации существует следующая проблема: в R3 хранится текущее число часов в двоичном виде. А необходимо отдельно выводить число десятков и число единиц на первый и второй разряды индикатора. Например, сейчас 15 часов (R3=15), тогда на первый разряд индикатора необходимо вывести 1, а на второй – 5.
Для разделения десятков и единиц используется вспомогательный регистр R18 .
2.6. Вывод времени на индикацию
Динамическая индикация осуществляется следующим образом: вначале в порт А выводится код, который зажигает сегменты индикатора, при которых светится требуемая цифра (0, 1, 2 …) и открывается первый транзисторный ключ, путем посылки 0 в PORTD.4. При этом будет отображаться только первый разряд индикатора. Через 5 мс необходимо закрыть первый транзисторный ключ, вывести в порт А код, который соответствует цифре, выводимой на второй разряд и открыть второй транзисторный ключ. При этом будет отображаться только второй разряд индикатора. Далее эта процедура повторяется для каждого разряда, и после отображения четвертого разряда снова выводится первый разряд. Таким образом, время обновления каждого разряда составляет 5мс * 4 = 20 мс, при такой частоте обновления человеческий глаз не замечает мерцания и воспринимает индикацию как статическую.
Для выполнения этих действий целесообразно использовать уже настроенный ранее таймер на 5 мс. Поэтому в подпрограмме обработчика прерывания по переполнению таймера будем вызываться функция INDICATION, которая и будет выполнять все вышеперечисленные действия.
При выводе на индикацию последовательно должны выводиться на каждый из четырех разрядов индикатора соответствующие значения. Для перебора разрядов использован счетчик (на регистре R8). Т.к. всего разрядов индикатора 4, то значения регистра R8 могут меняться в пределах от 1 до 4. При входе в п/п INDIKATION счетчик инкрементируется и в соответствии с его значением выдается сканирующий “0” на соответствующую линию порта D и обновляются показания соответствующего индикатора. Сканирующий “0” далее будет служить также и для опроса клавиатуры. При достижении счетчиком максимального значения его следует обнулять. Для облегчения вывода можно задействовать 4 регистра, например R4, R5, R6 и R7. Подпрограмма INDIKATION будет отображать значение регистра R4 на первом разряде индикатора, R5 – на втором, R6 – на третьем, R7 – на четвертом. Теперь в любом месте программы при изменении значений регистров R4..R7 будет осуществляться изменение информации, выводимой на индикатор.
Таким образом, подпрограмма INDIKATION выводит на 1 разряд индикатора число, которое хранится в R4. Пусть в R4 хранится число от 0 до 9, тогда необходимо выводить в порт А код, который соответствует текущему значению R4. Осуществляется это по предварительно составленной таблицей данных кодов. Таблица состоит из 10 байт, если первый байт таблицы послать в порт А, то на индикаторе появится цифра 0, если послать второй байт таблицы, то будет отображаться цифра 1 и т.д. Эта таблица кодов располагается в памяти программ. Теперь чтобы вывести на индикатор значение регистра R4, необходимо взять адрес первого элемента таблицы кодов, прибавить к этому адресу регистр R4, по полученному адресу считать байт из таблицы и вывести этот байт в порт А.
Algorithm Builder позволяет поместить в тело программы кроме собственно программы произвольные данные: таблицы кодов, строки сообщений и пр. Для их записи используется элемент алгоритма “codetable”. Для определения их расположения в адресном пространстве, перед ними следует поставить вершину или метку.
При составлении таблицы кодов учитывался тот факт, что сегменты индикатора загораются при подаче на них логического “0”.
Блок-схема подпрограммы INDIKATION представлена на рисунке 6.
Рисунок 3 – Блок-схема подпрограммы индикатор
В начале подпрограммы выполняется сохранение важных регистров в стеке, далее инкрементируется счетчик номера разряда индикатора и проверяется на выход за пределы допустимых значений. После этого, если в данный момент обрабатывается первый разряд индикатора, то R4 выводится на индикатор и затем открывается первый транзисторный ключ, который включает первый разряд индикатора.
2.7. Опрос клавиатуры
Клавиатура сканируется с помощью логического “0”, который подается на соответствующую линию при выводе на индикацию. Далее требуется опросить 3 младших разряда порта D, и если один из них равен “0”, то это является признаком нажатия соответствующей кнопки. В этой подпрограмме также требуется реализовать процедуру антидребезга.
На рисунке 10 показан дребезг контактов при нажатии на кнопку. Как видно из рисунка в результате дребезга контактов кнопки происходит имитация ее многократного нажатия. Для того чтобы избежать неправильного декодирования, считывание скан-кода производится через некоторое время после фиксации факта изменения состояния.
Рисунок 7 – Дребезг контактов
Используется задержка длительностью 20мс и после этого снова опрашивается разряд порта D, на котором перед этим присутствовал “0”. Если состояние не изменилось, то считается, что кнопка нажата.
Информация о работе Разработать часы реального времени в среде программирования Algorithm Builder