- •Введение.
- •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.1.2. Модуль таймера tmr1.
Таймер TMR1 имеет 16 – разрядный счетчик, выполненный на двух регистрах (TMR1H, TMR1L), доступных для записи и чтения. Модуль может работать в двух режимах:
- режим таймера,
- режим счетчика.
В режиме таймера инкрементируется содержимое 16-ти разрядного счетчика и при переполнении его устанавливается флаг прерывания TMR1IF в региcтре PIR1 <0>.
В режиме счетчика происходит приращение 16-ти разрядного счетчика, содержимое которого может быть прочитано в любой момент времени. При достижении значения FFh, счет начинается заново со значения 00h. Структурная схема модуля показана на рис 9.
Настройка модуля на различные режимы производится установкой соответствующих бит регистра T1CON (адрес 10h), значения которых приведены в таблице 17.
Таблица 17.
Номер разряда |
7 |
6 |
5 |
4 |
3 |
2 |
1 |
0 |
Обозначение сигнала |
- |
- |
T1CKPS1 |
T1CKPS0 |
T1OSCEN |
-T1SYNC |
TMR1CS |
TMR1ON |
Где:
T1CKPS1:T1CKPS0 – выбор коэффициента деления предделителя:
11 = 1:8
10 = 1:4
01 = 1:2
00 = 1:1
T1OSCEN – включение тактового генератора модуля TMR1:
- генератор включен,
- генератор выключен (инвертор и обратная связь отключены для уменьшения потребления тока),
-T1SYNC – синхронизация внешнего тактового сигнала (при TMR1CS = 1):
1 – не синхронизировать внешний тактовый сигнал,
0 – синхронизировать внешний тактовый сигнал.
TMR1CS - выбор источника тактового сигнала:
– внешний источник тактового сигнала со входа RC0 (активный передний фронт),
- внутренний источник Fosc/4.
TMR1ON - включение модуля TMR1:
- модуль включен,
- модуль выключен.
Пример программирования таймера TMR1.
Исходные данные примем те же, что и в примере программирования таймера TMR0:
1. Требуемая задержка -500 мсек.
2. Тактовый сигнал – внутренняя частота Fosc / 4 = 1 MHz/
3. Режим работы модуля – таймер.
Максимальное время срабатывания самого таймера составляет:
t max = 256*256 * 1 = 65536 мксек (счетчик таймера сдвоенный TMR1H и TMR1L
С включенным предделителем: T max = t max * 8 = 524288 мксек., т.е. максимальное время самого таймера TMR1 больше требуемого. Разность времен 24288 мксек компенсируем за счет уменьшения длительности цикла самого таймера путем записи в регистр таймера (TMR1H и TMR1L) некоторого числа:
mm = (24288 / 8)h = 0CBA
где: 24288 – разность максимального и требуемого времени,
8 – коэффициент деления предделителя таймера TMR1,
Текст программы.
#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() {
TRISB = 0xff; // порт В на вход
TRISC = 0x00; // порт С на выход
T1CON = 0x30; //настройка таймера TMR1
for(;;) { // цикл всей программы
for (;!RC0 ;) {
RC0 = (RB0&&RB1&&RB2&&RB4) || (RB0&&RB2&&!RB3&&RB4);
} // решение булевых уравнений фрагмента
TMR1IF= 0; // сброс флага TMR1
TMR1H = 0x0C; //начальная установка таймера
TMR1L = 0xBA;
TMR1ON = 1; //пуск таймера TMR1
for (; !TMR1IF ;) { // цикл таймера TMR1
RC0 = 0; // отключение Кп
}
} // конец main
Примечание. Код настройки таймера 30 (00110000) по порядку соответствует:
<7,6> – не программируется,
11 <5,4> – настройка предделителя 1:8
0 <3> - внутренний генератор отключен.
0 <2> - синхронизация входного сигнала отсутствует
0 <1> - внутренний источник входных импульсов
0 <0> - таймер TMR1 пока выключен.