Автор работы: Пользователь скрыл имя, 17 Мая 2012 в 19:37, курсовая работа
Научно-технический прогресс неутомимо идет вперед, в результате не только в промышленной, но и в бытовой технике все шире используются встроенные компьютерные системы на основе микроконтроллеров.
Вступление……………………………………………………………………………...3
Раздел 1. Разработка устройств на основе микроконтроллеров AVR фирмы Atmel Corporation……………………………………………………………………………....4
1.1. Общий обзор микроконтроллеров AVR…………………………………...4
1.2. Программное обеспечение…………………………………………………8
1.2.1. AVR Studio…………………………………………………….……8
1.2.2. Code Vision AVR…………………………………………………...9
1.4. Обзор микроконтроллеров AVR семейства Tiny………………………..10
Раздел 2. Задание на разработку устройства на основе микроконтроллера AVR..13
2.1. Выбор элементов системы управления и разработка принципиальной схемы……………………………………………………………………………13
2.2 Разработка алгоритма управляющей программы………………………...16
Раздел 3. Программная реализация задачи………………………………………….18
Вывод…………………………………………………………………………………..29
Список использованной литературы………………………………………………...30
reti ; Прерывание UART регистр данных пуст
reti ; Прерывание UART передача завершена
reti ; Прерывание по компаратору
reti ; Прерывание по изменению на любом контакте
reti ; Таймер/счетчик 1. Совпадение B
reti ; Таймер/счетчик 0. Совпадение B
reti ; Таймер/счетчик 0. Совпадение A
reti ; USI Стартовая готовность
reti ; USI Переполнение
reti ; EEPROM Готовность
reti ; Переполнение охранного
таймера
;*****************************
;* Модуль инициализации *
;*****************************
init:
;-------------------------- Инициализация
стека
ldi temp, RAMEND ; Выбор адреса вершины стека
out SPL, temp ; Запись его в регистр
стека
;-------------------------- Инициализация
портов В/В
ldi temp,0x18 ; Инициализация порта PB
out DDRB,temp
ldi temp,0xE7
out PORTB,temp
ldi temp, 0x0F ; Инициализация порта PD
out DDRD, temp
ldi temp, 0x7F
out PORTD, temp
;--------------------------- Инициализация
(выключение) компаратора
ldi temp, 0x80
out ACSR, temp
;--------------------------- Номер
мелодии
ldi temp,0
sts melod,temp
;*****************************
;* Начало основной программы *
;*****************************
main:
;--------------------------- Инициализация
таймера
ldi temp,high(
out OCR1AH,temp
ldi temp,low(zad)
out OCR1AL,temp
ldi temp,0x03 ; Режим работы таймера
out TCCR1B,temp
m0: rcall incod ; Ввод и проверка кода клавиш
brne m0
m1: in temp,PINB ; Проверка кнопки звонка
sbrs temp,6
rjmp kk1 ; Если нажата, переходим
к звуковой части
m2: ldi ZH,high(bufr) ; Установка указателя
ldi ZL,low(bufr)
clr count ; Сброс счетчика байт
;---------------------- Цикл
ввода кода
m3: cli ; Запретить все прерывания
ldi data,1 ; Вызываем задержку первого типа
rcall wait ; К подпрограмме
задержки
m5: rcall incod ; Ввод и проверка кода кнопок
st Z+,Key ; Записываем его в буфер
inc count ; Увеличение счетчика байтов
cpi count,bsize ; Проверяем не конец ли буфера
brsh m7 ; Если конец, завершаем
ввод кода
mov prewcode,Key; Записываем код
как старый
ldi data,2 ; Вызываем задержку второго типа (подготовка к задержке)
rcall wait
m6: rcall incod ; Ввод и проверка кода кнопок
cp Key,prewcode
brne m3 ; Если изменилось, записываем в буфер
cpi flz,1 ; Проверка окончания фазы ввода кода
brne m6
m7: sbic PINB,7 ; Проверка состояния тумблера
rjmp m9 ; Если тумблер в режиме"работы", то на проверку кода
ldi addre,0x08 ; Адрес начала хранения кода
rcall eerd ; Чтение значения ячейки из EEPROM
cpi data,0xFF ; Сравнение со значением FF(пусто)
breq eewrite ; Если равны, то
пропускаем проверку и переходим к записи
; ----------------------------- Процедура проверки кода
m9:
ldi addre,klen ; Адрес хранения длины кода
rcall eerd ; Чтение длины кода из EEPROM
cp count,data ; Сравнение с новым значением
brne m13 ; Если не равны, к началу
ldi addre,bufe ; В YL начало буфера в EEPROM
ldi ZH,high(bufr)
ldi ZL,low(bufr)
m10: rcall eerd ; Читаем байт из EEPROM и
ld temp,Z+ ; Читаем байт из ОЗУ и
cp data,temp ; Сравниваем байты разных кодов
brne m13 ; Если не равны, переходим
к началу
dec count ; Уменьшаем содержимое счетчика байтов
brne m10
rjmp m11
; ----------------------------- Режим записи кода
eewrite:
mov data,count ; Помещаем длину кода в data
ldi addre,klen ; Адрес хранения длины кода
rcall eewr ; Записываем в длину
кода EEPROM
ldi addre,bufe ; В регистр адреса начало буфера
ldi ZH,high(bufr)
ldi ZL,low(bufr)
m8: ld data, Z+ ; Читаем очередной байт из ОЗУ
rcall eewr ; Запись байта в EEPROM
dec count ; Декримент счетчика байтов
brne m8
; ----------------------------- Открывание замка
m11:
sbi PORTB,4 ; Команда "Открыть замок"
ldi data,3 ; Вызываем задержку третьего типа
rcall wait
cbi PORTB,4 ; Команда "Закрыть
замок"
m13: rjmp main
;*****************************
;*
Вспомогательные процедуры
;*****************************
; Проверка прием данных от клавиатуры.
incod:
clr r31
clt ; Сброс признака что была нажата клавиша.
ldi r31,$0E ; Младьшая тетрада-запрос в порт, старшая -
rcall GetKeyAnswer ; смещение ответа.
brne KeyPressed
ldi r31,$3D
rcall GetKeyAnswer
brne KeyPressed
ldi r31,$6B
rcall GetKeyAnswer
brne KeyPressed
ldi r31,$97
rcall GetKeyAnswer
brne KeyPressed
ret
KeyPressed:
set
swap r31
andi r31,$0F
swap Key
andi Key,$07
CCFind: inc r31 ; Поиск какой конкретно бит установлен.
lsr Key
brcc CCFind
breq NoMul
clt ; Если нажато несколько клавиш то не нажата ни одна.
NoMul: mov Key,r31
ret
; Сканирование клавиатуры: установка на выходных линиях заданого кода и прием
; ответа вызыватеся из функции GetKey.
GetKeyAnswer:
mov Key,r31
andi Key,$0F
out PORTD,Key
clr DelayVar
Delay1: dec DelayVar
brne Delay1
in Key,PIND
com Key
andi Key,$70 ; Если что то было найдено флаг Z нулевой.
ret
; ------------------------------ Подпрограмма задержки
wait:
cpi data,1 ; Проверяем код задержки
brne w1
ldi temp,0x40 ; Разрешаем прерывание по совпадению
rjmp w2
w1: ldi temp,0x80 ; Разрешаем
прерывания по переполнению
w2: out TIMSK,temp ; Записываем маску
clr temp ; Обнуляем таймер
out TCNT1H,temp
out TCNT1L,temp
ldi flz,0 ; Сбрасываем флаг задержки
sei ; Разрешаем прерывания
cpi data,2 ; Если это задержка 2-го типа
breq w4 ; Завершаем подпрограмму
w3: cpi flz,1 ; Ожидание окончания задержки
brne w3
w4: ret
; ------------------------------ Запись байта в ячейку EEPROM
eewr:
sbic EECR,EEWE ; Проверяем готовность EEPROM
rjmp eewr ; Если не готов ждем
out EEAR,addre ; Записываем адрес в регистр адреса
out EEDR,data ; Записываем данные в регистр данных
sbi EECR,EEMWE ; Устанавливаем бит разрешения записи
sbi EECR,EEWE ; Устанавливаем бит записи
inc addre ; Увеличиваем адрес в EEPROM
ret
; ------------------------------ Чтение байта из ячейки EEPROM
eerd:
sbic EECR,EEWE ; Проверяем готовность EEPROM
rjmp eerd ; Если не готов ждем
out EEAR,addre ; Записываем адрес в регистр адреса
sbi EECR,EERE ; Устанавливаем бит инициализации чтения
in data, EEDR ; Помещаем прочитанный байт в temp
inc addre ; Увеличиваем адрес в EEPROM
ret
;*****************************
;*
Процедура обработки
;*****************************
propr: ldi flz,1 ; Установка флага задержки
reti ; Завершаем обработку
прерывания
;*****************************
;*
Мелодичный звонок
;*****************************
kk1:
;--------------------------- Инициализация
таймера T1
ldi temp, 0x09 ; Включаем режим CTC
out TCCR1B, temp
km1: ldi temp, 0x00 ; Выключаем звук
out TCCR1A, temp
;-------------------------- Вычисление
номера нажатой кнопки
Информация о работе Разработка устройств на основе микроконтроллеров AVR фирмы Atmel Corporation