У вас вопросы?
У нас ответы:) SamZan.net

10 R17 R17 1 начало выход Сохранение регистров в стек Инкремент текущего разряда Тек

Работа добавлена на сайт samzan.net: 2016-03-30

Поможем написать учебную работу

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

Предоплата всего

от 25%

Подписываем

договор

Выберите тип работы:

Скидка 25% при заказе до 5.3.2025

PAGE  13


Инициализация стека

Инициализация портов  и регистров

Все флаги нажатия=1

Настройка таймера

1 в бит I

Обработка нажатия

R22 = 10

Переход в режим 1

начало

выход

R16 = R3

R17 = 0

R16>=10

R16 = R16 - 10

R17 = R17 + 1

начало

выход

Сохранение регистров в стек

Инкремент текущего разряда

Тек. Разряд < 5

1 в тек. разряд

Тек разряд=1

Тек разряд=2

Тек разряд=3

Тек разряд=4

Восстановление регистров из стека

4 на индикацию

Открываем 1 транзисторный ключ

Открываем 3 транзисторный ключ

R6 на индикацию

Открываем 2 транзисторный ключ

R5 на индикацию

Открываем 4 транзисторный ключ

R7 на индикацию

Сохраняем регистры в стек

Устанавливаем флаги нажатия

Считываем и сохраняем состояние 4-й строки клавиатуры

Считываем и сохраняем состояние 2-й строки клавиатуры

Считываем и сохраняем состояние 3-й строки клавиатуры

Начало

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

Восстановление регистров из стека

Тек разряд=4

Тек разряд=3

Тек разряд=2

Тек разряд=1

Выход

Методические указания к выполнению курсового проекта.

Задание: разработать часы реального времени на базе микроконтроллера AT90S8515. Время отображается с помощью четырех восьмисегментных индикаторов, управление осуществляется с помощью клавиатуры (3х4 – 12 кнопок). Программирование и прошивка МК осуществляется с помощью приложения Algorithm Builder.

Задачи устройства: при подаче питания на индикаторе отображается 00 часов 00 минут и часы начинают “идти”. При это должна мигать точка второго разряда индикатора с периодом 1 сек (0.5с горит, 0.5с не горит). При нажатии кнопки “*” включается режим ввода времени при котором последовательно задаются часы и минуты и после ввода последней цифры начинается ход часов. При вводе времени должна осуществляться проверка на некорректный ввод (например при вводе первой цифры можно ввести только “0”, “1” или “2” остальные кнопки должны игнорироваться).

Принципиальная электрическая схема устройства изображена на рисунке 1.

Рисунок 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*=4,992мс.

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

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

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, R19 – 16-разрядный регистр FLAGS 12 младших битов которого соответствуют 12 клавишам клавиатуры, при установлении одного из битов в “0” считается, что соответствующая клавиша нажата.

R16, R17, R20 – используются в качестве вспомогательных регистров.

2.2. Основная программа

При подаче питания и выполнении условий сброса выполняется процедура сброса (Reset) для инициализации системных устройств. Линии портов настраиваются на нужные уровни. Порт А необходимо настроить на выход, старшую тетраду порта D на выход и младшую на вход. Старшая тетрада порта D используется и для реализации индикации. Т.е. подавая на один из этих выходов логический “0” сканируется клавиатура и одновременно зажигается нужный индикатор. Далее обнуляются используемые в программе регистры или заносятся в них нужные значения. Настраивается таймер и заносятся нужные значения в регистры управления МК. Прерывание по переполнению таймера становится активным после разрешения глобальных прерываний. Далее программа ждет нажатия клавиши и если клавиша нажата, то переходит к обработке подпрограммы соответствующей данному нажатию. Реализовать распознавание нажатия клавиши удобно с помощью 16-разрядного регистра, т.к. клавиш 12, то будет использоваться 12 его младших разрядов. Например, можно установить все разряды такого регистра в 1 и при нажатии кнопки обнулять соответствующий бит регистра. В данном примере в качестве такого регистра выступает регистр FLAGS. Используя такой способ легко определить нажата ли клавиша и какая именно. На рисунке 2 представлена блок-схема основной программы.

