Во всех микроконтроллерах PIC имеется, по крайней мере, один базовый таймер/счетчик Таймер 0. Счетный регистр таймера TMR0 (h’01’), доступный для чтения и записи, может тактироваться внешним сигналом, подаваемым на вход микроконтроллера TOCKI (Timer0 ClocK In), который совмещен с линией RA4 порта А. Кроме того, инкрементирование счетчика может происходить по внутреннему тактовому сигналу Q4 (Рис. 4.4), частота которого составляет 1/4 частоты кварцевого резонатора. Частота обоих сигналов (и внешнего, и внутреннего) может быть снижена при помощи внутреннего 8-битного предделителя. Коэффициент деления предделителя задается тремя младшими битами регистра OPTION_REG, расположенного по адресу h’81’ (см. Рис. 13.2 на стр. 452), которые называются PS2:PS1:PS0. Соответственно, коэффициент деления будет равен 2PS+1. Например, если PS[2:0] = 111, то счетный регистр таймера будет инкрементироваться с частотой f/256, где f — частота источника тактового сигнала.
Предделитель может быть отключен от таймера установкой бита PSA (OPTION_REG[3]) в 1. При этом импульсы будут поступать непосредственно на счетчик. Кроме того, при записи в счетный регистр таймера регистр предделителя также сбрасывается (к примеру, последовательность команд movlw h’E8’, movwf 1 вызовет сброс предделителя), позволяя отсчитывать временной интервал от точно заданного момента.
Когда бит PSA регистра OPTION_REG установлен в 1, то предделитель используется в качестве постделителя сторожевого таймера (см. Рис. 13.1 на стр. 451). Сторожевой таймер предназначен для сброса микроконтроллера в случае, если он не будет периодически переустанавливаться командой сброса сторожевого таймера clrwdt (Clear WatchDog Timer). Это гарантирует сброс микроконтроллера в случае его некорректной работы, вызванной внешними помехами или ошибкой в программе, возможно, из-за перехода к незапрограммированной области памяти программ. При этом сторожевой таймер перестанет периодически переустанавливаться. Если предделитель подключен к Таймеру 0 (PSA = 0), то период тайм-аута сторожевого таймера будет примерно равен 18 мс. При установленном бите PSA период гарантированного сброса процессора будет составлять (2PS х 18) мс. Таким образом, для предотвращения сброса микроконтроллера интервал между выполнением команд clrwdt должен быть меньше указанного периода. Кроме того, эта команда сбрасывает счетчик предделителя. При наступлении тайм-аута бит регистра STATUS сбрасывается. Если это необходимо, сторожевой таймер можно отключить при программировании микроконтроллера (во время занесения кода программы в память программ). Различные конфигурационные биты (fuses) располагаются в ячейке памяти программ по адресу h’2007’ (см. Рис. 10.6 на стр. 312), которая недоступна, когда микроконтроллер работает в нормальном режиме. Все эти детали обычно скрыты от оператора программным обеспечением программатора.
С Таймером 0 связаны следующие регистры:
∙ TMR0 (h’01’)
Этот 8-битный суммирующий счетчик, иногда называемый таймером/счетчиком реального времени, осуществляет счет импульсов, поступающих на вход таймера. Данный регистр в любой момент времени доступен как для чтения, так и для записи. При переполнении счетчика (при смене значения с h’FF’ на h’00’) он устанавливает бит T0IF (Timer 0 Interrupt Flag) регистра управления прерываниями INTCON (см. Рис. 7.3 на стр. 213). Этот флаг может использоваться для генерации прерывания.
∙ OPTION_REG (h’81’)
Для управления Таймером 0 используются шесть битов этого регистра, расположенного по адресу h’81’ (см. Рис. 13.2 на стр. 452):
• PS2, PS1, PS0 (биты 2, 1 и 0 соответственно) определяют коэффициент деления предделителя (2PS+1) Таймера 0 или постделителя (2PS) сторожевого таймера.
• T0SE (бит 4) позволяет программисту задать фронт импульсов на входе T0CKI, по которому будет осуществляться инкрементирование счетчика:
0 — нарастающий фронт, 1 — спадающий фронт.
T0CS (бит 5) используется для выбора источника тактового сигнала таймера: 0 — системный тактовый сигнал, 1 — импульсы со входа T0CKI.
• Остальные два бита регистра используются для выбора активного фронта внешнего прерывания и конфигурирования входов порта В.
Счетчик команд
Мы уже говорили (см. Рис. 4.2), что микроконтроллеры PIC среднего уровня имеют 13-битный счетчик команд (Program Counter — PC), выполняющий функцию указателя на команды в пределах 8 Кбайт. Сколько именно битов счетчика используется в каждой конкретной модели, зависит от имеющегося объема памяти программ. Так, в микроконтроллере PIC16F84 используется 10 бит (210 = 1 Кбайт), в PIC16F628 — 11 бит (211 = 2 Кбайт), в PIC16F874 — 12 бит (212 = 4 Кбайт), а в PIC16F877 задействованы все 13 бит.