МІНІСТЕРСТВО ОСВІТИ І НАУКИ УКРАЇНИ
НАЦІОНАЛЬНИЙ УНІВЕРСИТЕТ "ЛЬВІВСЬКА ПОЛІТЕХНІКА"
ІНСТИТУТ КОМП’ЮТЕРНИХ ТЕХНОЛОГІЙ, АВТОМАТИКИ ТА МЕТРОЛОГІЇ
КАФЕДРА ”ЗАХИСТ ІНФОРМАЦІЇ”
Звіт
до лабораторної роботи № 3
з курсу: "Мікропроцесори в системах ТЗІ"
Варіант №4
Мета роботи – ознайомитись з будовою та принципом дії інфрачервоних детекторів руху і їх програмно-апаратною реалізацією на AVR-мікроконтролерах.
Домашня підготовка до роботи
1. Вивчити теоретичний матеріал.
2. Вивчити основні властивості мікроконтролера AT90S2313, принципи побудови інфрачервоних детекторів руху необхідні для виконання лабораторної роботи.
3. Підготовити програму функціонування інфрачервоного детектора руху згідно індивідуального завдання у Табл. 1. Коефіцієнт підсилення аналогових кіл прийняти рівним 1924.
Виконати в лабораторії
1. Створити проект в AVR Studio, ввести свою програму, провести її асемблювання.
2. В режимі покрокової відладки переконатися в правильності роботи програми, перевірити дотримання заданих в завданні часових параметрів та умов спрацювання.
3. Відкрити файл LR_3.dsn у програмі Proteus, внести зміни у схему відповідно до свого індивідуального завдання, підключити до МК отриманий в AVR Studio hex-файл та асемблерний файл.
4. Запустити режим симуляції схеми та перевірити правильність функціонування детектора руху у всіх режимах роботи.
Лістинг програми
; *******************************************
; Автор: ПІБ *
; Дата: 01.09.2010 *
; Версія: 1.0 *
; Ім'я файлу: LR_3.asm *
; Тип МК: AT90S2313 *
; Тактова частота: 4 MГц *
; *******************************************
;//////////////////////////////////////////////////////////////////////////
.nolist
.include "2313def.inc"
.list
;//////////////////Регістри для зберігання змінних/////////////////////////
.def result_h = r16 ; Розряди D11-D8 поточного результату АЦП
.def result_l = r17 ; Розряди D7-D0 поточного результату АЦП
.def temp1 = r18 ; Проміжні результати
.def temp2 = r19 ; Проміжні результати
; Регістри часової затримки
.def Delay1 = r21
.def Delay2 = r22
.def Delay3 = r23
;//////////////////////////////////////////////////////////////////////////
;//////////////////Виводи для підключення елементів схеми//////////////////
; АЦП
.equ #CS = PB0
.equ SCLK = PB1
.equ DOUT = PB2
.equ #SHDN = PB3
.equ PORT_ADC = PORTB
.equ DDR_ADC = DDRB
.equ PIN_ADC = PINB
; Світлодіод
.equ Led = PD3
.equ PORT_Led = PORTD
.equ DDR_Led = DDRD
.equ PIN_Led = PIND
;//////////////////////////////////////////////////////////////////////////
;///////////////////////////////Константи//////////////////////////////////
; Верхній поріг
.equ VTR_P = 2189 ; VTR = (2.981 * 4096)/5
; Нижній поріг
.equ VTR_N = 1906 ; VTR = (2.019 * 4096)/5
; Константа для задання періоду опитування АЦП таймером Т1 в режимі порівняння (DIV=64)
.equ T_300ms = 5000 – 1 ; N = (F * T / DIV) - 1
; Константи для підпрограми часової затримки
.equ T_5s = (4000000*1 - 15)/5
.equ T_3s = (4000000*2 - 15)/5
;//////////////////////////////////////////////////////////////////////////
;///////////////////////////////Оголошення макросів////////////////////////
; Макрос зчитування одного біту з АЦП МАХ1241
.MACRO BIT_READ
sbi PORTB, SCLK ; Сформувати передній фронт таткового імпульсу __|
nop ; Затримка
cbi PORTB, SCLK ; Сформува задній фронт тактового імпульсу
nop ; Затримка для встановлення біту на лінії DOUT
in temp1, PIN_ADC ; Прочитати сигнали з виводів АЦП
sbrc temp1, DOUT ; Якщо DOUT = 1
ori @0, @1 ; Занести 1 (параметр @1) у відповідний розряд регістра
.ENDMACRO
; Макрос затримки на 10 мкс
.MACRO Wait_4us
rjmp PC+1
rjmp PC+1
rjmp PC+1
rjmp PC+1
rjmp PC+1
rjmp PC+1
rjmp PC+1
rjmp PC+1
.ENDMACRO
;//////////////////////////////////////////////////////////////////////////
.listmac
.cseg
.org 0
rjmp RESET ; Вектор скиду
.org 0x04
rjmp TIM_COMP1 ; Вектор переривання від таймера Т1 в режимі «Порівняння»
.org 0x0B
RESET: ; Основна програма
; Ініціалізація стеку
ldi temp1, low(RAMEND)
out SPL, temp1
ldi temp1, (1<<#CS)
out PORT_ADC, temp1
; DOUT - вхід, #CS, DCLK, #SHDN - виходи
ldi temp1, (1<<#CS) | (1<<SCLK) | (1<<#SHDN)
out DDR_ADC, temp1
ldi temp1, (1<<Led)
out PORT_Led, temp1
out DDR_Led, temp1
; Затримка 35 секунд для встановлення PIR-давача (4 * 5 сек)
ldi temp1, 20 ; Лічильник 5 секундних затримок
Next_1:
; Задати затримку 5 сек
ldi Delay1, low(T_5s)
ldi Delay2, high(T_5s)
ldi Delay3, byte3(T_5s)
; Виклик підпрограми часової затримки (5 сек)
rcall Delay
dec temp1 ; Зменшити лічильник на 1
brne Next_1 ; Якщо лічильник не нуль, перейти на мітку Next_1
; Дозвіл переходу в режим пониженого енергоспож-ня (SЕ=1), встановити режим Idle (SM=0)
ldi temp1, (1<<SE)
out MCUCR, temp1
; Занести в регістр порівняння таймера Т1 розраховану константу T_300ms
ldi temp1, high(T_300ms)
out OCR1AH, temp1 ; Спочатку занести старший байт
ldi temp1, low(T_300ms)
out OCR1AL, temp1 ; Потім молодший байт
; Дозволити переривання від таймера Т1 в режимі порівняння
ldi temp1, (1<<OCIE1A)
out TIMSK, temp1
; Запустити таймер Т1, задати DIV=64, скидання TCNT1 в ноль при співпадінні
ldi temp1, (1<<CTC1) | (1<<CS11) | (1<<CS10)
out TCCR1B, temp1
; Дозволити переривання
sei
Wait_Loop:
sleep ; Перейти в режим пониженого енергоспоживання
rjmp Wait_Loop ; Після пробудження від Т1, знову перейти в режим сну
;*********************************************************************
TIM_COMP1: ; П/п обробки переривання від таймера Т1 в режимі порівняння
; Викликати п/п аналого-цифрового перетворення
rcall ADC_CONV
; Обчислити |VTR+ - RESULT|
; Занести в temp2-temp1 значення верхнього порога
ldi temp1, low(VTR_P)
ldi temp2, high(VTR_P)
; Відняти від верхнього порога поточне значення АЦП (VTR+ - RESULT)
sub temp1, result_l
sbc temp2, result_h
; Якщо результат < 0, то сигнал АЦП перевищив верхній поріг і треба включити тривогу
brlo Alarm ; Якщо VTR_P < RESULT перейти на мітку Alarm
; Якщо сигнал АЦП < VTR+ треба перевірити чи він не виходить за межі нижнього порогу
; Обчислити |VTR- - RESULT|
; Занести в temp2-temp1 значення нижнього порогу
ldi temp1, low(VTR_N)
ldi temp2, high(VTR_N)
; Відняти від нижнього порогу поточне значення АЦП (VTR- - RESULT)
sub temp1, result_l
sbc temp2, result_h
; Якщо результат >= 0, то сигнал АЦП менший нижнього порогу і треба включити тривогу
brsh Alarm ; Якщо VTR_N > RESULT перейти на мітку Alarm
; Якщо сигнал не вийшов за межі порогів – виключити світлодіод і перейти в кінець п/п
LL1:
sbi PORT_LED, LED ; Виключити світлодіод
rjmp End ; Перейти на мітку End
; Якщо виявлено порушника
Alarm:
clr temp1 ; temp1 = 0
out TCCR1B, temp1 ; Зупинити таймер Т1
; Затримка на час включення світлодіоду 5 сек
ldi Delay1, low(T_5s)
ldi Delay2, high(T_5s)
ldi Delay3, byte3(T_5s)
cbi PORT_LED, LED ; Включити світлодіод
rcall Delay ; Почекати 5 сек
sbi PORT_LED, LED ; Виключити світлодіод
; Включити таймер Т1 з попередніми параметрами
ldi temp1, (1<<CTC1) | (1<<CS11) | (1<<CS10)
out TCCR1B, temp1
End:
reti ; Вихід з п/п обслуговування переривання
;*********************************************************************
ADC_CONV: ; П/п аналого-цифрового перетворення для МАХ1241
; Вивести АЦП з режиму ShutDown (#SHDN = 1)
sbi PORT_ADC, #SHDN
; Почекати > 10 мкс, поки АЦП перейде в робочий режим
Wait_4us
Wait_4us
Wait_4us
; Очистити регістри результату
clr result_h
clr result_l
; Почати перетворення – подати на лінію #CS логічний 0
cbi PORT_ADC, #CS
nop ; Затримка для встановлення сигналу на лінії DOUT
; Чекати завершення перетворення – поки лінія DOUT не стане рівна 1
EOC: sbis PIN_ADC, DOUT ; Пропустити наступну команду, якщо DOUT = 1
rjmp EOC ; Якщо DOUT = 0 – продовжити чекати
; Зчитати результат перетворення
; Старші 4 біти результату – в регістр result_h
BIT_READ result_h, 0b00001000 ; Розряд D11
BIT_READ result_h, 0b00000100 ; Розряд D10
BIT_READ result_h, 0b00000010 ; Розряд D9
BIT_READ result_h, 0b00000001 ; Розряд D8
; Молодші 8 біт результату – в регістр result_l
BIT_READ result_l, 0b10000000 ; Розряд D7
BIT_READ result_l, 0b01000000 ; Розряд D6
BIT_READ result_l, 0b00100000 ; Розряд D5
BIT_READ result_l, 0b00010000 ; Розряд D4
BIT_READ result_l, 0b00001000 ; Розряд D3
BIT_READ result_l, 0b00000100 ; Розряд D2
BIT_READ result_l, 0b00000010 ; Розряд D1
BIT_READ result_l, 0b00000001 ; Розряд D0
; Завершити перетворення (лінія #CS = 1)
sbi PORTB, #CS
; Перевести АЦП в режим ShutDown (лінія # SHDN = 0)
cbi PORT_ADC, #SHDN
ret ; Вихід з підпрограми
;*********************************************************************
Delay: ; Підпрограма часової затримки
subi Delay1, 1 ; Зменшити регістри Delay3-Delay2-Delay1 на 1
sbci Delay2, 0
sbci Delay3, 0
brcc Delay ; Поки результат >= 0 продовжити віднімати 1
nop ; Затримка на 1 такт
ret ; Вихід з підпрограми
;*********************************************************************
Схема симуляції в Proteuz
Висновок: ознайомитись з будовою та принципом дії інфрачервоних детекторів руху і їх програмно-апаратною реалізацією на AVR-мікроконтролерах. Розширити навики створення та відладки програтно-апаратних засобів на основі мікроконтролерів сімейства AVR в програмах AVR Studio та Proteus 7.