Рисунок 2 – Блок-схема основной программы

Инициализация стека – это запись старшего адреса ОЗУ ($25F) в указатель стека SP.

Настройка таймера: запись числа $04 в регистр управления таймером TCCR0, запись числа 100 ($64) в таймер TCNT0 чтобы он переполнился через 5мс, запись числа $02 в регистр TIMSK (разрешение прерывания по переполнению таймера 0).  

Далее заносится 1 в бит I (разрешение глобального прерывания).

Затем проверяются флаги нажатия и если какой-либо флаг = 0, то обрабатывается нажатие и осуществляется возврат на проверку флагов. Таким образом, основная программа в бесконечном цикле проверяет флаги нажатия клавиш. Устанавливать эти флаги должна подпрограмма обработки клавиатуры KLAV, которая вызывается в подпрограмме обработки прерывания таймера и поэтому выполняется через каждые 5 мс. Каким образом подпрограмма KLAV сканирует клавиатуру и устанавливает флаги нажатия клавиш будет рассмотрено ниже.    

На рисунке 3 приведен пример реализации основной программы.

Рисунок 3 – Пример основной части программы составленный с помощью Algorithm Builder

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

2.3. Режимы работы устройства

Работу устройства можно разделить на 5 режимов:

Режим  0 – обычный ход часов, все разряды горят без мигания.

Режим 1 – мигает первый разряд, ожидается ввод часов

Режим 2 – мигает второй разряд, ожидается ввод часов

Режим 3 – мигает третий разряд, ожидается ввод минут

Режим 1 – мигает четвертый разряд, ожидается ввод минут.

Таким образом реагировать на нажатия клавиш в разных режимах необходимо по-разному, поэтому для каждого режима существует своя подпрограмма обработки нажатия клавиши. Целесообразно какой-либо регистр определить как переменную REGIM, в которой будет храниться номер текущего режима. Теперь если в режиме 0 выполняется нажатие клавиши, то вызывается подпрограмма REGIM0, которая должна проверить корректность нажатия и перейти (если нажата корректная кнопка) в следующий режим. Для режима 1 в качестве обработчика нажатия клавиши используется подпрограмма REGIM1 и т.д.

В качестве примера ниже приведена блок-схема подпрограммы REGIM0

Рисунок 4 – Блок-схема подпрограммы REGIM0

При вызове подпрограммы REGIM0 в регистре R22 хранился номер нажатой клавиши. Поэтому осуществляется проверка R22=10 (нажата “*”) и только если нажата кнопка “*” то переходим в следующий режим.

Понятно, что при нажатии кнопки в режиме 2 необходимо записать введенное значение часов в регистр R3 (текущее значение часов), а при нажатии кнопки в режиме 4 нужно выполнить те же действия с минутами.

2.4. Подпрограмма обработки прерывания таймера

В Algorithm Builder это подпрограмма с именем Timer_0_Overflow. Вызов этой подпрограммы осуществляется при переполнении таймера/счетчика 0, в нашем случае каждые 5мс. При входе в эту подпрограмму необходимо реализовать сохранение важных переменных и регистра флагов SREG в стеке, а при выходе из нее восстановить эти значения. Далее можно организовать счетчик (например использовать регистр R9), который будет фиксировать число входов в данную п/п. Когда этот счетчик станет равным 200, то это будет означать, что прошла 1с (200*5мс=1с) и при этом необходимо увеличить текущее значение секунд на 1. Данный счетчик можно использовать в п/п счета времени. Затем необходимо реализовать вызов подпрограмм счета времени, если мы находимся не в режиме ввода, сканирования клавиатуры и вывода на индикацию. Примерный алгоритм реализации подпрограммы таймера приведен на рисунке 5.

