- •Введение.
- •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.3.4. Последовательность преобразования аналогового сигнала.
Преобразование начинается после установки в «1» бита G0/-DONE (бит 2) в регистре ADCON0. Последовательность операций приведена на рис. После окончания преобразования результат перепишется в регистры ADRESH и ADRESL, где могут быть прочитаны программно. Перед следующим преобразованием необходимо дать выдержку не менее 2TAD.
2.3.5. Выравнивание результата преобразования.
Поскольку модуль АЦП 10 – разрядный, а результат преобразования хранится в двух спаренных 8 – разрядных регистрах, то окончательный результат преобразования можно «выравнять», как показано на рис. 16. Вид выравнивания задается битом ADFM (бит 7) регистра ADCON1 (адрес 9Fh): при ADFM =1 результат преобразования хранится в регистре ADRESL – восемь младших разрядов и регистре ADRESH – два старших разряда цифрового кода преобразования, шесть старших разрядов регистра ADRESH равны 0, при ADFM = 0 результат преобразования хранится в регистре ADRESH – восемь старших разрядов и в регистре ADRESL – два младших разряда цифрового кода, шесть младших разрядов регистра ADRESL равны 0.
2.3.6. Работа модуля ацп в sleep режиме.
Модуль АЦП можно запустить в работу в SLEEP с целью экономии энергопотребления, при этом в качестве генератора тактовых импульсов должен быть выбран внутренний RC-генератор (биты ADSC1:ADSC0 =11). После завершения преобразования аппаратно сбрасывается бит пуска преобразования GO/-DONE (бит 2 в регистре ADCON0) и если был установлен режим обслуживания прерывания, то микроконтроллер выйдет из SLEEP режима и обработает прерывание. Повторный запуск SLEEP режима может быть осуществлен подпрограммой обработки прерывания. Если режим обслуживания прерывания изначально не был установлен, то после окончания прерывания модуль АЦП выключается, хотя результат преобразования сохраняется в регистрах ADRESH:ADRESL и бит включения модуля ADON остается установленным. То есть работа может быть продолжена, если микроконтроллер будет выведен из SLEEP режима другим способом, например, внешним прерыванием.
2.3.7. Пример программирования модуля ацп.
Описание задачи.
Измерить силу тока в цепи якоря двигателя постоянного тока. Допустимая сила тока по паспорту двигателя составляет 10А.
1. Схема эксперимента:
В качестве датчика тока используем стандартный шунт Rш, рассчитанный на максимальный ток 10А и выдающий при этом токе напряжение на выходе U вых. = 0,75mV.
Схема подключения в этом случае имеет вид:
Т екст программы:
#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() {
TRISA = 0x01; // RA0 на выход
ADCON0 = 0x41; // настройка АЦП
ADCON1 = 0X80
OPTION = 0x08; // настройка TMR0
TOIF = 0; // сброс флага TMR0
TMR0 = 0x13; // пуск TMR0
for(; !TOIF ;) { } // ожидание срабатывания таймера
ADIF = 0; // сброс флага АЦП
GO/-DONE = 1; // пуск АЦП
for (;!ADIF ;) { } // ожидание преобразования АЦП
TXREG = ADRESH; // передача в USART старшего байта АЦП
TXREG = ADRESL; // передача в USART младшего байта АЦП
} // конец main
Примечание. Настройку модуля USART см. в соответствующем разделе.