Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
МУ Прог ЦТ лабы для БАУ 2011.doc
Скачиваний:
17
Добавлен:
01.05.2015
Размер:
2.99 Mб
Скачать

10 Лабораторная работа №10. Прерывания

Цель работы: обучение созданию программ для обработки прерываний.

Микроконтроллер обычно программируют так, чтобы он в бесконечном цикле выполнял какую-нибудь работу: вычисления, передача данных, контроль технологического процесса. Однако бывают случаи, когда при возникновении определенного события внешнего или внутреннего, необходимо прервать бесконечный цикл основной (фоновой) программы и выполнить какие-то действия (обработать прерывания) и затем продолжить выполнение фоновой программы с точки ее останова. Следовательно, при продолжении фоновой программы значения регистров W, Statusи возможно некоторых других должны быть такими же, как до обработки прерывания. Их необходимо запомнить и восстановить после обработки прерывания.

Фоновая программа в работе предназначена для счета просушенных изделий поступивших по конвейеру. Прерывания в программе предназначены для учета количества посетителей при прохождении человека через турникет.

Источник внешних прерываний подключается к клемме RB0/NT регистраPORTB. Чтобы произошло прерывание, на эту клемму должен прийти импульс с технологического оборудования. В лабораторной работе эта клемма подключается к клемме К3клавиатуры. Регистр PORTD настраивается таким образом, чтобы при нажатии кнопки клавиатуры, на клемме К3 появился сигнал и имитировал импульс с технологического оборудования.

Особенности работы с программой:

  1. При отладке программы в пошаговом режиме прерывания не происходят, поэтому при отладке программы обработчик прерываний вызываем как обыкновенную подпрограмму. Вызов подпрограммы Timerследует отключить. Обработчик прерываний следует вызывать из главной программы при значении регистраSum=2. Для этого в фоновой программе требуется включить команды, помеченные символом «точка с запятой», см. листинг программы. После отладки их необходимо выключить.

  2. Дребезг контактов устраняется запрещением прерываний в обработчике.

  3. Отлаженная программа запускается в автоматическом режиме. После выполнения нескольких прерываний, программа останавливается командой Half.Значения регистровEvent, Sum, _Work, W, _Status, Status просматриваются в окне наблюдения и заносятся в таблицу отчёта.

  4. Ввиду того, что клавиатура и проводники на стенде УМК-7 не имеет защитного экрана, следует обязательно во все разряды RD4..RD7подавать сигнал «1». Кроме того, все выводы клавиатуры необходимо подключить проводниками к выводам регистраPORTD, чтобы не было наводок.

Фрагменты программы «Обработка прерывания от RB0/NT».

include<p16F877.inc>

SUM EQU h'50'; счетчик, работающий в фоновом режиме.

_STATUS EQU h'51'; регистр, для сохранения состояния Status.

EVENT EQU h'52'; счетчик событий при прерываниях.

_WORK EQU h'53'; регистр, для сохранения состояния аккумулятора.

Счетчики для подпрограммы Timer опущены.

org0x000

GOTO MAIN; вектор сброса записываем по адресу h’000’.

org0x004

gotoPERS_COUNT; вектор записываем по адресу прерыванияh’004.

nop

MAIN NOP

NOP; устанавливаем курсор на команду CLRF STATUS в режиме F7.

CLRF STATUS

BSF STATUS, 5

CLRF TRISC

MOVLW B'00001111'

MOVWF TRISB; настраиваем вывод прерывания RB0на ввод.

MOVLW B'00001111'

MOVWF TRISD; настраиваем клавиатуру для имитации прерываний.

BCF STATUS, 5

BSF INTCON, INTE; разрешаем внешние прерывания.

BSF INTCON, GIE; разрешаем работу прерываний.

CLRF EVENT; очищаем счетчик событий (посетителей).

MOVLW B'11110001'

MOVWF PORTD; подаем напряжение на выводы клавиатуры.

CLRF SUM; очищаем регистр.

; Бесконечный цикл фоновой программы

LOOP

MOVLW H'F0'

MOVWF PORTC; сигнализация работы фоновой программы.

INCF SUM, F; периодически увеличиваем регистр SUM.

; Следующие четыре команды только для отладки в режиме F7.

; MOVLW D’2’

; XORWF SUM, W

;BTFSC STATUS, Z

;CALL PERS_COUNT; вызываемPERS_COUNTкак подпрограмму

MOVLW D'20'; определяем время задержки свечения светодиодов.

CALL Timer

CLRF PORTC

MOVLW D'20'; определяем время задержки тушения светодиодов.

CALL Timer

GOTO LOOP

GOTO$; конец главной программы.

Timer; подпрограмма задержки не приведена.

PERS_COUNT; обработчик прерывания

