[an error occurred while processing this directive] [an error occurred while processing this directive]
А в чем проблема?
(«Телесистемы»: Конференция «Микроконтроллеры и их применение»)
[an error occurred while processing this directive] [an error occurred while processing this directive] [an error occurred while processing this directive]

Отправлено Alexander 24 августа 2001 г. 12:41
В ответ на: а как сохранять STATUS и W ??? отправлено yes 24 августа 2001 г. 11:50

Я часто использую в пике вложенные прерывания (не больше 2 уровней вложенности, хотя ничто кроме 8 уровней стека PC не мешает сделать больше). Нужно только завести дополнительные переменные для сохранения W и STATUS и переменную, в которой хранится уровень прерывания (если вложенность не больше 2, достаточно одного бита).

Пример для 2-х уровней:

ORG 4 ;Вход в прерывание
MOVWF W_COPY ;Сохранили W, W_COPY должна быть во всех банках
SWAPF STATUS,W
BCF RP0 ;Bank 0, если болше 2-х банков, нужно сбросить и RP1
MOVWF STATUS_COPY ;Сохранили статус (STATUS_COPY в банке0)
BTFSC FLAGS,FLAG_LEVEL_1 ; битовый флаг уровня, при старте 0
GOTO LEVEL1 ;вложенное прерывание

;Прерывание уровня 0 (не вложенное)
BSF FLAG_LEVEL1 ;Поставим признак, что следующее прерывание вложенное
;Сохраняем копии W и STATUS
SWAPF STATUS_COPY,W
MOVWF STATUS ;восстановили банк, в котором сохранено W
MOVF W_COPY,W
MOVWF W_COPY1 ; Сохранили W_COPY в W_COPY1
BCF RP0 ;Bank 0, если болше 2-х банков, нужно сбросить и RP1
MOVF STATUS_COPY,W
MOVWF STATUS_COPY1 ; Сохранили STATUS_COPY в STATUS_COPY1
BSF INTCON,GIE ;Разрешили прерывания

LEVEL1:
;Здесь обработка прерываний
;При выходе проверяется флаг FLAG_LEVEL1 и восстанавливается W и STATUS либо из xxx_COPY, либо из xxx_COPY1. При выходе из основного прерывания флаг сбрасывается

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

Составить ответ  |||  Конференция  |||  Архив

Ответы



Перейти к списку ответов  |||  Конференция  |||  Архив  |||  Главная страница  |||  Содержание  |||  Без кадра

E-mail: info@telesys.ru