Разработка таймера прямого хода

  • Вид работы:
    Дипломная (ВКР)
  • Предмет:
    Информатика, ВТ, телекоммуникации
  • Язык:
    Русский
    ,
    Формат файла:
    MS Word
    601,70 kb
  • Опубликовано:
    2012-03-19
Вы можете узнать стоимость помощи в написании студенческой работы.
Помощь в написании работы, которую точно примут!

Разработка таймера прямого хода

Содержание

Введение

1. Описание принципиальной схемы

2. Описание и назначение переменных

3. Описание основной программы и подпрограм

3.1 Основная программа (Reset)

3.2 Подпрограмма начальной инициализации (INIT)

3.3 Подпрограмма обработки прерывания (TIMER_0_OVERFLOW)

3.4 Подпрограмма счёта времени (TIME_CONTROL)

3.5 Подпрограмма остановки таймера (TIMER)

3.6 Подпрограммы индикации (INDICATION, UPDATE)

3.7 Подпрограмма опроса клавиатуры (SCAN)

3.8 Подпрограмма антидребезга (ANTIDREBEZG)

3.9 Подпрограмма проверки корректности нажатия клавиши (GET_KEY)

Введение

Микроконтроллеры и микропроцессоры в данное время являются базовой основой для обработки сигналов, контроля управления аппаратной работы (обработка клавиатуры, индикация, управление цифровыми станциями, системами автоопределения).

Первый микроконтроллер был изобретён в 1971 году компанией INTEL (I8004).

Задачи, стоящие перед МК:

1.       Контроль и управление аппаратурой (обработка клавиатуры, индикация, управление цифровыми станциями, системами автоопределения и т.д.). Данные операции не требуют сложных вычислений, и для их реализации используется универсальный МК.

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

3.       Реализация различных телекоммуникационных протоколов.

В данном курсовом проекте для выполнения задачи по реализации таймера прямого хода будет запрограммирован микроконтроллер AT90S8515 с помощью приложения Algorithm Builder 4.42.

1. Описание принципиальной схемы


Рисунок 1.1 - Принципиальная электрическая схема блока клавиатуры и индикации

На рисунке 1.1 представлена принципиальная электрическая схема блока клавиатуры и индикации. Микроконтроллер является основной и единственной микросхемой, используемой в данной разработке. Для задания тактовой частоты контроллера используется кварцевый резонатор на 8 МГц. В качестве устройства отображения использованы четыре индикатора красного цвета свечения с общим анодом, каждый индикатор содержит 8 сегментов.

Индикация текущего времени осуществляется динамически, в данный конкретный момент времени отображается лишь одна цифра, что позволяет значительно снизить аппаратные затраты. Аноды каждой из четырех цифр являются раздельными, что позволяет в данный момент времени подключить к источнику питания только один анод и отобразить одну цифру. Для этого часы имеют четыре транзисторных ключа. Ключи управляются микроконтроллером, причем соответствующий ключ открыт, если на выводе контроллера присутствует логический ноль. Одноименные сегменты всех четырех цифр соединены вместе и через токоограничивающие резисторы подключены к выводам порта "А" (выводы PА.0 … PА.7). Управляющая программа один за другим подключает разряды индикатора к источнику питания и одновременно на соответствующих выводах порта "А" выставляет код отображаемой цифры.

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

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

Часы реального времени организованы с использованием прерываний по таймеру 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сек) и вызывается подпрограмма счета времени, вывода на индикацию и сканирования клавиатуры.

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

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

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

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

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

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

таймер программирование схема микроконтроллер

2. Описание и назначение переменных


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

REGIM (R1) - содержит номер режима, в котором в данное время работает программа, может принимать значения:

- режим прямого хода таймера

- режим вывода цифры в 1-й разряд

- режим вывода цифры во 2-й разряд

- режим вывода цифры в 3-й разряд

- режим вывода цифры в 4-й разряд

COUNTER (R2) - счётчик срабатывания таймера. Применяется для организации мерцания символов на индикаторах, с периодом в 1 сек (0.5 сек горит, 0.5 сек не горит).

POINT (R3) - регистр состояния точки (H - сегмент 2-го индикатора), может принимать значения:

- не горит

- горит

BLINK (R4) - регистр мерцания символов на индикаторах, может принимать значения:

- горит

- не горит

HOUR_1 (R5) - счётчик часов, может принимать значения от 0 до 2

HOUR_2 (R6) - счётчик часов, может принимать значения от 0 до 3

MIN_1 (R7) - счётчик минут, может принимать значения от 0 до 5

MIN_2 (R8) - счётчик минут, может принимать значения от 0 до 9

