- •Ответы по Семисалову.
- •Каналы связи в су гпс.
- •Многоадресный параллельный канал связи (шина).
- •Последовательные цифровые каналы связи.
- •Многоадресные последовательные каналы связи.(Добавить про usb, il…)
- •Линии связи в информационных каналах связи.
- •Структурная схема учпу.
- •Структурная схема логико-вычислительной части учпу.
- •Векторное и радиальное прерывание.
- •Комбинированное прерывание брп.
- •Контроллер электроавтоматики
- •Основные характеристики микропроцессора pic17f873
- •Регистры состояния и управления.
- •Порты ввода-вывода
- •Примечания:
- •2.3.7. Пример программирования модуля ацп.
- •Таймер tmr0.
- •Модуль таймера tmr1.
- •Модуль таймера tmr2.
- •Модуль сср.
- •Универсальный синхронно – асинхронный приемопередатчик (usart).
- •Модуль ведущего синхронного последовательного порта (mssp).
- •Измерительные системы: назначение, состав, дос-классификация.
- •Органы управления в станках
- •Одиночные органы управления.
- •Групповые органы управления
- •Клавиатуры с линейными шифраторами.
- •Матри4ные клавиатуры
- •Устройства индикации
- •Одино4ные индикаторы
- •Одностро4ные дисплеи
- •Многостро4ные дисплеи
Модуль таймера 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)
<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 – величина задержки в миллисекундах.