Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Kharakhnin / ПОСОБИЕ_Харахнин.doc
Скачиваний:
274
Добавлен:
08.03.2016
Размер:
17.89 Mб
Скачать

4.4. Программирование прерываний в микропроцессорном устройстве

Работа устройства с применением прерываний позволяет сэкономить процессорное время и при использовании таймеров организовать многозадачный режим работы. Система прерываний однокристального МК, например К1830ВЕ51, имеет 5 источников, за каждым из которых жестко закреплен адрес - вектор прерывания. Для программирования прерываний имеются два регистра: разрешения прерываний IE и приоритетов прерываний IP. В разделе инициализации программы необходимо разрешить прерывания и установить приоритеты. По адресам векторов необходимо записать команды JMP, которые будут передавать управление на подпрограммы обслуживания прерывания. Каждая подпрограмма должна заканчиваться командой RETI.

Рассмотрим несколько примеров, поясняющих особенности программирования прерываний в микропроцессорном устройстве.

Пример 1. Пусть требуется инкрементировать порт Р1 через 50 мС.

<1> ORG 0000H ;

<2> JMP INIT ; Переход на инициализацию системы

<3> ORG 000BH ; Адрес вектор – прерывания T/C0

<4> JMP INT_TIMER0; Переход на подпрограмму

<5>INIT:MOV P1,#00 ; Обнуление порта Р1

<6> MOV TMOD,#00000001B; Настройка T/C0 в таймер, режим 1

<7> MOV IE,#00000010B ; Разрешение прерывания от таймера 0

<8> SETB EA ; Разрешить разрешенные прерывания

<9> MOV TL0,#0AFH ; В регистр таймера число 15535=3CAFh

<10> MOV TH0,#3CH ; для обеспечения 50мС

<11> SETB TR0 ; Включение таймера

<12>MAIN: ; Блок основной программы

<13> JMP MAIN ;

<14>INT_TIMER0: CLR TR0 ; Выключение таймера

<15> INC P1 ; Инкремент порта Р1

<16> MOV TL0,#0AFH; Перезагрузка таймера

<17> MOV TH0,#3CH;

<18> SETB TR0 ; Включение таймера

<19> RETI

Особенностью программы является то, что для выполнения блока основной программы процессору отводится 50 мС времени. В течение этого промежутка идет заполнение регистра таймера импульсами с числа 15535 до 65535, после чего наступает переполнение регистра и возникает прерывание. В счетчик команд записывается адрес 000ВН, где стоит команда JMP INT_TIMER0 (шаг 4), пересылающая управление на подпрограмму обслуживания прерывания (шаг 14). Далее происходит инкремент Р1 (шаг 15), перезагрузка регистра таймера (шаги 16 и 17), включение таймера (шаг 18) и выход из подпрограммы в основную программу.

Пример 2. Выполнить подсчет числа деталей (до 99), проходящих за 1 секунду, по схеме на рис. 20.

Выход приемника импульсов подключен к входу Т0 ( Р3.4 ) МК, настроим T/C0 в режим счетчика внешних импульсов, разрешим прерывания от переполнения счетчика и загрузим в него число FFFFH. В подпрограмме обслуживания прерывания в регистре будем считать импульсы в BCD коде. Таким образом, импульс, поступающий в регистр счетчика, будет вызывать прерывание в работе процессора. Таймер/счетчик 1 настроим в таймер в режим 1. Разрешим прерывания от переполнения таймера. При 15-ти переполнениях таймера будет сформирована временная задержка в 1 секунду.

<1> ORG 0000H

<2> JMP INIT ; Переход на инициализацию

<3> ORG 000BH ; Вектор прерывания от переполнения

<4> JMP INT_COUNT0 ; счетчика 0

<5> ORG 001BH ; Вектор прерывания от переполнения

<6> JMP INT_TIMER1 ; таймера 1

<7>INIT:MOV TMOD,#15H; Настройка T/C0 в счетчик, T/C1 в таймер, режим 1

<8> MOV IE,#0AH ;Разрешение прерываний от счетчика и таймера

<9> MOV IP,#00001000B ; Более высокий приоритет у таймера

<10> SETB EA ; Разрешение всех разрешенных прерываний

<11> MOV TL0,#0FFH ; Загрузка счетчика для организации режима

<12> MOV TH0,#0FFH ; прерываний при поступлении импульса

<13> SETB TR0 ; Включение счетчика

<14> SETB TR1 ; Включение таймера

<15> MOV R0,#20H ;Адрес ячейки для хранения числа импульсов

<16> MOV R7,#00 ; Обнуление счетчика переполнений таймера

<17>MAIN: ; Выполнение блока основной программы

<18> JMP MAIN

<19>INT_COUNT0: CLR TR0 ; Выключение счетчика

<20> CLR C ; Сброс флага переноса

<21> INC A ; Инкремент счетчика импульсов

<22> DA A ; Десятичная коррекция для перевода в BCD

<23> MOV TL0,#0FFH; Перезагрузка

<24> MOV TH0,#0FFH; счетчика

<25> SETB TR0 ; Включение счетчика

<26> RETI ; Выход из подпрограммы прерывания счетчика

<27>INT_TIMER1: INC R7;Инкремент счетчика прерываний Т1

<28> CJNE R7,#15,END_INT; Проверка на 15 переполнений Т1

<29> CLR TR1 ; Если 15 переполнений, то выключить таймер

<30> MOV @R0,A ;Сохранить количество деталей в ОЗУ

<31> MOV R7,#00; Обнуление счетчика переполнений таймера

<32> CLR A ; Обнуление счетчика импульсов