SEC (R9) - счётчик секунд, может принимать значения от 0 до 59

MESTO (R10) - регистр для хранения текущего знакоместа, может принимать значения от 1 до 4

NOM_KNOP (R11) - регистр для хранения номера нажатой кнопки, может принимать значения от 1 до 12

MERC_T (R12) - флаг мерцания точки

MERC_С (R13) - флаг мерцания цифры

BLOK_VVODA (R14) - флаг установки блокировки ввода, может принимать значения:

- блокировка отключена

- блокировка включена

S_BLOK (R15) - счётчик, используемый для формирования "флага" блокировки ввода в подпрограмме сканирования клавиатуры (время блокировки)

R22, R23 - регистры, используемые в подпрограмме антидребезга.

TIM (R24) - флаг остановки таймера, при достижении заданного времени.

М (R25) - флаг обнуления значений часов, минут секунд, при начале работы таймера.

Описание переменных в Algorithm Builder приведено в приложении Б.

3. Описание основной программы и подпрограм


3.1 Основная программа (Reset)


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

В основной программе выполняем инициализацию стека - блок SP, настраиваем таймер на переполнение - блоки Timer 0, TIMSK. Настройка таймера: запись числа $04 в регистр управления таймером TCCR0, запись числа $02 в регистр TIMSK (разрешение прерывания по переполнению таймера 0). Далее заносится 1 в бит I (разрешение глобального прерывания) и вызов подпрограммы INIТ.

Листинг программы приведен в приложении В.

3.2 Подпрограмма начальной инициализации (INIT)



Рисунок 3.2 - Блок-схема подпрограммы, выполняющая инициализацию портов и задание первоначальных значений переменных

В данной подпрограмме выполняется инициализация портов, присвоение первоначальных значений переменных и инициализация вектора однобайтовых чисел IND в оперативной памяти микроконтроллера (для хранения данных, выводимых на индикатор).

3.3 Подпрограмма обработки прерывания (TIMER_0_OVERFLOW)



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

Данная подпрограмма будет вызываться в основной программе каждые 5 мс. Для этого в самом начале в регистр TCNT0 записывается число $64 (100), исходя из следующих соображений: частота тактирования CK/256, где СК - частота тактового генератора равная 8 МГц, период переполнения равен 8.192 мс.

Тпереп = 256× (256-N) ×=256× (256-100) ×»5 мс.

В ней определяется, с каким знакоместом и соответственно с какой строкой клавиатуры в текущий момент идёт работа программы и выдаётся соответствующая комбинация в порт D. Также идет приращение и анализ переменной COUNTER, исходя из её значения, определяется флаг, управляющий миганием точки второго разряда (POINT) и проверяется равенство 200, т.е. прошла ли 1 секунда. Для того, чтобы осуществить индикацию текущего времени, необходимо по очереди каждые 5 мс зажигать каждую цифру. Для этого часы имеют четыре транзисторных ключа. Ключи управляются микроконтроллером, причем соответствующий ключ открыт, если на выводе контроллера присутствует логический ноль. Т.е. подавая на один из этих выходов логический “0” сканируется клавиатура и одновременно зажигается нужный индикатор.

Далее вызываются подпрограммы: INDICATION - вывод символов на индикаторы, и SCAN - сканирование клавиатуры. Затем, если программа находится в режиме счёта времени (REGIM=0), производится проверка факта нажатия “ *". При подтверждении нажатия, программа переходит в режим установки времени: последовательно устанавливаются часы и минуты, при этом значение регистра REGIM изменяется от 1 до 4. При завершении установки времени, программа снова переходит в режим счёта времени. Если же “ * “ не была нажата, то через каждую секунду проверяется условие остановки таймера. Если таймер не был остановлен, то вызывается подпрограммы TIME_CONTROL (управляющая корректной инкрементацией времени) и TIMER (управляющая сравнением текущего времени с заданным и установкой флага остановки таймера). В конце происходит вызов подпрограммы UPDATE, которая обновляет информацию на индикаторах с периодом в 20 мс.

 

3.4 Подпрограмма счёта времени (TIME_CONTROL)


Рисунок 3.4 - Блок-схема подпрограммы счёта времени

Данная программа вызывается каждую секунду в режиме счёта времени. В начале подпрограмма проверяем факт установки флага обнуления значений часов, минут и секунд, т.е. таймер работает от нуля. Далее мы инкрементируем счётчик секунд SEC и сравниваем его с числом $3С (60), проверяя, прошла ли одна минута. Каждую минуту производится циклическая инкрементация счётчиков часов (HOUR_1, HOUR_2) и счётчиков минут (MIN_1, MIN_2), с проверками на корректность.

 

