Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Ответы_по_Семисалову[1].DOC
Скачиваний:
32
Добавлен:
25.09.2019
Размер:
7.69 Mб
Скачать
  1. Модуль таймера tmr2.

Модуль представляет собой 8-ми разрядный таймер с предделителем входных импульсов и выходным делителем. Структурная схема таймера показана на рис 10.

Работает таймер следующим образом. Временной период задается путем записи определенного числа в регистр PR2. После пуска тактовые импульсы через программируемый предделитель поступают в счетчик TMR2. Содержимое счетчика TMR2 инкрементируется и сравнивается с регистром PR2. При совпадении счетчик TMR2 обнуляется и процесс повторяется. В момент совпадения формируется тактовый сигнал для программируемого выходного делителя. Сигнал с выходного делителя устанавливает флаг TMR2IF, который при соответствующем разрешении вызывает прерывание. Настройка таймера осуществляется путем записи в регистр T2CON (адрес 12h) в соответствии с таблицей 18.

Таблица 18.

Номер разряда

7

6

5

4

3

2

1

0

Обозначение сигнала

-

TOUTPS3

TOUPTS2

TOUPTS1

TOUTPS0

TMR2ON

T2CKPS1

T2CKPS0

Где:

TOUPTS3:TOUPTS0 - выбор коэффициента деления выходного делителя таймера TMR2,

0000 = 1 : 1

0001 = 1 : 2

:

:

1111 = 1: 16

TMR2ON – включение таймера TMR2: 1 – таймер включен, 0 – таймер выключен.

T2CKPS1:T2CKPS0 – выбор коэффициента деления предделителя:

00 = 1:1

01 = 1:4

1х = 1:16

Пример программирования работы таймер TMR2 .

Рассмотрим пример программирования таймера TMR2 при использовании его для организации задержки на 500 мсек в том фрагменте электроавтоматики. Максимальная задержка самого таймера зависит от разрядности регистра PR2, поэтому:

Tmax = 256 * Tclk tmr2., где:

Tclk tmr2 – период входных импульсов таймера.

С учетом входного предделителя:

Tclk tmr2 = Tclk *16 = 16 мксек,

и Tmax = 256 * 16 = 4096 мксек,

а с учетом выходного делителя с максимальным коэффициентом деления 1:16, получим:

Tmax = 4096 * 16 =65536 мксек.

Таким образом максимальная задержка таймера TMR2 со всеми делителями недостаточна для получения требуемой задержки, поэтому мы вынуждены программировать несколько циклов срабатывания таймера TMR2(см. программирование таймера TMR0). Как было показано в указанном примере программирования таймера TMR0, разность входных импульсов 24288 должна быть компенсирована записью некоторого числа в регистр PR2. Рассчитаем это число.

Поскольку включен выходной делитель 1:16, то в таймере должны компенсировать 24288 /16 = 1518 импульсов, а вместе с предделителем 1518 / 16 = 13 импульсов, т.е. в регистр PR2 мы должны записать число 13 или 0Dh.

С учетом вышеизложенного программа для фрагмента электроавтоматики будет иметь вид:

#define XTAL_FREQ 4MHZ

#define byte unsigned char

#define word unsigned int

#include <pic.h>

#include <stdio.h>

__CONFIG(HS & WDTDIS & PWRTEN & LVPDIS & DUNPROT & WRTEN);модуль

void main() {

char chet = 0x00; //сброс счетчика числа циклов таймера

TRISB = 0xff; // порт В на вход

TRISC = 0x00; // порт С на выход

T2CON = 0x7A //настройка таймера TMR2

for(;;) { // цикл всей программы

for (;!RC0 ;) {

RC0 = (RB0&&RB1&&RB2&&RB4) || (RB0&&RB2&&!RB3&&RB4;

} //проверка условий включения пускателя Кп

TMR2IF = 0; // сброс флага TMR2

PR2 = 0x0D;

TMR2ON = 1; //пуск таймера TMR2

for (chet = 0x00; chet < 0x08; chet ++ ) { //счет числа циклов TMR2

for (; !TMR2IF ;) { //проверка срабатывания таймера

}

RC0 = 0; // отключение Кп

}

} // конец main

Расшифровка настройки таймера по разрядам регистра T2CON: 7A (01111010)

    1. <7> - не программируется,

1111 <6-3> - коэффициент деления выходного делителя 1:16,

0 <2> - таймер пока выключен,

10 <1-0> - в предделителе установлен коэффициент деления 1: 16.

Программирование задержки без использования таймеров.

В случае невозможности применения таймеров, например, все они применены в других участках программы, можно осуществить формирование задержки с помощью программных счетчиков. Рассмотрим такой случай.Условия те же – величина задержки 500 мсек. Задержку можно получить за счет создания программного счетчика. Дискрета времени в этом случае равна времени выполнения операции суммирования в каком либо регистре. Поскольку операция суммирования выполняется за один цикл, дискрета времени равна Tclk, т.е. 1мксек, поэтому для получения заданной задержки придется создать программный счетчик с многократным вложением. Максимальная задержка счетчика первого уровня будет равна: T1 = 256 * 1 = 256 мксек, полная задержка двух уровней составит: T2 = 256 * 256 = 65536 мксек., полная задержка трех уровней составит: T3 = 65536 * 256 = 16777216 мксек.

Таким образом для получения задержки в 500 000 мксек достаточно выполнить

500 000 / 65536 = 7,629 циклов на третьем уровне. Принимаем 8 циклов, второй уровень также обеспечивает полную задержку, а разность:

65536 * 8 – 500 000 = 24 288 мксек будем компенсировать на других уровнях.

Второй уровень уменьшит величину компенсации в 256 раз, поэтому окончательно для первого уровня получим:

:

(65536 -24288) / 256 = 161,125 или в шестнадцатиричной системе = АВ.

Разность первого уровня незначительна, ею можно пренебречь, тогда для первого уровня принимаем полное значение содержимого регистра: FF. И программа формирования задержки будет иметь вид:

#define XTAL_FREQ 4MHZ

#define byte unsigned char

#define word unsigned int

#include <pic.h>

#include <stdio.h>

__CONFIG(HS & WDTDIS & PWRTEN & LVPDIS & DUNPROT & WRTEN);модуль

char perep1; // программный счетчик первого уровня

char perep2; // программный счетчик второго уровня

char perep3; // программный счетчик третьего уровня

void main() {

TRISC = 0x00; // порт С на выход

PORTC = 0x01; // включение индикатора начала задержки

for (perep3 =0; perep3 < 0x08; perep3++) {

for (perep2 =0; perep2 < 0xAB; perep2++) {

for (perep1 =0; perep1 < 0xFF ; perep1++) {

}

}

}

PORTC = 0x00; // выключение индикатора

} //конец main

Программирование задержки можно осуществить и путем использования специальной функции delay, например, void delay xx; где: xx – величина задержки в миллисекундах.