- •Введение.
- •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.7. Сторожевой таймер.
Сторожевой таймер WDT предназначен для повышения надежности работы микроконтроллера. Он работает от внутреннего RC-генератора, поэтому не зависит от работы основной программы. При переполнении сторожевого таймера происходит общий сброс микроконтроллера. Для надежной работы устройства с использованием микроконтроллера необходимо в рабочей программе предусмотреть периодический сброс сторожевого таймера командой CLRWDT, предупредив таким образом непредвиденный общий сброс микроконтроллера. Сторожевой таймер при необходимости может быть включен или выключен установкой бита WDTE (2 бит в слове конфигурации, записанном по адресу 2007h) при программировании микроконтроллера. Для увеличения периода срабатывания сторожевого таймера к его входу может быть подключен предделитель (см. раздел таймер TMR0).
2.8. Система команд микроконтроллера.
Система команд микроконтроллеров PIC16F873 (PIC16F876) состоит из 35 команд. Полный перечень команд приведен в таблице 31 . Команды условно можно разделить на три группы: к первой группе относятся команды, работающие целиком с байтами; ко второй группе относятся команды, работающие с адресуемыми битами в регистрах; к третьей группе относятся команды управления процессором и команды, работающие с константами. Каждая команда представляет собой 14-разрядный двоичный код, содержащий код операции (OPCODE) и один или два операнда. Форматы команд приведены на рис.25 Большинство команд выполняются за один машинный цикл, исключение составляют команды, которые изменяют состояние счетчика команд:RETFIE, RETLW, RETURN; а также команды условий перехода: DECFSZ и INCFSZ. Эти команды выполняются за два машинных цикла. Машинный цикл состоит из 4 импульсов тактового генератора, т.е. при тактовой частоте 4 МГц время одного машинного цикла равно 1 мкс.
Таблица 31. Система команд микроконтроллера.
№№ |
Мнемоника команд |
Описание команд |
14-разрядный код бит 13 бит0 |
|
Байт ориентированные команды |
|
|||
1 |
ADDWF f,d |
Сложение регистров W и f |
00 0111 dfff ffff |
|
2 |
ANDWF f,d |
Побитное «И» регистров Wи f |
00 0101 dfff ffff |
|
3 |
CLRF f |
Очистить регистр f |
00 0001 1fff ffff |
|
4 |
CLRW |
Очистить регистр W |
00 0001 0xxx xxxx |
|
5 |
COMF f,d |
Инвертировать регистр f |
00 1001 dfff ffff |
|
6 |
DECF f,d |
Вычесть 1 из регистра f |
00 0011 dfff ffff |
|
7 |
DECFSZ f,d |
Вычесть 1 из f и пропустить следующую команду, если f=0 |
00 1011 dfff ffff |
|
8 |
INCF f,d |
Прибавить 1 к регистру f |
00 1010 dfff ffff |
|
9 |
INCFSZ f,d |
Прибавить 1 к f и пропустить следующую команду, если f=0 |
00 1111 dfff ffff |
|
10 |
IORWF f,d |
Побитное «ИЛИ» регистров W и f |
00 0100 dfff ffff |
|
11 |
MOVF f,d |
Переслать регистр f |
00 1000 dfff ffff |
|
12 |
MOVWF f |
Переслать регистр W в регистр f |
00 0000 1fff ffff |
|
13 |
NOP |
Нет операции |
00 0000 0xx0 0000 |
|
14 |
RLF f,d |
Циклический сдвиг регистра f влево через перенос |
00 1101 dfff ffff |
|
15 |
RRF f,d |
Циклический сдвиг регистра f вправо через перенгос |
00 1100 dfff ffff |
|
16 |
SUBWF f,d |
Вычесть содержимое регистра W из регистра f |
00 0010 dfff ffff |
|
17 |
SWAPF f,d |
Поменять местами полубайты в регистре f |
00 1110 dfff ffff |
|
18 |
XORWF f,d |
Побитное “Исключающее ИЛИ» регистров W и f |
00 0110 dfff ffff |
|
Бит ориентированные команды |
|
|||
19 |
BCF f,b |
Очистить бит номер b в регистре f (b = 0 – 7) |
01 00bb bfff ffff |
|
20 |
BSF f,b |
Установить в 1 бит номер b в регистре f |
01 01bb bfff ffff |
|
21 |
BTFSC f,b |
Проверить бит номер b в регистре f и пропустить следующую команду, если бит равен 0 |
01 10bb bfff ffff |
|
22 |
BTFSS f,b |
Проверить бит номер b в регистре f и пропустить следующую команду, если бит равен 1 |
01 11bb bfff ffff |
|
Команды управления и операций с константами |
|
|||
23 |
ADDLW k |
Сложить константу k с регистром W |
11 111x kkkk kkkk |
|
24 |
ANDLW k |
Побитное «И» константы k и регистра W |
11 1001 kkkk kkkk |
|
25 |
CALL k |
Вызов подпрограммы |
10 0kkk kkkk kkkk |
|
26 |
CLRWDT |
Очистить сторожевой таймер |
00 0000 0110 0100 |
|
27 |
GOTO k |
Безусловный переход |
10 1kkk kkkk kkkk |
|
28 |
IORLW k |
Побитное «ИЛИ» константы и регистра W |
11 1000 kkkk kkkk |
|
29 |
MOVLW k |
Переслать константу в регистр W |
11 00xx kkkk kkkk |
|
30 |
RETFIE |
Возврат из подпрограммы с разрешением прерываний |
00 0000 0000 1001 |
|
31 |
RETLW k |
Возврат из подпрограммы с загрузкой константы в регистр W |
11 01xx kkkk kkkk |
|
32 |
RETURN |
Возврат из подпрограммы |
00 0000 0000 1000 |
|
33 |
SLEEP |
Перейти в режим энергосбережения SLEEP |
00 0000 0110 0011 |
|
34 |
SUBLW k |
Вычесть регистр W из константы |
11 110x kkkk kkkk |
|
35 |
XORLW k |
Побитное «Исключающее ИЛИ» константы и регистра W |
11 1010 kkkk kkkk |
Подробное описание команд.
ADDWF Сложение регистров W и f
Синтаксис команды: [имя метки] ADDWF f,d
Операнды: 0 ≤ f ≤ 127
dÎ [0,1]
Операция: (W) + (f) ® dest (приемник)
Изменяемые флаги: C, DC, Z
Описание операции: Сложить содержимое регистров W и f,
результат остается в регистре W, если
d = 0; если d = 1, результат остается в
регистре f.
ADDLW Сложение регистра W с константой k
Синтаксис команды: [имя метки] ADDLW k
Операнды: 0 ≤ k ≤ 255
Операция: (W) + k ® (W)
Изменяемые флаги: C, DC, Z
Описание операции: Содержимое регистра W складывается с
константой k, результат остается в W.
ANDLW Побитное «И» регистра W с константой k.
Синтаксис команды: [имя метки] ANDLW k
Операнды: 0 ≤ k ≤ 255
Операция: (W) .AND. k ® (W)
Изменяемые флаги: Z
Описание операции: Выполняется побитное «И» регистра (W) с
8-разрядной константой k.
ANDWF Побитное «И» регистров W и f.
Синтаксис команды: [имя метки] ANDWF f,d
Операнды: 0 ≤ f ≤ 127
d Î[0,1]
Операция: (W) .AND. f ® (dest)
Изменяемые флаги: Z
Описание операции: Побитное «И» регистров W и f, результат
в регистре W, если d = 0 и в регистре f,
если d = 1.
BCF Очистить бит b в регистре f.
Синтаксис команды: [имя метки] BCF f,b
Операнды: 0 ≤ f ≤ 127
0 ≤ b ≤ 7
Операция: 0 ® (f <b>)
Изменяемые флаги: нет
Описание операции: Записывается 0 в бит «b» регистра f.
BSF Установить бит b в регистре f.
Синтаксис команды: [имя метки] BSF f,b
Операнды: 0 ≤ f ≤ 127
0 ≤ b ≤ 7
Операция: 1 ® (f<b>)
Изменяемые флаги: нет
Описание операции: Записывается 1 в бит «b» регистра f.
BTFSC Проверить бит b в регистре f, пропустить, если 0.
Синтаксис команды: [имя метки] BTFSC f,b
Операнды: 0 ≤ f ≤ 127
0 ≤ b ≤ 7
Операция: пропустить, если <b> = 0
Изменяемые флаги: нет
Описание операции: Если бит «b» равен 1, то исполняется
следующая команда в программе,
если бит «b» равен 0, то следующая
команда пропускается (исполняется
NOP-операция). Вся команда
выполняется за два машинных цикла.
BTFSS Проверить бит b в регистре f, пропустить, если 1.
Синтаксис команды: [имя метки] BTFSS f,b
Операнды: 0 ≤ f ≤ 127
0 ≤ b ≤ 7
Операция: пропустить, если <b> =1
Изменяемые флаги: нет
Описание операции: Если бит «b» равен 0, то выполняется
следующая команда в программе.
Если бит «b» равен 1, то следующая
команда пропускается (исполняется
NOP-операция). Вся команда
выполняется за два машинных цикла.
CALL Вызов подпрограммы.
Синтаксис команды: [имя метки] CALL f
Опе6ранды: 0 ≤ f ≤ 2047
Операция: (PC) + 1 ® TOS
k ® PC <10:0>
(PCLATH <4:3> ® PC <12:11>
Изменяемые флаги: нет
Описание операции: Вызов подпрограммы. Адрес
следующей команды помещается в
вершину стека. Константа загружается
в 11 младших разрядов счетчика
команд, два старших бита счетчика
загружаются из регистра PCLATH
(из разрядов <4:3> ).
Обозначения: TOS – вершина стека, PC – счетчик команд,
PCLATH – специальный регистр для записи
в старшие разряды счетчика команд.
RETURN Возврат из подпрограммы.
Синтакасис команды: [имя метки] RETURN
Операнды: нет
Операция: TOS ® PC
Изменяемые флаги: нет
Описание операции: Возврат из подпрограммы в основную,
содержимое вершины стека загружается
в счетчик команд.
RETFIE Возврат из подпрограммы с разрешением прерывания.
Синтаксис команды: [имя метки] RETFIE
Операнды: нет
Операция: TOS ® PC
1 ® GIE
Изменяемые флаги: нет
Описание операции: Возврат из подпрограммы. Вершина
стека записывается в счетчик команд,
разрешаются глобальные прерывания.
RETLW Возврат из подпрограммы сзаписью константы в регистр W.
Синтаксис команды: [имя метки] RETLW k
Операнды: 0 ≤ k ≤ 255
Операция: TOS ® PC
k ® (W)
Изменяемые флаги: нет
Описание операции: Возврат из подпрограммы. Константа k
загружается в регистр W, вершина стека
загружается в счетчик команд PC.
RETURN Возврат из подпрограммы.
Синтакасис команды: [имя метки] RETURN
Операнды: нет
Операция: TOS PC
Изменяемые флаги: нет
Описание операции: Возврат из подпрограммы в основную,
содержимое вершины стека загружается
в счетчик команд.
RETFIE Возврат из подпрограммы с разрешением прерывания.
Синтаксис команды: [имя метки] RETFIE
Операнды: нет
Операция: TOS PC
1 GIE
Изменяемые флаги: нет
Описание операции: Возврат из подпрограммы. Вершина
стека записывается в счетчик команд,
разрешаются глобальные прерывания.
RETLW Возврат из подпрограммы сзаписью константы в регистр W.
Синтаксис команды: [имя метки] RETLW k
Операнды: 0 ≤ k ≤ 255
Операция: TOS PC
k (W)
Изменяемые флаги: нет
Описание операции: Возврат из подпрограммы. Константа k
загружается в регистр W, вершина стека
загружается в счетчик команд PC.
CLRF Очистить регистр f.
Синтаксис команды: [имя метки] CLRF f
Операнды: 0 ≤ f ≤ 127
Операция: 00h f
Изменяемые флаги: 1 Z
Описание операции: Очистить регистр f и установить флаг Z.
CLRW Очистить регистрW.
Синтаксис команды: [имя метки] CLRW
Операнды: нет
Операция: 00h W
Изменяемые флаги: 1 W
Описание операции: Очистить регистр W и установить флаг Z.
CLRWDT Сбросить сторожевой таймер.
Синтаксис команды: [имя метки] CLRWDT
Операнды: нет
Операция: 00h WDT
00h предделитель WDT
1 -TO
1 -PD
Изменяемые флаги: -TO, -PD
Описание операции: Сбрасывается сторожевой таймер и
предделитель, если он подключен к
сторожевому таймеру, в регистре
STATUS устанавливаются биты –TO и
-PD
COMF Инвертировать регистр f.
Синтаксис команды: [имя метки] COMF f,d
Операнлы: 0 ≤ f ≤ 127
d [0,1]
Операция: (f) dest
Изменяемые флаги: Z
Описание операции: Инвертируется содержимое регистра f,
результат остается в регистре f, если
d = 1, или в регистре W, если d = 0.
DECF Вычесть 1 из регистра f.
Синтаксис команды: [имя метки] DECF f,d
Операнды: 0 ≤ f ≤ 127
d [0,1]
Операция: (f) - 1 dest
Изменяемые флаги: Z
Описание операции: Из регистра f вычитается 1. Результат
в регистре W, если d = 0, в регистре
f, если d = 1.
DECFSZ Вычесть 1 из регистра f и пропустить, если 0.
Синтаксис команды: [имя метки] DECFSZ f,d
Операнды: 0 ≤ f ≤ 127
d [0,1]
Операция: (f) -1 dest, пропустить, если 0
Изменяемые флаги: нет
Описание операции: Вычитается 1 из регистра f, результат
в регистре W, если d = 0, или в регистре
f, если d = 1. Если результат вычитания
равен 0, то следующая команда программы
пропускается, если результат не равен 0,
выполняется следующая команда.
GOTO Безусловный переход.
Синтаксис команды: [имя метки] GOTO k
Операнды: 0 ≤ k ≤ 2047
Операция: k PC <10:0>
(PCLATH <4:3>) PC<12:11>
Изменяемые флаги: нет
Описание операции: Безусловный переход на адрес, заданный
константой k. 11 младших разрядов адреса
записываются в счетчик команд непосред-
ственно константой, два старших разряда
переписывается из регистра PCLATH/