Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ПОВС (шпоры).doc
Скачиваний:
14
Добавлен:
20.09.2019
Размер:
670.72 Кб
Скачать
  1. Pic16f84. Проектирование обработчиков прерываний

ОСН. ПОЛОЖЕНИЯ ПО СОСТАВЛЕНИЮ ОБРАБОТЧИКОВ ПРЕРЫВАНИЙ

  1. Возврат из обработчика д. б.

B SF INTCON, GIE

RETURN

либо

RETFIE

  1. Событие на линии RB0 м. б. 2 типов: фронт (0/1), спад (задний фронт, 1/0). Сущ. спец. регистр OPTION_REG (0x81). В нём 6-ой разряд INTEDG – для определения типа события.

BCF 0x81, 6 ; спад

BSF OPTION_REG, INTEDG ; фронт

Управление регистрами при обработке прерываний

Save: MOVF VAR1,0

MOVWF VAR1_tmp

Restore: MOVF VAR1_tmp,0

MOVWF VAR1

Управление аккумулятором WReg

  • Сохранение

Save: MOVWF W_tmp

  • Восстановление

Restore: MOVF W_tmp,0

При восстановлении значения аккумулятора м. б. изменён 0-вой флаг регистра статуса Z, к-рый автоматически устанавливается в единицу при нулевом значении аккумулятора. Ввиду специфики некоторых программ необх. восстанавливать и этот флаг.

Есть инструкция SWAP, которая переставляет старшие и младшие байты регистра, не влияя на Z.

WReg: Restore:

SWAPF w_tmp,1 ; 1

SWAPF w_tmp,0 ; 2

23. Pic16f84. Проектирование обработчиков прерываний (продолжение)

Предположим, что w_tmp = 0x5F.

WReg: после 1 – w_tmp = 0xF5

после 2 – Wreg = 0x5F

При этом Z флаг не изменяется.

Управление регистром STATUS

Save: SWAPF STATUS,0

MOVWF STATUS_tmp

Restore: SWAPF STATUS_tmp,0

MOVWF STATUS

Пример обработчика:

Save: BTFSS STATUS,RP0

GOTO S_BANK0

BCF STATUS, RP0

MOVWF W_tmp

SWAPF STATUS, W

MOVWF STATUS_tmp

BSF STATUS, RP0

GOTO INT_CODE

S_BANK0: MOVWF W_tmp

SWAPF STATUS, 0

MOVWF STATUS_TMP

INT_CODE:

Restore: SWAPF STATUS_tmp, 0

MOVWF STATUS

BTFSS STATUS, RP0

GOTO Restore_W

BCF STATUS, RP0

SWAPF W_tmp, 1

SWAPF W_tmp,0

BSF STATUS, RP0

RETFIE

Restore_W:

SWAPF W_tmp, 1

SWAPF W_tmp, 0

RETFIE

  1. Pic16f84. Внутренняя структура и функционирование таймера

Структура таймера TMR0

TMR0 представляет собой обычный 8-битный двоичный счётчик. По умолчанию он принимает значение все нули и увеличивается сигналом c (см. рис).

Блок управления делит системную частоту Fsys на 4.

Предварительный делитель частоты (Prescaler) – устройство, которое может предварительно делить вх. частоту TMR0 на опр. коэффициент (чтобы получить частоту с соотв. значением).

Мультиплексоры (MUX) служат для выбора одного из источников синхронизации таймера, а по возможности вкл. предварительное деление исходной частоты.

XOR – программируемый инвертор, выбирает, чем синхронизировать от внешнего источника (фронт, спад).

Если T0SE = 0, то синхронизация таймера будет сигналом фронта Fx (??)

TIMER0 является программируемым модулем и содержит следующие компоненты:

  1. 8-разрядный таймер/счетчик TMR0 с возможностью чтения и записи как регистр;

  2. 8-разрядный программно управляемый предварительный делитель (предделитель);

  3. мультиплексор входного сигнала для выбора внутреннего или внешнего тактового сигнала;

  4. схему выбора фронта внешнего тактового сигнала;

  5. формирователь запроса прерывания по переполнению регистра TMR0 с FFh до 00h.

Режим таймера выбирается путем сбрасывания в ноль бита T0CS регистра OPTION <5>. В режиме таймера TMR0 инкрементируется каждый командный цикл (без предделителя). После записи информации в TMR0 инкрементирование его начнется после двух командных циклов. Это происходит со всеми командами, которые производят запись или чтение-модификацию-запись TMR0 (например, MOVF TMR0, CLRF TMR0). Избежать этого можно при помощи записи в TMR0 скорректированного значения. Если TMR0 нужно проверить на равенство нулю без останова счета, следует использовать инструкцию MOVF TMR0,W.

Режим счетчика выбирается путем установки в единицу бита T0CS регистра OPTION<5>. В этом режиме регистр TMR0 будет инкрементироваться либо нарастающим, либо спадающим фронтом на выводе RA4/T0CKI от внешних событий. Направление фронта определяется управляющим битом T0SE в регистре OPTION<4>. При T0SE = 0 будет выбран нарастающий фронт.

Предделитель может использоваться или совместно с TMR0, или со сторожевым (Watchdog) таймером. Вариант подключения делителя контролируется битом PSA регистра OPTION<3>. При PSA=0 делитель будет подсоединен к TMR0. Содержимое делителя программе недоступно. Коэффициент деления предделителя программируется битами PS2…PS0 регистра OPTION<2:0>. При PSA=1 делитель будет подсоединен к сторожевому таймеру как постделитель (делитель на выходе).

При использовании предделителя совместно с TMR0, все команды, изменяющие содержимое TMR0, обнуляют предделитель. Если пределитель используется совместно с WDT, команда CLRWDT обнуляет содержимое предделителя вместе с WDT.