ОБРАБОТКА ВНЕШНИХ ПРЕРЫВАНИЙ МК AVR

February 24, 2011 by admin Комментировать »

В качестве входов внешних прерываний используются входы портов с альтернативной функцией: PD2, PD3 – для прерываний INTO, INT1 и РЕО – для прерывания INT2 в микроконтроллере ATmega8515. Запросы внешних прерываний INTO, INT1 могут быть представлены низким уровнем сигнала прерывания (L), переходом от высокого уровня сигнала к низкому (HL – по отрицательному фронту), переходом от низкого уровня сигнала к высокому (LH – по положительному фронту), запрос INT2 только переходами (LH) и (HL). В зависимости от типа запроса в регистре управления микроконтроллера MCUCR необходимо установить биты ISCxO и ISCxl согласно табл. 2.1 для каждого из прерываний INTx (х = 0,1) и определить бит ISC2 в регистре EMCUCR для прерывания

INT2. При ISC2 = О прерывание осуществляется по отрицательному фронту, при ISC2 = I – по положительному.

Далее подготовим программу переключения светодиодов с использованием внешнего прерывания от кнопки STOP.

Согласно поставленным условиям, в блок инициализации микроконтроллера внесем ряд изменений:

–   добавим вектор прерываний;

–   указатель стека установим на последнюю ячейку ОЗУ;

–    разрешим внешнее прерывание INTO (по сигналу О на линии 2 порта PD) и прерывания вообще.

Поскольку внешнее прерывание INTO представлено сигналом на входе порта PD2, в качестве кнопки STOP используем кнопку

SW2 и программируем PD2 на ввод. Пример программы 2.2 приведен ниже. Задержка представлена подпрограммой DELAY. Программа работает аналогично 2.1, но нажатие кнопки STOP вызывает прерывание.

Программа 2.2

;Программа 2.2 для поочередного переключения светодиодов ;при нажатии на кнопку START (SWO). После нажатия на кноп- ;ку STOP (SW2) переключение прекращается и возобновляется ;с места остановки при повторном нажатии на кнопку START

г

.include "8515def.inc"    ;файл определений для AT90S8515

;.include "m8515def.inc"  ;файл определений для ATmega8515

.def temp = г1б           ;временный регистр

.def reg_led = г2 0       ;состояние регистра светодиодов

.equ START = О            ;0-й разряд порта PD

.org $000

прерываний***

rjmp INIT               ;обработка сброса

rjmp STOP_PRESSED       ;обработка внешнего прерывания

; INTO(STOP)

;* *^Инициализация МК*** INIT: Idi reg_led,OxFE

Idi temp,$5F            ;установка

out SPL^temp            ; указателя стека

Idi temp,$02            ; на последнюю

out SPH^temp            ; ячейку ОЗУ

sec                     ;C=1

set                     ;T=1

ser temp                ;инициализация выводов

out DDRB^temp           ; порта PB на вывод

out PORTE,temp          ;погасить светодиоды

clr temp                ;инициализация

out DDRD,temp           ; порта PD на ввод

Idi temp,0x05           ;включение подтягивающих

out PORTD,temp          ; резисторов порта PD

Idi temp,0x7F           ;разрешение прерывания INTO

out GIMSK,temp          ; (6 бит GIMSK или GICR)

Idi temp,0x00           ;обработка прерывания INTO

out MCUCR,temp          ; no низкому уровню

sei                     ; разрешение прерываний WAITSTART: sbic PIND,START ; ожидание нажатия

rjmp WAITSTART         ; кнопки START

LOOP: out PORTB,reg_led ;включение светодиодов rcall DELAY      ;задержка

ser temp ^             ;выключение

out FORTH,temp         ; светодиодов

brts LEFT              ;переход, если флаг Т установлен

sbrs reg_led,О         ;пропуск следующей команды, если

; 0-й разряд reg_led установлен set  ;Т=1

гог reg_led            ;сдвиг reg_led вправо

rjmp LOOP

LEFT: sbrs reg_led,7      ;пропуск следующей команды, если

; 7-й разряд reg_led установлен clt  ;Т=0

го1 reg_led            ;сдвиг reg_led влево

rjmp LOOP

;; Обработка прерывания от кнопки STOP*** STOP_PRESSED:

WAITSTART_2:              ;ожидание

sbic PIND,START        ; нажатия

rjmp WAITSTART_2       ; кнопки START

reti

;*** Задержка *** DELAY:Idi rl7,2 dl: Idi rl8,2 d2: dec rl8 brne d2 dec rl7 brne dl ret

Задание 2. Проверить работу программы с помощью отладчика AVR Studio 4. Изменить параметры задержки, чтобы длительность задержки составила 0,5 с. Запрограммировать микроконтроллер и проверить работу программы.

Задание 3. Изменить программу для включения (выключения) светодиодов в одной из заданных последовательностей:

а)  7-6-5^3-2-1-0-1-2-3^5-6-7-6-5…

б) в четных разрядах;