<33> SETB TR1 ; Включить таймер

<34>END_INT: RETI

Таким образом, в примере используются два вида прерывания - от переполнения счетчика и таймера. Приоритет таймера более высокий, поэтому при возникновении прерываний одновременно вначале будет обработано прерывание от таймера, формирующего временной интервал в 1 секунду.

Пример 3. Разработать программу, обеспечивающую следующий алгоритм работы. Если датчики D1 и D2 не замкнуты, то обеспечивается эффект “ двойной бегущий огонь”, если замкнут D1 – режим “ одинарный бегущий огонь”, если замкнут D2 – режим “ бегущая тень ”. Время задержки 1 секунда. После 20 циклов сдвига осуществляется возврат в первоначальный режим. Используйте аппаратные прерывания по входам INT0 и INT1.

Разработаем алгоритмы работы устройства (рис. 22, 23). Их будет 3:алгоритм основной программы, алгоритм при возникновении прерывания по входу INT0 и алгоритм при возникновении прерывания по входу INT1.

Рис. 22. Алгоритм основной программы

Рис. 23. Алгоритмы работы устройства в режимах прерываний по входам INT0 и INT1

Схема подключения датчиков и светодиодов представлена на рис.24.

Рис. 24. Электрическая принципиальная схема к примеру 3

Рассмотрим программу работы устройства.

<1> D1 BIT 20H.0 ; Обозначение битов

<2> D2 BIT 20H.1 ;

<3> ORG 0000H ;

<4> JMP INIT ; Начало программы

<5> ORG 0003H ;

<6> JMP DAT1 ; Вектор прерывания INT0

<7> ORG 0013H ;

<8> JMP DAT2 ; Вектор прерывания INT1

<9>INIT: MOV IE,#05H ; Разрешение прерываний по INT0 и INT1

<10> SETB EA ; Разрешение всех разрешенных прерываний

<11> MOV TMOD,#00000001B; T/C0 - таймер

<12> MOV R7,#20 ;Загрузка заданных сдвигов счетчика <13> MOV R6,#15 ;Загрузка счетчика переполнений таймера

<14>START: MOV A,#33H ; Код в порт

<15> MOV R0,#01 ; Код при D1=0

<16> MOV R1,#0FEH ; Код при D2=0

<17>BEGIN: JB D1,MOVE_1 ; Проверка признака D1=0

<18> JB D2,MOVE_0 ; Проверка признака D2=0

<19> MOV P2,A ; Выслать код в порт

<20> CALL DELAY_1S ; Вызов задержки 1 сек

<21> RL A ; Сдвиг А

<22> JMP BEGIN ;

<23>MOVE_1: MOV P2,R0 ; Выполнить действия, если D1=0

<24> CALL DELAY_1S ;

<25> MOV A,R0 ;

<26> RL A ;

<27> MOV R0,A ;

<28> DJNZ R7,BEGIN ;

<29> CLR D1 ;

<30> CLR D2 ;

<31> MOV R7,#20 ;

<32> JMP START ;

<33>MOVE_0: MOV P2,R1 ; Выполнить действия, если D2=0

<34> CALL DELAY_1S ;

<35> MOV A,R1 ;

<36> RL A ;

<37> MOV R1,A ;

<38> DJNZ R7,BEGIN ;

<39> CLR D1 ;

<40> CLR D2 ;

<41> MOV R7,#20 ;

<42> JMP START

<43>DAT1: SETB D1 ; Подпрограмма обслуживания

<44> CLR D2 ; прерывания по входу INT0

<45> CLR EX0 ;

<46> RETI ;

<47>DAT2: SETB D2 ; Подпрограмма

<48> CLR D1 ;обслуживания прерывания по входу INT1

<49> CLR EX1 ;

<50> RETI ;

<51>DELAY_1S:SETB TR0 ; Подпрограмма задержки в 1 секунду

<52>WAIT: JNB TF0,WAIT ;

<53> CLR TF0 ;

<54> DJNZ R6,WAIT ;

<55> CLR TR0 ;

<56> MOV R6,#15 ;Перезагрузка счетчика переполнений таймера

<57> RET ;

После инициализации процессор выполняет основную программу. Она ограничивается меткой BEGIN. В этом случае выполняется режим “ двойного бегущего огня ” (шаги с 17 по 22). При срабатывании одного из датчиков наступает режим прерывания, и управление передается на один из векторов прерывания: 0003Н при срабатывании D1 либо 0013H при срабатывании D2. При этом управление передается на подпрограммы обслуживания прерывания либо на шаг 43, либо на 47, где производится установка признака срабатывания датчиков, далее сбрасывается флаг прерывания по соответствующему входу и происходит выход из подпрограммы прерывания.

В шагах 17 и 18 проверяется установка признаков срабатывания датчиков D1 или D2 и выбор соответствующего режима. Задержка на срабатывание светодиодов выбрана равной 1 секунде и осуществляется таймером 0 (шаги 51- 57).

З а д а н и я д л я с а м о с т о я т е л ь н о й р а б о т ы

  1. Разработать программу, обеспечивающую подсчет деталей на конвейере (рис.25) по входу INT0, проходящих за 1 минуту. Использовать режим прерываний.

  2. Разработать программу, инкрементирующую на 2 порт Р3 через 2.5мС. Использовать прерывание по переполнению таймера 1.

  3. Разработать программу, обеспечивающую зажигание соответствующего светодиода в младшей тетраде порта Р2 (при срабатывании датчика D1) и в старшей тетраде (при срабатывании D2) (рис. 23). Использовать режим прерываний.

Рис. 25. Функциональная схема к заданию 1