- •Введение.
- •1.1. Основные характеристики.
- •1.2. Структурная схема микроконтроллера.
- •1.3. Блоки памяти.
- •1.4. Регистры состояния и управления.
- •1.5. Порты ввода-вывода.
- •2.0.Функциональные модули микроконтроллера pic16f873.
- •2.1. Таймеры.
- •2.1.2. Модуль таймера tmr1.
- •2.1.3. Модуль таймера tmr2.
- •2.2. Модуль сср.
- •2.2.2. Режим сравнения.
- •2.2.3. Режим широтно-импульсного преобразователя (шим).
- •2.3. Модуль ацп.
- •2.3.1.Работа модуля осуществляется в следующей последовательности:
- •2.3.2.Временные требования к работе модуля ацп.
- •2.3.4. Последовательность преобразования аналогового сигнала.
- •2.3.5. Выравнивание результата преобразования.
- •2.3.6. Работа модуля ацп в sleep режиме.
- •2.3.7. Пример программирования модуля ацп.
- •2.4.Универсальный синхронно – асинхронный приемопередатчик (usart).
- •2.4.1.Режим асинхронного полного дуплекса.
- •2.4.1.1. Асинхронный передатчик usart.
- •2.4.1.2. Асинхронный приемник модуля usart.
- •2.5.Модуль ведущего синхронного последовательного порта (mssp).
- •2.5.1. Режим ведомого i2c.
- •2.5.1.1.Прием данных.
- •2.5.1.2. Передача данных.
- •2.5.1.3.Поддержка общего вызова.
- •2.5.1.4.Работа в sleep режиме.
- •2.5.2. Режим ведущего i2c.
- •2.5.3. Подключение абонентов к шине i2c.
- •2.6. Прерывания.
- •2.7. Сторожевой таймер.
- •2.8. Система команд микроконтроллера.
- •Incf Прибавить 1 к содержимому регистра f.
- •Incfsz Прибавить 1 к регистру f, пропустить, если 0.
- •Iorlw Побитное «или» регистра w и константы k.
- •Iorwf Побитное “или» регистров w, f.
- •Xorlw Побитное «Исключающее или» константы и регистра w.
- •Xorwf Побитное «исключающее или» регистров w,f.
2.0.Функциональные модули микроконтроллера pic16f873.
Микроконтроллеры серии PIC16F873 имеют в своем составе следующие функциональные блоки: - три таймера: TMR0, TMR1, TMR2,
- два специальных модуля CCP1, CCP2,
- модуль аналого - цифрового преобразователя –АЦП,
- модуль универсального синхронно – асинхронного приемопередатчика USART,
- модуль синхронного последовательного порта MSSP,
- модуль памяти данных типа EEPROM.
Микроконтроллеры других серий этого семейства имеют иные наборы функциональных модулей, в частности, в их составе могут быть модули параллельного порта или модули USB – портов.
Рассмотрим работу некоторых функциональных модулей.
2.1. Таймеры.
Микроконтроллеры типа PIC16F873 имеют в своем составе три таймера: TMR0, TMR1 и TMR2. В основном все таймеры предназначены для получения временных интервалов в процессах управления различными техническими системами. Однако каждый из перечисленных таймеров имеет свои технические и функциональные особенности. Рассмотрим устройство и принцип действия всех таймеров.
2.1.1.Таймер TMR0.
Данный таймер имеет следующие основные функциональные возможности:
- 8-разрядный таймер-счетчик,
- возможность чтения и записи текущего состояния счетчика,
- 8-разрядный программируемый предделитель входных импульсов,
- внутренний или внешний источник тактовых входных импульсов,
- выбор активного фронта входных импульсов,
- возможность формирования запроса на прерывание при переполнении счетчика.
Блок-схема таймера TMR0 показана на рис 1.8.
Настройка таймера TMR0 осуществляется с помощью регистра OPTION-REG (адрес 81h или 181h). Распределение разрядов и обозначение сигналов регистра приведены в таблице 16.
Таблица 16.
Номер разряда |
7 |
6 |
5 |
4 |
3 |
2 |
1 |
0 |
Обозначение сигнала |
- |
- |
TOCS |
TOSE |
PSA |
PS2 |
PS1 |
PS0 |
Назначение сигналов:
TOCS – выбор тактового сигнала для таймера TMR0:
1- внешний тактовый сигнал с вывода RA4,
0- внутренний тактовый сигнал CLKOUT ,
TOSE – выбор фронта входного сигнала для таймера:
1 – приращение счетчика таймера по заднему фронту входного сигнала,
0 – то же по переднему фронту,
PSA – выбор способа использования предделителя:
1 – предделитель включен перед сторожевым таймером – WDT,
0 – предделитель включен перед таймером TMR0,
PS2:PS0 – установка коэффициента деления предделителя: см. таблицу 5
Принцип работы таймера типовой для большинства таймеров. Вначале производится настройка таймера в соответствии с вышеизложенным. Поскольку счетчик таймера работает на сложение, в регистр TMR0 записывается дополнительный код требуемого времени:
N = FF – t * Т,
где: t – интервал времени в сек, Т – период входного тактового сигнала . Период входного сигнала определяется как величина обратная частоте входного сигнала. Входной сигнал формируется либо внутренним генератором: F = Fosc / 4, либо внешним генератором через вход RA4 (см. таблицу 4)
После переполнения счетчика (регистр TMR0) формируется сигнал готовности таймера – установка в 1 сигнала TOIF (регистр INTCON <2>), который является также сигналом требования прерывания. Само же прерывание может быть разрешено установкой в 1 сигнала TOIE (регистр INTCON <5>). После обработки прерывания сигнал требования прерывания TOIF должен быть программно сброшен в 0. Следующий интервал времени будет получен при повторной записи в регистр TMR0.
Примечания:
После записи в регистр TMR0 первые два машинных цикла запрещается подача входных импульсов в счетчик таймера, что вызовет задержку начала формирования интервала времени.
Запись в регистр TMR0 сбрасывает предделитель не изменяя его режим работы.
Пример программирования работы таймера TMR0 на языке СИ.
Данный таймер можно использовать в качестве элемента задержки в контроллерах электроавтоматики станков с ЧПУ. Дополним приведенный выше фрагмент электроавтоматики условием отключения Кп после задержки в 500 мсек. с помощью таймера TMR0. Для простоты будем использовать внутренний генератор тактовых импульсов частотой 4 МГц, откуда тактовая частота равна: Fclk = Fosc /4 = 1МГц, а период соответственно Тclk = 1 мксек.
Время срабатывания таймера рассчитывается из условия:
t = nn * Tclk,
где nn – число импульсов, пришедших в счетчик таймера.
Tclk – период входных импульсов таймера.
Так как счетчик таймера TMR0 работает на суммирование, то в него записывается дополнительный код:
mm = FF – nn,
поэтому максимальный период срабатывания таймера (при mm =0) будет равен:
Тмах = 256 х Tclk = 256 мксек., где:
256 – максимальная емкость 8-ми разрядного регистра TMR0,
Для получения большей задержки перед таймером включается предделитель (см. бит PSA <3> в регистре OPTION-REG). Этот прием позволит еще увеличить время задержки в 256 раз:
Тмах = 256 * 256 = 65536 мксек
Однако и этого приема недостаточно для получения требуемой задержки, поэтому увеличим задержку за счет формирования нескольких циклов срабатывания таймера:
К = 500 000 / 65536 = 7,629 .
Поскольку число циклов может быть только целым, принимаем К = 8.
Тогда максимально возможное число импульсов будет равно:
Mmax = 65536 * 8 = 524288
поэтому разность 24288 компенсируем за счет уменьшения задержки на самом таймере с учетом предделителя:
mm = 24288 / 256 = 94,875, принимаем : mm = 95 , или в шестнадцатиричной системе счисления: mm = 5D. Данное число будем записывать в регистр TMR0 таймера.
Программа работы фрагмента электроавтоматики (см. раздел 1.6) совместно с задержкой в 500 мсек будет имет вид:
#define XTAL_FREQ 4MHZ //Частота тактового генератора 4 MHZ
#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; // порт С на выход
OPTION = 0x07; // предделитель перед таймером TMR0,
// коэффициент деления предделителя 1:256
for(;;) { // цикл всей программы
for (;!RC0 ;) {
RC0 = (RB0&&RB1&&RB2&&RB4) || (RB0&&RB2&&!RB3&&RB4;
} // решение булевых уравнений фрагмента
TOIF = 0; // сброс флага TMR0 - начальный
for (chet = 0x00; chet < 0x08; chet ++ ) { //счет циклов таймера
T0IF = 0; // сброс флага таймера в цикле
TMR0 = 0x5D; //пуск таймера TMR0
for (; !TOIF ;) { // цикл таймера TMR0
}
RC0 = 0; // отключение Кп
}
} // конец main