Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Программируемые контроллеры для систем управления ч2. Г.И.Загарий, В.С. Коновалов В.С., Н.О. Ковзель, В.И. Поддубняк, А.И. / Программируемые контроллеры для систем управления ч2. Г.И.Загарий, В.С. Коновалов В.С., Н.О. Ковзель, В.И. Поддубняк, А.И. .doc
Скачиваний:
317
Добавлен:
08.08.2013
Размер:
15.9 Mб
Скачать

7.1.5 Прямая и косвенная адресация регистров

При прямой 9-битной адресации (рис. 7.3), младшие 7 бит берутся как прямой адрес из кода операции, а два бита указателя страниц (RP1,RP0) – из регистра статуса (03h).

Рис. 7.3. Формирование адреса регистра при прямой адресации

Регистр FSR (F4) является указателем косвенной адресации. Любая команда, которая использует f0 (IND0,INDF, 00) в качестве регистра фактически обращается к указателю, который хранится в FSR. Чтение косвенным образом самого регистра f0 даст результат 00h. Запись в регистр f0 косвенным образом будет выглядеть как NOP, но биты статуса могут быть изменены. Необходимый 9-битный адрес формируется объединением содержимого 8 – битного FSR регистра и бита IRP из регистра статуса по приведенной на рис. 7.4 схеме.

Рис. 7.4. Формирование адреса регистра при косвенной адресации

Некоторые регистры специальных функций располагаются на странице 1. Чтобы адресоваться к ним, нужно дополнительно установить в единицу бит RP0 в регистре статуса.

7.1.6 Модуль таймера/счетчика

Модуль таймера/счетчика имеет следующие особенности:

• 8-разрядный таймер/счетчик;

• доступен по чтению и записи;

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

• внутреннее или внешнее тактирование;

• выбор фронта тактирующего импульса при внешнем тактировании.

На рис. 7.5 приведена упрощенная структурная схема модуля таймера, а на рис. 7.6 показана эквивалентная схема вывода T0CKI.

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

Рис. 7.5. Структурная схема модуля таймера

Режим счетчикавыбирается установкой в 1 бита T0CS. В этом режиме TMR0 увеличивается по каждому перепаду 1/0 или 0/1 на выводе T0CKI. Перепад, увеличивающий значение TMR0, выбирается битом выбора фронта переключенияT0SE(OPTION<4>). Установка этого бита в 0 вызывает увеличение TMR0 по перепаду 0/1.

Рис. 7.6. Эквивалентная схема вывода T0CKI

Предварительный делитель может использоваться модулем сторожевого таймера WDTили модулем таймера. Подключение предварительного делителя задается битомPSA(ОРТION<3>). Установка битаPSAв 1 подключает предварительный делитель к модулю WDT и устанавливает коэффициент деления для TMR0 1:1. Установка бита PSA в 0 подключает предварительный делитель к модулю таймера. Коэффициент деления предварительного делителя может быть установлен от 1:2 до 1:256 битамиPSO-PS2 регистраOPTION. Сам счетчик предварительного делителя не доступен для чтения и записи.

7.1.7 Предварительный делитель

Предварительный делитель представляет собой специализированный встроенный 8-разрядный счетчик, который может использоваться как предварительный делитель для TMR0 или как дополнительный делитель для сторожевого таймераWDT(рис. 7.7). Для упрощения в данном описании этот счетчик везде называется предварительным делителем. Необходимо учесть, что делитель может быть использован либо сTMR0, либо со сторожевым таймеромWDT, но не одновременно.

Биты PSAиPS0 –PS2 в регистреOPTIONзадают режим использования предварительного делителя и его коэффициент деления. Когда предварительный делитель используется сTMR0, все команды, производящие запись в регистрTMR0 (например, командыCLRFTMR0,MOVWFTMR0,BSFTMR0,xи т. д.), очищают предварительный делитель. Когда предварительный делитель используется со сторожевым таймеромWDT, командаCLRWDTочищает предварительный делитель одновременно со сбросом сторожевого таймераWDT. Предварительный делитель не может быть считан или записан программно. По сбросу предварительный делитель содержит все 0.

Рис. 7.7. Структурная схема предварительного делителя

Назначение предварительного делителя задается программно и может быть изменено в процессе выполнения программы. Чтобы избежать непредусмотренного сброса контроллера при переключении предварительного делителя с TMR0 наWDT, должна быть выполнена следующая последовательность команд:

MOVLW'хх0х0ххх'B;Выбирается внутренний источник ;сигнала и новое значение ;предварительного делителя.

MOVWFOPTION

CLRFTMR0 ;ОчисткаTMR0 и предварительного ;делителя.

MOVLW'xxxxlxxx'B;ВыбираетсяWDT, значение ;предварительного ;делителя не ;меняется.

MOVWFOPTION

CLRWDT;СбросWDTи предварительного ;делителя.

MOVLW'xxxxlxxx'B;Новое значение предварительного ;делителя.

MOVWFOPTION

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

В табл. 7.1.5 указаны регистры и отмечены биты, состояние которых связано с работой таймера. Табл. 7.1.6 описывает зависимость коэффициента деления для таймера и сторожевого таймера от состояния битов PS2:PS0 регистраOPTION.

Таблица 7.1.5

Адрес

Регистр

Бит7

Бит6

Бит 5

Бит 4

БитЗ

Бит 2

Бит1

Бит0

0lh

TMR0

8-разрядный таймер/счетчик

81h

OPTION

T0CS

T0SE

PSA

PS2

PS1

PS0

Примечания:

1. Помеченные символом "–" биты отсутствуют. Считываются как 0.

2. Заштрихованные биты не связаны с TMR0.

Таблица 7.1.6

PS2:PS0

Коэффициент деления для TMR0

Коэффициент деления для WDT

000

1 : 2

1 : 1

001

1 : 4

1 : 2

010

1 : 8

1 : 4

011

1 : 16

1 : 8

Таблица 7.1.6 (продолжение)

100

1 : 32

1 : 16

101

1 : 64

1 : 32

110

1 : 128

1 : 64

111

1 : 256

1 : 128

Для переключения предварительного делителя с WDTнаTMR0 необходимо выполнить следующую последовательность команд. Эта последовательность должна быть выполнена даже в том случае, если сторожевой таймерWDTзапрещен.

CLRWDT;Сброс сторожевого таймера и ;предварительного делителя.

MOVLW'хххх0ххх'B;ВыборкаTMR0 и нового значения ;предварительного делителя.

MOVWFOPTION