Задача: получить импульсы с частотой 1Гц.
Исходный материал: PIC16f628a и простенькая devboard + proteus.
Продолжаем разбираться с работой таймеров пиков, на этот раз исследуем работу с 16 битным таймером timer1. Сначала немного теории работы: Таймер может работать как счетчик или таймер, для таймера выделено два 8 битных регистра TMR1H и TMR1L. Контролируется таймер регистром T1CON: T1CKPS<1:0>: Timer1 выбор коэффициента деления частоты 11 = 1:8 10 = 1:4 01 = 1:2 00 = 1:1 T1OSCEN: включение внутреннего генератора 1 = включен 0 = выключен T1SYNC: синхронизация внешнего генератора TMR1CS = 1 1 = не синхронизировать 0 = синхронизировать внешний генератор TMR1CS = 0 бит игнорируется TMR1CS: выбор генератора 1 = внешний источник тактирования на пине RB6/T1OSO/T1CKI/PGC (по возрастающему импульсу) 0 = внутреннее тактирование (FOSC/4) TMR1ON: бит включения 1 = включен 0 = выключен
Для получения импульсов с частотой 1 Гц будем использовать кварц 32.768 кГц.
Небольшой рассчет:
Fosc = 32.768 kHz
F0sc/4 = 8192 Hz
После предделителя F = 1024 Hz
один тик = 0.0009765625 секунды
0.5/0.0009765625 = 512
Таймер до переполнения делает 65536 тиков: 65536 — 512 = 65024
Значит конфигурация таймера будет TMR1H = 0b11111110; TMR1L = 0x00;
Ну и собственно код программы:
#include <htc.h> #define _XTAL_FREQ 32768 __CONFIG(WDTDIS & UNPROTECT & MCLREN & LVPDIS); void main() { __delay_ms(100); //небольшая задержка TRISB = 0x00; PORTB = 0x00; T1CKPS1 = 1; T1CKPS0 = 1; // предделитель = 8 T1OSCEN = 0; //выключаем внутренний генератор TMR1CS = 0; // Fosc/4 GIE = 1; // глобальные прерывания PEIE = 1; // прерывания перефирии TMR1IE = 1; // прерывание по переполнению TMR1 TMR1ON = 1; // включаем таймер TMR1H = 0b11111110; TMR1L = 0x00; //инициализация таймера со значения 65024 for (;;) { //бесконечный цикл } } interrupt isr() { if (TMR1IF) { TMR1H = 0b11111110; TMR1L = 0x00; RB5 = !RB5; TMR1IF = 0; //сброс флага } }
Результат моделирования в протеусе:
Источник: http://diymicro.ru/?p=79 |