Разработка устройств на основе микроконтроллеров AVR фирмы Atmel Corporation

Автор работы: Пользователь скрыл имя, 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

Работа состоит из  1 файл

Мой курсовой.DOC

— 360.00 Кб (Скачать документ)

            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(zad) ; Записываем коэффициент задержки

            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) ; В регистровую пару Z записываем

            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) ; В регистровую пару Z записываем

            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