Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
курсач_1часть_2.doc
Скачиваний:
63
Добавлен:
24.11.2018
Размер:
4.3 Mб
Скачать
  1. Разработка алгоритма работы таймера

8.1 Словесное описание

  • Включение таймера производится нажатием на кнопку «ВКЛ/ОТКЛ». Кнопка должна быть с фиксацией, прерывать цепь питания схемы.

  • Сразу после включения таймер находится в режиме ожидания. Цифровая клавиатура (кнопки «0» … «9») не активна, на индикаторах выводится значение «00». В этом режиме при нажатии на кнопку «СТАРТ» должен сработать режим звуковой сигнализации.

  • При нажатии на кнопку «СТОП/УСТАНОВКА» в режиме ожидания включается режим установки. При этом цифровая клавиатура становится активна, кнопка «СТАРТ» не активна и не должна реагировать на нажатие.

Нажатие кнопки «СТОП/УСТАНОВКА» в режиме установки обеспечивает переход в режим ожидания.

  • Если таймер не находится в режиме установки, то при нажатии на кнопку «СТАРТ» происходит переход в режим таймера. При этом цифровая клавиатура становится неактивна.

При нажатии кнопки «СТОП/УСТАНОВКА» происходит выход из режима таймер, переход в режим ожидания. В этом случае при нажатии кнопки «СТАРТ» осуществляется возврат в режим таймера, при нажатии кнопки «СТОП/УСТАНОВКА» - переход в режим установки.

  • При обнулении таймера в режиме таймер переход в режим звуковой сигнализации. При нажатии кнопки «СТОП/УСТАНОВКА» выход из режима звуковой сигнализации в режим ожидания.

8.2 Блок-схема алгоритма работы таймера

По словесному описанию приведенному в п. 8.1 составим блок-схему алгоритма работы таймера.

Рис. 8.2 Блок-схема алгоритма работы таймера

  1. Разработка программы

Начальные настройки микроконтроллера

Приведем листинг программы с начальными настройками микроконтроллера

;Подключаем файл описаний

.include "tn2313def.inc"

;Листинг

.list

;Определяем рабочие регистры

.def buf=R17

.def wreg=R16

.def temp=R18

.equ wset=24 ;Константа задержки динамической индикации

.equ ktim=3906 ;Константа секундного интервала

.equ ksnd=1000 ;Константа генератора звукового сигнала

;Начало программного кода

.cseg ;Выбор программного сегмента

.org 0 ;Установка в 0 текущего адреса

start:

rjmp init ;Переход на начало программы

reti ;Внешнее прерывание 0

reti ;Внешнее прерывание 1

reti ;Таймер/счетчик 1 захват

rjmp timdec ;Таймер/счетчик 1, совпадение канал А

reti ;Таймер/счетчик 1, прерывание по переполнению

reti ;Таймер/счетчик 0, прерывание по переполнению

reti ;Прерывание UART прием завершен

reti ;Прерывание UART регистр данных пуст

reti ;Прерывание UART передача завершена

reti ;Прерывание по компаратору

reti ;Прерывание по изменению на любом контакте

reti ;Таймер/счетчик 1, совпадение канал В

reti ;Таймер/счетчик 0, совпадение канал В

reti ;Таймер/счетчик 0, совпадение канал А

reti ;USI готовность к старту

reti ;USI переполнение

reti ;EEPROM готовность

reti ;Переполнение охранного таймера

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

init:

ldi wreg, RAMEND ;Определяем адрес вершины стека

out SPL, wreg

;Инициализация портов ввода-вывода

ldi wreg, 0xFF ;Инициализация порта B

out DDRB, wreg ;на вывод

ldi wreg, 0 ;Инициализация порта D

out DDRD, wreg ;на ввод

out PORTB, wreg ;Установка логических 0

;на выводы порта B

ldi wreg, 0xFF ;Подключение подтягивающих резисторов

out PORTD, wreg ;на выводы порта D

;Инициализация таймера Т0

ldi wreg, 0x04 ;Конфигурируем таймер T0

out TCCR0B, wreg ;с предделителем частоты на 256

