Задача: получить импульсы с частотой 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
Соответственно, для второго делителя: Ну и вдогонку, еще пару вещей, которые необходимо учитывать при разработке проекта на 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; //сброс флага } }
Результат на осциллограме в протеусе:
Источник: http://diymicro.ru/?p=84 |