МІНІСТЕРСТВО ОСВІТИ І НАУКИ УКРАЇНИ
НАЦІОНАЛЬНИЙ УНІВЕРСИТЕТ "ЛЬВІВСЬКА ПОЛІТЕХНІКА"
ІНСТИТУТ КОМП’ЮТЕРНИХ ТЕХНОЛОГІЙ, АВТОМАТИКИ ТА МЕТРОЛОГІЇ
КАФЕДРА ”ЗАХИСТ ІНФОРМАЦІЇ”
Звіт
до лабораторної роботи № 3
з курсу: "Мікропроцесори в системах технічного захисту інформації"
на тему: “Побудова інфрачервоних детекторів руху на AVR-мікроконтролерах”
Варіант – 17
Мета роботи: Ознайомитись з будовою та принципом дії інфрачервоних детекторів руху і їх програмно-апаратною реалізацією на AVR-мікроконтролерах.
Повний текст завдання:
Домашня підготовка до роботи:
Вивчити теоретичний матеріал.
Вивчити основні властивості МК, принципи побудови інфрачервоних детекторів руху необхідні для виконання лабораторної роботи.
Підготувати програму функціонування інфрачервоного детектора руху згідно індивідуального завдання у табл. 1. Коефіцієнт підсилення аналогових кіл прийняти рівним 1924.
Виконання в лабораторії:
Створити проект в AVR Studio, ввести свою програму, провести її асемблювання.
В режимі покрокової відладки переконатися в правильності роботи програми.
Відкрити файл LR_3.dsn в програмі Proteus, внести зміни у схему відповідно до свого індивідуального завдання, підключити до МК отриманий в AVR Studio hex-файл.
Запустити режим симуляції схеми та перевірити правильність функціонування детектора у всіх режимах роботи.
Табл. 1.
№
Тактова частота, МГц
Період опитування АЦП Tadc, с
Максимальний рівень шуму, мкВ
Час встановлення PIR-давача Tset, с
Час включення світлодіода Talarm, с
Вивід МК для підключення світлодіода
Виводи МК для підключення АЦП
17
10
0,17
320
32
35
PD1
PD2,3,4,5
Лістинг програми одержаної в AVR Studio та необхідні розрахунки:
.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 = PD4 ;PB6
.equ SCLK = PD3 ;PB5
.equ DOUT = PD5 ;PB7
.equ SHDN = PD2 ;PB4
.equ PORT_ADC = PORTD
.equ DDR_ADC = DDRD
.equ PIN_ADC = PIND
; Світлодіод
.equ Led = PD1
.equ PORT_Led = PORTD
.equ DDR_Led = DDRD
.equ PIN_Led = PIND
;//////////////////////////////////////////////////////////////////////////
;///////////////////////////////Константи//////////////////////////////////
; Верхній поріг
.equ VTR_P = 2552 ; VTR = (3.11568 * 4096)/5
; Нижній поріг
.equ VTR_N = 1543 ; VTR = (1.88432 * 4096)/5
; Константа для задання періоду опитування АЦП таймером Т1 в режимі порівняння (DIV=64)
.equ T_300ms = 26562 - 1 ; N = (FT * TADC / DIV) - 1
; Константи для підпрограми часової затримки
.equ T_4s = (10000000*4 - 15)/5
.equ T_3s = (10000000*3 - 15)/5
;//////////////////////////////////////////////////////////////////////////
;///////////////////////////////Оголошення макросів////////////////////////
; Макрос зчитування одного біту з АЦП МАХ1241
.MACRO BIT_READ
sbi PORT_ADC, SCLK ; Сформувати передній фронт таткового імпульсу __|
nop
nop
nop
nop ; Затримка
cbi PORT_ADC, SCLK ; Сформува задній фронт тактового імпульсу
nop
nop
nop
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) ;| (1<<Led)
out DDR_ADC, temp1
;ldi temp1, (1<<Led)
;out PORT_Led, temp1
;out DDR_Led, temp1
sbi PORT_Led, Led
sbi DDR_Led, Led
; Затримка 32 секунди для встановлення PIR-давача (8 * 4 сек)
;ldi temp1, 8 ; Лічильник 4 секундних затримок
Next_1:
; Задати затримку 4 сек
ldi Delay1, low(T_4s)
ldi Delay2, high(T_4s)
ldi Delay3, byte3(T_4s)
; Виклик підпрограми часової затримки (4 сек)
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
; Затримка на час включення світлодіоду 3 сек
ldi Delay1, low(T_3s)
ldi Delay2, high(T_3s)
ldi Delay3, byte3(T_3s)
cbi PORT_LED, LED ; Включити світлодіод
rcall Delay ; Почекати 3 сек
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
Wait_4us
Wait_4us
Wait_4us
Wait_4us
Wait_4us
Wait_4us
; Очистити регістри результату
clr result_h
clr result_l
; Почати перетворення - подати на лінію #CS логічний 0
cbi PORT_ADC, CS
nop
nop
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 PORT_ADC, 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 ; Вихід з підпрограми
;*********************************************************************
Схема симуляції в Proteus:
Висновок:
Виконавши лабораторну роботу ми ознайомились з принципами роботи інфрачервоних детекторів руху і їх реалізацією на AVR-мікроконтролерах. Розширили навики створення та відладки програмно-апаратних засобів на основі мікроконтролерів сімейства AVR у програмах AVR Studio та Proteus 7.
Також виконуючи дану роботу ми ознайомились з принципами оцифровування аналогових сигналів, та роботою аналогово-цифрових перетворювачів на прикладі АЦП MAX 1241, та управління роботою програми за допомогою внутрішніх таймерів-лічильників, що використовуються для лічби, порівняння та ін.