PIC мк. Эксперимент №8. Использование таймера TMR1.

Задача: получить импульсы с частотой 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;  //сброс флага
}

}

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

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

PIC мк. Эксперимент №8. Использование таймера TMR1.: 53 комментария

  1. По первому вопросу снова трудно понять и код и что требуется от него, но мне не нравится как кнопки юзаются. Их бы по хорошему тоже в прерывания поместить, что будет если во время нажатия сработает прерывание по таймеру?

    А второй, ну а кто вам запрещает? просто точность будет хуже по ходу и все. Но я бы на таймере наверное делал это, послал пачку импульсов, дальше таймер перенастроил на отсчет интервала нужного и по его достижении либо перенастроил этот же таймер либо пустил второй.

    Ответить

  2. Буду думать как переделать часть где идет проверка кнопки. Тогда вопрос у меня правильно выставлены биты настройки для timer1 и timer2?????

    Ответить

    sarge Ответил:

    Как минимум TOSCEN надо в 0, но при TMR1CS = 0, на работу он влиять не будет.
    А про остальные биты настройки – разбивайте программу на части и проверяйте все ли работает так как того хотите вы. А то что я тут говорю, это все вилами по воде писано.

    Ответить

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

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

Этот сайт использует Akismet для борьбы со спамом. Узнайте как обрабатываются ваши данные комментариев.