Главная » Статьи » Полезные материалы

Прерывания в PIC микроконтроллерах. Продолжение

Второй метод обработки прерывания подразумевает также вхождение в обработчик, но в нем не нужно выполнять необходимые действия. В нем нужно просто зафиксировать факт того, что поступил запрос от какого-то источника. Пусть это будет таймер. Нам требуется выдать импульс на светодиод на одну секунду – ну, например, чтобы отобразить момент завершения какой-нибудь операции. Это такой момент, когда нам не особенно важно, когда зажжется светодиод. Нам ведь не обязательно, чтобы он зажегся прямо сейчас, не так ли? Пусть он загорится через 100 мСек, после выполнения более важных операций. То есть, мы получили запрос на прерывание, перешли в обработчик, зафиксировали факт прерывания, вышли из обработчика и продолжаем выполнение главной программы. Суть в том, чтобы в цикле главной программы находилось условие проверки факта прерывания! А до этого условия может пройти, например, 50 мСек или больше, или меньше. Зависит от того, как далеко вы разместили это условие и в каком месте выполнялась программа, когда поступил запрос на прерывание.

Это можно понять, взглянув на рисунок.

Я обычно использую простую переменную размером в бит. В начале программы сбрасываю ее в ноль – это условно состояние отсутствия запроса. Когда произошло прерывание – в обработчике устанавливаю ее в единицу. Таким образом я фиксирую факт прерывания. В теле основной программы находится условие – если переменная равна единице, то выполняю то, что мне нужно было выполнить обязательно после прерывания, но не было критично ко времени начала выполнения. Естественно, в этом условии необходимо сбрасывать в ноль эту переменную, указав таким образом программе, что обработка прерывания завершена. Проверка этого условия происходит через время tx. Это время – которое проходит между запросом на прерывание и обработкой этого запроса. Это время можно сократить, если использовать проверку факта прерывания чаще. Например, записывать в циклах, которые есть в программе. Если прерывание произошло в момент задержки, то вернувшись из прерывания, программа будет выполнять оставшееся время этой задержки. Поэтому лучше задержки организовывать в циклах. Это значит писать не

DelayMs 500,

а

For I = 1 To 10

DelayMs 50

'А здесь вставлять проверку

Next

Естественно, это абстрактный пример и он может быть модифицирован как угодно.

Мы запишем ту же самую программу, но только по этому способу. Будем считать, что нам не критично по времени переключение PORTB.4

 

Device = 16F877 'Выберем микроконтроллер

Xtal = 4        'Укажем тактовую частоту

 

Dim Timer As TMR1L.Word 'Для удобства зададим имя для TMR1

Dim Fact As Bit         'Переменная для фиксирования факта прерывания

TRISD = 0       'Порты PORTB и PORTD - на выход

TRISB = 0

Fact = 0        'Сбросим переменную в ноль, чтобы указать программе, что прерывания еще нет

On_Interrupt GoTo ISR  'Зададим адрес обработчика прерываний

                       '(он находится по адресу метки ISR)                       

Timer = 28036          'Загрузим таймер значением

                       'Это значение я вычислил с помощью программы ProtonHeaderMaker

                       'чтобы он переполнился через 300 мСек

PIE1.0 = 1            

INTCON.6 = 1           'Разрешим прерывание от периферийных устройств микроконтроллера

                       'так как TMR1 - периферия

INTCON.7 = 1           'Установим бит глобального разрешения прерываний

                       'Этот бит разрешает работу всех запросов вообще

T1CON = %00110001      'Настроим предделитель для TMR1 и включим таймер

GoTo Main              'После всех настроек перейдем на выполнение главной программы

'А таймер уже тикает и увеличивает свое значение с каждым тиком

'Как вы помните, мы его загрузили значением 28036 в начале

'Как только он дотикает до 65535 и придет следующий тик - это вызовет его

'переполнение и, соответственно, прерывание по переполнению TMR1

ISR:

Context Save          'Сохраним регистры STATUS и аккумулятор

If PIR1.0 = 1 Then    'Проверим, было ли вызвано прерывание именно переполнением таймера TMR1

PIR1.0 = 0            'Если это так, то сразу сбросим флаг этого прерывания, чтобы

                      'при выходе снова не попасть в обработчик

Nop                   'Эти NOPы - корректирующие

Nop                   'Но нам они никак не помешают, так как время нам не критично

Nop                   'Я оставил как в предыдущем примере

Nop

Nop

Nop

Nop

Fact = 1              'Установим факт запроса прерывания

Timer = 28040         'Загружаем таймер новым значением. Обратите внимание - оно отлично от начального

EndIf

Context Restore       'Восстановим значения регистров W и STATUS

Retfie                'Возврат из обработчика

 

Main:

Inc PORTD             'Увеличиваем значение 8-разрядного регистра PORTD

DelayMS 100           'Задержка для видимости человеком смены состояния порта

If Fact = 1 Then

    PORTB.4 = ~PORTB.4 'А вот и само действие

    Fact = 0           'И сброс флага - указание, что мы обработали запрос

EndIf

GoTo Main             'Отправляемся на начало




Категория: Полезные материалы | Добавил: ADMIN (21.11.2011)
Просмотров: 10443 | Комментарии: 5 | Теги: прерывания, пример, PROTON, interrupt | Рейтинг: 4.8/8
Всего комментариев: 5
1 DIKLER   (20.12.2011 14:34) [Материал]
ENDIF в конце пропустили.
Все статьи на "отлично"!!!

2 DIKLER   (20.12.2011 16:28) [Материал]
Кстате может кто подскажет... компилятор PROTON v2.1.3 ругается на строку Context Save
пишет:
*** CONTEXT saving is automatic on 14-bit core devices. Command ignored! ***
Это означает, для 14-bit или все кроме 14-bit ?

3 ADMIN   (22.12.2011 08:01) [Материал]
Это не ругается, а предупреждает, что для 14-разрядной линейки это действие выполняется автоматически, поэтому команда, написанная пользователем в программе игнорируется

4 PINCOD   (07.05.2012 17:24) [Материал]
Друзья мои помогите с кусочком программы в ПРОТОНЕ вот с такими функциями-управление 2-мя нагрузками.Но что-бы интервал и работа устанавливались индивидуально.Вроде просто но нужен толчек помогите пожалуйста 16F876A,LCD.Спасибо разобрался

5 ADMIN   (15.05.2012 18:05) [Материал]
А где остальная программа? В чем проблема с кусочком?

Добавлять комментарии могут только зарегистрированные пользователи.
[ Регистрация | Вход ]