BCF INTCON, INTE; запрещаем внешние прерывания

MOVWF _WORK; сохраняем значение Wв регистре_WORK.

SWAPF STATUS, W

MOVWF _STATUS; сохраняем значение Status.

BCF INTCON, INTF; сбрасываем флаг внешнего прерывания.

INCF EVENT, F; регистрация очередного посетителя.

SWAPF _STATUS, W; возвращаем значение Status.

MOVWF STATUS

SWAPF _WORK, F

SWAPF _WORK, W; возвращаем значение W.

BSF INTCON, INTE; разрешаем внешние прерывания.

RETFIE; возврат в фоновую программу из обработчика.

END

Работа программы начинается после включения питания или перезапуска МК с вектора сброса по адресу h’00’и согласно записанной там командеGoto MAIN, управление передается в главную программу. В ее начале настраиваются на вход или выход регистрыPORTB иPORTD. Затем разрешаются внешние прерывания, и работа самих прерываний, устанавливая биты в РСН (INTCON, INTEиINTCON, GIE). После настройки РСН начинается бесконечный цикл фоновой программы.

При нажатии на кнопку «1» клавиатуры на клемму RB0поступает импульс напряжения (он имитирует прохождение посетителя через турникет). Формируется флаг-сообщение внешнего прерывания в битеINTF регистра INTCON. По этому флагу работа фоновой программы прерывается, и управление передается на вектор прерываний по адресуh’004’, где находится команда безусловного переходаgotoPERS_COUNT на подпрограмму обработчика прерываний.

В обработчике прерываний сразу запрещаем внешние прерывания, чтобы защититься от дребезга контактов кнопки. Затем сбрасываем флаг - сообщение, что поступил сигнал внешнего прерывания командой BCF INTCON, INTE. Если этого не сделать, прерывания будут выполняться бесконечно, и не будет возврата в фоновую программу. Запоминаем значение регистраWв регистре_WORK и значение регистраStatusв регистре_STATUS.Далее выполняется обработка события, в нашем случае увеличивается значение РОНSUM, контролирующего количество посетителей.

В конце своей работы обработчик восстанавливает значения РСН W иStatus, чтобы фоновая программа правильно продолжила свою работу, поскольку значения этих регистров могли измениться при работе обработчика. Восстановление выполняется с помощью командыSWAPF, так как эта команда не влияет на РСНStatus. Снова разрешаем работу обработчика прерываний командойBSF INTCON, INTEи возвращаемся в фоновую программу по команде RETFIE.

Отметим, что на одно нажатие кнопки клавиатуры возможно увеличение регистра EVENTболее чем на единицу. Это объясняется тем, что проводник, соединяющий вывод клавиатуры и клеммуRB0, не экранирован.

Аналогично можно считать консервные банки, продвигающихся мимо фотоэлектрического датчика. После прохождения, например, 24 банок обработчик прерываний может остановить конвейер и включить упаковочную машину, запечатывающую консервные банки в коробку.

Т а б л и ц а 10.1. – Варианты заданий

Вариант

Источник прерываний

Время задержки Timer, с

Вариант

Источник прерываний

Время задержки Timer, с

1

Кнопка ‘1’

1

6

Кнопка ‘6’

1

2

Кнопка ‘2’

2

7

Кнопка ‘7’

2

3

Кнопка ‘3’

3

8

Кнопка ‘8’

3

4

Кнопка ‘4’

4

9

Кнопка ‘Shift’

4

5

Кнопка ‘5’

5

10

Кнопка ‘Enter’

5

Выполните свой вариант из таблицы 10.1, теоретически рассчитайте время задержки, учитывая, что частота работы МК 12 МГц, и заполните таблицу 10.2 в отчете.

Т а б л и ц а 10.2 – Данные отчета по лабораторной работе

Вариант

Источник прерываний

Время задержки Timer, с

Значение счетчика Sch3

Значение счетчика Sch_out

Значение счетчика Sch_in

Контрольные вопросы.

  1. С какой целью и где сохраняют значения регистров W, Status.

  2. Как узнать значения регистров Event, Sum, _Work, W, _Status, Status.

  3. Можно ли из обработчика прерываний вызывать подпрограмму из главной (фоновой) программы.

  4. Что такое прерывания?

  5. Каким образом включается разрешение прерываний?

  6. Назначение флага прерываний?

  7. Что такое дребезг контактов?

  8. Как в программе устраняется дребезг контактов?

  9. Что такое фоновая программа?

  10. По какому адресу расположен вектор прерываний?

  11. Что такое вектор сброса?

  12. Почему применяется команда SWAPFдля сохранения РСНStatus?

  13. Какие помехи (наводки) существуют в эксперименте, искажающие результат работы программы.