3.5 Подпрограмма остановки таймера (TIMER)


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

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

 


3.6 Подпрограммы индикации (INDICATION, UPDATE)


Рисунок 3.6 - Блок-схема подпрограммы индикации

Подпрограмма INDICATION вызывается в подпрограмме обработки по прерываний таймеру. Адрес нулевой ячейки вектора IND заносится в регистр X. После чего прибавляется смещение, определяемое текущим знакоместом MESTO, и значение выводится в порт A. Также идёт обеспечение мигания светодиодов при режиме прямого хода таймера, выводящих на табло букву "С" а также обеспечивается мигания разряда, в который в данный момент должно вводиться значение, при одном из режимов ввода времени.

Каждый семисегментный светодиодный знаковый индикатор (ССЗИ) имеет семь излучающих сегментов A - G и точку Н (рисунок 3.5).

Рисунок 3.7 - Сегменты ССЗИ

Светящимся сегментам соответствуют биты установленные в 0, погашенным - 1. Коды для цифр "0"-"9" приведены в таблице 3.1.

Таблица 3.1 - Коды для ССЗИ


A

B

C

D

E

F

G

H

код

1

1

0

0

1

1

1

1

1

$F9

2

0

0

1

0

0

1

0

1

$A4

3

0

0

0

0

1

1

0

1

$B0

4

0

0

1

1

0

0

1

$99

5

0

1

0

0

1

0

0

1

$92

6

0

1

0

0

0

0

0

1

$82

7

0

0

0

1

1

1

1

1

$F8

8

0

0

0

0

0

0

0

1

$80

9

0

0

0

0

1

0

0

1

$90

0

0

0

0

0

0

0

1

1

$C0


Задание кодов цифр, выводимых на индикацию, осуществляется с помощью массива Code_table:

$C0, $F9, … - элементы массива (числа в шестнадцатеричном формате, соответствующие цифрам 0, 1, …).

Рисунок 3.9 - Блок-схема подпрограммы обновления информации на индикаторах

Подпрограмма UPDATE предназначена для обновления информации на индикаторах. Адрес нулевой ячейки вектора IND заносится в регистр X. Затем, в зависимости от знакоместа и значения, которое на него выводится, формируется кодовая последовательность, формирующая нужное число на индикаторе. Для этого в регистр Z заносится начальный адрес массива CODE_TABLE, умноженный на 2. Далее к этому регистру прибавляется номер нужного значения (HOUR_1…MIN_2 - в зависимости от знакоместа) и после выполнения команды LPM нужное значение будет содержаться в регистре R0, которое впоследствии и выдаётся в порт A.

3.7 Подпрограмма опроса клавиатуры (SCAN)


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

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

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

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

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

Если программа работает в режиме ввода времени, то вызывается подпрограмма GET_KEY, определяющая корректность ввода цифры.

 


3.8 Подпрограмма антидребезга (ANTIDREBEZG)


Рисунок 3.12 - блок-схема подпрограммы антидребезга

Подпрограмма вызывается после того, как зафиксирован факт нажатия кнопки и предназначена для того, чтобы избежать неправильного декодирования, считывание скан-кода производится через некоторое время после фиксации факта изменения состояния. Это время определяется числом 32x255, которое было подобрано экспериментально.

 


3.9 Подпрограмма проверки корректности нажатия клавиши (GET_KEY)


Рисунок 3.13 - Блок-схема подпрограммы проверки корректности нажатия клавиши

Данная подпрограмма предназначена для проверки корректности нажатия клавиши в режиме ввода времени.

При этом игнорируется нажатие клавиш “ * ” и “ #". При нажатии “ 0 ” в регистр NOM_KNOP записывается 0, которое впоследствии выдаётся в один из счётчиков часов (минут).

Далее, в зависимости от того, на какой индикатор в данный момент происходит выдача информации (состояние регистра REGIM), производятся следующие проверки:

REGIM = 1 - то можно ввести только цифры от 0 до 2;

REGIM = 2 - если HOUR_1 = 2, то в HOUR_2 можно ввести цифру от 0 до 3, в других случаях в HOUR_2 можно ввести цифру от 0 до 9;

REGIM = 3 - в MIN_1 можно ввести цифру от 0 до 5;

REGIM = 4 - в MIN_2 можно ввести цифру от 0 до 9.

Заключение


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

В результате выполнения курсового проекта были получены и закреплены основные навыки программирования устройств на базе микроконтроллеров.

Похожие работы на - Разработка таймера прямого хода

 

Не нашли материал для своей работы?
Поможем написать уникальную работу
Без плагиата!