Рис. 13.7.
1000: Установить вывод микроконтроллера при совпадении
На вывод ССР1 выставляется ВЫСОКИЙ уровень. Защелка модуля ССР может быть сброшена только переключением модуля в режим 0000, т. е. при его выключении.
1001: Сбросить вывод микроконтроллера при совпадении
На вывод ССР1 выставляется НИЗКИЙ уровень. Защелка модуля ССР может быть установлена только выключением модуля.
1010: Генерировать прерывание при совпадении
Состояние вывода ССР1 не изменяется, единственным действием является установка флага ССР1 IF.
1011: Сформировать специальное событие при совпадении
Таймер 1 сбрасывается. При использовании модуля ССР2 (это единственное отличие в функционировании модулей ССР1 и ССР2) можно запустить преобразование АЦП (см. Рис. 14.11 на стр. 510).
В режимах 1000 и 1001 выводы микроконтроллера, используемые модулями ССР1 и ССР2, должны быть сконфигурированы как выходы. При отключенном модуле ССР (после любого сброса) эти выводы будут отображать состояние соответствующих битов порта. В качестве примера давайте рассмотрим выключение модуля ССР. Поскольку единственным способом переключения защелки модуля в ее исходное состояние является запись в регистр CCPCON режима 0000, логично будет записать это значение в соответствующий бит порта для исключения нежелательных выбросов. К примеру, при использовании режима 1001 бит регистра порта следует при инициализации установить в 1, чтобы после сброса на этом выводе присутствовал ВЫСОКИЙ уровень. В микроконтроллерах, выпускающихся в корпусах с количеством выводов более 28, вывод ССР1, как правило, задействует линию RC2, а вывод ССР2 — линию RC1.
В качестве примера предположим, что нам необходимо сконфигурировать Таймер 1 также, как и в предыдущем примере, — чтобы его переполнение происходило каждые 10 с. Для этого нам необходимо задать период тайм-аута, равный 16 с (коэффициент деления предделителя 8), а затем укоротить цикл. Соответственно в регистр CCPR1 следует загрузить 10/16 от максимального значения (216 х 10/16), что составит h’A000’. При достижении таймером данного значения он будет автоматически сбрасываться, и если бит маски CCP1IE (а также биты PEIE и GIE) установлен, то будет генерироваться прерывание.
Инициализационный код для данной задачи выглядит следующим образом:
movlw h’A0’; Загружаем в CCPR1 число h’A000’
movwf CCPR1H;
clrf CCPR1L;
movlw b’00001011’; Режим ССР1 — 1011. Специальное событие
movwf CCP1C0N
movlw b’00111011’; Таймер 1 вкл. (1), внешний такт. сигнал (1)
movwf T1CON; Синхр. режим (0), генератор вкл. (1), 1:8 (111)
bsf STATUS,RP0; Переключаемся в 1-й банк
bsf PIE1,CCP1IE; Разрешаем прерывание от ССР1
bcf STATUS,RP0; Возвращаемся в 0-й банк
bsf INTCON,PEIE; Разрешаем прерывания от таймера/ССР
bsf INTCON,GIE; Разрешаем работу системы прерываний
После выполнения этих команд микроконтроллер будет автоматически прерываться каждые 10 с.
Поскольку в режиме 1011 вывод ССР1 отключен от модуля ССР, указанный вывод может использоваться как обычный вывод порта ввода/вывода независимо от модуля ССР1.
* * *