Рисунок 5 – Алгоритм подпрограммы таймера/счетчика

2.5. Подпрограмма счета времени

В этой п/п можно использовать счетчик, описанный в п/п таймера. Пример представлен на рисунке 6.

Рисунок 6 – Пример п/п счета времени

В этой п/п в регистре R1 содержится число секунд, в R2 – число минут и в R3 – число часов. R9 – это счетчик, который инкрементируется каждый раз при вызове подпрограммы обработки прерывания по переполнению таймера 0, т.е. R9 увеличивается каждые 5 мс. Таким образом, когда R9 достигает 200 (проходит 1 сек) вызывается TIME_TICK, которая обнуляет R9 и увеличивает текущее число секунд на 1. Естественно еще выполняется проверка секунд на равенство 60 и, если необходимо, увеличиваются минуты и часы.

При организации индикации существует следующая проблема: в R3 хранится текущее число часов в двоичном виде. А необходимо отдельно выводить число десятков и  число единиц на первый и второй разряды индикатора. Например, сейчас 15 часов (R3=15), тогда на первый разряд индикатора необходимо вывести 1, а на второй – 5. Чтобы разделить десятки и единицы числа R3 нужно выполнить следующие действия:

Рисунок 7 – Пример разделения числа часов на десятки и единицы

В данном примере используются вспомогательные регистры R16 и R17, в R17 будут содержаться десятки, а в R16-единицы. В R3 исходное число часов, Аналогичную программу нужно составить и для минут.

2.6. Вывод времени на индикацию

Динамическая индикация осуществляется следующим образом: вначале в порт А выводится код, который зажигает сегменты индикатора, при которых светится требуемая цифра (0, 1, 2 …) и открывается первый транзисторный ключ, путем посылки 0 в PORTD.4. При этом будет отображаться только первый разряд индикатора. Через 5 мс необходимо закрыть первый транзисторный ключ, вывести в порт А код, который соответствует цифре, выводимой на второй разряд и открыть второй транзисторный ключ. При этом будет отображаться только второй разряд индикатора. Далее эта процедура повторяется для каждого разряда и после отображения четвертого разряда снова выводится первый разряд. Таким образом, время обновления каждого разряда составляет 5мс * 4 = 20 мс, при такой частоте обновления человеческий глаз не замечает мерцания и воспринимает индикацию как статическую.

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

При выводе на индикацию последовательно должны выводиться на каждый из четырех разрядов индикатора соответствующие значения. Для перебора разрядов может быть использован счетчик (например на регистре R8). Т.к. всего разрядов индикатора 4, то значения регистра R8 могут меняться в пределах от 1 до 4. При входе в п/п INDIKATOR счетчик инкрементируется и в соответствии с его значением выдается сканирующий “0” на соответствующую линию порта D и обновляются показания соответствующего индикатора. Сканирующий “0 далее будет служить также и для опроса клавиатуры. При достижении счетчиком максимального значения его следует обнулять. Для облегчения вывода можно задействовать 4 регистра, например R4, R5, R6 и R7. Подпрограмма INDIKATOR будет отображать значение регистра R4 на первом разряде индикатора, R5 – на втором, R6 – на третьем, R7 – на четвертом. Теперь в любом месте программы при изменении значений регистров R4..R7 будет осуществляться изменение информации, выводимой на индикатор.

Таким образом, подпрограмма INDIKATOR должна выводить на 1 разряд  индикатора число, которое хранится в R4. Пусть в R4 хранится число от 0 до 9, тогда необходимо выводить в порт А код, который соответствует текущему значению R4. Это удобно осуществить предварительно составив таблицу данных кодов. Таблица состоит из 10 байт, если первый байт таблицы послать в порт А, то на индикаторе появится цифра 0, если послать второй байт таблицы, то будет отображаться цифра 1 и т.д. Эта таблица кодов располагается в памяти программ. Теперь чтобы вывести на индикатор значение регистра R4, необходимо взять адрес первого элемента таблицы кодов, прибавить к этому адресу регистр R4, по полученному адресу считать байт из таблицы и вывести этот байт в порт А. Подпрограмма, выполняющая эти действия, показана на рисунке 8.

   

