Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

Микроконтроллеры PIC фирмы Microchip для начинающих выпуск №16


РАССЫЛКА Микроконтроллеры PIC фирмы Microchip для начинающих
Ведущий: Алексей (pont_a@mail.ru)


Доброго времени суток, дамы и господа!!

Сегодня начнем рассматривать систему прерываний  микроконтроллеров серии PIC18 на базе микроконтроллера PIC18F452!

Помните, в выпуске №13 я акцентировал Ваше внимание на такой момент (вставляю кусок кода программы):
; основная программа         
  ORG      0
  BRA      Main_Init     ; делаем так. Когда будем рассматривать прерывания, поймете почему
  ORG      0x20              ; вся программа начинаться будет с адреса 0x20
Main_Init:

Так вот, данный прыжок необходим, если мы используем прерывания в нашей программе.  Почему цифра 0x20, и можно ли сделать иначе?  На эти вопросы я и попытаюсь Вам ответить сегодня.  
Открываем datasheet на наш микроконтроллер PIC18F452 и находим пункт: 8.0 Interrupts. В этом пункте описана система прерываний микроконтроллера. Как мы видим, у данного микроконтроллера и других микроконтроллерах серии PIC18 есть 2 вектора прерываний. Вектор – это адрес в программной памяти, на который программа автоматически переходит, если возникает какое либо разрешенное прерывание.
0x08 – вектор высокоприоритетных прерываний,
0x18 – вектор низкоприоритетных прерываний.
Только не забывайте, если приоритетность прерываний отключена, то вектор прерываний будет один – 0x08!
Как происходит обработка прерывания? Пусть у нас программа выполняет основной цикл, совершенно асинхронно приходит разрешенное прерывание от любого модуля. Микроконтроллер выполняет текущую команду до конца, затем, автоматически, сохраняет текущий указатель команд PC (адрес возврата из прерывания) в стек. Далее, исполнение программы начинается с вектора, соответствующего приоритету пришедшего прерывания (исполняется обработчик прерываний). Когда обработчик прерываний завершил свою работу, выход из прерываний осуществляется командой RETFIE. После выполнения этой команды, микроконтроллер восстанавливает из стека адрес возврата и переходит на выполнение команды, расположенной по этому адресу (следующая команда основного цикла). Вот по такому алгоритму обрабатываются прерывания в микроконтроллерах серии PIC18.
Прерывания с высоким приоритетом, могут вызываться, как из основного цикла, так и из обработчика прерываний с низким приоритетом!
Так как обработчик прерываний это та же программа, которая будет модифицировать основные регистры ядра - WREG, STATUS и BSR, то нам необходимо перед выполнением кода обработчика эти регистры сохранить, а после завершения исполнения кода обработчика - восстановить. Для этих целей используется одноуровневый аппаратный быстрый стек. Когда происходит прерывание, микроконтроллер, автоматически, сохраняет в этот стек 3 описанных выше регистра. Чтобы, после окончания исполнения кода микроконтроллера сохраненные регистры восстановились, необходимо команду RETFIE  вызывать с параметром 1.  Только хочу уточнить, данный механизм можно использовать в 2-х случаях:

  • все прерывания имеют одинаковый приоритет (приоритетность отключена);
  • если приоритетность включена, то использовать быстрый стек можно лишь для обработчика прерываний с высоким приоритетом. Для прерываний низкого приоритета придется сохранять эти регистры программно. 

Следующий момент. Очень часто, в основном цикле микроконтроллера встречаются критичные куски кода программы, на которых возникновение прерывания может привести к неверной отработке алгоритма программы. Например, если программа в основном цикле модифицирует переменную, состоящую из нескольких байт, а в прерываниях эта переменная может передаваться по UART. Тогда на время выполнения критичного кода основного цикла прерывания запрещают, путем сброса глобальных флагов разрешения прерываний.    
Обязательно надо следить за тем, чтобы переменные и специальные регистры не пересекались в основном цикле программы и в обработчике прерываний!

Напоследок, приведу пример программы, которая использует систему прерываний. Этот код можете использовать для своих разработок электроники, как изначальный:
; основная программа         
  ORG      0
            BRA      Main_Init     ; переходим на основную программу
  ORG      0x08              ; вектор прерываний с высоким приоритетом
            BRA      Int_high                  
  ORG      0
x18             ; вектор прерываний с низким приоритетом
;------------------------------------------------------------------------------------------

            MOVWF  lowi_w, ab                                    ; сохраняем WREG
            MOVFF   STATUS, lowi_status                  ; сохраняем STATUS
            MOVFF   BSR, lowi_bsr                              ; сохраняем BSR
 
            ; обработчик прерываний с низким приоритетом

            MOVFF   lowi_bsr, BSR                              ; восстанавливаем BSR
            MOVF     lowi_w, rw, ab                               ; WREG
; обязательно STATUS восстанавливать позже WREG, т.к. команда MOVF модифицирует  регистр STATUS
            MOVFF   lowi_status, STATUS                  ; STATUS
           RETFIE                    
;-------------------------------------------------------------------------------------------
Int_high:

            ; обработчик прерываний с высоким приоритетом

            RETFIE         1 
;-------------------------------------------------------------------------------------------
Main_Init:

            ; основная программа

;-------------------------------------------------------------------------------------------

В следующем выпуске продолжим рассматривать систему прерываний микроконтроллера PIC18F452! Изучим настройку  системы прерываний и ее регистры управления!

Полный архив рассылки Вы можете прочитать на нашем сайте!  При любом опубликовании текстов данной рассылки ссылка на сайт http://www.2aplusa.ru обязательна!

Желаю Вам удачи! До скорой встречи!


С уважением, Алексей pont_a@mail.ru
Cайт разработчиков 2AplusA http://2aplusa.ru


В избранное