Меню сайта
Администрация
579-010-666
Или воспользуйтесь формой обратной связи.
Разделы
Автолюбителям [13]
Таймер NE555 [11]
Конструктор схем [11]
Измерительная аппаратура [5]
Осциллографы [2]
На микрухах [10]
Роботы [0]
Световые эффекты [1]
Термостат [0]
Обучение PIC с нуля [17]
Чат
500
Наш опрос
Оцените мой сайт

Результат опроса Результаты Все опросы нашего сайта Архив опросов

Всего голосовало: 148
Статистика



Онлайн всего: 1
Гостей: 1
Пользователей: 0
Главная » Статьи » Обучение 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

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

Ну и вдогонку, еще пару вещей, которые необходимо учитывать при разработке проекта на 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
Категория: Обучение PIC с нуля | Добавил: 4ydocactus (01.06.2012)
Просмотров: 1209 | Теги: pic16f628a, работа с таймером, TMR2, PIC микроконтроллеры | Рейтинг: 0.0/0
Всего комментариев: 0
Добавлять комментарии могут только зарегистрированные пользователи.
[ Регистрация | Вход ]
Профиль
Суббота
04.05.2024
10:04

Новости сайта
Добавленно новых материалов:
****************************************
1.06.2012
Просьба...
Уважаемые пользователи!
Выделите пожалуйста 1 минуту вашего времени и кликните пару ссылок от рекламы на Google. Тем самым вы потдержите проект.
Спасибо!
Реклама