- •Федеральное агентство образования российской федерации
- •Кафедра «Электронные, радиоэлектронные и электротехнические системы» курсовой проект по дисциплине «Цифровые устройства и микропроцессоры»
- •Часть 1. Разработка устройства логического управления ……………….………4
- •Часть 2. Разработка таймера на основе микроконтроллера ……………………23
- •Часть 1. Разработка устройства логического управления.
- •Структурный синтез устройства и выбор элементной базы
- •1.1 Структурный синтез устройства, формирующего условия переходов
- •1.2 Структурный синтез дискретного автомата
- •1.3 Синтез декодера выходных состояний
- •1.4 Выбор элементной базы
- •Синтез вспомогательных логических устройств
- •2.2 Синтез таймера
- •Синтез тактового генератора
- •Синтез устройства индикации
- •Синтез устройства начального пуска
- •Моделирование
- •3.1 Моделирование автомата
- •3.2 Моделирование таймера и тактового генератора
- •Часть 2. Разработка таймера на основе микроконтроллера.
- •Анализ задания и составление функциональной схемы
- •Выбор элементной базы
- •6.1 Выбор микропроцессорного устройства
- •6.2 Выбор устройства индикации
- •Устройство звуковой сигнализации
- •Разработка принципиальной схемы системы
- •Разработка алгоритма работы таймера
- •8.1 Словесное описание
- •8.2 Блок-схема алгоритма работы таймера
- •Разработка программы
- •Моделирование
-
Разработка алгоритма работы таймера
8.1 Словесное описание
-
Включение таймера производится нажатием на кнопку «ВКЛ/ОТКЛ». Кнопка должна быть с фиксацией, прерывать цепь питания схемы.
-
Сразу после включения таймер находится в режиме ожидания. Цифровая клавиатура (кнопки «0» … «9») не активна, на индикаторах выводится значение «00». В этом режиме при нажатии на кнопку «СТАРТ» должен сработать режим звуковой сигнализации.
-
При нажатии на кнопку «СТОП/УСТАНОВКА» в режиме ожидания включается режим установки. При этом цифровая клавиатура становится активна, кнопка «СТАРТ» не активна и не должна реагировать на нажатие.
Нажатие кнопки «СТОП/УСТАНОВКА» в режиме установки обеспечивает переход в режим ожидания.
-
Если таймер не находится в режиме установки, то при нажатии на кнопку «СТАРТ» происходит переход в режим таймера. При этом цифровая клавиатура становится неактивна.
При нажатии кнопки «СТОП/УСТАНОВКА» происходит выход из режима таймер, переход в режим ожидания. В этом случае при нажатии кнопки «СТАРТ» осуществляется возврат в режим таймера, при нажатии кнопки «СТОП/УСТАНОВКА» - переход в режим установки.
-
При обнулении таймера в режиме таймер переход в режим звуковой сигнализации. При нажатии кнопки «СТОП/УСТАНОВКА» выход из режима звуковой сигнализации в режим ожидания.
8.2 Блок-схема алгоритма работы таймера
По словесному описанию приведенному в п. 8.1 составим блок-схему алгоритма работы таймера.
Рис. 8.2 Блок-схема алгоритма работы таймера
-
Разработка программы
Начальные настройки микроконтроллера
Приведем листинг программы с начальными настройками микроконтроллера
;Подключаем файл описаний
.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 ;Возвращаемся в начало цикла