Главная  Радио и связь 

0 1 2 3 [ 4 ] 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93

. equ

door

= PD2

. equ

code

= PD3

.equ

open

= PD4

.equ

lock

= PB2

.equ

alarm

= PBl

.equ

hi =

.cseg

.org 0

rjmp

RESET

;Reset Handler

;rjnip EXT INT0

;IRQO Handler

;rjmp EXT INT1

;IRQ1 Handler

;rjmp TIM CAPT1

;Timerl Capture Handler

;rjmp TIM C0MP1

;Timer1 Compare Handler

;rjmp TIM 0VF1

;Timerl Overflow Handler

;rjmp TIM OVF0

;TimerO Overflow Handler

;rjmp UART RXC

;UART RX Complete ;Handler

;rjmp UART DRE

;UDR Empty Handler

;rjmp UART TXC

;UART TX Complete Handler

;rjmp ANA COMP

;Analog Comparator Handler

RESET:

tmp,low(RAMEND)

;Определение начала

SPL.tmp

/стека в ОЗУ

/Очистить регистр tmp (= 0)

DDRD.tmp

;Линии порта D - входы

PORTB,tnip

;На всех линиях порта В /установить НИЗКИЕ уровни

/Установить tmp (= $ff)

PORTD,tnip

/Установить на всех линиях /порта D ВЫСОКИЕ уровни

DDRB,tm,p

/Линии порта В - выходы

PIND,tmp

/Эта операция только для отладчика

Idi tmp,15 out WDTCR,tmp

main: wdr sbis

PIND,code

/Studio. Ha входных контактах порта D /установить ВЫСОКИЕ уровни. Если не /вставить эту команду, то при каждой новой /отладке придется вручную устанавливать /PIND в окне New 10 View. Если PIND не /установить, отладчик будет воспринимать /состояние линий порта D таким, как при /одновременном нажатии трех кнопок: /«ДВЕРЬ», «КОДОВОЕ УСТРОЙСТВО» и /«ОТПИРАНИЕ ИЗНУТРИ» /Инициализация сторожевого /таймера: при отсутствии команды /сброса (wdr) в течение 2 с /произойдет переход на прерывание /RESET

/Очистка Т-флага регистра флагов /Сброс сторожевого таймера /Пропуск следующей команды, /если на линии code (PD3) /ВЫСОКИЙ уровень



rcall sbis

rcall sbis

rcall

rjmp

OpenLock FIND,open

OpenLock FIND,door

DoorlsOpen

;Вызов подпрограммы OpenLock

;Пропуск следующей команды,

;если на линии open (PD4)

;ВЫСОКИЙ уровень

/Вызов подпрограммы OpenLock

/Пропуск следующей команды,

/если на линии door (PD2)

/ВЫСОКИЙ уровень

/Вызов подпрограммы DoorlsOpen

/Очитска Т-флага регистра флагов

/Возврат к команде с меткой main:

/Подпрограмма управления замком

OpenLock;

rcall rcall rcall rcall cbi

PORTB,lock

dSOOms dSOOms dSOOms dSOOms PORTB,lock

/Установка ВЫСОКОГО уровня /на линии lock порта В /Четыре вызова подпрограммы /Задержки на 500 мс каждая

Установка НИЗКОГО уровня на линии lock (РВ2) Загрузка в tmp константы 10 Вызов подпрограммы задержки на 500 мс Уменьшение содержимого tmp на 1 Если флаг Z в регистре флагов не равен 1 (содержимое tmp не стало равным нулю), перейти на метку more: Установить флаг Т в регистре флагов Возврат из подпрограммы /Подпрограмма управления сиреной и светодиодон

Idi tmp,10

more: rcall d500ms

dec tmp

brne more

set ret

DoorlsOpen:

brts NoClose

sbi PORTB,hi

Idi Idi

XL,low(500) XH,high(500)

NewPls:wdr sbi

PORTB,alarm rcall d05ms cbi PORTB,alarm

Если в регистре флагов флаг т

установлен, то перейти

на метку NoClose:

Установить ВЫСОКИЙ уровень

на линии hi (РВО)

Загрузить в пару регистров

XHiXL константу 500

(в XL загрузить младший

байт числа 500,

в ХН - старший байт числа 500)

Сбросить сторожевой таймер

Установка ВЫСОКОГО уровня

на линии alarm (РВ1)

Вызов подпрограммы задержки

на 0.5 мс

Установка НИЗКОГО уровня



rcall d05ms

sbiw XL,1

brne NewPls

rcall dSOOms

rjmp NoClose:

sbis

Г]Шр

DoorlsOpen PIND,door

NoClose

/Подпрограмма задержки на 0.5 мс

;на линии alarm (PBl)

/Вызов подпрограммы

/задержки на 0.5 мс

/Вычитание единицы из

/двухбайтного слова,

/хранящегося в регистрах XH:XL

/Если флаг Z регистра флагов не равен

/нулю (содержимое XHrXL

/не равно нулю), перейти

/на метку NewPls:

/Вызов подпрограммы задержки

/на 0.5 мс

/Возврат на метку DoorlsOpen

/Пропустить следующую команду, /если на линии door (PD2) /ВЫСОКИЙ уровень /Переход на метку NoClose /Возврат из подпрограммы

d05ms: wdr Idi Idi

d05 l: sbiw

YL,low(497)

YH,high(497)

YL,1

brne d05 l

/Подпрограмма задержки на 500 мс

d500ms:ldi XL,low(1000)

Idi XH,high(1000)

d500 l:rcall d05ms

sbiw XL,1

brne d500 l

/Сброс Сторожевого таймера /Загрузка в YH:YL константы 497

/Вычитание из содержимого YH:YL /единицы

/Если флаг ZoO (результат /выполнения предыдущей команды /не равен нулю), перейти /на метку d05 l: /Возврат из подпрограммы

/Загрузка в XHrXL

/константы 1000

/Вызов подпрограммы задержки

/на 0.5 мс

/Вычитание единицы

/из содержимого XHrXL

/Если результат не равен нулю,

/перейти на метку d500 l:

/Возврат из подпрограммы

Рассмотрим набранную программу

Программа начинается с директивы .include «имя файла», которую AVR Studio воспринимает так, как если бы вместо нее было вставлено содержимое файла. После начала отладки появится возможность просмотреть содержимое этого файла.



0 1 2 3 [ 4 ] 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93


0.0053