в) в нечетных разрядах;

г)  последовательно увеличивая количество включенных (выключенных) светодиодов до восьми и затем уменьшая до нуля.

Отладив программу, загрузите ее в микроконтроллер и проверьте работу.

Задание 4. Изменить программу, добавив внешнее прерывание ESfTl (сигнал на линии PD3, адрес прерывания 002, бит 7 регистра маски GIMSK или GICR) от кнопки START. Открыв при отладке программы окно памяти данных, проверить работу стека, размещаемого в памяти с адреса $025F. Отлаженную программу загрузить в микроконтроллер и проверить ее работу.

Обработка кнопочного регистра с индикацией состояния

Ввод данных от кнопок рассмотрим на примере программы 2.3, выполняющей последовательный опрос и индикацию нажатия кнопок SWx (х = 0,1,2,3) кратковременным включением соответствующего светодиода LEDx, а также включением светодиодов LEDx (х = 4, 5, 6, 7) и выключением после повторного нажатия кнопок SWx (х = 4, 5, 6, 7).

Обратите внимание на использование в программе макроопределений для проверки состояния кнопок. При каждом нажатии кнопки значение соответствующего бита в слове состояния младшей и старшей групп кнопок (st_L, st_H) меняется на противоположное (командой еог) и сохраняется. Для вывода на светодиоды формируется байт вывода reg led.

Программа 2.3

;Программа 2.3 для обработки нажатий кнопок и индикации их ;состояний

.include "8515def.inc"    ;файл определений для AT90S8515 ;.include "m8515def.inc" ;файл определений для ATmega8515

.def temp = г16           ;временный регистр

.def st_L = rl7           ;состояние младшей группы SW_0123

.def st_H = rl8           ;состояние старшей группы SW_4567

.def sw_cod = г22         ;код состояния замкнутой кнопки

.def reg_led = г23        ;регистр состояния светодиодов

.macro testH_sw           ;макроопределение

sbic FIND, @0         ;проверка кнопки SWx(х=4,5,б,7)

rjmp quit             ; и установка

bid sw_cod, @0        ; бита замкнутой кнопки

еог st_H,sw_cod       ;переключение бита состояния

mov reg_led,st_H      ;байт для индикации

com reg_led           ;инвертирование для вывода

out PORTB,reg_led     ; на светодиоды

с1г reg_led           ;очистка

clr sw_cod

rcall DELAY               ;задержка

wait: sbis FIND, @0              ;кнопка отпущена?

rjmp wait quit: nop .endmacro testH_sw

.macro testL_sw                  ;макроопределение

sbic PIND,@0              ;проверка кнопки SWx(x=0,1,2,3)

rjmp quit                 ; и установка

bid sw_cod,@0             ; бита замкнутой кнопки

eor st_L,sw_cod           ;переключение бита состояния

mov reg_led,sw_cod        ;байт

or reg_led,st_H           ; для индикации

com reg_led               ;инвертирование для вывода

out PORTB,reg_led         ; на светодиоды

clr sw_cod

rcall DELAY_0             ;короткая задержка

ori reg_led,OxOf          ; перед гашением

out PORTB,reg_led         ; светодиодов младшей группы

quit: nop .endmacro testL_sw .org $000

rjmp init ;***Инициализация***

INIT: Idi temp,low(RAMEND) ;установка

out SPL,temp              ; указателя стека

Idi temp,high(RAMEND) ; на последнюю

out SPH,temp              ; ячейку ОЗУ

ser temp                  ;настройка

out DDRB,temp             ; порта PB

out PORTB,temp            ; на вывод

clr temp                  ;настройка

out DDRD,temp             ; порта PD

ser temp                  ; на

out PORTD,temp            ; ввод

clr sw_cod                ;очистка кода кнопки

clr st_L                  ;очистка операнда

clr st_H

clr reg_led

set                       ; T=1

input: testL_sw 0 testL_sw 1 testL_sw 2 testL sw 3

testH_sw 4 testH_sw 5 testH_sw б testH_sw 7 rjmp input Задержка *** DELAY_0: Idi r21,255 dO: dec r21 brne dO ret

Задержка *** DELAY: Idi rl9,10 dl: Idi r20,255 d2: Idi r21,255 d3: dec r21 brne d3 dec r20 brne d2 dec rl9 brne dl ret

Задание 5. Ha основе 2.3 разработать программу «кодового замка», которая после набора 4-разрядного PIN-кода с помощью кнопок SWO – SW3 и ввода данных, например с помощью кнопки SW5, осуществляет сравнение с паролем и включает светодиод LED7 при правильном вводе. При трех неправильных попытках введения PIN-кода кнопочная клавиатура должна быть заблокирована, а все светодиоды включены.

Оставить комментарий

микросхемы мощности Устройство импульсов питания пример приемника провода витков генератора выходе напряжение напряжения нагрузки радоэлектроника работы сигнал сигнала сигналов управления сопротивление усилитель усилителя усиления устройства схема теория транзистора транзисторов частоты