;Инициализация компаратора (отключение компаратора)

ldi wreg, 0x80

out ACSR, wreg

cons:

ldi buf, 0x00 ;Установка начального значение таймера в 0

main:

cli ;Запрет прерываний

ldi wreg, 0 ;Деактивация таймера Т1

out TCCR1B, wreg

out TIMSK, wreg

out TCCR1A, wreg

rcall wclr ;Вызов подпрограммы ожидания отпускания кнопок

Реализация режима ожидания

;РЕЖИМ ОЖИДАНИЯ

wmode:

in wreg, PIND ;Читаем состояния порта D

rcall wait ;Для борьбы с дребезгом контактов вводим задержку

sbrs wreg, 2 ;Если нажата кнопка СТОП/УСТАНОВКА

rcall setmod ;переходим в РЕЖИМ УСТАНОВКИ

sbrs wreg, 1 ;Проверяем, не нажата ли кнопка

rcall timmod ;СТАРТ, если да, переходим в режим ТАЙМЕР

rcall bufset ;Выводим текущее значение таймера

rjmp wmode ;Возвращаемся в начало цикла

Реализация подпрограммы индикации

;Подпрограмма вывода значения таймера на индикаторы

bufset:

sbi PORTB, 0 ;Отключаем индикатор 1 и 2

sbi PORTB, 1

rcall loset ;Формируем цифру младшего разряда

cbi PORTB, 1 ;Подключаем индикатор 2

rcall wait ;Подпрограмма задержки

sbi PORTB, 1 ;Отключаем индикатор 2

rcall hiset ;Формируем цифру старшего разряда

cbi PORTB, 0 ; Подключаем индикатор 1

rcall wait

sbi PORTB, 0 ;Выключаем индикатор 1

ret ;Выходим из подпрограммы

Реализация подпрограммы задержки

;Подпрограмма задержки

wait:

push wreg ;Записываем в стек значение рабочего регистра

ldi wreg, 0 ;Сбрасываем в ноль таймер Т0

out TCNT0, wreg

wtim:

in wreg, TCNT0 ;Сравниваем значение

cpi wreg, wset ;счетного регистра с

brlo wtim ;коэффициентом задающим

;временной интервал

pop wreg ;Возвращаем значение рабочего регистра

ret

Реализация подпрограммы ожидания отпускания кнопок

;Подпрограмма ожидания отпускания кнопки

wclr:

in wreg, PIND ;Читаем содержимое порта D

cpi wreg, 0x7F ;если нажата хотя бы одна

brne wclr ;кнопка, переходим в начало

ret ;подпрограммы, иначе выходим

Реализация подпрограмм формирования цифр:

;Подпрограмма формирования цифры старшего разряда

hiset:

push buf ;Сохраняем в стеке текущее значение таймера

andi buf, 0xF0 ;Маскируем тетраду старшего разряда

swap buf ;Меняем местами тетрады

lsl buf ;Удваиваем цифру старшего разряда

mov YL, buf ;Копируем содержимое регистров

ldi YH, 0

ldi ZL, low(stab*2) ;Определяем адрес таблицы, содержащей

ldi ZH, high(stab*2) ;подпрограммы установки цифр

add ZL, YL ;Складываем младшие и старшие байты

adc ZH, YH ;регистров Y и Z

lpm XL, Z+ ;Читаем содержимое ячейки с адресом Z

lpm XH, Z

mov ZH, XH ;Копируем полученные данные в регистр Z

mov ZL, XL

icall ;Осуществляем косвенный переход к подпрограмме

;адрес которой записан в регистре Z

pop buf ;Возвращаем текущее значение таймера

ret

;Подпрограмма формирования цифры младшего разряда

loset:

push buf ;Сохраняем в стеке текущее значение таймера

andi buf, 0x0F ;Маскируем тетраду младшего разряда

lsl buf ;Удваиваем цифру старшего разряда

mov YL, buf ;Копируем содержимое регистров

ldi YH, 0

ldi ZL, low(stab*2) ;Определяем адрес таблицы, содержащей

ldi ZH, high(stab*2) ;подпрограммы установки цифр

