- •Введение.
- •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.2.3. Режим широтно-импульсного преобразователя (шим).
В режиме ШИМ вывод RC2 микроконтроллера используется в качестве выхода 10-разрядного широтно-импульсного модулятора. Структурная схема модуля в этом режиме показана на рис. 13.
Работает модуль в этом режиме следующим образом. Главной задачей модуля является выдача на вывод RC2 сигнала, форма которого показана на рис. Сигнал представляет собой импульсную последовательность с заданной частотой и заданной длительностью импульса. Заданная частота формируется таймером TMR2, в который записывается число, соответствующее периоду ШИМ. Это число предварительно записывается в регистр PR2 и в процессе работы модуля непрерывно сравнивается с состоянием счетчика таймера.
При совпадении этих значений происходит сброс счетчика таймера и установка в «1» выходного RS- триггера, формируя таким образом начало импульса ШИМ.
Длительность импульса задается 10-разрядным двоичным кодом, который записывается в регистр CCPR1L – младшая часть кода и разряды <5:4> регистра CCP1CON - старшая часть кода. В процессе работы модуля содержимое регистров CCPR1L : CCP1CON <5:4> переписывается в буфер, образованный регистром CCPR1H и двухразрядной внутренней защелкой. Содержимое буфера непрерывно сравнивается с содержимым счетчика таймера TMR2. При их совпадении сбрасывается RS-триггер, формируя таким образом на выводе RC2 уровень сигнала «0». Ввод очередного значения длительности и, соответственно, пуск схемы сравнения осуществляется только после срабатывания схемы сравнения триггера TMR2 с регистром PR2. Для правильной работы модуля в режиме ШИМ двоичный код в регистре PR2 должен всегда быть больше кода в регистрах CCPR1L:<5:4> CCP1CON, в противном случае на выходе всегда будет уровень «0».
Численные значения частоты и длительности определяются из следующих зависимостей:
f = 1/T; T= [(PR2 + 1)] x Tosc x (коэффициент предделителя TMR2).
a = (CCPR1L:CCP1CON <5:4>) x Tosc x (коэффициент предделителя TMR2).
Tosc – период тактовых импульсов микроконтроллера.
Таким образом, процесс настройки модуля ССР в режиме ШИМ заключается в следующем:
- рассчитать и записать в регистр PR2 величину периода ШИМ,
- рассчитать и записать в регистры CCPR1L:CCP1CON <5:4> величину длительности импульса ШИМ,
- настроить вывод RC2 на выход (TRISC<2> = 0),
- настроить предделитель и таймер TMR2 (см. раздел «Таймеры….» ),
- включить модуль ССР1 (регистр CCP1CON<3:0> = 11xx).
В микроконтроллере PIC16F873 имеется два модуля ССР: ССР1 и ССР2. Настройка и работа модуля ССР2 аналогична настройке и работе модуля ССР1. Отличие заключается только в именах регистров: например, вместо регистра CCP1CON должен быть регистр CCP2CON, вместо регистра CCPR1H должен быть регистр CCPR2H и т.д.
При использовании двух модулей ССР одновременно необходимо помнить, что основные тактирующие элементы в обоих модулях одни и те же: в режимах захвата и сравнения – таймер TMR1, а в режиме ШИМ – таймер TMR2 и регистр PR2.
В качестве примера программирования модуля ССР в режиме ШИМ рассмотрим следующие условия:
Частота следования импульсов 1кгц, скважность импульсов равна 2, тактовая частота микроконтроллера – 4 мггц.
Из приведенных условий требуемый период ШИМ Тшим = 1/1000= 0,001 сек или 1 000 мксек. Максимальный период импульсов самого таймера TMR2 = 256 * 1 = 256 мксек, и с учетом входного делителя можно получить TMR2 = 256 * 4 =1024 мксек (коэффициент деления входного делителя 1:4) , поэтому для получения требуемой частоты следования импульсов в регистр PR2 необходимо записать число 1000 / 4 = 250 или в шестнадцатиричной системе EA. Длительность импульсов равна половине периода (скважность равна 2), поэтому в регистр CCP1RL запишем число 125 ил в шестнадцатиричной системе 7C.
В регистр CCP1CON запишем число 0x0C – модуль CCP1 включен, режим работы модуля – ШИМ.
Для работы модуля ССР необходимо настроить таймер TMR2 (см.выше):
T2CON = 0x05 – коэффициент деления входного предделителя 1:4, модуль TMR2 включен, выходной делитель выключен
Тогда программа формирования ШИМ – сигналов будет выглядеть следующим образом:
#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() {
TRISC = Ox00; // вывод RC2 на выход
T2CON = 0x05; // настройка модуля TMR2
PR2 = 0xEA; // запись периода ШИМ
CCP1RL = 7C; // запись длительности импульсов ШИМ
CCP1CON = 0x0C; //настройка модуля CCP1 и включение модуля
for (;;) { }
}