Рисунок 8 – Пример использования таблицы кодов

Algorithm Builder позволяет поместить в тело программы кроме собственно программы произвольные данные: таблицы кодов, строки сообщений и пр. Для их записи используется элемент алгоритма “FIELD”. Для определения их расположения в адресном пространстве, перед ними следует поставить вершину или метку.

Синтаксис записи данных:

DB: [Format] #, #, #..

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

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

В этом примере в R19 содержится значение выводимой цифры, а INDIK_COD – это таблица данных со значениями соответствующими каждой цифре. Например, если вывести в порт А значение $C0, то на индикаторе высветится 0, если $F9 – то 1 и т.д. Чтобы из данной таблицы получить нужное значение применяется команда LPM. Предварительно в регистр Z заносится начальный адрес таблицы умноженный на 2. Далее к этому регистру прибавляется номер нужного значения (регистр R19) и после выполнения команды LPM нужное значение будет содержаться в регистре R0.

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

Блок-схема подпрограммы INDIKATOR представлена на рисунке 9.

Рисунок 9 – Блок-схема подпрограммы индикатор

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

2.7. Опрос клавиатуры

Клавиатура сканируется с помощью логического “0”, который подается на соответствующую линию при выводе на индикацию. Далее требуется опросить 3 младших разряда порта D, и если один из них равен “0”, то это является признаком нажатия соответствующей кнопки. В этой подпрограмме также требуется реализовать процедуру антидребезга.

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

Рисунок 10 – Дребезг контактов

Чаще всего используется задержка длительностью 20мс и после этого снова опрашивается разряд порта D на котором перед этим присутствовал “0”. Если состояние не изменилось, то считается что кнопка нажата.

Целесообразно использовать уже настроенный таймер на переполнение через каждые 5 мс. Для реализации этого следует создать подпрограмму KLAV, которая будет выполнять опрос клавиатуры, и вызываться в подпрограмме обработки прерывания по переполнению таймера. Таким образом, подпрограмма KLAV будет выполняться через каждые 5 мс.

Т.к. сканирование клавиатуры и индикации выполняется с помощью одних линии, то опрос клавиатуры будет связан с индикацией. Например, если в данный момент на индикаторе отображается первый разряд (присутствует 0 на линии PORTD.4), то сейчас подается 0 на первую строку клавиатуры, и можно считать состояние только первых трех кнопок этой строки. Таким образом, номер разряда индикатора, который отображается в данный момент, будет номером строки клавиатуры, которую можно сканировать в данный момент. В подпрограмме INDIKATOR уже была введена переменная, в которой хранился номер текущего разряда индикатора. Эту переменную и нужно использовать при опросе клавиатуры.    

Блок-схема подпрограммы KLAV представлена на рисунке 11.

Рисунок 11 – Блок-схема подпрограммы KLAV

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




1. тема переподготовки и повышения квалификации кадров многоуровневый подхоо groindusiril complex nficrisis mngement innovtion mnge.html
2. Излившиеся породы состоят из мельчайших кристаллов которые часто даже не различимы простым глазом- порода
3. Промышленная электроника Отчет о лабораторной работе 1 ОПРЕДЕЛЕНИЕ УДЕЛЬНЫХ Э
4. 2014 год Элементы налога и их характеристика
5. Політична філософія Платона
6. Testtem hbebnt et servos instrument vocli nominbnt
7. Биография и творчество писателя К. Сэндберга
8. Реферат по демографии Миграционные процессы в мире
9. Разработка мероприятий по улучшению финансово хозяйственной деятельности предприятия
10. Нагорная проповедь Христа1