add ZL, YL ;Складываем младшие и старшие байты

adc ZH, YH ;регистров Y и Z

lpm XL, Z+ ;Читаем содержимое ячейки с адресом Z

lpm XH, Z

mov ZH, XH ;Копируем полученные данные в регистр Z

mov ZL, XL

icall ;Осуществляем косвенный переход к подпрограмме

;адрес которой записан в регистре Z

pop buf ;Возвращаем текущее значение таймера

ret

;Таблица адресов установки цифр на выводах порта D

stab: .dw nst0, nst1, nst2, nst3

.dw nst4, nst5, nst6, nst7

.dw nst8, nst9

;Установка «0»

nst0:

cbi PORTB, 7

cbi PORTB, 5

cbi PORTB, 4

cbi PORTB, 6

ret

;Установка «1»

nst1:

sbi PORTB, 7

cbi PORTB, 5

cbi PORTB, 4

cbi PORTB, 6

ret

;Установка «2»

nst2:

cbi PORTB, 7

sbi PORTB, 5

cbi PORTB, 4

cbi PORTB, 6

ret

;Установка «3»

nst3:

sbi PORTB, 7

sbi PORTB, 5

cbi PORTB, 4

cbi PORTB, 6

ret

;Установка «4»

nst4:

cbi PORTB, 7

cbi PORTB, 5

sbi PORTB, 4

cbi PORTB, 6

ret

;Установка «5»

nst5:

sbi PORTB, 7

cbi PORTB, 5

sbi PORTB, 4

cbi PORTB, 6

ret

;Установка «6»

nst6:

cbi PORTB, 7

sbi PORTB, 5

sbi PORTB, 4

cbi PORTB, 6

ret

;Установка «7»

nst7:

sbi PORTB, 7

sbi PORTB, 5

sbi PORTB, 4

cbi PORTB, 6

ret

;Установка «8»

nst8:

cbi PORTB, 7

cbi PORTB, 5

cbi PORTB, 4

sbi PORTB, 6

ret

;Установка «9»

nst9:

sbi PORTB, 7

cbi PORTB, 5

cbi PORTB, 4

sbi PORTB, 6

ret

Реализация режима установки

;Режим установки

setmod:

rcall wclr ;Переход к подпрограмме ожидания отпускания кнопки

rcall lvlsc ;Переход к подпрограмме установки значения таймера

;Подпрограмма установки значения таймера

lvlsc:

rcall bufset ;Вывод текущего значения таймера

rcall bufset

rcall bufset

rcall bufset

ldi temp, 25 ;Цикл «мигания»

wlvl:

dec temp

in wreg, PIND ;Проверяем, не нажата ли кнопка

rcall wait

sbrs wreg, 2 ;СТОП/УСТАНОВКА, если да,

rjmp main ;переходим в РЕЖИМ ОЖИДАНИЯ

in wreg, PIND ;Читаем содержимое порта D

rcall wait ;Антидребезговая задержка

sbrs wreg, 0 ;Если нажата кнопка установки старшего разряда

rcall inhi ;вызываем соответствующую подпрограмму

sbrs wreg, 4 ;Если нажата кнопка установки младшего разряда

rcall inlow ;вызываем соответствующую подпрограмму

cpi temp, 0 ;Если период цикла не завершен

brne wlvl ;возвращаемся в его начало

rcall bufset ;Выводим текущее значение таймера

rcall bufset

rcall bufset

rcall bufset

rcall bufset

rcall bufset

rjmp lvlsc

;Подпрограмма установки младшего разряда

inlow:

rcall wclr ;Ожидаем отпускания кнопки

push buf ;Копируем в стек текущее значение таймера

andi buf, 0x0F ;Маскируем младшую тетраду

cpi buf, 0x09 ;Сравниваем ее с 9

breq cbufl ;если равно, обнуляем, иначе

pop buf

inc buf ;инкрементируем

rjmp lvlsc

;Подпрограмма обнуления младшего разряда

cbufl:

pop buf

andi buf, 0xF0

rjmp lvlsc

inhi:

