- •Введение.
- •Микроконтроллеры. Общие положения.
- •1.2. Типы микроконтроллеров
- •1.2.1. Встраиваемые микроконтроллеры.
- •1.2.2. Микроконтроллеры с внешней памятью.
- •1.2.3. Цифровые сигнальные процессоры
- •1.3. Архитектура микроконтроллеров.
- •1.4. Типы памяти микроконтроллеров
- •1.4.1. Память программ.
- •1.4.2. Память данных
- •1.4.3. Регистры микроконтроллера.
- •1.4. 4.Внешняя память
- •Микроконтроллеры pic (Разработка фирмы Mikrochip).
- •2.1. Питание р1с-микроконтроллеров
- •Тактирование pic-микроконтроллеров.
- •2.3. Схемы сброса
- •2.4. Выбор микроконтроллера
- •Микроконтроллеры типа pic16f873.
- •3.1. Основные характеристики.
- •3.2. Структурная схема микроконтроллера.
- •3.3. Блоки памяти.
- •1.4. Регистры состояния и управления.
- •1.5. Порты ввода-вывода.
- •1.6. Пример программирования работы фрагмента электроавтоматики станка с чпу.
- •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. Модуль eeprom памяти данных.
- •2.6. Прерывания.
- •2.7. Сторожевой таймер.
- •2.8. Система команд микроконтроллера.
- •Incf Прибавить 1 к содержимому регистра f.
- •Incfsz Прибавить 1 к регистру f, пропустить, если 0.
- •Iorlw Побитное «или» регистра w и константы k.
- •Iorwf Побитное “или» регистров w, f.
- •Xorlw Побитное «Исключающее или» константы и регистра w.
- •Xorwf Побитное «исключающее или» регистров w,f.
RA0/AN0
RA1/AN1
RA2/AN2/Vref-
RA3/AN3/Vref+
MCLR1 RA4/TOCK1
Vpp RA5/AN5/SS
RC0/T1OCO/T1CK1
OSC1/CLK1N RC1/T1OS1/CCP2
RC2/CCP1
RC3/SCK/SCL
RC4/SD1/SDA
OSC2/CLKOUT RC5/SD0
RC6/TX/CK
RC7/RX/DT
Vdd
RB0/INT
RB1
RB2
Vss RB3/PGM
RB4
RB5
RB6/PGC
Vss RB7/PGD
2
3
4
5
6
7
11
12
13
14
15
16
17
18
21
22
23
24
25
26
27
28
1
9
10
20
19
8
Рис.3. Назначение выводов микроконтроллеров PIC16F873, PIC16F876.
RA0/AN0
RA1/AN1
RA2/AN2/Vref-
RA3/AN3/Vref+
MCLR1 RA4/TOCK1
Vpp RA5/AN5/SS
RC0/T1OCO/T1CK1
OSC1/CLK1N RC1/T1OS1/CCP2
RC2/CCP1
RC3/SCK/SCL
RC4/SD1/SDA
OSC2/CLKOUT RC5/SD0
RC6/TX/CK
RC7/RX/DT
Vdd
RB0/INT
RB1
RB2
Vss RB3/PGM
RB4
RB5
RB6/PGC
Vss RB7/PGD
2
3
4
5
6
7
11
12
13
14
15
16
17
18
21
22
23
24
25
26
27
28
1
9
10
20
19
8
Рис.4. Назначение выводов микроконтроллеров PIC16F887.
Рис.5 Организация памяти программ в микроконтроллере PIC 16F873.
1.4. Регистры состояния и управления.
К регистрам состояния и управления процессором относятся следующие регистры: STATUS, OPTION_REG, PCL, FSR, PCLATH, INTCON, PIR1, PIE1, PIR2, PIE2. Большинство из этих регистров для удобства программирования отображены во всех банках памяти данных.
Регистр STATUS содержит флаги состояния АЛУ, флаги причин сброса микроконтроллера и биты управления банками памяти данных. Распределение разрядов регистра приведено в таблице 2.
Таблица 4
-
Номера битов
7
6
5
4
3
2
1
0
Обозначения сигналов
IRP
RP1
RP0
-TO
-PD
Z
DC
C
IRP – бит выбора банка памяти при косвенной адресации: 1 – банки 2,3; 0 – банки 0,1.
PR1:PR0 – биты выбора банков памяти данных при непосредственной адресации (см. таблицу 3).
-TO - бит флага переполнения сторожевого таймера: = 0 после переполнения.
-PD - бит флага после включения питания: = 0 при включении режима SLEEP.
Z – бит флага нулевого результата = 1 при нулевом результате арифметической или логической операции.
DC – бит флага десятичного переноса / заема для команд ADDWF, ADDWL, SUBWF, SUBWL – см. систему команд микроконтроллера): = 1 – был перенос из младшего полубайта, = 0 – не было переноса. Заем имеет инверсное значение.
C – бит флага переноса / заема (для команд ADDWF, ADDWL, SUBWF, SUBWL) : = 1 – был перенос из старшего бита, = 0 - не было переноса. Заем имеет инверсное значение.
Таблица 5.
-
Номер банка и пределы адресов
RP0
RP1
Банк 0 адреса: 000h - 07Fh
0
0
Банк 1 адреса: 080h - 0FFh
1
0
Банк 2 адреса: 100h - 17Fh
0
1
Банк 3 адреса: 180h - 1FFh
1
1
Регистр OPTION_REG предназначен для управления предварительным делителем импульсов сторожевого таймера или таймера TMR0. Распределение разрядов приведено в таблице 4.
Таблица 6
-
Номера битов
7
6
5
4
3
2
1
0
Обозначения сигналов
-RBPU
INTEDG
TOCS
TOSE
PSA
PS2
PS1
PS0
-RBPU – бит включения подтягивающих резисторов на входах PORTB.
INTEDG – бит выбора фронта сигнала на входе внешнего прерывания:
=1 – прерывание по переднему фронту сигнала,
= 0 – по заднему фронту.
TOCS – выбор тактового сигнала для таймера TMR0:
=1 внешний тактовый сигнал с вывода RA4,
= 0 – внутренний тактовый сигнал.
TOSE – выбор фронта входного сигнала со входа RA4 для приращения таймера TMR0:
=1- приращение по заднему фронту,
= 0 – приращение по переднему фронту.
PSA - выбор режима подключения предварительного делителя:
= 1 - предделитель включен перед сторожевым таймером
=– предделитель включен перед таймером TMR0.
PS2: PS0 – установка коэффициента предделителя в соответствии с таблицей 45
Таблица 7.
-
Значение коэффициента
Для
TMR0
Для
WDT
000
1:2
1:1
001
1:4
1:2
010
1:8
1:4
011
1:16
1:8
100
1:32
1:16
101
1:64
1:32
110
1:128
1:64
111
1:256
1:128
Регистр INTCON - предназначен для хранения масок и флагов прерываний. Обозначение и распределение разрядов приведено в таблице 6:
Таблица 8.
-
Номера битов
7
6
5
4
3
2
1
0
Обозначения сигналов
GIE
PEIE
TOIE
INTE
RBIE
TOIF
INTF
RBIF
GIE – глобальное разрешение прерываний:
=1 – разрешены все незамаскированные прерывания,
= 0 – все прерывания запрещены.
PEIE – разрешение прерываний от периферийных модулей микроконтроллера: =1 – разрешены незамаскированные прерывания от периферийных модулей,
= 0 – запрещены прерывания от периферийных модулей.
TOIE – разрешение прерывания при переполнении таймера TMR0: 1 – прерывание разрешено, 0 – прерывание запрещено.
INTE – разрешение внешнего прерывания:
=1- прерывание разрешено,
=0 – прерывание запрещено.
RBIE – разрешение прерывания по входам RB7:RB4 PORTB:
=1 – прерывание разрешено,
=0 – прерывание запрещено.
TOIF - флаг переполнения таймера TMR0:
= 1 – переполнение было (сброс программно),
= 0 – переполнения не было.
INTF – флаг внешнего прерывания INT:
= 1 – было условие внешнего прерывания на выводе RB0/INT,
= 0 – внешнего прерывания не было.
RBIF- флаг прерывания по изменению уровня сигналов на входах RB7:RB4 PORTB:
=1 – зафиксировано изменение уровня сигнала ( сбрасывается программно),
=0 – изменения уровня сигнала не было.
Регистр PIE1 – содержит биты разрешения прерываний от функциональных модулей. Обозначения и распределение разрядов приведены в таблице 7.
Таблица 9
-
Номера битов
7
6
5
4
3
2
1
0
Обозначения сигналов
PSPIE
ADIE
RCIE
TXIE
SSPIE
CCP1IE
TMR2IE
TMR1IE
PSPIE - разрешение прерывания от ведомого параллельного порта (для МК типа PIC16F874, PIC16F877):
= 1 прерывание разрешено,
=0 – прерывание запрещено.
ADIE – разрешение прерывания по окончанию преобразования в АЦП:
=1- прерывание разрешено,
= 0 – прерывание запрещено.
RCIE – разрешение прерывания от приемника USART:
=1 – прерывание разрешено,
=0 – прерывание запрещено.
TXIE – разрешение прерывания от передатчика USART:
= 1 – прерывание разрешено,
= 0 – прерывание запрещено.
SSPIE – разрешение прерывания от синхронного последовательного порта:
=1- прерывание разрешено,
=0 – прерывание запрещено.
CCP1IE – разрешение прерывания от модуля CCP1:
= – прерывание разрешено,
=0 – прерывание запрещено.
TMR2IE – разрешение прерывания по переполнению таймера TMR2
=1 - прерывание разрешено,
= 0 - прерывание запрещено.
TMR1IE – разрешение прерывания по переполнению таймера TMR1:
=1 – прерывание разрешено,
=0 – прерывание запрещено.
Регистр PIE2 – содержит маски прерываний от функциональных модулей микроконтроллера. Обозначения и распределение разрядов приведено в таблице 8.
Таблица 10
-
Номера битов
7
6
5
4
3
2
1
0
Обозначения сигналов
-
-
-
EEIE
BCLIE
_
-
CCP1IE
EEIE -разрешение прерывания по окончанию записи в EEPROM данных:
= 1 – прерывание разрешено,
=0 – прерывание запрещено.
BCLIE – разрешение прерывания при возникновении коллизий на шинном интерфейсе I2С :
= 1 – прерывание разрешено,
=0 - прерывание запрещено.
CCP1IE – разрешение прерывания от модуля CCP2:
=1 – прерывание разрешено,
= 0 – прерывание запрещено.
Остальные разряды не используются и читаются как 0.
Регистр PIR1 – содержит биты флагов прерываний от периферийных модулей. Обозначения и распределение разрядов приведено в таблице9.
Таблица 11
-
Номера битов
7
6
5
4
3
2
1
0
Обозначения сигналов
PSPIF
ADIF
RCIF
TXIF
SSPIF
CCP1IF
TMR2IF
TMR1IF
RSPIF – флаг прерывания от ведомого параллельного порта (для МК типа PIC16F874, PIC16F877):
=1 – произошла операция чтения или записи (сбрасывается программно),
=0 – операции чтения или записи не происходило.
ADIF – флаг прерывания от периферийного модуля АЦП:
= 1 – преобразование завершено,
= 0 – преобразование незавершенно.
RSIF – флаг прерывания от приемника USART:
=1 – буфер приемника USART полон,
=0 – буфер приемника пуст.
TXIF – флаг прерывания от передатчика USART:
= 1 – буфер передатчика USART пуст,
= 0 – буфер передатчика полон.
SSPIF – флаг прерывания от модуля MSSP:
=1 – выполнено одно из условий прерывания от модуля MSSP (об условиях прерывания см. раздел. Модуль MSSP),
=0 – не выполнено ни одно из условий прерывания от модуля MSSP.
CCP1F – флаг прерывания от модуля CCP1 ( условия прерываний см. в разделе Модуль CCP1).
TMR2IF – флаг прерывания по переполнению таймера TMR2:
= 1 – переполнение наступило (сбрасывается программно),
= 0 – переполнения таймера TMR2 не было.
TMR1IF – флаг прерывания от таймера TMR1:
=1 – переполнение таймера произошло (сбрасывается программно),
=0 – переполнения таймера не было.
Регистр PIE2 – содержит маски прерываний от функциональных модулей микроконтроллера. Обозначения и распределение разрядов приведено в таблице 10.
Таблица 12
-
Номера битов
7
6
5
4
3
2
1
0
Обозначения сигналов
-
-
-
EEIE
BCLIE
_
-
CCP1IE
EEIE -разрешение прерывания по окончанию записи в EEPROM данных:
= 1 – прерывание разрешено,
=0 – прерывание запрещено.
BCLIE – разрешение прерывания при возникновении коллизий на шинном интерфейсе I2С :
= 1 – прерывание разрешено,
=0 - прерывание запрещено.
CCP1IE – разрешение прерывания от модуля CCP2:
=1 – прерывание разрешено,
= 0 – прерывание запрещено.
Остальные разряды не используются и читаются как 0.
Регистр PIR2 - содержит флаги прерываний от функциональных модулей. Обозначения и распределение разрядов приведено в таблице 11.
Таблица 13
-
Номера битов
7
6
5
4
3
2
1
0
Обозначения сигналов
-
-
-
EEIF
BCLIF
_
-
CCP1IF
EEIF – флаг прерывания по окончанию записи в память EEPROM:
= 1 – запись завершена и разряд должен быть сброшен программно,
=0 – запись не завершена или не была начата.
BCLIF – флаг прерывания при возникновении коллизии на шине I2C:
= 1- на шине взникла коллизия, 0 – коллизий не обнаружено.
CCP1IF – флаг прерывания от модуля CCP2:
В режиме захвата: 1 – выполнен захват значения таймера TMR1 (сброс должен быть выполнен программно),
=0 – захвата не было.
В режиме сравнения:
= 1 – значение таймера TMR1 достигло заданной величины, (сброс осуществляется программно),
= 0 – значение таймера не достигло заданной величины.
Примечание. Флаги прерываний от всех перечисленных устройств устанавливаются по окончании цикла работы конкретного устройства независимо от того разрешено прерывание или нет.
1.5. Порты ввода-вывода.
Для связи микроконтроллера с внешними устройствами и системами служат порты ввода-вывода. Микроконтроллер PIC16F873 имеет три порта, именуемые PORTA, PORTB, PORTC. Другие микроконтроллеры имеют другой состав, например, микроконтроллер PIC16F874 кроме перечисленных портов, имеет еще два порта: PORTD, PORTE. Порты ввода-вывода предназначены либо для ввода сигналов от каких либо внешних источников, либо для вывода сигналов на другие устройства. Все выводы всех портов представляют собой универсальные двунаправленные каналы, которые могут быть настроены как на ввод, так и на вывод информации. Некоторые выводы мультиплицированы с каналами функциональных блоков микроконтроллера и в случае их использования в этих блоках каналы портов не являются универсальными каналами ввода вывода. Назначение мультиплицированных выводов будет рассматриваться при изучении конкретных функциональных блоков. Однако порядок настройки портов на вход или выход не зависит от места использования канала. Рассмотрим их подробнее.
PORTA представляет собой шестиразрядный порт на регистре специального назначения PORTA по адресу 05h.(в микроконтроллере PIC16F874 – восьмиразрядный). Обозначения разрядов приведены в таблице 12. Направление передачи информации задается установкой соответствующих разрядов регистра TRISA (адрес 85h): при записи в разряды регистра TRISA «1» соответствующий вывод порта А настраивается на ввод информации, при этом выходной буфер переводится в третье состояние, при записи «0» - на вывод – уровень сигнала - TTL. При использовании порта на вывод информации операции производятся по циклу «чтение – модификация – запись», т.е. сначала производится чтение с выходного буфера, затем изменение содержимого и запись в защелку порта.
Таблица 14
-
Номера битов
7
6
5
4
3
2
1
0
Обозначения выводов
-
-
RA5
RA4
RA3
RA2
RA1
RA0
Один из выводов - RA4 - имеет на входе триггер Шмитта, а на выходе открытый сток. Все остальные выводы имеют на входе TTL-буфер, а на выходе полнофункциональные КМОП - буферы.
Примечание. В микроконтроллере PIC16F887 PORTA может работать как в аналоговом режиме, так и в цифровом. Для перевода порта в цифровой режим необходимо с регистр специального назначения ANSEL записать 0.
PORTB представляет собой 8 - ми разрядный внешний порт на регистре специального назначения PORTB (адрес 06h). Выводы порта также могут быть настроены как на вход, так и на выход путем записи в соответствующие разряды регистра TRISB (адрес 86h): лог. «1» при настройке выводов на вход и лог. «0» при настройке вывода на выход. Обозначения разрядов порта приведены в таблице 13 .
Таблица 15.
-
Номера битов
7
6
5
4
3
2
1
0
Обозначения выводов
RB7
RB6
RB5
RB4
RB3
RB2
RB1
RB0
Отличительной особенностью порта В является наличие на всех выводах
подтягивающих резисторов, которые могут быть подключены к выводам в случае необходимости путем записи лог. «1» в разряд –RBPU (7бит) регистра OPTION_REG. Подтягивающие резисторы автоматически отключаются, если соответствующие выводы переводятся в режим выхода.
Примечание. PORTB также может работать в аналоговом и цифровом режиме, и для переключения порта в цифровой режим необходимо записать «0» в регистр специального назначения ANSELH.
PORTC представляет собой 8 – разрядный внешний порт на регистре специального назначения PORTC (адрес 7h). Как и порты А, В, порт С может быть настроен как на вход, так и на выход путем записи в соответствующие разряды регистра TRISC ( адрес 87h). Обозначения разрядов PORTC приведены в таблице 14 .
Таблица 16.
-
Номера битов
7
6
5
4
3
2
1
0
Обозначения выводов
RC7
RC6
RC5
RC4
RC3
RC2
RC1
RC0
Примечания:
В микроконтроллерах типа PIC16F874, PIC16F887 имеются также внешние порты PORTD и PORTE, которые могут быть настроены на вход или на выход с помощью записи в регистры TRISD и TRISE аналогично портам А , В, С.
Большинство выводов всех портов мультиплицированы с выходами различных функциональных блоков, о чем будет идти речь при рассмотрении конкретных функциональных блоков.
Использование и программирование портов можно рассмотреть на примере решения булева уравнения, описывающего фрагмент электроавтоматики станка.
1.6. Пример программирования работы фрагмента электроавтоматики станка с чпу.
Рассмотрим пример устройства управления подсистемой обеспечения процесса резания смазочно-охлаждающей жидкостью (СОЖ) на станках с ЧПУ. Схема устройства состоит из силовой и логической части.
Рис. 8. Принципиальная схема силовой части блока управления подсистемой СОЖ.
На схеме:
АВ – автоматический выключатель,
М - приводной двигатель насоса подачи СОЖ,
Кп - контакты электромагнитного пускателя,
РТ - катушки теплового реле.
Работает схема следующим образом.
После включения автоматического выключателя АВ питающее напряжение – 3х380 в через замкнутые контакты пускателя Кп подается на асинхронный двигатель привода насоса М. Двигатель имеет два вида защиты: динамическую защиту за счет уставки автоматического выключателя АВ и тепловую защиту за счет теплового реле. Включение электромагнитного пускателя осуществляется логической схемой блока управления.
Рис. 9. Принципиальная схема логической части блока управления подсистемой СОЖ.
На схеме:
+Е, -Е - напряжение питания схемы,
П1 - переключатель режимов работы блока: ручной / автоматический,
Р1 - контакты пускового реле при автоматическом режиме работы,
Р2 – контакты реле давления в системе СОЖ,
Кн1 – концевой выключатель защитного кожуха станка,
Р3 – контакты температурного реле СОЖ,
РТ – контакты теплового реле,
Кнс – кнопка СТОП при ручном управлении,
Кнп – кнопка ПУСК при ручном управлении,
Кп1 – контакты электромагнитного пускателя,
Кп - катушка электромагнитного пускателя.
Работает схема следующим образом.
При автоматическом режиме работы (переключатель П1 в верхнем положении) замыкается контакт Р1 и ток через нормально замкнутый контакт Р2,при закрытом защитном кожухе (контакт Кн1 замкнут), нормально замкнутые контакты Р3 и РТ проходит через катушку пускателя Кп, вызывая его срабатывание и включение двигателя насоса СОЖ. Останавливается схема размыканием контакта Р1 сигналом из системы ЧПУ.
При ручном режиме (переключатель П1 в нижнем положении ) ток через нормально закрытый контакт кнопки Кнс и нажатой кнопке Кнп проходит на катушку пускателя по описанной выше схеме. После отпускания кнопки Кнп, ее контакты блокируются контактами пускателя Кп1. Останавливается схема нажатием кнопки Кнс.
Алгоритм работы схемы в обоих режимах можно описать следующим булевым уравнением:
Кп = Р2 * Кн * Р3 * Рт * ( П1 * R1 + П1 * Кнс * Кнп + П1 * Кнс * Кп1 ) (1).
Для решения этого уравнения , т.е. управления подсистемой СОЖ разрабатываем устройство на основе микроконтроллера типа PIC16F873, так как количество сигналов, участвующих в управлении не более 13, кроме того повторяющиеся сигналы – П1- могут быть заменены одним сигналом. Принципиальная схема блока управления показана на рис.1.9.
Рис. 10. Принципиальная схема бока управления.
Работает схема следующим образом. Для работы микроконтроллера необходим автономный источник питания, выдающий напряжение постоянного тока +5в, подаваемый на входы Vdd и Vss микросхемы. На элементах Q1, C1, C2 собран генератор тактовых импульсов, а на элементах R1, Кс – схема внешнего сброса микроконтроллера. Связь микроконтроллера с исполнительными элементами логической схемы осуществляется через порты PORTA, PORTB в соответствии с таблицей 15.
Таблица 15. Распределение сигналов логической схемы по разрядам портов связи микроконтроллера.
Сигнал |
П1 |
Р2 |
Кн |
Р3 |
РТ |
R1 |
Кнс |
Кнп |
Кп |
Кн1 |
контакт |
RB1 |
RB2 |
RB3 |
RB4 |
RB5 |
RB6 |
RA1 |
RA4 |
RA0 |
RB7 |
После распределения сигналов уравнение (1) можно переписать в формате языка высокого уровня, например, на языке СИ:
RA0 = (RB2&&RB3 && RB1&&RB6) ||(RB2&&RB3&&RB1&&RA1&&RA4) || (RB2&&RB3&&RB1&&RA1&&RA0). (2)
Булево уравнения (2) представляет собой функцию управления фрагментом электроавтоматики. Для решения этого уравнения пишем программу его решения на языке высокого уровня – СИ.
Программа имеет следующий вид:
#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 = 0x10;
TRISB= 0xFF;
for (; !RA0 ;) { //цикл программы работы фрагмента
RA0 = (RB2&&RB3 && RB1&&RB6) ||(RB2&&RB3 RB1&&RA1&&RA4)|| (RB2&&RB3&& RB1&&RA1&&RA0);
}
} // конец main
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.
Таблица 18.
Номер разряда |
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 мсек. или 500 000 мксек с помощью таймера 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 компенсируем за счет уменьшения задержки на самом таймере с учетом предделителя и на каждом цикле работы таймера:
На каждом цикле компенсируем:
24 288 /8 = 3086 импульсов.
За счет предделителя компенсируем:
3086 / 256 = 12 импульсов.
Поэтому перед запуском таймера записываем в него число 12 или в шестнадцатиричной системе счисления: 0С.
Программа работы фрагмента электроавтоматики (см. раздел 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; //сброс счетчика числа циклов таймера
OPTION = 0x07; // предделитель перед таймером TMR0,
TRISA = 0x10;
TRISB= 0xFF;
for (; !RA0 ;) { //цикл программы работы фрагмента
RA0 = (RB2&&RB3 && RB1&&RB6) ||(RB2&&RB3 RB1&&RA1&&RA4)|| (RB2&&RB3&& RB1&&RA1&&RA0);
}
TOIF = 0; // сброс флага TMR0 - начальный
for (chet = 0x00; chet < 0x08; chet ++ ) { //счет циклов таймера
T0IF = 0; // сброс флага таймера в цикле
TMR0 = 0x0С; //пуск таймера TMR0
for (; !TOIF ;) { // цикл таймера TMR0
}
RA0 = 0; // отключение Кп
}
} // конец main
2.1.2. Модуль таймера tmr1.
Таймер TMR1 имеет 16 – разрядный счетчик, выполненный на двух регистрах (TMR1H, TMR1L), доступных для записи и чтения. Модуль может работать в двух режимах:
- режим таймера,
- режим счетчика.
В режиме таймера инкрементируется содержимое 16-ти разрядного счетчика и при переполнении его устанавливается флаг прерывания TMR1IF в региcтре PIR1 <0>.
В режиме счетчика происходит приращение 16-ти разрядного счетчика, содержимое которого может быть прочитано в любой момент времени. При достижении значения FFh, счет начинается заново со значения 00h. Структурная схема модуля показана на рис 9.
Настройка модуля на различные режимы производится установкой соответствующих бит регистра T1CON (адрес 10h), значения которых приведены в таблице 17.
Таблица 179
Номер разряда |
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 = 65536 * 8 = 524288 мксек.,
т.е. максимальное время самого таймера TMR1 больше требуемого. Разность времен: 24288 мксек компенсируем за счет уменьшения длительности цикла самого таймера путем записи в регистр таймера (TMR1H и TMR1L) некоторого числа, Так как входные импульсы поступают в таймер через предделитель с полным коэффициентом деления, то таймер должен компенсировать:
2428/8 = 3036 импульсов или в шестнадцатиричной системе: 0BDC.
Текст программы.
#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; // порт В на вход
TRISA = 0x10; // порт A на выход и на вход
T1CON = 0x30; //настройка таймера TMR1
for (; !RA0 ;) { //цикл программы работы фрагмента
RA0 = (RB2&&RB3 && RB1&&RB6) ||(RB2&&RB3 RB1&&RA1&&RA4)|| (RB2&&RB3&& RB1&&RA1&&RA0);
} // решение булевых уравнений фрагмента
TMR1IF= 0; // сброс флага TMR1
TMR1H = 0x0B; //начальная установка таймера
TMR1L = 0xDC;
TMR1ON = 1; //пуск таймера TMR1
for (; !TMR1IF ;) { } // цикл таймера TMR1
RA0 = 0; // отключение Кп
} // конец main
Примечание. Код настройки таймера 30 (00110000) по порядку соответствует:
<7,6> – не программируется,
11 <5,4> – настройка предделителя 1:8
0 <3> - внутренний генератор отключен.
0 <2> - синхронизация входного сигнала отсутствует
0 <1> - внутренний источник входных импульсов
0 <0> - таймер TMR1 пока выключен.
2.1.3. Модуль таймера tmr2.
Модуль представляет собой 8-ми разрядный таймер с предделителем входных импульсов и выходным делителем. Структурная схема таймера показана на рис 10.
Работает таймер следующим образом. Временной период задается путем записи определенного числа в регистр PR2. После пуска тактовые импульсы через программируемый предделитель поступают в счетчик TMR2. Содержимое счетчика TMR2 инкрементируется и сравнивается с регистром PR2. При совпадении счетчик TMR2 обнуляется и процесс повторяется. В момент совпадения формируется тактовый сигнал для программируемого выходного делителя. Сигнал с выходного делителя устанавливает флаг TMR2IF, который при соответствующем разрешении вызывает прерывание. Настройка таймера осуществляется путем записи в регистр T2CON (адрес 12h) в соответствии с таблицей 18.
Таблица 20.
Номер разряда |
7 |
6 |
5 |
4 |
3 |
2 |
1 |
0 |
Обозначение сигнала |
- |
TOUTPS3 |
TOUPTS2 |
TOUPTS1 |
TOUTPS0 |
TMR2ON |
T2CKPS1 |
T2CKPS0 |
Где:
TOUPTS3:TOUPTS0 - выбор коэффициента деления выходного делителя таймера TMR2,
0000 = 1 : 1
0001 = 1 : 2
:
:
1111 = 1: 16
TMR2ON – включение таймера TMR2: 1 – таймер включен, 0 – таймер выключен.
T2CKPS1:T2CKPS0 – выбор коэффициента деления предделителя:
00 = 1:1
01 = 1:4
1х = 1:16
Пример программирования работы таймер TMR2 .
Рассмотрим пример программирования таймера TMR2 при использовании его для организации задержки на 500 мсек в том фрагменте электроавтоматики. Максимальная задержка самого таймера зависит от разрядности регистра PR2, поскольку счтчик таймера восьмиразрядный а период тактовых импульсов равен 1 мксек, максимальное время задержки составит 256 мксек.
С учетом входного предделителя с коэффициентом деления 1:16, получим:
Т мах = 256 * 16 = 4096 мксек.
а с учетом выходного делителя с максимальным коэффициентом деления 1:16, получим:
Tmax = 4096 * 16 =65536 мксек.
Таким образом, максимальная задержка таймера TMR2 со всеми делителями недостаточна для получения требуемой задержки, поэтому мы вынуждены программировать несколько циклов срабатывания таймера TMR2(см. программирование таймера TMR0). Как было показано в указанном примере программирования таймера TMR0, разность входных импульсов 24288 должна быть компенсирована записью некоторого числа в регистр PR2. Рассчитаем это число:
Поскольку совершается восемь циклов работы таймера на каждом цикле мы можем компенсировать:
24288 / 8 = 3036 импульсов.
На выходном предделителе компенсируется:
3036 / 16 = 190 импульсов.
А с учетом входного предделителя:
190 / 16 = 12 импульсов или в шестнадцатиричной системе 0С импульсов.
С учетом вышеизложенного программа для фрагмента электроавтоматики будет иметь вид:
#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() {
char shet = 0x00; //сброс счетчика числа циклов таймера
TRISB = 0xff; // порт В на вход
TRISA = 0x10; // порт A на выход и на вход
T2CON = 0x7A //настройка таймера TMR2
for (;! RA0 ;) {
RA0 = (RB2&&RB3 && RB1&&RB6) ||(RB2&&RB3 RB1&&RA1&&RA4)|| (RB2&&RB3&& RB1&&RA1&&RA0);
} //проверка условий включения пускателя Кп
for (shet = 0x00; shet < 0x08; shet ++ ) { //счет числа циклов TMR2
TMR2IF = 0; // сброс флага TMR2
PR2 = 0x0D;
TMR2ON = 1; //пуск таймера TMR2
for (; !TMR2IF ;) { } //проверка срабатывания таймера
}
RA0 = 0; // отключение Кп
} // конец main
Расшифровка настройки таймера по разрядам регистра T2CON: 7A (01111010)
<7> - не программируется,
1111 <6-3> - коэффициент деления выходного делителя 1:16,
0 <2> - таймер пока выключен,
10 <1-0> - в предделителе установлен коэффициент деления 1: 16.
Программирование задержки без использования таймеров.
В случае невозможности применения таймеров, например, все они применены в других участках программы, можно осуществить формирование задержки с помощью программных счетчиков. Блок схема алгоритма работы программного
счетчика показана на рис.
Уст.сч.1
Уст.сч.1
Уст.сч.2
Выход
Рассмотрим такой случай. Условия те же – величина задержки 500 мсек. Задержку можно получить за счет создания программного счетчика. Время заполнения программного счетчика определяется как сумма времен запрограммированных операций. Основной операцией в данном случае является простое прибавление единицы к содержимому счетчика, после чего должна быть операция контроля достижения заданного значения счетчика. Поэтому общее время равно времени выполнения минимум двух операций. В микроконтроллерах PIC16F873 (887) при частоте генератора 4мггц время выполнения указанных операций – Tclk – составляет 1мксек. Максимальная задержка счетчика первого (низшего) уровня будет равна:
T1 = 256 * 1*2 = 512мксек
Таким образом счетчик второго уровня заполняется с периодом Т1.
Поскольку время выполнения операций суммирования на втором уровне также составляет 2 мксек, то этим временем можно пренебречь. Тогда максимальное время задержки на двух уровнях программного счетчика составит:
Т2 = Т1*256 = 131072 мксек
Тогда с помощью счетчика третьего уровня можно осуществить задержку за счет следующего числа циклов работы:
500 000 / 131072 = 3,81
Принимаем 4 цикла, вследствие чего общее время задержки составит:
Т3 = 131072 * 4 = 524288 мксек.
То есть необходимо компенсировать 24288 мксек. Это число можно распределить по разным уровням. На каждом цикле третьего уровня можно компенсировать:
24288 / 4 = 6072 мксек.
Если первый уровень использовать для деления полностью (до состояния счетчика FF), то на втором уровне необходимо компенсировать:
6072 / 512 = 12 или в шестнадцатиричной системе: 0C.
И программа формирования задержки c помощью трехуровнего программного счетчика будет иметь вид:
#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);модуль
char perep1; // программный счетчик первого уровня
char perep2; // программный счетчик второго уровня
char perep3; // программный счетчик третьего уровня
void main() {
TRISC = 0x00; // порт С на выход
PORTC = 0x01; // включение индикатора начала задержки
for (perep3 =0; perep3 < 0x08; perep3++) {
for (perep2 =0x0B; perep2 < 0xFF; perep2++) {
for (perep1 =0; perep1 < 0xFF ; perep1++) {
}
}
}
PORTC = 0x00; // выключение индикатора
} //конец main
2.2. Модуль сср.
Функциональный модуль ССР может работать в одном из трех режимов: захват, сравнение и широтно-импульсный модулятор (ШИМ). В микроконтроллере PIC16F873 имеется два модуля: ССР1 и ССР2. Рассмотрим работу модуля ССР1.
2.2.1. Режим «захват»: Структурная схема модуля в этом режиме показана на рис. 11
Принцип работы модуля заключается в следующем: Предварительно запускается в работу таймер TMR1 в режиме синхронного счетчика. При поступлении на вход RC2 сигнала от какого либо внешнего источника содержимое счетчика таймера (регистры TMR1H – старший байт, TMR1L – младший байт) переписывается в регистр модуля ССР1 (регистры CCPR1H– старший байт, CCPR1L– младший байт). Одновременно формируется флаг прерывания –CCP1IF от модуля CCP1 (см. раздел «регистры состояния …» - разряд 2 регистра PIR1). По этой команде содержимое регистра модуля должно быть прочитано, а флаг прерывания программно сброшен. Если содержимое регистра не будет прочитано, то оно будет потеряно при приходе следующего входного импульса. Содержимое счетчика таймера TMR1 не изменяется (таймер продолжает счет)
Перед началом работы модуля ССР1 его необходимо настроить, для чего выполняются следующие операции:
- настройка и пуск таймера TMR1 (см. раздел «Таймеры» ),
- настроить вывод RC2 микроконтроллера на вход (записать 1 в разряд 2 регистра TRISC – адрес 87h),
- запрограммировать регистр CCP1CON в соответствии с выбранным режимом (см. таблицу 18
:
Таблица 21.
Номера разрядов |
3 |
2 |
1 |
0 |
Обозначение сигналов |
CCO1M3 |
CCP1M2 |
CCP1M1 |
CCP1M0 |
С помощью разрядов 3 – 0 регистра CCP1CON (адрес 17h, 1Dh) задаются следующие режимы работы модуля:
0000 – модуль выключен (сброшен),
0100 – модуль включен, захват по каждому заднему фронту входного сигнала,
0101 – модуль включен, захват по каждому переднему фронту входного сигнала,
0110 – модуль включен, захват по переднему фронту каждого 4-го входного сигнала,
0111 – модуль включен, захват по переднему фронту каждого 16-го входного сигнала
Примечание. Перечисленные подрежимы захвата могут быть изменены в процессе работы, однако во избежание первого ложного срабатывания следует перед перепрограммированием модуля его выключить, чтобы сбросить счетчик модуля.
2.2.2. Режим сравнения.
В этом режиме производится сравнение содержимого регистра модуля с содержимым счетчика таймера TMR1. При совпадении этих данных формируется сигнал прерывания –CCP1IF ( устанавливается «1» во втором разряде регистра PIR1) и в зависимости от выбранного подрежима устанавливается соответствующий сигнал на выводе RC2. Структурная схема модуля ССР1 в этом режиме показана на рис. 12.
Подрежимы работы модуля устанавливаются разрядами <3:0> регистра CCP1CON:
1000 – сравнение, вывод RC2 = 1, устанавливается флаг прерывания CCP1IF,
1001 – сравнение, вывод RC2 = 0, устанавливается флаг прерывания CCP1IF,
1010 – сравнение, вывод RC2 не меняется, устанавливается флаг CCP1IF,
1011 – сравнение, устанавливается триггер специальных функций, устанавливается флаг прерывания CCP1IF, сбрасывается счетчик таймера TMR1.
Настройка модуля в этом режиме производится в следующей последовательности:
- настройка вывода RC2 на выход («0» во 2-ой разряд регистра TRISC),
-настройка таймера TMR1,
- выбор подрежима установкой разрядов 3-0 регистра CCP1CON.
Момент совпадения содержимого счетчиков модуля и таймера TMR1 фиксируется установкой флага прерываний, который после отработки подпрограммы прерывания должен быть сброшен программным способом.
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 = Ox04; // вывод RC2 на выход
T2CON = 0x05; // настройка модуля TMR2
PR2 = 0xEA; // запись периода ШИМ
CCP1RL = 7C; // запись длительности импульсов ШИМ
CCP1CON = 0x0C; //настройка модуля CCP1 и включение модуля
for (;;) { }
}
2.3. Модуль ацп.
Модуль АЦП имеет 5 входных каналов (8 в микроконтроллерах PIC16F874). Структурная схема модуля показана на рис. 14. Микроконтроллер имеет в своем составе один аналого-цифровой 10 - разрядный преобразователь, на вход которого коммутируется 5 или 8 (для PIC16F887) аналоговых сигналов. Входные сигналы подаются на выводы RA0…RA3, RA5, RE0…RE3 портов A и E микроконтроллера, соответственно эти выводы должны быть предварительно настроены как входы. В качестве опорных напряжений преобразователя можно использовать как напряжения питания микроконтроллера: Vdd и Vss, так и задавать от внешнего источника опорных напряжений: Vref+ и Vref-, которые подаются на входы RA3, RA2 соответственно. Число входных каналов модуля при этом сокращается.
Для управления модулем АЦП используются четыре регистра специального назначения:
- ADRESH – регистр старшего байта результата преобразования,
- ADRESL - регистр младшего байта результата преобразования,
- ADCON0 – регистр управления 0,
- ADCON1 - регистр управления1.
Регистр ADCON0 используется для настройки и пуска преобразователя. Формат регистра приведен в таблице 19
Таблица 22.
Номер разряда |
7 |
6 |
5 |
4 |
3 |
2 |
1 |
0 |
Обозн. разряда |
ADCS1 |
ADCS0 |
CHS2 |
CHS1 |
CHS0 |
GO/DONE |
- |
ADON |
Бит 0 – ADON – включение преобразования: 1 – модуль включен,
0 – модуль выключен, ток не потребляется.
Бит 1 не используется.
Бит 2 – GO/DONE -бит состояния преобразователя: 1 – выполняется преобразование, установка бита означает начало работы преобразователя, 0 – ожидание, аппаратно сбрасывается по окончании преобразования.
Биты 5-3 – CHS2:CHS0 - выбор номера аналогового входа:
000 – канал 0
001 – канал 1
010 – канал 2
011 – канал 3
100 – канал 4
101 – канал 5
110 – канал 6
111 – канал 7
Биты 7-6 – ADCS1:ADCS0 – выбор источника тактовых сигналов преобразователя)
00 – Fosc/2, где Fosc- основная тактовая частота микроконтроллера,
01 – Fosc/8
10 – Fosc/32
11 - частота внутреннего RC – генератора модуля АЦП.
Формат регистра ADCON1 приведен в таблице 19.
Таблица 23
Номер разряда |
7 |
6 |
5 |
4 |
3 |
2 |
1 |
0 |
Обозн. разряда |
ADFM |
- |
- |
- |
PCFG3 |
PCFG2 |
PCFG1 |
PCFG0 |
Биты 3-0 PCFG3:PCFG0 - биты настройки каналов на различные режимы. Режимы приведены в таблице 20
Таблица 24.
PCFG3 PCFG0 |
AN7 RE2 |
AN6 RE1 |
AN5 RE0 |
AN4 RA5 |
AN3 RA3 |
AN2 RA2 |
AN1 RA1 |
AN0 RA0 |
Vref+ |
Vref- |
Кан./ Vref |
0000 |
A |
A |
A |
A |
A |
A |
A |
A |
Vdd |
Vss |
8/0 |
0001 |
A |
A |
A |
A |
Vref+ |
A |
A |
A |
RA3 |
Vss |
7/1 |
0010 |
D |
D |
D |
A |
A |
A |
A |
A |
Vdd |
Vss |
5/0 |
0011 |
D |
D |
D |
A |
Vref+ |
A |
A |
A |
RA3 |
Vss |
4/1 |
0100 |
D |
D |
D |
D |
A |
D |
A |
A |
Vdd |
Vss |
3/0 |
0101 |
D |
D |
D |
D |
Vref+ |
D |
A |
A |
RA3 |
Vss |
2/1 |
011x |
D |
D |
D |
D |
D |
D |
D |
D |
Vdd |
Vss |
0/0 |
1000 |
A |
A |
A |
A |
Vref+ |
Vref- |
A |
A |
RA3 |
RA2 |
6/2 |
1001 |
D |
D |
A |
A |
A |
A |
A |
A |
Vdd |
Vss |
6/0 |
1010 |
D |
D |
A |
A |
Vref+ |
A |
A |
A |
RA3 |
Vss |
5/1 |
1011 |
D |
D |
A |
A |
Vref+ |
Vref- |
A |
A |
RA3 |
RA2 |
4/2 |
1100 |
D |
D |
D |
A |
Vref+ |
Vref- |
A |
A |
RA3 |
RA2 |
3/2 |
1101 |
D |
D |
D |
D |
Vref+ |
Vref- |
A |
A |
RA3 |
RA2 |
2/2 |
1110 |
D |
D |
D |
D |
D |
D |
D |
A |
Vdd |
Vss |
1/0 |
1111 |
D |
D |
D |
D |
Vref+ |
Vref- |
D |
A |
RA3 |
RA2 |
1/2 |
Обозначения в таблице 20:
A – аналоговый вход,
D – цифровой канал ввода/вывода
Vref+ - положительное внешнее опорное напряжение АЦП,
Vref- - отрицательное внешнее опорное напряжение АЦП,
Kан./Vref – число доступных аналоговых каналов / число входов внешнего опорного напряжения.
2.3.1.Работа модуля осуществляется в следующей последовательности:
Настроить модуль АЦП:
- настроить выводы портов А и В на: ввод – для аналоговых каналов и опорных напряжений Vref в соответствии с конкретной задачей, на ввод / вывод для цифровых каналов (см. регистр ADCON1 ),
- выбрать входной канал аналогового сигнала (см. регистр ADCON0),
- выбрать источник тактовых сигналов для преобразователя (регистр ADCON0),
-включить модуль АЦП («1» в 0 разряд регистра ADCON0),
2. Настроить прерывание от модуля АЦП, если это необходимо:
- сбросить бит ADIF (регистр PIR1) в «0»,
- установить бит ADIE (регистр PIE1) в «1»,
- установить бит PEIE (регистр INTCON) в «1»,
- установить бит GIE (регистр INTCON) в «1»,
3. Выдержать паузу для зарядки входного конденсатора АЦП (см. ниже).
4. Начать аналого-цифровое преобразование: установить бит GO/-DONE (регистр ADCON0) в «1».
5. Ожидать окончания преобразования:
- ожидать сброса бита GO/-DONE,
или
- обработать прерывание по окончанию преобразования.
6. Считать результат преобразования из регистра ADRESH – старший байт двоичного числа, из регистра ADRESL – младший байт, сбросить бит ADIF (регистр PIR1)/
7. Для следующего преобразования необходимо:
- сделать выдержку не менее 2TAD, где TAD – время одного преобразования,
- повторить этапы, начиная с пункта 1 или 2.
2.3.2.Временные требования к работе модуля ацп.
На входе модуля имеется накопительный конденсатор CHOLD, необходимый для стабилизации входного сигнала на время преобразования. Поэтому перед включением преобразования необходимо сделать выдержку. Расчетная схема входной части модуля приведена на рис. Временную задержку можно рассчитать по формуле:
TACQ = TAMP + TC + TCOFF , где:
TAMP – время задержки входного усилителя модуля,
TC - время заряда конденсатора CHOLD,
TCOFF – температурный коэффициент.
TAMP = 2MKC;
Tc = CHOLD (RIC + RSS +RS) Ln(1/2047); где:
RIC – входное сопротивление модуля = 1ком,
RSS - входное сопротивление канала = 7ком,
RS – максимальное рекомендуемое внутреннее сопротивление источника аналогового сигнала 10ком.
TCOFF = [(t – 25) (0,05 / t)], где: t температура окружающей среды в градусах.
При подстановке приведенных данных можно получить следующее значение выдержки:
TACQ = 2 + 16,47 + 1,25 = 19,72 мкс.
После очередного преобразования необходимо также сделать выдержку длительностью не менее 2TAD, где TAD – время работы модуля для получения одного бита выходного кода, зависит от частоты входных импульсов преобразователя. Значения TAD для различных режимов приведены в таблице 21.
Таблица 25.
TAD |
FOSC |
|
Режим |
Значения битов ADCS1:ADCS0 |
Максимальное значение частоты |
2TOSC |
00 |
1,25МГц |
8TOSC |
01 |
5МГц |
32TOSC |
10 |
20МГц |
2-6 мкс (RC-генератор модуля АЦП) |
11 |
(см. характеристики модуля) |
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 см. в соответствующем разделе.
2.4.Универсальный синхронно – асинхронный приемопередатчик (usart).
Модуль USART представляет собой устройство ввода/вывода последовательного типа и предназначен для связи с любым устройством, поддерживающим заданный формат представляемой информации и согласованное по уровням передаваемых сигналов. Для обмена с абонентами модуль использует выводы микроконтроллера RC6 и RC7, которые настраиваются на вход или выход с помощью регистра TRISC, о чем будет сказано в соответствующем разделе.
Модуль может работать в одном из трех режимов:
- асинхронный полный дуплекс,
- ведущий синхронный полудуплекс,
- ведомый синхронный полудуплекс.
На практике наибольший интерес представляет режим асинхронного полного дуплекса. Рассмотрим его подробно.
2.4.1.Режим асинхронного полного дуплекса.
В этом режиме есть два подрежима:
- подрежим прямого обмена с одним абонентом,
- подрежим сетевого обмена.
Для выбора соответствующего подрежима используется 9 – ый разряд передающего регистра. Если он равен 0, то выбирается подрежим прямого обмена и принятый приемником байт является байтом данных. Если же 9–ый разряд равен 1, то принятый всеми приемниками сетевой структуры байт является адресом устройства в сети и следующий принятый байт является байтом данных для данного адресата.
Для удобства изучения рассмотрим отдельно работу передатчика и приемника.
2.4.1.1. Асинхронный передатчик usart.
Структурная схема передатчика показана на рис.
Работает передатчик следующим образом. Для настройки и управления модулем USART используется два регистра специального назначения: TXSTA и RCSTA, значения разрядов которых приведены в таблицах 24,25. Принцип работы передатчика аналогичен работе любого последовательного порта: передаваемый байт записывается в буферный регистр TXREG (адрес 19h) обычным циклом записи. Из буферного регистра байт автоматически переписывается в сдвиговый регистр TSR, где к передаваемому байту автоматически пристыковываются служебные биты: старт-бит и стоп-бит. В случае использования сетевого подрежима в восьмой бит регистра TSR (0 бит регистра TXSTA) записывается программно 1, если передаваемый байт является адресом абонента, или 0, если байт является информацией. В момент окончания перезаписи байта из регистра TXREG в регистр TSR устанавливается в «1» флаг TXIF, свидетельствующий о том, что буферный регистр пуст и в него можно записывать очередной байт для передачи, при разрешении работать по прерываниям, флаг TXIF совместно с сигналом TXIE вызывают прерывание микроконроллера от передатчика модуля USART. При поступлении на вход регистра TSR тактовых импульсов из генератора скорости обмена SPBRG содержимое регистра TSR выдвигается через вывод RC6/TX микроконтроллера и поступает на вход приемника абонента (абонентов для сетевого подрежима).
Скорость передачи определяется настройкой генератора скорости обмена SPBRG и выбором низкоскоростного режима (BGRH = 0, бит 2 регистра TXSTA), или высокоскоростного режима (BGRH = 1). Скорость в данном случае рассчитывается по формулам:
Vclk = Fosc / 64 (X+1) - для низкоскоростного режима,
Vclk = Fosc / 16 X+1) – для высокоскоростного режима.
где: X – число записанное в регистр SPBRG (адрес 99h), выбранное из таблицы 26.
Таблица 22 (для Fosc = 4 МГц).
Скорость обмена в К/бод |
0,3 |
1,2 |
2,4 |
9,6 |
19,2 |
28,8 |
57,6 |
Значение SPBRG (десятичное) |
207 |
51 |
25 |
6 |
2 |
1 |
0 |
Распределение и обозначение битов регистра настройки передатчика TXSTA (адрес 98h) приведено в таблице 23
Регистр TXSTA Таблица 27
Номер разряда |
7 |
6 |
5 |
4 |
3 |
2 |
1 |
0 |
Обозн. разряда |
CSRC |
TX9 |
TXEN |
SYNC |
- |
BRGH |
TRMT |
TX9D |
где:
7 бит – CSRC – осуществляет выбор источника тактового сигнала для синхронного режима: бит =1- внутренний тактовый сигнал от генератора BRG, бит =0- внешний тактовый сигнал с вывода RC6. Для рассматриваемого асинхронного режима бит не имеет значения.
6 бит – TX9 - разрешение 9-ти разрядной передачи: 1 – 9-ти разрядная передача, 0 – 8-ми разрядная передача.
5 бит – TXEN – разрешение передачи: 1 – передача разрешена, 0 = передача запрещена.
4 бит – SYNC – режим работы модуля USART: 1 – синхронный, 0 – асинхронный.
3 бит – не используется.
2 бит – BRGH – выбор скоростного режима: 1 – высокоскоростной режим, 0 – низкоскоростной режим.
1 бит – TMRT – флаг состояния сдвигового регистра TSR: 1- регистр пуст, 0 – регистр занят,
0 бит – TX9D – значение 9-го разряда при 9-ти разрядной передаче.
Рекомендуемая последовательность действий при программировании передатчика:
1.Установить расчетную скорость передачи с помощью регистра SPBRG и бита BRGH в регистре TXSTA.
2. Выбрать асинхронный режим передачи сбросом бита SYNC в регистре TXSTA и установкой бита SPEN в регистре RCSTA (см. ниже).
3. При выборе режима обслуживания прерывания необходимо:
- установить бит TXIE в регистре PIE1,
- установить бит PEIE в регистре INTCON – прерывание от периферийных модулей,
- установить бит GIE в регистре INTCON – глобальное прерывание.
4. При 9-ти разрядной передаче разрешить ее установкой бита TX9 в регистре TXSTA.
5. Разрешить передачу установкой бита TXEN, при этом автоматически установится
флаг TXIF, что приведет к вызову подпрограммы прерывания, если оно разрешено.
6. Если передача 9-ти разрядная записать соответствующее число в разряд TX9D.
7. Записать передаваемый байт в регистр TXREG.
Примечание.
При передаче массива данных возможны два варианта:
при работе по прерываниям запись очередного байта, запись 9-го разряда при9-ти разрядной передаче, контроль окончания передачи массива, а также управление битами прерывания TXIE, PEIE, GIE производится в подпрограмме обслуживания прерывания.
при работе без прерывания перед записью 9-го разряда и передаваемого байта необходимо убедиться, что буфер TXREG пуст ( бит TXIF – 4 бит в регистре PIR1 равен 1).
2.4.1.2. Асинхронный приемник модуля usart.
Асинхронный приемник работает независимо от передатчика, осуществляя таким образом полный дуплекс обмена информацией, однако существует синхронизация работы обоих узлов через генератор тактовых импульсов на основе регистра SPBRG. Структурная схема приемника приведена на рис.
Приемник настраивается и управляется регистром статуса RCSTA, распределение и наименование разрядов которого приведены в таблице 23 .
Работает приемник следующим образом. Входная посылка от абонента поступает на вывод RC7 микроконтроллера, который в данном случае должен быть запрограммирован на вход. Импульсы посылки, пройдя мажоритарный детектор поступают на вход сдвигового регистра RSR. Данный регистр является служебным внутренним регистром и недоступен пользователю. Ввод посылки начинается со старт-бита и заканчивается приемом стоп-бита. После приема стоп-бита содержимое регистра RSR (без старт-бита и стоп-бита) автоматически переписывается в регистр RCREG. 8 – ой бит (при 9 – ти битном приеме) записывается в «0» бит регистра RCSTA (см. таблицу 24 ). После записи принятого байта в регистр RCREG устанавливается флаг RCIF (в регистреPIR1), который в совокупности с битом RCIE (регистр PIE1) вызывает прерывание от приемника USART, если оно разрешено. Принятый байт должен быть программно прочитан в регистре RCREG, при этом флаг RCIF будет автоматически сброшен. Если по какой либо причине принятый байт не был прочитан и был принят второй байт, то первый принятый байт будет переписан в буфер регистра RCREG, а в вновь принятый байт будет сохранен в самом регистре RCREG. Двойным чтением из регистра RCREG информация будет сохранена. Если после заполнения буфера и самого регистра будет принят третий байт, то принятая посылка останется в регистре RSR, и будет установлен флаг ошибки приема OERR, принятый третий байт при этом будет потерян. Если при приеме посылки не будет обнаружен стоповый бит, то будет выставлен флаг ошибки кадра FERR, что даст информацию о надежности работы приемника.
Мажоритарный детектор предназначен для повышения надежности определения уровня сигнала в принимаемой посылке.
Таблица 28
Номер разряда |
7 |
6 |
5 |
4 |
3 |
2 |
1 |
0 |
Обозн. разряда |
SPEN |
RX9 |
SREN |
CREN |
ADDEN |
FERR |
OERR |
RX9D |
где:
7 бит – SPEN – разрешение работы USART: «1» - модуль включен, выводы микроконтроллера RC7, RC6 подключены к модулю USART, «0» - модуль выключен.
6 бит – RX9 – разрешение 9–ти разрядного приема: «1» - 9-ти разрядный прием, «0» - 8-ми разрядный прием.
5 бит – SREN – для асинхронного приема не имеет значения.
4 бит – CREN – разрешение приема: «1» - прием разрешен, «0» - прием запрещен.
3 бит – ADDEN - разрешение детектирования адреса: «1» - детектирование адреса разрешено, если восьмой бит регистра RSR равен 1, то содержимое регистра RSR переписывается в регистр RCREG, рассматривается как адрес и генерируется прерывание; при равенстве 0 восьмого бита регистра RSR (<0> регистра RCSTA), принятый байт является информацией. При равенстве 0 бита ADDEN детектирование адреса запрещено, все байты принимаются как информационные.
2 бит – FERR – ошибка кадра: «1» - была ошибка – отсутствие стоп-бита, сбрасывается при чтении из регистра RCREG, «0» - ошибки не было.
1 бит – OERR – ошибка переполнения приемного буфера: «1» - произошла ошибка, бит сбрасывается при сбросе бита CREN – разрешение приема, «0» - ошибки не было.
0 бит – RX9D – 9-ый бит принятых данных (при разрешении 9-ти битного приема0.
Рекомендуемая последовательность действий при программировании приемника USART.
Установить требуемую скорость приема с помощью регистра SPBRG и бита BRGH (см. раздел передатчика USART), если скорость не была установлена ранее.
Выбрать асинхронный режим сбросом бита SYNC и установкой бита SPEN.
Установить биты RCIE, PEIE, GIE при работе по прерываниям.
Установить бит RX9 при разрешении 9-ти битного приема.
Разрешить прием установкой бита CREN.
Ожидать установку флага RCIF или прерывания.
Считать 9-тый бит данных и проверить наличие ошибки FERR.
Считать принятый байт из регистра RCREG.
При обнаружении ошибки переполнения сбросить бит CREN.
Примечание. При приеме массива данных и отсутствии ошибок возвратиться на пункт 6.
При работе модуля USART в сетевом подрежиме, необходимо при программировании приемника ввести операции дешифрации адреса, поэтому алгоритм работы будет несколько иной:
1, 2, 3, 4 пункты аналогичны рассмотренным выше.
5. Установить бит ADDEN для разрешения детектирования адреса.
6. Разрешить прием установкой бита CREN.
7. Ожидать установки бита RCIF или прерывания.
8. Считать принятый байт из регистра RCREG для опознания адреса.
9. При совпадении принятого адреса с собственным сбросить биты ADDEN и RCIF для приема последующего байта информации.
Работу модуля USART в синхронных режимах при необходимости можно изучить по руководству применения PIC-микроконтроллеров [ ].
Рассмотрим пример программирования модуля USART в режиме асинхронного дуплекса. Общая задача заключается в создании последовательного канала связи между котроллером и СОМ – портом компьютера. Принципиальная схема канала будет выглядеть следующим образом.
Рис. 22. Принципиальная схема канала связи с использованием модуля USART микроконтроллера.
Для работы данного канала необходима настройка передатчика и приемника модуля USART и физическая реализация преобразователя сигналов из формата USART в формат COM и обратно, выполненного на микросхеме MAX 232/
Для передатчика:
Регистр TXSTA = 0x20 – работа с восьмибитовой информацией, сдвиговый регистр TSR сброшен, низкоскоростной режим работы BRGH = 0, асинxронный режим SYNC = 0, передача разрешена TXEN = 1. В регистр SPBRG запишем число 0x06, что при низкоскоростном режиме и тактовой частоте Fosc = 4 MHZ обеспечивает скорость работы 9600 бод (см. справочные данные на конкретный микроконтроллер).
Для приемника:
Регистр RCSTA = 0x90 – USART включен, 8 – битовый обмен, прием разрешен, адрес не дешифрируется, ошибок нет, 9-ый бит отсутствует.
Настроечный фрагмент программы имеет вид:
#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() {
TRISС = 0xFF; // RC6, RC7 на вход
TXSTA = 0x20; // настройка передатчика
RCSTA = 0x90; // настройка приемника
SPDRG = 0x06; // настройка генератора на скорость 9600 бод
Далее следует программа обмена информацией между абонентами
2.5.Модуль ведущего синхронного последовательного порта (mssp).
Модуль MSSP предназначен для связи по последовательному каналу между различными устройствами: элементы памяти, драйверы ЖКИ, другие микроконтроллеры и т.п.
Модуль может работать в двух режимах:
Шинный интерфейс I2C (Inter-Integrater Circuit).
Последовательный периферийный интерфейс (SPI).
Из этих режимов наибольший интерес для создания разветвленных систем управления представляет первый, т. е. решим шинного интерфейса. Рассмотрим его подробнее. Поскольку микроконтроллеры в данном случае представляют собой некоторую сетевую структуру, базирующуюся на протоколе шинного интерфейса I2C, то каждый из абонентов этой структуры может быть либо ведомым, либо ведущим в зависимости от программы работы модуля MSSP. Модуль MSSP в этом режиме настраивается и управляется с помощью трех регистров специального назначения:
- SSPSTAT (адрес 94h) – регистр статуса,
- SSPCON (адрес 14h) – регистр управления 1,
- SSPCON2 (адрес 91h) – регистр управления 2.
Распределение и обозначения разрядов этих регистров приведены в таблицах 25…27
Таблица 29 ( для регистра SSPSTAT)
Номер разряда |
7 |
6 |
5 |
4 |
3 |
2 |
1 |
0 |
Обозн. разряда |
SMP |
CKE |
D/-A |
P |
S |
R/-W |
UA |
BF |
где:
7 бит: SMP – фаза выборки бита: «1» - управление длительность фронта выключено, «0» - управление длительность фронта включено.
6 бит: CKE: выбор фронта тактового сигнала: «1» - входные уровни соответствуют спецификации SMBus, «0» - входные уровни соответствуют спецификации I2C.
5 бит: D/-A: бит данные/адрес: «1» - последний принятый или переданный байт является информационным, «0» - последний принятый или переданный байт является адресным.
4 бит: P: бит STOP: «1» - бит STOP был обнаружен последним, «0» - бит STOP не является последним.
3 бит: S: бит START: «1» - бит START был обнаружен последним, «0» - бит START не является последним.
2 бит: R/-W: бит чтения/записи:
для ведомого режима: «1» - чтение, «0» - запись. Бит действует только после совпадения адреса и до приема бит START, STOP, ASK.
для режима ведущего: «1» - выполняется передача данных, «0» - передачи данных нет.
1 бит : UA: флаг обновления адреса устройства: «1» - необходимо обновить адрес устройства в регистре SSPADD, «0» - обновление адреса не требуется.
0 бит : BF: бит статуса буфера SSPBUF: для приема – «1» - прием завершен, буфер полон,
«0» - прием не завершен, буфер пуст; для передачи – «1» - выполняется передача, буфер полон, «0» - передача завершена, буфер пуст.
Таблица 30 ( для регистра SSPCON)
Номер разряда |
7 |
6 |
5 |
4 |
3 |
2 |
1 |
0 |
Обозн. разряда |
WCOL |
SSPOV |
SSPEN |
CRP |
SSPM3 |
SSPM2 |
SSPM1 |
SSPM0 |
где:
7 бит : WCOL: Бит конфликта записи: для ведущего режима: «1» - запись в SSPBUF была выполнена при несоблюдении условий шины I2C, «0» - конфликта не было; для ведомого режима: «1» - была предпринята попытка записи в SSPBUF во время передачи предыдущего байта, «0» - конфликта не было.
6 бит: SSPOV: бит переполнения приемника: «1» - принят новый байт в то время как SSPBUF содержит предыдущие данные, «0» - переполнения нет.
5 бит: SSPEN: бит включения модуля MSSP: «1» - модуль MSSP включен, выводы SCK, SDO, SDI, -SS (RC3, RC5, RC4,RA5 соответственно) подключены к модулю MSSP, «0» - модуль выключен, перечисленные выводы работают как цифровые входы/выходы.
4 бит: CKP: бит выбора полярности тактового сигнала:(только для ведомого режима, для ведущего не используется) «1» - тактовый сигнал не управляется, «0» - тактовый сигнал удерживается в низком логическом уровне (используется для подготовки данных).
3 – 0 биты: SSPM3: SSPM0: режимы работы модуля MSSP:
SSPM3:SSPM0
0110 - ведомый режим, 7-ми разрядная адресация,
0111 - ведомый режим, 10-ми разрядная адресация,
1000 – ведущий режим, тактовый сигнал = Fosc/(4*(SSPADD +1),
1011 - программная поддержка ведущего режима ( ведомый режим выключен),
1110 – программная поддержка ведущего режима, 7-ми разрядная адресация с
разрешением прерываний по приему бит START и STOP,
1111 – программная поддержка ведущего режима, 10-ти разрядная адресация с
разрешением прерываний по приему бит START и STOP.
Таблица 31. ( для регистра SSPCON2).
Номер разряда |
7 |
6 |
5 |
4 |
3 |
2 |
1 |
0 |
Обозн. разряда |
GCEN |
ACRSTAT |
ACKDT |
ACKEN |
RCEN |
PEN |
RSEN |
SEN |
где:
7 бит: GCEN: бит разрешения поддержки общего вызова (только для ведомого режима): «1» - разрешить прерывания при приеме в регистр SSPSR адреса общего вызова (0000h),
«0» - поддержка общего вызова выключена.
6 бит: ASCSTAT: бит статуса подтверждения (только для ведущего режима). Подрежим передачи: «1» - подтверждения от ведомого не получено, «0» - подтверждение от ведомого получено.
5 бит: ACKDT: бит подтверждения (только для ведущего режима). Подрежим приема ведущим: «1» есть подтверждение, «0» - нет подтверждения.
4 бит: ACKEN: формирование бита подтверждения (только для ведущего режима). «1» - на выводах SCL, SDA – формируется бит ACKDT, «0» - подтверждение не формируется.
3 бит: RCEN: Разрешение приема данных (только для ведущего режима): «1» - разрешить прием данных с шины I2C, «0» - приемник ведущего выключен.
2 бит: PEN: формирование бита STOP (только для ведущего режима), «1» - на выводах SCL, SDA – формируется бит STOP, «0» - бит STOP не формируется.
1 бит: RSEN: формирование бита повторный START (только для ведущего режима): «1» на выводах SCL, SDA формируется бит повторный START, «0» - бит повторный START не формируется.
0 бит: SEN: формирование бита START (только для ведущего режима): «1» - на выводах SCL, SDA формируется бит START, «0» - бит START не формируется.
Как было сказано выше, в сетевой структуре микроконтроллеров есть два вида: ведомые и ведущие, каждый из которых может принимать и передавать информацию. Рассмотрим каждый вид в отдельности.
2.5.1. Режим ведомого i2c.
Структурная схема модуля MSSP в этом режиме показана на рис.21 Для своей работы модуль использует два вывода микроконтроллера: SCL и SDA (соответственно RC3 и RC4).
Работа модуля в данном режиме заключается в следующем. Рабочие сигналы в модуль поступают через два вывода микроконтроллера: SDA (RC4) – биты информации, SCL (RC3) – тактовые сигналы, поэтому оба вывода должны быть предварительно настроены на ввод. После включения модуля MSSP (установка бита SSPEN в регистре SSPCON) ожидается появление бита START, после чего принимается 8 бит, которые записываются в сдвиговый регистр SSPSR. Запись происходит по переднему фронту синхронизирующего импульса на входе SCL. По заднему фронту 8-го импульса SCL содержимое регистра SSPSR сравнивается с содержимым регистра SSPADD, где хранится адрес конкретного устройства – абонента сети. Если значения регистров совпадают (адрес опознан), и биты BF, SSPOV равны нулю (нет переполнения регистра SSPBUF), то производятся следующие действия:
- значение регистра SSPSR переписывается в регистр SSPBUF по заднему фронту 8 импульса SCL;
- устанавливается флаг BF (буфер полон) в регистре SSPSTAT;
- генерируется бит –ACK;
- устанавливается флаг SSPIF (PIR1 <3>) по заднему фронту 9-го импульса SCL. После приема и опознания адреса возможны два варианта продолжения работы модуля: прием от ведущего микроконтроллера или передача информации ведущему. Вид работы определяется состоянием бита R/-W (0 бит) в адресном байте.
2.5.1.1.Прием данных.
Если в принятом адресном байте бит R/-W равен нулю, то бит R/-W в регистре SSPSTAT также устанавливается в 0. Все последующие байты будут информационными, поэтому из регистра SSPSR переписываются в регистр SSPBUF, одновременно формируется бит ответа ASK и устанавливается флаг SSPIF (флаг SSPIF устанавливается после приема каждого байта). После установки флага содержимое регистра SSPBUF должно быть прочитано и программно должен быть сброшен флаг SSPIF. Если регистр SSPBUF до прихода очередного байта не был прочитан или не был сброшен флаг, то не будет сформирован бит ответа ASK, что приведет к сбою в работе модуля. При нормальной работе прием информации ведомым микроконтроллером продолжается до приема стоп-бита P (бит P в регистре SSPSTAT также устанавливается в 1). Восстановление работы модуля производится после его выключения и повторного включения (бит SSPEN в регистре SSPCON).
2.5.1.2. Передача данных.
Работа модуля по приему и опознанию адреса аналогична рассмотренному выше. Но если в принятом адресном байте бит R/-W равен 1, то бит R/-W в регистре SSPSTAT также устанавливается в 1. Одновременно бит CKR (4бит регистра CCPCON) устанавливается в 0, что блокирует линию SCL. Передаваемый байт записывается в регистр SSPBUF и устанавливается в 1 бит SKR, что означает освобождение линии SCL. Ведущее устройство контролирует линию SCL и при обнаружении тактовых импульсов начинает прием посылки по заднему фронту сигналов на линии SCL. На 9 такте на линии SCL ведущее устройство формирует сигнал ACK. Если сигнал ACK от ведущего не поступил, то ведомое устройство заканчивает прием установкой в 1 бита P (4бит в регистре SSPSTAT) и переходит режим ожидания сигнала START.
2.5.1.3.Поддержка общего вызова.
Данная процедура используется при необходимости передавать одну и ту же информацию для всех абонентов, подключенных к шине I2C. Для распознавания общего вызова используется зарезервированный для этого случая адрес, в котором все разряды, включая бит R/-W равны 0. Данный режим включатся ведомым устройством путем установки в 1 бита GSEN (7 бит регистра SSPCON2). Далее процедура работы модуля аналогична работе при приеме данных.
2.5.1.4.Работа в sleep режиме.
В SLEEP режиме микроконтроллер может принимать байты адреса или данных. При этом микроконтроллер выходит из SLEEP режима, если имеется разрешение работы модуля MSSP по прерываниям.
2.5.2. Режим ведущего i2c.
Режим ведущего включатся путем установки бит SSPM3:SSPM0 в регистре SSPCON, при этом выводы SCL и SDA управляются аппаратно (переключаются в режим выхода). Структурная схема модуля в режиме ведущего приведена на рис. Работает модуль следующим образом. При передаче данных модуль формирует сигнал START путем установки бита SEN в регистре SSPCON2, после чего ожидает прерывания или установки флага SSPIF (бит 3 в регистре PIR1). При получении этих условий в регистр SSPBUF записывается адрес абонента (7 старших разрядов и направление обмена – R/-W =0 – передача байта), одновременно устанавливается бит BF регистра SSPSTAT (буфер SSPBUF полон), после чего байт адреса переписывается в сдвиговый регистр SSPSR и передается абоненту. После перезаписи байта из регистра SSPBUF в регистр SSPSR сбрасывается бит BF регистра SSPSTAT. Получив в ответ сигнал ACK, ведущий записывает 1 в бит ACKSTAT регистра SSPCON2 и по заднему фронту 9-го тактового сигнала устанавливается флаг SSPIF, означающий что предыдущий байт передан абоненту и можно передавать следующий: либо непосредственно по опросу флага, либо по прерыванию. После этого записью в регистр SSPBUF на линию выдается байт данных. После прохода 8 тактовых импульсов ожидается бит ACK и устанавливается бит ACKSTAT. По заднему фронту 9-го тактового импульса устанавливается флаг SSPIF. Далее продолжается по данному циклу передача всех байтов информации. После передачи всего массива данных записью 1 в бит PEN (2 бит) регистра SSPCON2 инициируется сигнал STOP.
При приеме информации ведущим адресная часть цикла аналогична вышеизложенному, но в адресном байте бит R/-W равен 1, поэтому после приема сигнала ACK не устанавливается флаг SSPIF. Ведущий переходит в режим ожидания, контролируя сигнал на линии SCL (этот сигнал задерживается ведомым для перехода в режим передачи). После «отпускания» линии SCL, ведущий принимает 8 бит, записывает 1 в бит ACKDT регистра SSPCON2, формирует ответ ACK и устанавливает флаг SSPIF, по которому принятая информация должна быть прочитана (иначе она будет потеряна при приеме следующего байта. По окончании передачи массива данных ведомое устройство инициирует на шине сигнал STOP.
Ведущий отслеживает и возникновение конфликта на шине I2C. Суть обнаружения конфликта заключается в том, что при переходе сигнала на линии SCL в высокое состояние сигнал на линии SDA меняться не должен и если это произошло, значит шину пытается захватить другое устройство. Обнаружив конфликт, ведущее устройство устанавливает бит BCLIF в регистре PIR2, прекращает работу на шине и переходит в режим ожидания, контролируя возникновение на шине сигнала STOP. После обнаружения этого сигнала устройство может продолжить работу, «захватив» шину обычным способом.
С другими режимами работы модуля MSSP, например, с режимом синхронного последовательного интерфейса SPI можно ознакомиться в [ ].
SCL
2.5.3. Подключение абонентов к шине i2c.
Для надежной работы шины необходимо выполнять определенные требования к абонентам по их нагрузочным характеристикам. На рис.23 приведена схема подключения устройств к шине.
Подтягивающие резисторы Rp определяются из условия минимально допустимого тока при наименьшем уровне напряжения на линии (уровень логического 0 – 0,4 в.).
Например:
VDD = 5в + 10%
VOL = 0,4 в
Rp min = (5,5 – 0,4)/ 0,003 = 1,7 кОм.
Максимальное значение входного резистора Rs определяется допустимым уровнем шума.
Устройства на шине I2C должны иметь один источник питания, к которым подключены подтягивающие резисторы.
С другими режимами работы модуля MSSP, например, с режимом синхронного последовательного интерфейса SPI можно ознакомиться в [ ].
В качестве примера рассмотрим задачу создания фрагмента системы управления, состоящую из нескольких ведомых и одного ведущего микроконтроллеров. Принципиальная схема фрагмента показана на рис.24
Настройка ведущего модуля:
Регистр SSPCON = 0x2E;
Что соответствует условиям:
Модуль MSSP включен,
Ведущий режим, 7-разрядная адресация, с разрешением прерываний.
Регистр SSPCON2 = 0x0F;
Что соответствует условиям:
Режим общего вызова не используется,
Прием разрешен,
Бит STOP формируется,
Бит повторный START формируется,
Бит START формируется.
Регистр SSPSTAT = 0x00; - при передаче и SSPSTAT = 0x04; - при приеме.
Что соответствует условиям:
1.Включено управление длительностью переднего фронта импульсов,
2.Уровни входных сигналов соответствуют требования шины I2C,
Регистр SSPADD = 0x00; Что соответствует нулевому адресу ведущего модуля
Настройка ведомых модулей:
Регистр SSPCON = 0x36;
Что соответствует условиям:
Модуль MSSP включен,
Ведомый режим, 7-разрядная адресация,
Тактовым сигналом не управлять, (можно записывать в бит CKR=1 при необходимости подготовки данных для передачи ведущему, с последующим сбросом данного бита).
Регистр SSPCON2 = 0x0F;
Регистр SSPSTAT = 0x00;
Регистр SSPADD = 0x01; - для первого ведомого модуля,
SSPADD = 0xnn; - для последующих ведомых модулей.
Настроечная часть программ работы системы микроконтроллеров будет иметь вид:
А. Ведущий модуль:
#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 = 0xFF;
SSPSTAT = 0x00;
SSPCON = 0x2E;
SSPCON2 = 0x0F;
SSPADD = 0x 00;
Для ведомых модулей
TRISC = 0xFF;
SSPSTAT = 0x 04;
SSPCON = 0x36;
SSPCON2 = 0x0F;
SSPADD = 0xnn; //nn –соответствует адресу конкретного абонента
Рабочие части программ определяются фактическими задачами обмена информацией, включая конкретные диагностические фрагменты, (например, фрагменты контроля ошибок формата и т. п.).
2.6. Модуль eeprom памяти данных.
Принцип работы модуля является обычным для устройств такого типа и выполняется при номинальном напряжении микроконтроллера. Запись информации осуществляется по одному байту по принципу «стирание – запись», т.е. адресуемая ячейка вначале стирается, а потом в нее записывается новая информация. При чтении информация сохраняется. Функции записи/чтения осуществляются через 6 регистров специального назначения:
-EEDATA – регистр хранения данных при записи и чтении,
-EEDATH – регистр старшего байта данных (при работе с FLASH – памятью),
-EEADR - регистр адреса ячейки памяти,
-EEADRH – регистр старшего байта адреса (при работе с FLASH – памятью),
-EECON1 - регистр управления модулем,
-EECON2 - вспомогательный регистр для предотвращения случайной записи.
Формат регистра EECON1:
Таблица 32
Номер разряда |
7 |
6 |
5 |
4 |
3 |
2 |
1 |
0 |
Обозн. разряда |
EEPGD |
- |
- |
- |
WRERR |
WREN |
WR |
RD |
7 бит: EEPGD – выбор типа памяти: 0 – EEPROM, 1 – FLASH,
3 бит: WRERR – флаг ошибки записи данных: 1 – запись прервана (MCLR, WDT),
2 бит: WREN – разрешение записи: 1 – запись разрешена, 0 – запись запрещена,
1 бит: WR – инициализация записи: 1 – запись производится, сбрасывается в 0 автоматически после окончания записи, 0 – запись завершена, (установка флага EEIF),
0 бит: RD – инициализация чтения: 1 –инициализировать чтение, сбрасывается в 0 по окончанию чтения (установка флага EEIF).
2.6. Прерывания.
В микроконтроллерах PIC16F873 (PIC16F876) реализованы 14 источников прерывания. Источниками прерываний могут быть как внутренние устройства (память, функциональные блоки), так и внешние устройства, формирующие сигналы прерывания в виде сигнала INT на входе RB0 или в виде перепада уровня сигналов на входах RB4…RB7. Структурная схема системы прерываний приведена на рис.26 Как видно из схемы, прерывания от всех источников возникают после установки соответствующего флага (сигналы флагов оканчиваются символом F). Установка флага в каждом устройстве производится после готовности устройства к обслуживанию его процессором. Все прерывания могут быть замаскированы (отменены) путем установки в 0 соответствующего сигнала (сигналы маски оканчиваются символом E). Все без исключения прерывания могут быть замаскированы сигналом GIE (установкой его в 0), кроме того прерывания от функциональных модулей могут быть замаскированы сигналом PEIE.
Флаги и маски прерываний хранятся в регистрах INTCON, PIE1, PIR1, PIE2, PIR2. При разработке подпрограмм обслуживания прерываний необходимо помнить, что при переходе на подпрограмму в стеке сохраняется только адрес возврата, поэтому, при необходимости, надо позаботиться о сохранении содержимого некоторых ключевых регистров, например, рабочего регистра W и регистра состояния процессора STATUS.
Рис. 9. Принципиальная схема логической части блока управления подсистемой СОЖ.
Ав. Кнопка аварийного отключения.
Рис. 10. Принципиальная схема бока управления.
Текст программы.
#define XTAL_FREQ 4MHZ
#define byte unsigned char
#define word unsigned int
#include <pic.h>
#include <stdio.h>
__CONFIG(HS & WDTDIS & PWRTEN & LVPDIS & DUNPROTECT & PWRTEN);
char shet; // счетчик циклов срабатывания таймера
interrupt isr(void);
Void main()
{
ANSELH = 0; // настройка порта B в цифровой режим
ANSEL =0; // настройка порта А в цифровой режим
TRISB = 0xFF; // настройка порта В вход
TRISA = 0x10;
PEIE=1; // разрешение прерывания от функциональных модулей
GIE=1; // разрешение глобального прерывания
INTE =1; // разрешение прерывания от внешнего источника
for (; !RA0 ;) { //цикл программы работы фрагмента
RA0 = (RB2&&RB3 && RB1&&RB6) ||(RB2&&RB3 RB1&&RA1&&RA4)|| (RB2&&RB3&& RB1&&RA1&&RA0);
}
} // конец main
interrupt isr(void)
{
GIE = 0; //запрет всех прерываний
RA0 = 0; //отключение Кп
RA2 = 1; // Включение аварийной сигнализации
TMR1IF =0; //сброс флага TMR1 - предварительный
T1CON = 0x30; // настройка таймераTMR1
For (shet = 0x00; shet<0x0F; shet ++){
TMR1IF = 0;
TMR1H = 0xFF;
TMR1L = 0xFF; //настройка таймера TMR1 на максимальную задержку
TMR1ON =1; // пуск таймера TMR1
For (; !TMR1IF;) { }
}
RA2 =0; //отключение аварийной сигнализации
INTF =0; //сброс флага внешнего прерывания.
GIE = 1; // восстановление разрешения прерываний
} //выход из прерывания
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 мкс.
Таблица 36. Система команд микроконтроллера.
№№ |
Мнемоника команд |
Описание команд |
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/
Incf Прибавить 1 к содержимому регистра f.
Синтаксис команды: [имя метки] INCF f,d
Операнды: 0 ≤ f ≤ 127
d [0,1]
Операция: (f) + 1 dest
Изменяемые флаги: Z
Описание операции: К содержимому регистра f прибавляется 1,
результат в регистре W, если d = 0, в
регистре f, если d = 1.
Incfsz Прибавить 1 к регистру f, пропустить, если 0.
Синтаксис команды: [имя метки] INCFSZ f,d
Операнды: 0 ≤ f ≤ 127
d [0,1]
Операция: (f) +1 dest, пропустить, если 0
Изменяемые флаги: нет
Описание операции: К содержимому регистра f прибавляется 1.
результат сохраняется в регистре W, если
d =0, и в регистре f, если d =1. Если результат
суммирования равен 0, то следующая команда
пропускается, если не равен 0, то выполняется
следующая команда.
Iorlw Побитное «или» регистра w и константы k.
Синтаксис команды: [имя метки] IORLW k
Операнды: 0 ≤ k ≤ 255
Операция: (W).OR.k W
Изменяемые флаги: Z
Описание операции: Побитное «ИЛИ» содержимого регистра W и
константы k, результат в регистре W.
Iorwf Побитное “или» регистров w, f.
Синтаксис команды: [имя метки] IORWF f,d
Операнды: 0 ≤ f ≤ 127
d [0,1]
Операция: (W).OR.f dest
Изменяемые флаги: Z
Описание операции: Побитное «ИЛИ» регистров W,f.
Результат в регистре W, если d=0, в
регистре f, если d=1/
MOVF Переслать значение регистра f.
Синтаксис команды: [имя метки] MOVF f,d
Операнды: 0 ≤ f ≤ 127
d [0,1]
Операция: (f) dest
Изменяемые флаги: Z
Описание операции: Содержимое регистра f пересылается в
адрес, заданный операндом d, т.е. в
регистр W, если d=0 и в регистр f, если d=1.
MOVLW Переслать константу в регистр W.
Синтаксис команды: [имя метки] MOVLW k
Операнды: 0 ≤ k ≤ 255
Операция: k (W)
Изменяемые флаги: нет
Описание операции: Пересылается константа в регистр W, в
неиспользуемые разряды записывается 0.
MOVWF Переслать содержимое регистра W в регистр f.
Синтаксис команды: [имя метки] MOVWF f
Операнды: 0 ≤ f ≤ 127
Операция: (W) (f)
Изменяемые флаги: нет
Описание операции: Содержимое регистра W пересылается в
регистр f.
NOP Нет операции.
Синтаксис команды: [имя метки] NOP
Операнды: нет
Операция: нет
Изменяемые флаги: нет
Описание операции: нет операции
RLF Циклический сдвиг влево через перенос.
Синтаксис команды: [имя метки] RLF f,d
Операнды: 0 ≤ f ≤ 127
d [0,1]
Операция: см. рисунок
Изменяемые флаги: C
Описание операции: Выполняется циклический сдвиг регистра
f через бит С регистра STATUS, если d =0
результат сохраняется в регистре W, если
d = 1, результат в регистре f.
RRF Циклический сдвиг вправо через перенос.
Синтаксис команды: [имя метки] RRF f,d
Операнды: 0 ≤ f ≤ 127
d [0,1]
Операция: см. рисунок
Изменяемые флаги: С
Описание операции: Выполняется циклический сдвиг регистра f
вправо через бит С регистра STATUS.Если
d = 0, результат остается в регистре W, если
d = 1 – результат в регистре f.
SLEEP Переход в режим энергосбережения.
Синтаксис команды: [имя метки] SLEEP
Операнды: нет
Операция: 00h WDT
1 -TO
0 -PD
Изменяемые флаги: -TO, -PD
Описание операции: Сбрасывается флаг включения питания –PD,
устанавливается в 1 флаг переполнения
сторожевого таймера –TO, сбрасывается
WDT и его предделитель, выключается
тактовый генератор.
SUBLW Вычесть значение регистра W из константы.
Синтаксис команды: [имя метки] SUBLW k
Операнды: 0 ≤ k ≤ 255
Операция: k – (W) W
Изменяемые флаги: C, DC, Z
Описание операции: Из 8-разрядной константы вычитается
содержимое регистра W. Результат
сохраняется в регистре W.
SUBWF Вычитание регистра W из регистра f.
Синтаксис команды: [имя метки] SUBWF f,d
Операнды: 0 ≤ f ≤ 127
d [0,1]
Операция: (f) – (W) dest
Изменяемые флаги: C, DC, Z
Описание операции: Из регистра f вычитается содержимое W,
результат остается в регистре W, если d=0,
если d = 1, результат сохраняется в f.
SWAPF Поменять местами полубайты в регистре f.
Синтаксис команды: [имя метки] SWAPF f,d
Операнды: 0 ≤ f ≤ 127
d [0,1]
Операция: (f<3:0>) (dest <7:4>)
(f<7:4>) (dest <3:0>)
Изменяемые флаги: нет
Описание операции: Меняются местами старший и младший
полубайты регистра f. Результат остается в
регистре W, если d =0 и в регистре f, если
d = 1.
Xorlw Побитное «Исключающее или» константы и регистра w.
Синтаксис команды: [имя метки] XORLW k
Операнды: 0 ≤ k ≤ 255
Операция: (W) .XOR. k (W)
Изменяемые флаги: Z
Описание операции: Выполняется побитное «исключающее ИЛИ»
содержимого регистра W и константы k,
результат сохраняется в регистре W.
Xorwf Побитное «исключающее или» регистров w,f.
Синтаксис команды: [имя метки] XORWF f,d
Операнды: 0 ≤ f ≤ 127
d [0,1]
Операция: (W) .XOR. (f) dest
Изменяемые флаги: Z
Описание операции: Выполняется побитное «исключающее ИЛИ»
регистров W и f. Результат сохраняется в W,
если d = 0, и в регистре f, если d = 1.
