PIC мк. Эксперимент №9. Использование модуля таймера TMR2.

Задача: получить импульсы с частотой 1КГц.

Исходный материал: PIC16f628a и простенькая devboard + proteus.

Модуль таймера TMR2 является 8 битным таймером с некоторыми особенностями.

Импульсы с кварца проходят через предделитель с 3 коэффициентами деления (1, 4 и 16). Далее, поделенные импульсы используются для увеличения значения TMR2. Содержимое TMR2 сравнивается со значением, находящимся в регистре PR2. В случае совпадения импульсы поступают на очередной делитель и генерируется прерывание (TMR2IF).

Подсчет импульсов можно останавливать присваивая TMR2ON 0. Да, и еще, и TMR2 и PR2 являются перезаписываемыми.

Ниже приведены настройки первого делителя:

T2CKPS1    T2CKPS0
0                   0                  1:1
0                   1                   1:4
1                    x                  1:16

Соответственно, для второго делителя:

postcaller

Ну и вдогонку, еще пару вещей, которые необходимо учитывать при разработке проекта на PIC микроконтроллере, использующем модуль таймера TMR2:

  • В момент подачи питания на микроконтроллера в регистре PR2 содержится значение FFh
  • Оба делителя сбрасываются при изменении значения TMR2
  • Сброс микроконтроллера ведет к сбросу предделителей

А сейчас попытаемся применить все сказанное на практике.

Не буду отклоняться от прошлых опытов и также применим таймер для генерации импульсов заданной частоты. У нас в распоряжении кварц 4 МГц, то есть на вход таймера поступает частота 1 МГц.

получим импульсы длиной в 500 us (частота 1KHz)


#include <htc.h>
#define _XTAL_FREQ 4000000
#define out RB7

__CONFIG(WDTDIS & UNPROTECT & MCLREN & LVPDIS);

void main() {
__delay_ms(100); //небольшая задержка
TRISB = 0x00;
PORTB = 0x00;
TMR2 = 0x01; //стартуем с 1
PR2 = 0x64;  //считаем по 100 мкс
T2CKPS0 = 0; T2CKPS1 = 0; //1 делитель не делит входную частоту
TOUTPS2 = 1; TOUTPS1 = 0; TOUTPS3 = 0; TOUTPS0 = 0; //2 делитель делит на 5
GIE = 1;   // глобальные прерывания
PEIE = 1;  // прерывания перефирии
TMR2IE = 1;
TMR2ON = 1; // Запуск таймера!
for (;;) {
 //бесконечный цикл
 }

}

interrupt isr() {

if (TMR2IF) {
out = !out;
TMR2 = 0x01;
T2CKPS0 = 0; T2CKPS1 = 0; //1 делитель не делит входную частоту
TOUTPS2 = 1; TOUTPS1 = 0; TOUTPS3 = 0; TOUTPS0 = 0; //2 делитель делит на 5
TMR2IF = 0;  //сброс флага
}

}

Результат на осциллограме в протеусе:

Исходники здесь

PIC мк. Эксперимент №9. Использование модуля таймера TMR2.: 3 комментария

  1. Не где не нашел токового объяснения про сброс. При загрузке или сбросе в регистре TMR2, будет или нет обнуляться регистр PR2 ? Спасибо за помощь.

    Ответить

    sarge Ответил:

    Насколько я знаю, PR2 может сброситься только по ресету в FF, но я не уверен на 100%.

    Всегда ведь можно промоделировать и проверить ;)

    Ответить

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Можно использовать следующие HTML-теги и атрибуты: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code class="" title="" data-url=""> <del datetime=""> <em> <i> <q cite=""> <strike> <strong> <pre class="" title="" data-url=""> <span class="" title="" data-url="">