rcall wclr ;Ожидаем отпускания кнопки

swap buf ;Меняем местами тетрады

push buf ;Сохраняем значение в стеке

andi buf, 0x0F ;Маскируем старшую тетраду

cpi buf, 0x09 ;Сравниваем с 9

breq cbufh ;Обнуляем если равно

pop buf ;Иначе инкрементируем

inc buf

swap buf ;Восстанавливаем значение таймера из стека

rjmp lvlsc

;Подпрограмма обнуления старшего разряда

cbufh:

pop buf

andi buf, 0xF0

swap buf

rjmp lvlsc

Режим таймера

;Режим таймера

timmod:

rcall wclr ;Ожидаем отпускания кнопок

cpi buf, 0 ;Проверяем не обнулен ли таймер,

breq sigmod ;если да, переходим в РЕЖИМ СИГНАЛИЗАЦИИ

ldi wreg, high(ktim) ;Устанавливаем константу совпадения

out OCR1AH, wreg

ldi wreg, low(ktim)

out OCR1AL, wreg

ldi wreg, 0x0C ;Устанавлием таймер T1 в режим счета с

out TCCR1B, wreg ;предделителем на 64

ldi wreg, 0x40 ;Устанавливаем режим прерывания по совпадению

out TIMSK, wreg

sei ;Разрешаем прерывания

wstop:

in wreg, PIND ;Проверяем, не нажата ли кнопка

rcall wait

sbrs wreg, 2 ;СТОП/УСТАНОВКА, если да,

rjmp main ;переходим в РЕЖИМ ОЖИДАНИЯ

rcall bufset

rjmp wstop

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

timdec:

push buf ;Сохраняем текущее значение таймера

andi buf, 0x0F ;Маскируем младшую тетраду

cpi buf, 0 ;Если она равна 0

breq cur ;Проверяем старший разряд,

brne dbuf ;иначе уменьшаем на 1

prout: cpi buf, 0 ;Проверяем не обнулен ли таймер,

breq sigmod ;если да, переходим в РЕЖИМ СИГНАЛИЗАЦИИ

reti

;Подпрограмма проверки старшего разряда

cur: pop buf ;Восстанавливаем значение из стека и меняем местами

swap buf ;старшие и младшие тетрады

andi buf, 0x0F ;Маскируем старшую тетраду

cpi buf, 0 ;Проверяем, если она равна нулю, переходим в

breq prout ; РЕЖИМ СИГНАЛИЗАЦИИ

dec buf ;Иначе уменьшаем на 1,

ldi wreg, 0x90 ;восстанавливаем значение таймера,

add buf, wreg ;записываем «9» в младший разряд

swap buf

rjmp prout

;Подпрограмма уменьшения значения младшего разряда

dbuf: pop buf

ldi wreg, 3

dwreg: dec wreg

cpi wreg,0

brne dwreg

dec buf

rjmp prout

Режим сигнализации

;Режим звуковой сигнализации

sigmod: cli ;Запрещаем прерывания

ldi wreg, high(ksnd) ;Записываем константу в регистр совпадения

out OCR1AH, wreg ;таймера Т1

ldi wreg, low(ksnd)

out OCR1AL, wreg

ldi wreg, 0x09 ;Устанавлием таймер T1 в режим счета с

out TCCR1B, wreg ;предделителем на 64

;Подпрограмма формирования прерывистого звука

wsig: ldi temp, 25

pwsig: ldi wreg, 0 ;Отключаем звук

out TCCR1A, wreg

in wreg, PIND ;Проверяем, не нажата ли кнопка

sbrs wreg, 2 ;СТОП/УСТАНОВКА, если да,

rjmp main ;переходим в РЕЖИМ ОЖИДАНИЯ

rcall bufset ;Выводим текущее значение таймера

dec temp

cpi temp, 0

brne pwsig

setsig: ldi wreg, 0x40 ;По прошествии задержки включаем звук

out TCCR1A, wreg

rcall wait ;Включаем задержку

rcall wait

rcall wait

rcall wait

rcall wait

rjmp wsig ;Возвращаемся в начало цикла

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]