Текст
                    В. С. Яцонков
Мккрокошроллеры
с аппаратной повдтиой USB

УДК 681.325.5 ББК 32.97 Я 92 Серия «Современная электроника» основана в 2001 г. Яценков В. С. Я 92 Микроконтроллеры Microchip с аппаратной поддержкой USB. - М.: Горячая линия-Телеком, 2008. - 400 с.: ил. ISBN 978-5-9912-0030-1. В настоящее время использование шины USB является наиболее попу- лярным методом для подключения периферийных устройств к компьютеру. Микроконтроллеры Microchip серии PIC18F2455/2550/4455/4550 включают в себя не только аппаратную поддержку шины USB, но и других популярных протоколов обмена данными, а также функциональные модули таймеров, АЦП, ЦАП и ШИМ, что позволяет создавать на основе этих микроконтрол- леров самые разнообразные оконечные устройства, взаимодействующие с персональным компьютером. В книге приведено полное техническое опи- сание микроконтроллеров Microchip PIC18F2455/2550/4455/4550, рассмотре- ны примеры практического применения. Для специалистов, занимающихся разработкой устройств на основе микроконтроллеров, радиолюбителей и студентов радиотехнических специ- альностей ББК 32.97 Адрес издательства в Интернет www.techbook.ru Справочное издание Яценков Валерий Станиславович Микроконтроллеры Microchip с аппаратной поддержкой USB. Редактор А. Ю. Петкин Компьютерная верстка Ю. Н. Рысева Обложка художника В. Г. Сетина Подписано в печать 25.04.07. Формат 70*100/16. Усл. печ. л. 33,25. Изд. № 730 ООО «Научно-техническое издательство «Горячая линия-Телеком» Заказ № 01 ISBN 978-5-9912-0030-1 © В. С. Яценков, 2008 © Оформление издательства «Горячая линия-Телеком», 2008 Отпечатано в типографии ООО "ТИЛЬ-2004", 1007023, Москва, ул. Электрозаводская д. 21
Введение При разработке микроконтроллерных устройств, которые должны взаимодей- ствовать с персональным компьютером, большое значение имеет правильность выбора протокола обмена данными. В настоящее время наиболее популярным протоколом обмена данными между компьютером и периферийными устройст- вами является протокол шины USB (Universal Serial Bus, универсальная после- довательная шина). По этой шине могут передаваться как большие массивы данных (иногда в режиме реального времени), так и управляющие команды. Бла- годаря такой универсальности, спектр периферийных устройств, подключаемых к компьютеру почти не ограничен с технической точки зрения. Большинство периферийных устройств разрабатывается на основе различ- ных микроконтроллеров. Достаточно давно разработаны специализированные микросхемы-трансиверы, обслуживающие обмен по шине USB и являющиеся промежуточным звеном между собственно микроконтроллером и шиной. Оче- видно, что следующим логическим шагом стала интеграция трансивера USB в состав микроконтроллеров, аналогично тому, как в них ранее были интегрирова- ны модули АЦП, ШИМ, USART и прочие. В ассортиментной линии Microchip первой модификацией микроконтроллера со встроенной поддержкой USB были однократно программируемые PIC16C745/765. В данной книге мы не рассматриваем эту модификацию, по- скольку сейчас доступна более мощная по всем параметрам модификация PIC18F2455/2550/4455/4550 с FLASH-памятью программ. Основными достоинствами микроконтроллеров PIC18F2455/2550/4455/4550 являются функциональная наполненность и низкое энергопотребление на основе различных программируемых опций энергосбережения и фирменной технологии nanoWatt™. Параметры модуля USB: . Совместимость с USB V2.0. • Поддержка низкоскоростного (1.5 Мбит/с) и высокоскоростного (12 Мбит/с) режимов. . Поддержка управляющей, по прерыванию, изохронной и пакетной передачи. . Поддержка до 32 конечных точек (16 двунаправленных). . 1 кБ ОЗУ двойного доступа для нужд USB. • Встроенный трансивер USB. . Встроенный источник питания USB. . Возможность подключения внешнего трансивера USB. • Потоковый порт SPP для ввода-вывода потока параллельных данных через USB. Режимы управления энергопотреблением: . Run: процессор включен, периферия включена. . Idle: процессор остановлен, периферия включена. • Sleep: процессор и периферия выключены. • Типовой потребляемый ток в режиме Idle до 5,8 мкА. • Типовой потребляемый ток в режиме Sleep до 0,1 мкА. 3
Введение • Генератор модуля Timerl: потребление до 1,1 мкА при 32 кГц, 2 В. . Сторожевой таймер: до 2,1 мкА. Гибкая структура генератора тактовых импульсов: • Четыре режима кварцевого генератора, включая особо точный для USB • Четыре режима внешнего тактирования, до 48 МГц . Блок встроенного генератора: - 8 выбираемых пользователем частот, от 31 кГц до 8 МГц; - возможность подстройки частоты для компенсации дрейфа. • Вторичный генератор, на основе генератора модуля Timerl, 32 кГц. • Возможность независимого тактирования процессора и модуля USB. • Мониторинг тактовых импульсов: - возможность безопасного останова при пропадании импульсов основного тактового генератора. Опции периферии: • Втекающий и вытекающий ток до 25 мА. • Три внешних прерывания. • Четыре модуля таймеров. • До двух модулей захвата/сравнения/ШИМ: - захват 16 бит, с разрешением до 6,25 нс (TCY/16); - сравнение 16 бит, с разрешением до 100 нс (TCY). . ШИМ с разрешением от 1 до 10 бит . Расширенный модуль захвата/сравнения/ШИМ (ЕССР): - различные выходные режимы; - полярность по выбору; - программируемая «мертвая зона»; - автоотключение и авторестарт; . Расширенный модуль USART (EUSART): - поддержка шины LIN. . Модуль ведущего синхронного последовательного порта (MSSP) с поддерж- кой SPI (все четыре режима) и 12С (ведущий и ведомый). • До 13 модулей 10-разрядного АЦП с программируемым временем выборки. • Сдвоенный аналоговый компаратор с мультиплексированием входов. Специальные опции микроконтроллера: • Структура, оптимизированная под компилятор С, с расширенным набором команд. • 100000 циклов перезаписи памяти программ. • 1000000 циклов перезаписи памяти данных EEPROM. • Срок хранения памяти программ и данных более 40 лет. • Возможность самопрограммирования (смены прошивок). • Наличие приоритетов прерываний. • Аппаратный умножитель 8x8. • Расширенный сторожевой таймер: - программируемый период от 41 мс до 131 с. • Программируемая защита кода. • Внутрисхемное программирование по двум проводам. • Одно напряжение программирования 5 В (ICSP). • Внутрисхемная отладка по двум проводам (ICD). • Опционально назначаемый порт ICD/ICSP (только в 44-выводном корпусе). • Широкий диапазон напряжений питания, от 2,0 до 5,5 В. 4
Введение Параметры микроконтроллеров Прибор Память программ Память данных I/O АЦП, кан. байт слов RAM EEPROM PIC18F2455 24К 12288 2048 256 24 10 PIC18F2550 32К 16384 2048 256 24 10 PIC18F4455 24К 12288 2048 256 35 13 PIC18F4550 32К 16384 2048 256 35 13 Прибор ССР/ ЕССР (ШИМ) SPP MSSP EUSART Компара- торы Таймеры SPI l2C PIC18F2455 2/0 - 4- 4- 1 2 1/3 P1C18F2550 2/0 - 4- 4- 1 2 1/3 PIC18F4455 1/1 4- 4- 4- 1 2 1/3 PIC18F4550 1/1 4- 4- 4- 1 2 1/3 5
Глава 1. Структура и базовые функции микроконтроллеров семейства PIC18F2455/2550/4455/4550 Расположение и назначение выводов Количество и назначение выводов корпуса зависит от типа корпуса и конкрет- ного варианта микроконтроллера. На рис. 1.1 показано размещение выводов для корпусов типа DIP, а на рис. 1.2 для корпусов типа TQFP и QFN. На рис. 1.3. при- ведена внутренняя структура PIC18F2455/2550 (28 выводов), а на рис. 1.4. внут- ренняя структура PIC18F4455/4550 (44 вывода) 28-Pin PDIP, SOIC MCLFWPP/RE3------► RA0/AN0"— RA1/AN1 *—" RA2/AN2/Vkef-/CVhef —* RA3/AN3/VHEF+ *—* RA4 Л0СК1/С10UT/RCV RA5/AN4'SS/HLVDIN/C2OUT —* Vss---- OSCVCLKI----- OSC2/CLKO/RA6----- RC0/T1OSO/T13CKI-*-► rci;tiosi/ccp2(1>;u6e -*-* RC2/CCP-I —— VlJSE *—- RB7/KBI3/PGD RB6/KBI2/PGC RBS/KB11/PGM RB4/AN11/KBI0 RB3/AN9/CCP 2(1 b'VPO RB2/AN8/INT2/VMO RB1 /AN 10/INT1/SCK/SCL RBO/AN12/INTO/FLTO/SDl/SDA Voo Vss RC7/RX/DT/SDO RCfi/TX'CK RC5/D+/VP RC4/D-/VM 40-Pin PDIP MCLRA/PP/RE3 RAO/ANO RA1/AN1 RA2/AN2/VE!EF-/CVREF RA3/AN3/Vref+ RA4.Q0CKI/C1OUT/RCV RA5/AN4/SS/HLVDIN/C2OLFT RE0/AN5/CK1SPP RE1/AN6/CK2SPP RE2/AN7/OESPP VOD VSS OSCl/CLKI OSC2/CLKO/RA6 RCO/TlOSOCri3CKI RCI/TIOSI/CCP^’VUOE RC2/CCP1/P1A Vusb RDO/SPPO RD1/SPP1 RB7/KBI3/PGD RB6/KBI2/PGC RB5/KBI1/PGM RB4/AN11/KBI0/CSSPP RB3/AN9/CCP2'1>/VPO RB2/AN8/iNT2/VMO RB1/AN10/INT1/SCK/SCL RBO/AN 12/INT0/FLT0/SDI/SDA VDD Vss RD7/SPP7/P1D RD6/SPP6/P1C RD5/SPP5/P1B RD4/SPP4 RC7/RX/DT/SDO RC6/TX/CK RC5/D+/VP RC4/D-/VM RD3/SPP3 RD2/SPP2 Рис. 1.1. Расположение выводов корпусов типа DIP: (1) Вывод RB3 является альтернативным для мультиплексирования ССР2 6
Структура и базовые функции микроконтроллеров RC7;RX'DT'SDO RD4/SPP4 RO5/SPP5/PW RD6;SPP6,-P1C RO7.'SPP7;P1C Vdd RBO/AFJ г 2, INTOFlTO/SDI/SDA RB1 'AM O'INT1,-SCK/SCL RB2/AN8/INT2rVMO RB3'AN9.'CCP2<1,/VPO 44-Pin QFN PIC18F4455 PIC18F4550 27 24 23 шиж llllllllltl NC/ICRST<2>,'ICVh-1?) RCO/11OSO/T13CKI OSC2;CLKO/RA6 OSC1/CLKI vss Vc-Q P.E2/AN7/OESPP RE1/ANG/CK2SPP RE0/AN5/CK1SPP RA5-AN4/SS/HLVDIN/C2OUT RA4/T0CKI/C1OUT.-RCV Рис. 1.2. Расположение выводов корпусов типа TQFP, QFN. <1) Вывод RB3 является альтернативным для мультиплексирования ССР2. Специ- альные опции ICPORTS доступны в определенных случаях 7
Гпава 1 Шина данных <В> 4 Табл указателе‘2ъ Носика OSC1<2>^- OSC2'2) Й~* T1OSO нию напряжения тактирования Vusb [Х]« Сброс по вклю- чению питания внутреннего генератора Сторожевой таймер Генератор ЙМГц Защелка данных УпревпеН|Яе гфогршлмироа Внутрисхемный отладчик Память Стек Л уроеень Защелка ком ер запуска MCLRA/pp/RE3(11 Рис. 1.3. Внутренняя структура PIC18F2455/2550 (28 выводов): (1) RE3 мультиплексируется с MCLR и доступен только тогда MCLR отключен. (2) OSC1/CLKI и OSC2/CLKO доступны только в определенных режимах генератора и ко- гда выводы не используются как порты I/O.(3) Вывод RB3 является альтернативным для мультиплексирования ССР2 |fclatu|pclatii] : PCU I РСН ; PCL] 3;fl?tenKa адреса Память программ i24;32Kg) Заишт® дачных Декодер команд и модуль У Управляющее сигмапы конечного автомата ▼ ▼ |prodh| prodl] I Мультиплексор 8ХВ _______Л Регулятор И напряжения USB RAO/ANO RA1/AN1 RA2/AN2A/REF-/CVREF RA3/AN3/VREF+ RA4/T0CKI/C1OUT/RCV RA5/AN4/SS/HLVDIN/C2OUT OSC2/CLKO/RA6 RB0/AN12/INT0/FLT0/SDI/SDA RB1 /AN 1O/l NT1 /SCK/SCL RB2/AN8/INT2/VMO RB3/AN9/CCP2[3)/VPO RB4/AN11/KBI0 RB5/KBI1,'PGM RB6/KBI2/PGC RB7/KBI3/PGD RC0/T1OSO/T13CKI___ RC1/T1 OSVCCP2p,/UOE RC2/CCP1 RC4/D-/VM RC5/D+/VP RC6/TX/CK RC7/RX/DT/SDO 8
Структура и базовые функции микроконтроллеров Шиня данных <В> PORTA Защелка адреса osc-i'21 oscz(2> IMESC T1OSI T1OSO tCpGC*3’ ICPGOP* ICRST™ внутреннего генератора Таймерзапуска такт генератора Сброс го вклю- чению литания Генератор 8 МГц данных (2Кб’, Внутрисхемный отладчик I..i Защелке данных Защелка адреса [pCLATu|pQ-Ath| [PCU I РСН ] PCL] Счетчик команд г Сгех31 кроееик Геол защелка Шина команд <16> Защелка ROM Декодер команд м модуль Таймер включе- нии питаная Сторожевой Сорос го CHUM ICPORTSP®—* Мониторинг гактироБзмия mclr!” [pRODH| PROCL р^ыиплексорВХб I RAO/ANO RA1/AN1 RA2fAN2/VRbF-/CVREF RA3/AN3/VP.EF+ RA4/TCCKVC1OUT/RCV ' RA5/AN4/SS/HLVD1N/C2OUT OSC2/CLKO/RA6 R30'AN12/INTO/FLTO/SDI/SD/ RB1/AN10/INTVSCK/SC.L RB2/AN8/INT2A/MO RB3/AN9/CCP2'4>/VPO RB4/AN11/KBI0'CSSPP RB5/KBI1/PGM RB6/KBI2/PGC RB7/KBI3/PGD RC0/T1OSO/T13CKI RC1/T1OSI/CCP2W>AJOE RC2/CCP1/P1A RC4/D-/VM RC5/D+A/P RC6/TX/CK RC7/RX/DT/SDO RD0/SPP0:RD4/SPP4 RO5/SPP5/P1B RD6/SPPC/P1C RD7/SPP7/P1D RE0/AN5/CK1SPP RE1/AN6/CK2SPP RE2/AN7/OESPP MCLRA/PP/RE3(1t Рис. 1.4. Внутренняя структура PIC18F4455/4550 (44 вывода): (1) RE3 мультиплексируется с MCLR и доступен только тогда MCLR отключен. (2) OSC1/CLKI и OSC2/CLKO доступны только в определенных режимах генератора и ко- гда выводы не используются как порты I/O.<3) Этот вывод доступен только в 44-выводном корпусе TQFP при определенных условиях. (4)Вывод RB3 является альтернативным для мультиплексирования ССР2 9
Глава 1 Таблица 1.1 Назначение выводов PIC18F2455/2550 Обозначение вывода Но- мер Тип Бу- фер Описание MCLR/Vpp/RE3 MCLR Vpp RE3 1 I P 1 ST ST Вход общего сброса или напряжения программирования Общий сброс низким уровнем Вход напряжения программирования Цифровой вход OSC1/CLKI OSC1 CLKI 9 J 1 A A Подключение резонатора или вход внешних тактов Кристалл резонатора или вход внешних тактов Только вход внешних тактов; всегда ас- социирован с функцией вывода OSC1 (см. также вывод OSC2) OSC2/CLKO/RA6 OSC2 CLKO RA6 10 О 0 I/O TTL Подключение резонатора или выход тактовых импульсов Подключен к кварцу в режиме кварцево- го генератора Выход импульсов частотой % от входной на OSC1 Порт ввода-вывода общего назначения RAO/ANO RAO ANO 2 I/O 1 TTL A Цифровой вход/выход Аналоговый вход 0 RA1/AN1 RA1 AN1 3 I/O 1 TTL A Цифровой вход/выход Аналоговый вход 1 RA2ZAN2/VrEFJCVref RA2 AN2 Vref- CVref 4 I/O 1 1 0 TTL A A A Цифровой вход/выход Аналоговый вход 2 Вход опорного напряжения АЦП (низкое) Выход опорного уровня компаратора RA3/AN3/VrEF+ RA3 AN3 Vref+ 5 I/O 1 1 TTL A A Цифровой вход/выход Аналоговый вход 3 Вход опорного напряжения АЦП (высокое) RA4/T0CKI/C1OUT /RCV RA4 TOCKI сюит RCV 6 I/O 1 о I ST ST TTL Цифровой вход/выход Вход внешних счетных импульсов моду- ля TimerO Выход компаратора 1 Вход RCV USB-трансивера 10
Структура и базовые функции микроконтроллеров Обозначение вывода Но- мер Тип Бу- фер Описание RA5/AN4/SS/ HLVDIN/C2OUT 7 RA5 I/O TTL Цифровой вход/выход AN4 I A Аналоговый вход 4 SS I TTL Вход выбора SPI HLVDIN I A Вход модуля обнаружения перепада «High/Low» C2OUT 0 - Выход компаратора 2 RBO/AN12/1NTO/FLTO/ 21 SDI/SDA RB0 I/O TTL Цифровой вход/выход AN12 I A ' Аналоговый вход 12 INTO I ST Внешнее прерывание 0 FLTO I ST Вход ошибки ШИМ (модуль ССР1) SDI I ST Вход данных SPI SDA I/O ST Вход/выход данных 12С RB1/AN10/INT1/SCK/ 22 SCL RB1 I/O TTL Цифровой вход/выход AN10 I A Аналоговый вход 10 INT1 I ST Внешнее прерывание 1 SCK I/O ST Вход/выход синхроимпульсов для режи- ма SPI SCL I/O ST Вход/выход синхроимпульсов для режи- ма 12С RB2/AN8/INT2/VMO 23 RB2 I/O TTL Цифровой вход/выход AN8 I A Аналоговый вход 8 INT2 I ST Внешнее прерывание 2 VMO 0 - Выход VMO USB-трансивера RB3/AN9/CCP2/VPO 24 RB3 I/O TTL Цифровой вход/выход AN9 I A Аналоговый вход 9 ССР2П) I/O ST Вход Capture2/ выход Сотраге2/ выход PWM2 VPO 0 - RB4/AN11/KBI0 25 RB4 I/O TTL Цифровой вход/выход AN11 I A Аналоговый вход 11 KBIO I TTL Вывод прерывания по изменению со- стояния 11
Глава 1 Обозначение вывода Но- мер Тип Бу- фер Описание RB5/KBI1/PGM RB5 кви PGM 26 I/O t I/O TTL TTL ST Цифровой вход/выход Вывод прерывания по изменению со- стояния Включение низковольтного программи- рования ICSP RB6/KBI2/PGC RB6 KBI2 PGC 27 I/O I I/O TTL TTL ST Цифровой вход/выход Вывод прерывания по изменению со- стояния Внутрисхемная отладка и тактирование ICSP RB7/KBI3/PGD RB7 KBI3 PGD 28 I/O I I/O TTL TTL ST Цифровой вход/выход Вывод прерывания по изменению со- стояния Внутрисхемная отладка и данные ICSP RCO/T10SO/T13CK1 RCO T1OSO T13CKI 11 VO 0 I ST ST Цифровой вход/выход Вход генератора Timerl Вход внешних импульсов Т1тег1Я1тегЗ RC1/T1OSI/CCP2/ UOE RC1 T1OSI CCP2l2> UOE 12 I/O I I/O ST CMOS ST Цифровой вход/выход Вход генератора Timerl Вход Capture2/ выход Сотраге2/выход PWM2 Выход QE внешнего USB-трансивера RC2/CCP1 RC2 CCP1 13 I/O I/O ST ST Цифровой вход/выход Вход Capturel/выход Comparel/выход PWM1 RC4/D-/VM RC4 D- VM 15 I I/O I TTL TTL Цифровой вход/выход Отрицательная диф.линия USB (вход/выход) Вход VM внешнего USB-трансивера RC5/D+/VP RC5 D+ VP 16 I I/O 0 TTL TTL Цифровой вход/выход Положительная диф.линия USB (вход/выход) Вход VP внешнего USB-трансивера 12
Структура и базовые функции микроконтроллеров Обозначение вывода Но- мер Тип Бу- фер Описание RC6/TX/CK 17 RC6 I/O ST Цифровой вход/выход ТХ О — Асинхронная передача EUSART СК I/O ST Синхронные такты EUSART (см. RX/DT) RC7/RX/DT/SDO 18 RC7 I/O ST Цифровой вход/выход RX 1 ST Асинхронный прием EUSART DT I/O ST Синхронные данные EUSART (см. RX/DT) SDO о - Выход данных SPI Vusb 14 О - Встроенный регулятор USB 3.3V Vss 8,9 р - «Земля» для логики и портов вво- да/вывода Vdd 20 р - Напряжение питания для логики и портов Обозначения: TTL - совместимый по уровням с TTL логикой; CMOS - совместимый с CMOS; ST - триггер Шоттки на входе, с уровнями CMOS; О - выход, I - вход, Р - питание. Примечания: 1. Подключено к ССР2, когда бит конфигурации ССР2МХ сброшен. 2. По умолчанию подключен к ССР2, когда бит конфигурации установлен. Таблица 1.2 Назначение выводов PIC1BF4455/4550 Обозначение вывода Номер вывода Тип БУ' Фер Описание PDIP QFN TQFP . MCLR/Vpp/RE3 MCLR Vpp RE3 1 18 18 I P I ST ST Вход общего сброса или напряжения программиро- вания Общий сброс низким уров- нем Вход напряжения про- граммирования Цифровой вход OSC1/CLKI OSC1 CLKI 13 32 30 I I A A Подключение резонатора или вход внешних тактов Кристалл резонатора или вход внешних тактовых импульсов Только вход внешних так- тов; всегда ассоциирован с функцией вывода OSC1 (см. также вывод OSC2) 13
Гпава 1 Обозначение вывода Номер вывода Тип Бу- фер Описание PDIP QFN TQFP OSC2/CLKO/RA6 14 33 31 Подключение резонатора или выход тактовых им- пульсов OSC2 0 Подключен к кварцу в ре- жиме кварцевого генера- тора CLKO 0 — Выход импульсов частотой % от входной на OSC1 RA6 I/O TTL Порт ввода-вывода обще- го назначения RAO/ANO 2 19 19 RAO I/O TTL Цифровой вход/выход ANO I A Аналоговый вход 0 RA1/AN1 3 20 20 RA1 I/O TTL Цифровой вход/выход AN1 I A Аналоговый вход 1 RA2/AN2/Vref7 4 21 21 CVref RA2 I/O TTL Цифровой вход/выход AN2 I A Аналоговый вход 2 Vref- I A Вход опорного напряжения АЦП (низкое) CVref 0 A Выход опорного уровня компаратора RA3/AN3/VrEF+ 5 22 22 RA3 I/O TTL Цифровой вход/выход AN3 I A Аналоговый вход 3 Vref+ I A Вход опорного напряжения АЦП (высокое) RA4/T0CKI/C1 OU 6 23 23 T/RCV RA4 I/O ST Цифровой вход/выход TOCKI I ST Вход внешних счетных импульсов модуля TimerO сюит 0 — Выход компаратора 1 RCV I TTL Вход RCV USB-трансивера RA5/AN4/SS/ HLVDIN/C2OUT 7 24 24 RA5 I/O TTL Цифровой вход/выход AN4 I A Аналоговый вход 4 SS I TTL Вход выбора SPI HLVDIN I A Вход модуля обнаружения перепада «High/Low» C2OUT о - Выход компаратора 2 14
Структура и базовые функции микроконтроллеров Обозначение вывода Номер вывода Тип Бу- фер Описание PDIP QFN TQFP RB0/AN12/INT0/ FLTO/SDI/SDA 33 9 8 RB0 I/O TTL Цифровой вход/выход AN12 I A Аналоговый вход 12 INTO I ST Внешнее прерывание 0 FLTO I ST Вход ошибки ШИМ (мо- дуль ССР1) SDI I ST Вход данных SPI SDA I/O ST Вход/выход данных lzC RB1/AN10/INT1/ 34 10 9 SCK/SCL RB1 I/O TTL Цифровой вход/выход AN10 I A Аналоговый вход 10 INT1 I ST Внешнее прерывание 1 SC К I/O ST Вход/выход синхроим- пульсов для режима SPI SCL I/O ST Вход/выход синхроим- пульсов для режима 12С RB2/AN8/INT2/ 35 11 10 VMO RB2 I/O TTL Цифровой вход/выход AN8 I A Аналоговый вход 8 INT2 I ST Внешнее прерывание 2 VMO 0 . - Выход VMO USB- трансивера RB3/AN9/CCP2/ 36 12 11 VPO RB3 I/O TTL Цифровой вход/выход AN9 I A Аналоговый вход 9 CCP2(1) I/O ST Вход Capture2/ выход VPO о - Сотраге2/ выход PWM2 RB4/AN11/КВГО/ 37 14 14 CSSPP RB4 I/O TTL Цифровой вход/выход AN11 I A Аналоговый вход 11 КВЮ I TTL Вывод прерывания по из- менению состояния CSSPP о - Выход сигнала выбора кристалла SPP RB5/KBI1/PGM 38 15 15 RB5 I/O TTL Цифровой вход/выход KBI1 I TTL Вывод прерывания по из- менению состояния PGM I/O ST Включение низковольтного программирования ICSP 15
Гпава 1 Обозначение Номер вывода Бу- Описание вывода PDIP QFN TQFP фер RB6/KBI2/PGC RB6 KBI2 PGC 39 16 16 I/O I I/O TTL TTL ST Цифровой вход/выход Вывод прерывания по из- менению состояния Внутрисхемная отладка и тактирование ICSP RB7/KBI3/PGD RB7 KBI3 PGD 40 17 17 I/O I I/O TTL TTL ST Цифровой вход/выход Вывод прерывания по из- менению состояния Внутрисхемная отладка и данные ICSP Rconroso/ Т13СК1 RC0 T1OSO Т13СК1 15 34 32 I/O О I ST ST Цифровой вход/выход Вход генератора Timerl Вход внешних импульсов Timed/ТггпегЗ RC1/T1OSI/CCP2 /UOE RC1 T1OSI ССР2(г) UOE 16 35 35 I/O I I/O ST CMO ST Цифровой вход/выход Вход генератора Timerl Вход Capture2/ выход Compare2 / выход PWM2 Выход ОЕ внешнего USB- трансивера RC2/CCP1/P1A RC2 ССР1 Р1А 17 36 36 I/O I/O О ST ST TTL Цифровой вход/выход Вход Caplure 1 /выход Com- pare 1 / выход PWM1 Расширенный выход ШИМ ССР1, канал А RC4/D-/VM RC4 D- VM 23 42 42 I I/O I TTL TTL Цифровой вход/выход Отрицательная дифлиния USB (вход/выход) Вход VM внешнего USB- трансивера RC5/D+/VP RC5 D+ VP 24 43 43 I I/O О TTL TTL Цифровой вход/выход Положительная дифлиния USB (вход/выход) Вход VP внешнего USB- трансивера 16
Структура и базовые функции микроконтроллеров Обозначение Номер вывода Бу- Описание ' вывода PDIP QFN TQFP фер RC6/TX/CK RC6 ТХ СК 25 44 44 I/O О I/O ST ST Цифровой вход/выход Асинхронная передача EUSART Синхронные такты EUSART (см. RX/DT) RC7/RX/DT/SDO RC7 RX DT SDO 26 1 1 I/O 1 I/O О ST ST ST Цифровой вход/выход Асинхронный прием EUSART Синхронные данные EUSART (см. RX/DT) Выход данных SPI RD0/SPP0 RDO SPPO 19 38 38 I/O I/O ST TTL Цифровой вход/выход Данные параллельного потокового порта RD1/SPP1 RD1 SPP1 20 39 39 I/O I/O ST TTL Цифровой вход/выход Данные параллельного потокового порта RD2/SPP2 RD2 SPP2 21 40 40 I/O I/O ST TTL Цифровой вход/выход Данные параллельного потокового порта RD3/SPP3 RD3 SPP3 22 41 41 I/O I/O ST TTL Цифровой вход/выход Данные параллельного потокового порта RD4/SPP4 RD4 SPP4 27 2 2 I/O I/O ST TTL Цифровой вход/выход Данные параллельного потокового порта RD5/SPP5/P1B RD5 SPP5 Р1В 28 3 3 I/O I/O О ST TTL Цифровой вход/выход Данные параллельного потокового порта Выход расширенного ШИМ ССР1,каналВ RD6/SPP6/P1C RD6 SPP6 Р1С 29 4 4 I/O I/O О ST TTL Цифровой вход/выход Данные параллельного потокового порта Выход расширенного ШИМ ССР1, канал С 17
Глава 1 Обозначение Номер вывода Тип Бу- Описание вывода PDIP QFN TQFP фер RD7/SPP7/P1D RD7 SPP7 P1D 30 5 5 I/O I/O 0 ST TTL Цифровой вход/выход Данные параллельного потокового порта Выход расширенного ШИМ ССР1, канал D RE0/AN5/CK1SPP RE0 AN5 CK1SPP 8 25 25 I/O I О ST A Цифровой вход/выход Аналоговый вход 5 Выход 1 тактов SPP RE1/AN6/CK2SPP RE1 AN6 CK2SPP 9 26 26 I/O I 0 ST A Цифровой вход/выход Аналоговый вход 6 Выход 2 тактов SPP RE2/AN7/OESPP RE2 AN7 OESPP 10 27 27 I/O I о ST A Цифровой вход/выход Аналоговый вход 7 Выход включения SPP Vss 12, 31 6, 30, 31 6, 29 p - Общий провод для логики и портов ввода/вывода Vdd 11, 32 7, 8, 28, 29 7, 28 p - Питание для логики и пор- тов ввода/вывода Vusb 18 37 37 о - Выход встроенного регу- лятора 3.3V USB NC/ICCK/ICPGC ICCK ICPGC 12 I/O I/O ST ST Не подключен или такты порта ICD/ICSP(3) Тактирование внутрисхем- ного отладчика Такты программирования ICSP NC/ICD17ICPGD ICDT ICPGD 13 I/O I/O ST ST Не подключен или такты порта ICD/ICSP(3) Данные внутрисхемного отладчика Данные программирова- ния ICSP NC/ICRST/ICVPP ICRST ICVpp 33 I p - Не подключен или такты порта ICD/ICSP(3) Вход общего сброса Вход напряжения про- граммирования 18
Структура и базовые функции микроконтроллеров Обозначение вывода Номер вывода Тип Бу- фер Описание PDIP QFN TQFP NC/ICPORTS ICPORTS 34 Р - Не подключен или эмуля- ция 28-выводнбго кри- сталла Разрешает эмуляцию 28- выводного кристалла, если подключен к Vss NC - 13 - - - Свободный вывод Обозначения: TTL - совместимый по уровням с TTL логикой; CMOS - совместимый с CMOS; ST - триггер Шоттки на входе, с уровнями CMOS; О - выход, I - вход, Р - питание. Примечания: 1. Подключено к ССР2, когда бит конфигурации ССР2МХ сброшен. 2. По умолчанию подключен к ССР2, когда бит конфигурации установлен. 3. Эти выводы находятся в состоянии «свободный», пока не установлен бит ICPRT. Вывод NC/ICPORTS в состоянии «свободен», пока бит ICPRT не установлен и DEBUG не сброшен. Типы корпусов На рис. 1.5 - 1.8 показаны внешний вид и типовые размеры различных типов корпусов, применяемых при производстве семейства PIC18F2455/2550/4455/4550. Рис. 1.5. Корпус PDIP 28 выводов 19
Гпава 1 Рис. 1.6. Корпус SOIC 28 выводов Рис. 1.7. Корпус PDIP 40 выводов 20
Структура и базовые функции микроконтроллеров Рис. 1.8. Корпус TQFP 44 вывода Рис. 1.9. Безвывсдный корпус QFN, 44 контакта 21
Глава 1 Источники тактовых импульсов Микроконтроллеры семейства PIC18F2455/2550/4455/4550 содержат иные, чем у предыдущих кристаллов серии PIC18, тактовые генераторы и систему так- тирования контроллера. Добавление модуля USB с его высокими требованиями к стабильности источника тактирования сделало необходимым использование от- дельного источника, который удовлетворяет требованиям как низкоскоростного, так и высокоскоростного USB порта. По этой причине приборы PIC18F2455/2550/4455/4550 имеют новую секцию тактового генератора, вырабатывающего импульсы с частотой 48МГц для полно- скоростного USB модуля. Поскольку он тактируется от первичного источника так- тов, предусмотрено использование предделителей и постделителей, что позво- ляет выбирать частоту тактирования в широком диапазоне. Структура тактового генератора показана на рис. 1.10. Рис. 1.10. Структура тактового генератора 22
Структура и базовые функции микроконтроллеров Остальные опции системы тактирования аналогичны применяемым в других микроконтроллерах серии PIC18, и мы рассмотрим их далее. Работой генератора в микроконтроллерах PIC18F2455/2550/4455/4550 управ- ляют два регистра конфигурации и два управляющих регистра. Регистры конфи- гурации CONFIG1L и CONFIG1H задают режим генератора и опции предделите- ля/постделителя USB. Биты регистров конфигурации могут быть настроены толь- ко при программировании кристалла, и их изменение возможно только при по- вторном программировании. Регистр OSCCON определяет режим Active Clock, в первую очередь он использу- ется в управлении переключением тактов в режимах ШИМ. Регистр OSCTUNE при- меняется для подстройки внутреннего источника частоты INTSRC, а также указывает источник низкой частоты, который используется в некоторых специальных случаях. Типы тактовых генераторов Семейство PIC18F2455/2550/4455/4550 может тактироваться от одного из двенадцати различных источников тактовых импульсов. В отличие от остального семейства PIC18, четыре из этих источников могут работать с двумя типами ре- зонаторов одновременно. Путем программирования битов FOSC3:FOSCO поль- зователь может выбирать один из следующих режимов: 1. XT Кварц/керамический резонатор 2. XTPLL Кварц/керамический резонатор с включенной ФАПЧ 3. HS Высокочастотный кварц/резонатор 4. HSPLL Высокочастотный кварц/резонатор с включенной ФАПЧ 5. ЕС Внешние такты с выходом F0Sc/4 на вывод RA6 6. ЕСЮ Внешние такты, и вывод R6 как порт ввода/вывода 7. ECPLL Внешние такты с ФАПЧ, выход Fosc/4 на вывод RA6 8. ECPIO Внешние такты с ФАПЧ, и вывод R6 как порт ввода/вывода 9. INTHS - Внутренний генератор, как источник тактов микроконтроллера, и генератор HS, как источник тактов USB 10. INTXT Внутренний генератор, как источник тактов микроконтроллера, и генератор XT, как источник тактов USB 11. INTIO Внутренний генератор, как источник тактов микроконтроллера, генератор ЕС, как источник тактов USB, порт ввода/вывода на RA6 12. INTCKO Внутренний генератор, как источник тактов микроконтроллера, генератор ЕС, как источник тактов USB, выход Fosc/4 на вывод RA6. Типы генераторов и функционирование USB Поскольку реализация полноскоростного интерфейса USB предъявляет осо- бые требования к источнику тактовой частоты, то и подходы к его реализации отличаются от применявшихся ранее. В предыдущих кристаллах PICmicro® ядро и все периферийные модули тактировались от общего источника. В семействе PIC18F2455/2550/4455/4550 первичный тактовый генератор является частью мо- дуля USB. Модуль USB не может быть тактирован от другого источника. Вычис- лительное ядро микроконтроллера и периферийные модули по-прежнему могут тактироваться от внешнего или внутреннего источника по выбору пользователя. В соответствии с требованиями стандарта USB, для тактирования модуля нужны импульсы с частотой или 6 МГц или 48 МГц, в зависимости от скорости 23
Глава 1 Рис.1.11. Схема включения резонатора: (1) Значения С1 и С2 см. в таблице значений.(2) Резистор Rs может потребоваться при использовании кристалла со срезом типа АТ.(• Значение Rf зависит от выбранного режима передачи данных. Но нет никакой необходимости тактировать микроконтроллер именно с этой частотой. Настройки тактового генератора позволяют гибко выби- рать источник и частоту тактирования для остальной части устройства. Прежде чем перейти к описанию настроек генератора для тактирования моду- ля USB, рассмотрим способы подключения кварцевого или керамического резо- натора и внешнего источника тактовых импульсов. Пользователям, уже знако- мым с аналогичной информацией для предыдущих версий микроконтроллеров, рекомендуется обратить внимание на реализацию умножителя частоты на осно- ве петли ФАПЧ. В режимах HS, HSPLL, XT и XTPLL кварцевый или керамический резонатор подключают к выводам OSC1 и OSC2. Схема включения обычная, она показана на рис. 1.11. Таблица 1.3 Примеры значений номиналов конденсаторов для различных керамических резонаторов Режим Частота, МГц OSC1, пФ OSC2, пФ XT 4,0 33 33 HS 8,0 16,0 27 22 27 22 Таблица 1.4 Примеры значений номиналов конденсаторов для различных кварцевых резонаторов Режим Частота, МГц OSC1, пФ OSC2, пФ XT 4,0 27 27 4,0 27 27 HS 8,0 22 22 20,0 15 15 Приведенные в табл. 1.3 и 1.4 данные являются ориентировочными и предна- значены для начального определения значений. При разработке устройства не- обходимо провести его тестирование на устойчивость генерации и стабильность частоты во всем диапазоне рабочих температур и питающих напряжений. 24
Структура и базовые функции микроконтроллеров При разработке и эксплуатации устройств необходимо учитывать следующие нюансы: Чем больше емкость конденсаторов С1 и С2, тем больше стабильность, но больше время запуска генератора. При напряжении питания ниже 3 В, а также при использовании некоторых специфических типов керамических резонаторов независимо от напряжения, может понадобиться использовать режим HS или переключиться в режим квар- цевого генератора. Поскольку кварцевые и керамические резонаторы от разных производителей могут иметь разные характеристики, пользователю может понадобиться прокон- сультироваться с производителем относительно параметров внешних элементов. Если применяется кристалл с низковольтной спецификацией, во избежание его перегрузки может потребоваться резистор Rs. Всегда проверяйте работу генератора за пределами штатных значений пи- тающего напряжения и температуры. Это повышает надежность работы устрой- ства в целом. Встроенный постделитель позволяет получать тактовую частоту иную, чем ре- зонансная частота кварца или керамического резонатора. Коэффициент деления частоты определяется битами конфигурации CPUDIV. Пользователь может вы- брать коэффициенты 1/1,1/2,1/3 или 1/4 относительно резонансной частоты. В режиме HS может быть использован внешний источник тактовой частоты. В этом случае вывод OSC2/CLKO оставляют свободным, а источник импульсов подключают, как показано на рис. 1.12. Такты от внешнего источника PIC18FXXXX Свободный -<----- OSC2 (В РЕЖИМЕ HS) Рис. 1.12. Тактирование от внешнего источника в режиме HS При работе в режимах ЕС, ECIO, ECPLL и ЕСРЮ подразумевается подклю- чение внешнего источника тактовых импульсов к выводу OSC1. В этом случае не требуется выдерживать интервал времени для запуска генератора после сброса по питанию или при выходе из режима SLEEP (разумеется, при усло- вии, что внешний генератор уже вошел в рабочий режим к моменту сброса микроконтроллера). В режимах ЕС и ECPLL частота тактовых импульсов делится на 4 и получен- ные импульсы подаются на вывод OSC2. Этот сигнал может быть использован для тестирования или синхронизации внешней логики. Подключение в этом ре- жиме показано на рис. 1.13. Такты от внешнего источника FOSC/4- OSC1/CLKI PIC18FXXXX OSC2/CLKO Рис. 1.13. Тактирование от внешнего источника (конфигурация ЕС и ECPLL) 25
Глава 1 Такты от внешнего источника OSC1/CLKI PIC18FXXXX RA6 -----► I/O (OSC2) Рис. 1.14. Тактирование от внешнего источника (конфигурация ECIO и ЕСРЮ) В режимах ЕСЮ и ЕСРЮ цепи тактирования работают аналогично, за исключе- нием того, что вывод OSC2 превращается в дополнительную линию порта вво- да/вывода общего применения. Этой линии соответствует бит 6 PORTA (RA6). Подключение показано на рис. 1.14. Встроенный постделитель для уменьшения тактовой частоты в режимах HS и XT, также доступен в режимах ЕС и ЕСЮ. Умножитель частоты на основе ФАПЧ Семейство PIC18F2455/2550/4455/4550 содержит схему умножителя частоты на основе петли фазовой автоподстройки частоты. Умножитель предназначен специально для тактирования приложений USB-интерфейса при помощи низко- частотных генераторов и может применяться в качестве источника тактовых им- пульсов остальной части микроконтроллера. Петля ФАПЧ включена в режимах HSPLL, XTPLL, ECPLL и ЕСРЮ. Она позво- ляет вырабатывать фиксированные колебания 96 МГц из фиксированных коле- баний 4 МГц. Выходная частота может быть при необходимости поделена до нужного значения и использована одновременно для тактирования USB и ядра микроконтроллера. Поскольку для работы ФАПЧ нужна фиксированная входная частота, исходный генератор имеет предделитель, позволяющий пользователю использовать резонаторы или кварцы с частотой, отличной от 4 МГц. Структур- ная схема генератора с петлей ФАПЧ показана на рис. 1.15. Рис. 1.15. Структурная схема генератора с петлей ФАПЧ (режим HS) 26
Структура и базовые функции микроконтроллеров Кроме того, существует постделитель, позволяющий менять частоту импуль- сов, поступающих с ФАПЧ на ядро микроконтроллера. Благодаря этому, микро- контроллер может работать на частоте, отличающейся от частоты тактирования модуля USB. В отличие от постделителя для режимов XT, HS и ЕС, в данном случае доступны коэффициенты 1/1, 1/2, 1/3, 1/4 и 1/6 от значения на выходе ФАПЧ. В режимах HSPLL, ECPLL и ECPIO можно использовать высокочастотные кварцы, с рабочей частотой до 48МГц. При помощи предделителя эту частоту можно поделить до 12 раз, получив 4 МГц, необходимые ФАПЧ. В режиме XTPLL можно использовать только входные колебания 4 МГц, поступающие на ФАПЧ напрямую. Блок встроенного генератора Семейство PIC18F2455/2550/4455/4550 содержит встроенный генератор, вы- рабатывающий два различных тактовых сигнала, любой из них может быть ис- пользован для тактирования микроконтроллера. Если периферия USB не ис- пользуется, то встроенный генератор позволяет обойтись без внешних элемен- тов на выводах OSC1 и OSC2. Основной генератор представляет собой источник импульсов 8 МГц, которые можно использовать непосредственно для тактирова- ния микроконтроллера. Эти импульсы поступают также на постделитель INTOSC, который позволяет получить импульсы с частотой от 31 кГц до 4 МГц. Выход INTOSC включен, когда выбрана частота тактирования от 125 кГц до 8 МГц. Вторым источником импульсов является RC-генератор INTRC, имеющий но- минальную частоту 31 кГц. INTRC включается, когда выбран в качестве источни- ка тактовой частоты. Кроме того, он включается автоматически, если включены следующие опции: - таймер запуска по включению питания - отказоустойчивый монитор частоты - сторожевой таймер - ускоренный запуск. Эти опции подробно рассмотрены далее, в описании специальных модулей и опций микроконтроллера. Источник тактовой частоты (INTOSC напрямую, INTRC напрямую или INTOSC через делитель) определяется настройкой битов конфигурации IRCF регистра OSCCON. Режимы встроенного генератора и тактирование USB Когда встроенный генератор используется в качестве источника тактовых им- пульсов микроконтроллера, то модуль USB следует тактировать от другого ис- точника (независимый внешний источник или кварц/резонатор на выводах OSC1, OSC2). Выбор источника для тактирования USB определяется особенностями конкретного выбранного режима внутреннего генератора. Существует четыре режима работы встроенного генератора: INTHS. Тактирование USB происходит от генератора в режиме HS. INTXT. Тактирование USB происходит от генератора в режиме XT. INTCKO. Тактирование USB происходит от внешнего источника, через вывод OSC1/CLKI. На выходе OSC2/CLKO присутствует FOsc/4. INTIO. Тактирование USB происходит от внешнего источника, через вывод 27
Гпава 1 OSC1/CLKI. (RA6). Вывод OSC2/CLKO работает как линия двунаправленного порта Регистр OSCTUNE bit7 INTSRC бит выбора источника низкочастотного сигнала 1 = 31.25 кГц поступает от источника 8 МГц INTOSC через делитель на 256 0 = 31 кГц поступает от встроенного генератора INTRC bit 6-5 Не используются. Читаются, как 0. bit 4-0 TUN4:TUN0 Биты подстройки частоты 01111 = Максимальная частота 00001 00000 = Центральная частота, соответствует заводской калибровке 11111 10000 = Минимальная частота Встроенные генераторы калибруются на фабрике, но могут быть настроены и в приложении пользователя путем записи новой калибровочной константы в ре- гистр OSCTUNE. Настроечная характеристика (функция частоты от значения константы) линейная во всем диапазоне настройки. Как только в OSCTUNE записано новое значение, частоты INTOSC и INTRC начинают смещаться к новому значению. Это происходит не мгновенно. Частота INTRC устанавливается через 8 тактов (примерно 256 мкс). Частота INTOSC ста- билизируется через 1 мс. Выполнение программного кода продолжается и во время сдвига частоты, индикация окончания сдвига не предусмотрена. Регистр OSCTUNE также содержит бит INTSRC. Этот бит позволяет пользо- вателю выбрать, какой внутренний генератор является источником тактов, когда установлена опция частоты 31 кГц. Более подробно этот вопрос рассмотрен в разделе «Управляющий регистр генератора». Дрейф частоты и его компенсация Несмотря на то, что встроенные генераторы откалиброваны на фабрике, зна- чение частоты может незначительно дрейфовать в ту или иную сторону в зави- симости от напряжения питания и температуры корпуса. Генераторы INTOSC и INTRC не связаны между собой, и дрейф частоты в них происходит абсолютно независимо. Корректировка частоты INTOSC также не влияет на частоту INTRC. Для корректировки частоты INTOSC необходимо знать, в какую сторону, и на какую величину производить компенсацию. Например, при использовании модуля EUSART, подстройка необходима, если начинает появляться ошибка кадрирова- ния или принимаемые данные содержат ошибки в асинхронном режиме. Ошибка кадрирования означает, что частота тактирования слишком велика. Необходимо уменьшить частоту путем уменьшения константы. С другой стороны, ошибки дан- ных означают, что частота слишком низка. 28
Структура и базовые функции микроконтроллеров Для вычисления величины корректировки можно использовать сравнение час- тоты тактирования устройства с опорной частотой. Используется два таймера: один тактируется периферийными тактами, тогда как другой тактируется от фик- сированного опорного источника, такого как генератор таймера Timerl. Оба тай- мера сбрасываются, но таймер, тактируемый опорной частотой, генерирует пре- рывание. Когда происходит прерывание, считывают значение из таймера, такти- руемого от внутреннего генератора, и сбрасывают оба таймера. Если значение таймера, тактируемого от внутреннего генератора, больше, чем ожидалось из расчетов, значит, частота внутреннего генератора слишком высока, и наоборот. И, наконец, модуль ССР может использовать свободно работающий таймер Timerl или Timer3, тактируемый от блока внутреннего генератора, и некое внешнее событие с заведомо известным периодом (например, импульсы внешнего образцово- го генератора). Момент первого события захватывается в регистры CCPRxH:CCPRxL и сохраняется для дальнейшего использования. Затем, когда захвачен момент вто- рого события, время первого события вычитается из времени второго события (под временем понимают значение таймера). Поскольку период следования внешнего события известен, можно рассчитать разницу времени между событиями. Если измеренное время намного больше, чем расчетное, внутренний генера- тор работает слишком быстро, и наоборот. Настройки генератора для USB Когда микроконтроллер PIC18F4550 применяется для обмена данными по USB, то для его работы требуется тактовая частота 6 МГц или 48 МГц в зависи- мости от заданного режима скорости USB. Поэтому при разработке и программи- ровании приложений нужно заранее обдумать выбор частоты генератора и его тип. В табл. 1.5 перечислены все варианты конфигурирования тактового генера- тора, совместимые с работой USB. Таблица 1.5 Варианты конфигурирования тактового генератора, совместимые с USB Входная частота генерато- ра, МГц Делитель ФАПЧ (PLLDIV2:PLLDIV0) Режим генератора (FOSC3:FOSCO) Делитель ядра (CPUDIV1 :CPUDIV0) Тактовая частота микрокон- троллера 48 Нет(1) ЕС, ECIO Нет (00) 48 2(01) 24 3(Ю) 16 4(11) 12 48 12 (111) ЕС, ECIO Нет (00) 48 2(01) 24 3(Ю) 16 4(11) 12 ECPLL, ECPIO 2 (00) 48 3(01) 32 4(Ю) 24 6(11) 16 29
Глава 1 Входная частота генерато- ра, МГ ц Делитель ФАПЧ (PLLDIV2:PLLD1V0) Режим генератора (FOSC3-.FOSCO) Делитель ядра (CPUDIV1:CPUDIV0) Тактовая частота микрокон- троллера 40 10(110) ЕС, ЕСЮ Нет (00) 40 2(01) 20 3(Ю) 13.33 4(11) 10 ECPLL, ЕСРЮ 2(00) 48 3(01) 32 4(10) 24 6(11) 16 24 6(101) HS, ЕС, ЕСЮ Нет (00) 24 2(01) 12 3(Ю) 8 4(11) 6 HSPLL, ECPLL, ЕСРЮ 2(00) 48 3(01) 32 4(10) 24 6(11) 16 20 5(100) HS, ЕС, ЕСЮ Нет (00) 20 2(01) 10 3(Ю) 6,67 4(11) 5 HSPLL, ECPLL, ЕСРЮ 2(00) 48 3(01) 32 4(10) 24 6(11) 16 16 4(011) HS, ЕС, ЕСЮ Нет (00) 16 2(01) 8 3(10) 5,33 4(11) 4 HSPLL, ECPLL, ЕСРЮ 2(00) 48 3(01) 32 4(10) 24 6(11) 16 12 3 (010) HS, ЕС, ЕСЮ Нет (00) 12 2(01) 6 3(10) 4 4(11) 3 HSPLL, ECPLL, ЕСРЮ 2(00) 48 3(01) 32 4(Ю) 24 6(11) 16 30
Структура и базовые функции микроконтроллеров Входная частота генерато- ра, МГ ц Делитель ФАПЧ (PLLDIV2:PLLDIV0) Режим генератора (FOSC3;FOSCO) Делитель ядра (CPUDIV1:CPUDIV0) Тактовая частота микрокон- троллера 8 2(001) HS, ЕС, ECIO Нет (00) 8 2(01) 4 3(10) 2,67 4(11) 2 HSPLL, ECPLL, ЕСРЮ 2 (00) 48 3(01) 32 4(10) 24 6(11) 16 4 1 (000) XT, HS, ЕС, ECIO Нет (00) 4 2(01) 2 3(Ю) 1,33 4(11) 1 HSPLL, ECPLL, XTPLL, ECPIO 2 (00) 48 3(01) 32 4(10) 24 6(11) 16 Примечание:(1) Действителен, если бит конфигурации USBDIV сброшен Обозначения: Все тактовые частоты, кроме 24 МГц, эксклюзивно ассоциированы с ра- ботой USB в режиме полной скорости (частота тактов USB 48 МГц). Жирный шрифт ука- зывает на настройки, при которых поддерживается совместимость с низкоскоростным USB (системная частота 24 МГц, частота тактов USB 6 МГц). Управление источниками тактирования По аналогии с другими микроконтроллерами PIC18, семейство P1C18F2455/2550/4455/4550 имеет опцию, позволяющую источнику тактирования переключаться с основного генератора на альтернативный низкочастотный ис- точник. В данном семействе предусмотрено два альтернативных источника. Ко- гда выбран альтернативный источник, различные функции управления энергопо- треблением по-прежнему доступны. В общем случае, доступны три разновидности источников тактирования: - первичные генераторы; - вторичные генераторы; - блок встроенных генераторов. Первичные генераторы включают в себя режимы «внешний кристалл» и «внешний резонатор», «внешнее тактирование» и блок встроенных генераторов. Индивидуальный режим определяется содержимым битов конфигурации FOSC3:FOSCO. Детали настройки рассматриваются далее. 31
Глава 1 Вторичные генераторы представляют собой внешние источники, не подклю- ченные к выводам OSC1 и OSC2. Эти источники могут продолжать работать и после того, как контроллер переведен в режим управления энергопотреблением. Микроконтроллеры PIC18F2455/2550/4455/4550 используют генератор тайме- ра Timerl, как вторичный генератор. Этот генератор (во всех режимах управле- ния энергопотреблением) часто является источником опорного времени для раз- личных функций, таких, как часы реального времени. Наиболее часто стандарт- ный часовой кристалл 32768 Гц подключается к выводам RC0/T1OSO/T13CKI и RC1/T1OSI/UOE. Как и в случае рассмотренных выше генераторов режима XT и HS, между каждым выводом и землей следует подключить нагрузочный кон- денсатор (рис. 1.11). Более детально этот вопрос рассмотрен в описании модуля Timerl. Кроме своей работы в качестве первичного генератора, блок встроенных ге- нераторов доступен и в режимах управления энергопотреблением. Источник INTRC также применяется для тактирования нескольких специальных модулей, таких, как сторожевой таймер и монитор тактовой частоты. Регистр OSCCON bit7 IDLEN бит включения режима Idle (свободен). 1 = Устройство входит в режим «простоя» по инструкции SLEEP. О = Устройство входит в режим Sleep по инструкции SLEEP. bit6-4 ICRF2:ICRF0 биты выбора частоты встроенного генератора. 111 = 8 МГц (INTOSC работает напрямую). 110 = 4 МГц. 101 =2 МГц. 100 = 1 МГц’3* 011 = 500 кГц. 010 = 250 кГц. 001 = 125 кГц. 000 = 31 кГц (от 1NTOSC/256 или INTRC напрямую/2*. bit3 OSTS бит статуса тайм-аута при запуске генератора’1*. 1 = тайм-аут для запуска генератора исчерпан, генератор работает. 0 = запуск еще идет, первичный генератор не готов. bit2 IOFS бит стабильности частоты INTOSC. 1 = Частота INTOSC стабильна. 0 = Частота INTOSC нестабильна. bitl-0 SCSI :SCS0 биты выбора системы тактирования. 1 х = блок внутреннего генератора. 01 = генератор модуля Timerl. 00 = первичный генератор. (1) Зависит от состояния бита конфигурации IESO ’2) Источник выбирается битом INTSRC (OSCTUNE<7>), см. текст (3* Выходная частота по умолчанию после сброса. 32
Структура и базовые функции микроконтроллеров Регистр OSCCON управляет несколькими параметрами системы тактирова- ния, как в обычном режиме, так и в режиме энергосбережения. Биты SCS1.SCS0 определяют источник тактовых импульсов. Доступными источниками являются первичные импульсы (определяемые битами конфигурации FOSC3:FOSCO), вто- ричные импульсы (генератор модуля Timerl) и блок внутреннего генератора. Ис- точник тактирования меняется немедленно после изменения соответствующих битов, в течение периода следования импульсов. Биты SCS обнуляются при любых вариантах сброса! Биты IRCF2:IRCF0 определяют выходную частоту импульсов блока внутрен- него генератора, тактирующих микроконтроллер. Если контроллер тактируется от блока внутреннего генератора, то изменение этих битов приводит к немедленно- му изменению частоты на выходе генераторов. По умолчанию после сброса вы- ходная частота блока встроенного генератора устанавливается равной 1 МГц. Если установлена выходная частота 31 кГц (IRCF2JRCF0 = ООО), пользователь может выбирать, какой из внутренних генераторов будет источником. Выбор осуще- ствляется при помощи бита INTSRC (регистр OSCTUNE<7>). Установка этого бита указывает на генератор INTOSC, как источник импульсов 31,25 кГц. Импульсы полу- чаются путем деления на 256 постделителем INTOSC. Сброс бита INTSRC устанав- ливает в качестве источника генератор INTRC с номинальной частотой 31 кГц. Эта опция позволяет пользователю выбрать настраиваемый и более точный INTOSC в качестве источника тактирования, пока установлен режим энергосбе- режения с очень низкой тактовой частотой. Независимо от установки INTSRC, генератор INTRC всегда остается источником тактов для таких периферийных модулей, как сторожевой таймер и монитор тактовой частоты. Биты OSTS, IOFS и T1RUN показывают, какой источник тактовой частоты сей- час тактирует контроллер. Бит OSTS индицирует, что таймер запуска генератора переполнен и первичный источник тактирует контроллер в режиме тактирования от первичного источника. Бит 1OFS индицирует, когда внутренний генератор ста- билизировался и выдает тактирующие импульсы в режиме RC-генератора. Бит T1RUN (T1CON<6>) индицирует, что генератор таймера Timerl используется в качестве источника в режиме вторичного тактирования. В энергосберегающих режимах из этих трех битов в один момент времени может быть установлен только один бит. Если ни один из этих битов не установлен, это означает, что тактирование происходит от INTRC, или блок внутреннего генератора только что стартовал, и его частота пока еще не стабильна. Бит IDLEN определяет, как будет выполнена команда SLEEP: с переходом в обычный режим SLEEP, или в один из режимов ожидания/бездействия (Idle modes). Применение флагов и управляющих битов регистра OSCCON рассмотрено также в разделе «Энергосберегающие режимы». Примечания: 1. Следует включить таймер Timerl, прежде чем его генератор будет ис- пользован в качестве вторичного источника тактов. Для этого необходимо установить бит T1OSCEN в регистре управления таймером (T1CON<3>). Ес- ли модуль Timerl не включен, то попытки подключить вторичный источник будут проигнорированы. 2. Прежде, чем подключать генератор модуля Timerl, следует быть уве- ренным, что он запущен и работает. В противном случае возможна очень большая задержка, пока генератор стартует. 33
Глава 1 Влияние режимов энергосбережения на различные источники тактовых импульсов Если установлен режим PRIJDLE, назначенный ранее первичный генератор продолжает работать без перерыва. Во всех остальных энергосберегающих ре- жимах генератор, использующий вывод OSC1, отключается. Если модуль USB не включен, на выводах OSC1 и OSC2 прекращаются колебания. В режимах вторичного тактирования (SECLRUN и SECJDLE) генератор Timerl работает и выдает тактовую частоту. Генератор также может работать во всех энер- госберегающих режимах, если требуется тактировать модули Timerl или Timer3. В режимах тактирования от встроенного генератора (RC_RUN и RCJDLE) им- пульсы поступают от блока внутреннего генератора. Выход INTRC 31 кГц может быть использован непосредственно как источник тактовых импульсов или для дополнительных модулей (см. разделы «Сторожевой таймер», «Монитор такто- вой частоты» и «Двухскоростной запуск»). Выход INTOSC 8 МГц может поступать напрямую или через постделитель. Выход INTOSC отключается, если импульсы поступают напрямую с выхода INTRC. Независимо от того, находится ли контроллер в режиме ожидания (Idle), ис- точник тактирования USB продолжает работать. Если контролер тактировался от генератора на основе кварца или резонатора, этот генератор продолжает такти- ровать модуль USB. Ядро и остальные модули переключаются на другой источ- ник тактовых импульсов. Если выбран переход в полноценный режим SLEEP по команде SLEEP, то все источники тактовой частоты останавливаются. Следовательно, переключения всех транзисторов прекращаются, и потребляемый ток состоит только из суммы токов утечек. Режим SLEEP не может быть реализован, если модуль USB работает и осуществляет обмен данными. Существует лишь одно исключение, когда прибор получает команду «Останов» через USB. Как только модуль USB полу- чает эту команду, он переключается в режим энергосбережения, и весь микро- контроллер переходит в режим SLEEP. Включение какого-либо модуля, способного работать в режиме SLEEP, увели- чивает потребляемый ток. Для работы модуля сторожевого таймера необходим генератор INTRC. Для использования таймера Timerl в качестве часов реально- го времени также понадобится соответствующий генератор. Некоторые опцио- нальные возможности могут быть реализованы без потребления энергии от ис- точника питания прибора. Это, например, внешние прерывания, последователь- ный порт в режиме «ведомого» и т.д. Задержки по включению питания Задержки по включению питания управляются двумя таймерами. Поэтому в большинстве приложений не требуются дополнительные внешние элементы цепи сброса. Таймеры задержек позволяют удерживать контроллер в состоянии сброса, пока питание не стабилизируется на должном уровне, а первичный гене- ратор не выйдет в стабильный режим. Первый таймер - это PWRT, таймер включения питания, который обеспечи- вает фиксированную задержку при включении. Таймер включается сбросом бита конфигурации PWRTEN. 34
Структура и базовые функции микроконтроллеров Второй таймер - это таймер запуска тактового генератора OST, призванный удерживать кристалл в состоянии сброса, пока генератор не стабилизируется (режимы XT и HS). Таймер OST отсчитывает 1024 импульса тактового генерато- ра, прежде чем позволит генератору тактировать микроконтроллер. Если в слове конфигурации указан режим генератора HSPLL, то прибор удер- живается в состоянии сброса дополнительные 2 мс, чтобы петля ФАПЧ успела захватить входную тактовую частоту. Энергосберегающие режимы В семействе PIC18F2455/2550/4455/4550 предусмотрено семь режимов опти- мального потребления энергии питания. В свою очередь, режимы потребления делятся на три категории: . Работа (Run) • Ожидание (Idle) • Засыпание (Sleep) Эти категории определяют, какая часть микроконтроллера тактируется и с ка- кой частотой. Режимы Run и Idle могут использовать три доступных типа источни- ка тактирования (первичный, вторичный и блок встроенного генератора). В ре- жиме Sleep источники тактирования не используются. Энергосберегающие режимы, примененные в рассматриваемом семействе приборов, включают в себя некоторые опции, примененные в более ранних микро- контроллерах серии PICmicro®. Это опция переключения источника тактирования, позволяющая приборам серии PIC18 использовать генератор таймера Timerl вме- сто первичного генератора. Также используется традиционный для всех приборов PICmicro® режим Sleep, когда не работает ни один тактовый генератор. Выбор энергосберегающих режимов Выбирая энергосберегающий режим, необходимо определиться с двумя во- просами: будет ли микроконтроллер тактироваться или нет, и выбрать источник тактирования. Бит IDLEN регистра OSCCON<7> управляет тактированием кон- троллера, тогда как биты SCS1:SCS0 регистра OSCCON<1:0> выбирают источ- ник тактирования (см. выше описание регистра OSCCON). Индивидуальные ре- жимы, источники тактирования и задействованные модули сведены в табл. 1.6. Таблица 1.6 Энергосберегающие режимы Режим Биты OSCCON Тактирование модулей Доступные частоты и источники IDLEN(1) SCSI: SCSO Ядро Перифе- рия Sleep 0 - Нет Нет Все генераторы отключены PRI_RUN - 00 Да Да Первичный источник, все его режимы Нормальный режим полного потребления 35
Гпава 1 Режим Биты OSCCON Тактирование модулей Доступные частоты и источники IDLEN(1) SCSI: SCSO Ядро Перифе- рия SEC_RUN - 01 Да Да Вторичный - генератор тай- мера Timerl RC_RUN - 1x Да Да Блок внутреннего генератора(2) PRI JDLE 1 00 Нет Да' Первичный - все режимы. SECJDLE 1 01 Нет Да Вторичный - генератор Timerl RCJDLE 1 1x Нет Да Блок внутреннего генератора(2> (1) Значение IDLEN используется, когда выполнена команда SLEEP. (2) Включая INTOSC и его постделитель, равно как и INTRC. Переход от одного энергосберегающего режима к другому начинается с за- грузки нового значения в регистр OSCCON. Биты SCS1:SCSO выбирают источник тактирования и определяют, какой режим - Run или Idle будет использован. Из- менение этих битов переключает прибор на новый источник (допуская, что он работает). Переключение в режим Idle или Sleep происходит в момент выполне- ния команды SLEEP и зависит от состояния бита IDLEN в этот момент. В зависимости от текущего режима и того, какой режим ожидается, не всегда может потребоваться оперировать всеми этими битами. Переход в другой режим может быть осуществлен переключением битов выбора источника или измене- нием состояния бита IDLEN перед выдачей команды SLEEP. Если бит IDLEN ус- тановлен корректно, может оказаться достаточным только команды SLEEP. Переход между источниками тактовых импульсов занимает два цикла старого источника и три цикла нового. Эта формула предполагает, что новый источник уже запущен и стабилен. Три бита указывают текущий источник и его статус: .OSTS (OSCCON<3>). . IOFS (OSCCON<2>). . T1RUN (T1CON<6>). Как правило, только один из этих битов будет установлен в определенном энергосберегающем режиме. Если установлен бит OSTS, устройство тактируется от первичного источника. Если установлен бит IOFS, то генератор INTOSC выда- ет стабильные 8 МГц на делитель, откуда они поступают на прибор. Если уста- новлен бит T1RUN, то источником является генератор таймера Timerl. Если же ни один из этих битов не установлен, то либо прибор тактируется от источника INTRC, либо генератор INTOSC еще не стабилен. Если блок внутреннего генератора сконфигурирован, как первичный источник, при помощи битов FOSC3.FOSCO, то в режимах PRI_RUN и PRI JDLE могут быть установлены два бита - OSTS и IOFS. Это означает, что первичный источник (в данном случае INTOSC) генерирует стабильные 8 МГц. Ввод другого режима энергопотребления на этой же частоте очистит бит OSTS. Внимание! Если напряжение питания меньше, чем 3 В, может случиться так, что будет установлена тактовая частота больше, чем допустимая для микроконтроллера при пониженном напряжении питания. При несоблюдении допустимого соотношения VDD/FOSC микроконтроллер может работать не- корректно. 36
Структура и базовые функции микроконтроллеров Напомним также, что выполнение команды SLEEP не обязательно означа- ет, что микроконтроллер перейдет в режим Sleep. Это зависит от состоя- ния бита IDLEN. В режимах вида «Run» тактируются как ядро, так и периферийные модули. Различие состоит только в источнике тактов. Режим PRI_RUN - это обычный режим работы с полным энергопотреблени- ем. Этот режим установлен по умолчанию после сброса, исключая случай, когда установлен двухскоростной запуск. В этом режиме бит OSTS установлен. Бит IOFS может быть установлен, если первичным источником является блок внут- реннего генератора. Режим SEC_RUN - это режим совместимости с опцией «переключение ис- точника», доступной в других приборах серии PIC18. В этом режиме ядро и пе- риферия тактируются от генератора Timerl. Это дает возможность иметь по- ниженное энергопотребление при достаточно стабильном источнике тактовых импульсов. Переход в этот режим осуществляется установкой битов SCSI :SCS0 в состояние «01». При этом начинается тактирование от генератора Timerl, первичный генера- тор отключается, флаг-бит T1RUN (T1CON<6>) установлен, флаг-бит OSTS сброшен (рис. 1.16). Внимание! Генератор Timerl должен быть запущен перед установкой ре- жима SECRUN. Если флаг-бит T1RUN не сигнализирует о готовности гене- ратора, то вхождение в режим SEC_RUN не произойдет. Если генератор включен, но не «разогнался», то случится задержка тактирования до полного запуска генератора. В обоих этих случаях возможен непредсказуемый резуль- тат попытки переключения режима! При переходе из режима SEC_RUN в PRI_RUN периферия и ядро продолжа- ют тактироваться от генератора Timerl, пока не стартует первичный генератор. Когда переключение закончено, флаг-бит T1RUN сбрасывается, OSTS устанав- ливается. Биты IDLEN и SCS не затрагиваются, генератор Timerl продолжает работать (рис. 1.17). В режиме RC_RUN ядро и периферия тактируются от блока внутреннего генера- тора с использованием мультиплексора INTOSC. Первичный генератор отключается. Если используется источник INTRC, то рассматриваемый режим обеспечивает наи- лучшее сбережение энергии питания из всех режимов серии «Run». Этот режим удо- бен для приложений, не требующих быстрого тактирования на всем протяжении ра- боты или некритичных к тактовой частоте и ее стабильности. * Смена тактирования обычно происходит за 2-4 tosc Рис. 1.16. Смена тактирования при переходе в режим SEC_RUN 37
Гпава 1 T0ST = 1024 Tosc, TpLl - 2 мс Эти интервалы показаны не в масштабе. Рис. 1.17. Переход из режима SEC_RUN в PRI_RUN (HSPLL) Если в качестве первичного источника объявить блок внутреннего генератора (INTRC или INTOSC), то в момент исполнения кода не будет заметных различий между режимами PRI_RUN и RC_RUN. Тем не менее, при входе в режим RC_RUN и выходе из него все равно будет существовать задержка переключе- ния. Поэтому, если первичным источником является блок внутреннего генерато- ра, использовать режим RC_RUN не рекомендуется. Вход в этот режим осуществляется установкой бита SCS1 = 1. Кроме того, рекомендуется сбросить бит SCS0, несмотря на то, что он игнорируется. Это обеспечит совместимость с будущими устройствами. Когда источник тактирования переключен на мультиплексор INTOSC (рис. 1.18), первичный генератор отключается, а флаг-бит OSTS сбрасывается. Биты IRCF могут быть модифицированы в любой момент с целью немедленного изменения тактовой частоты. Если биты IRCF и бит INTSRC сброшены, то выход INTOSC выключен и флаг- бит IOFS остается сброшенным. Таким образом, индикация об источнике такти- рования будет отсутствовать. Тактирование предоставляет источник INTRC. 'Смена тактирования обычно происходит за 2-4 Tgs(- Рис. 1.18. Переход в режим RC„RUN 38
Структура и базовые функции микроконтроллеров Рис. 1.19. Переход из режима RC_RUN в PRLRUN Если биты IRCF выводятся из состояния «все сброшены» (включая, таким об- разом, выход INTOSC), или бит INTSRC установлен, то флаг-бит IOFS переходит в «1» после того, как выходные колебания INTOSC стабилизируются. Тактирова- ние микроконтроллера продолжится по истечении интервала стабилизации Т !Obst- Если биты IRCF имели изначально ненулевые значения или INTSRC был ус- тановлен перед установкой SCS1 и генератор INTOSC уже стабилен, то бит IOFS останется установленным в «1». При переходе из режима RC_RUN в режим PRLRUN контроллер продолжает тактироваться от мультиплексора INTOSC, пока стартует первичный источник. Когда он готов, происходит переключение (рис. 1.19). По окончании переключе- ния флаг-бит IOFS сбрасывается, флаг-бит OSTS устанавливается, и контроллер далее тактируется от первичного генератора. Биты IDLEN и SCS при переключе- нии не меняются. Источник INTRC продолжает работать, если включен модуль сторожевого таймера или монитор тактовой частоты. Внимание! Если напряжение питания меньше, чем 3 В, может случиться так, что будет установлена тактовая частота больше, чем допустимая для микроконтроллера при пониженном напряжении питания. При несоблюдении допустимого соотношения VDD/FOSC микроконтроллер может работать не- корректно. Режим Sleep Режим Sleep у микроконтроллеров семейства PIC18F2455/2550/4455/4550 полностью идентичен этому режиму у остальных микроконтроллеров PICmicro. Он включается после сброса бита IDLEN (состояние по умолчанию после сброса) и исполнения инструкции SLEEP. При этом отключается тактовый генератор. Все флаг-биты источников тактирования сбрасываются. Вхождение в режим Sleep из любого другого режима не требует переключения источника тактирования, потому что в этом режиме ядро и большая часть перифе- 39
Глава 1 Q11 Q2i Q3 IQ4 |Q1 Рис. 1.20. Диаграмма тактирования при входе в режим Sleep рии не требует тактирования. Если включен сторожевой таймер, он продолжает тактироваться от источника INSRC. Если включен генератор Timerl, он тоже продолжает работать (рис. 1.20). Выход из режима Sleep происходит по прерыванию, по сбросу и по перепол- нению сторожевого таймера. Но тактирование прибора не начинается до тех пор, пока источник, заданный битами SCS1:SCS0, не будет готов, или будет тактиро- ваться от блока внутреннего генератора, если включен двухскоростной запуск или монитор тактовой частоты. В таком случае бит OSTS установится, когда так- тирование будет происходить от первичного источника (рис.1.21). Состояние би- тов IDLEN и SCS при выходе из Sleep не меняется. OSC1 Выход ФАПЧ Такты CPU Такты периферии Счетчик команд ; qi---------------------Q2; оз; 04; qi ;Q2; оз ;Q4 ;qi ;q2 ;оз^ Q4; qi оз; Q4‘ : Л П Л Л П Л П Л П ПЛ ДЛ П П Г РсТ г У рс + 4 ~ X рс + 6 Г~ + I Пробуждение Установлен бит OSTS TOSt = Tosc' Tpll ~ мс Эти интервалы показаны не в масштабе. Рис. 1.21. Тактирование при выходе из Sleep (HSPLL) Режим Idle Режим Idle позволяет избирательно отключить тактирование ядра, сохраняя тактирование периферийных модулей. Применение этого режима позволяет раз- работчику более гибко использовать режимы энергосбережения. Если бит IDLEN = 1 когда выполняется команда SLEEP, то периферия такти- руется от источника, заданного битами SCS1:SCS0, но тактирование ядра пре- кращается. Флаг-биты источников тактирования не меняются. Таким образом, режим Idle является компромиссным решением, позволяющим экономить энер- гию источника, обходясь без задержки на запуск тактового генератора (как это происходит при выходе из Sleep). Если включен сторожевой таймер, он продолжает тактироваться от источника INSRC. Если включен генератор Timerl, он тоже продолжает работать. Поскольку ядро не выполняет никакие команды, выйти из режима Idle можно только по сбросу, по прерыванию или по переполнению сторожевого таймера.
Структура и базовые функции микроконтроллеров Рис. 1.22. Диаграмма тактирования при входе в режим Idle Когда происходит пробуждающее событие, ядро начинает тактироваться не мгновенно, а по истечении некоторого интервала TCsd- Когда вычислитель начи- нает исполнение кода программы, он продолжает тактироваться от того источни- ка, от которого тактировался в момент входа в Idle. Например, при пробуждении из режима RCJDLE микроконтроллер переходит в режим RC„RUN и, соответст- венно, тактируется от встроенного RC-генератора. При пробуждении по причине переполнения сторожевого таймера контроллер переходит в ту разновидность режима Run, которая определена битами SCS1:SCS0. Режим PRIJDLE уникален тем, что не отключается первичный источник так- тирования. Это позволяет работать с чувствительными к тактовой частоте при- ложениями, поскольку генератор не нужно «разгонять» каждый раз при смене режима или переключаться на другой источник. Для вхождения в режим PRIJDLE из режима PRLRUN (рис. 1.22) достаточно установить бит IDLEN = 1 и выполнить команду SLEEP. При переходе из других режимов серии «Run» необходимо сначала установить бит IDLEN, затем обнулить биты SCS, и лишь после этого выполнить команду SLEEP. Несмотря на то, что яд- ро не тактируется, периферия продолжает получать тактовые импульсы от источ- ника, определенного битами FOSC3:FOSCO. Бит OSTS остается установленным. При выходе из режима PRIJDLE состояние битов IDLEN и SCS не изменяется (рис 1.23). Режим SEC IDLE прекращает тактирование ядра, но периферия продолжает тактироваться от генератора Timerl. Для перехода в этот режим из режима SECJ4UN достаточно установить бит IDLEN = 1 и выполнить команду SLEEP. Если контроллер ранее находился в режиме ином, чем SEC_RUN, то следует сначала установить бит IDLEN, затем установить биты SCSI :SCS0 в состояние Рис. 1.23. Диаграмма тактирования при выходе из режима Idle 41
Гпава 1 «01» и после этого выполнить команду SLEEP. Когда тактирование переключает- ся на генератор модуля Timerl, первичный генератор отключается, флаг-бит OSTS сбрасывается и флаг-бит Т1 RUN устанавливается. После выхода из режима периферия продолжает тактироваться от генератора Timerl. По истечении интервала TCSD ядро начинает исполнение команд, такти- руясь от генератора Timerl. Состояние битов IDLEN и SCS не изменяется; гене- ратор Timerl продолжает работать. Внимание! Генератор Timer! должен стабильно работать перед перехо- дом в режим SECJDLE. Если бит включения генератора T1OSCEN не уста- новлен. то команда SLEEP будет проигнорирована и переход в режим SECJDLE не произойдет. Если генератор Timer! включен, но еще не вошел в рабочий режим, то тактирование будет задержано на время «разгона» генератора. В этой си- туации возможен непредсказуемый результат выполнения команды SLEEP. Режим RCJDLE прекращает тактирование ядра, но периферия продолжает тактироваться от блока встроенного генератора через мультиплексор INTOSC. Из режима RC„RUN переход осуществляется путем установки бита IDLEN = 1 и выполнения команды SLEEP. Для перехода из других режимов необходимо сна- чала установить бит IDLEN, затем биты SCS1:SCS0 в состояние «10» и выпол- нить команду SLEEP. Несмотря на то, что в данном случае бит SCS0 игнорирует- ся, настоятельно рекомендуется обнулять его для совместимости с будущими версиями микроконтроллера. Мультиплексор INTOSC может быть использован для получения более высокой тактовой частоты путем модификации битов IRCF до ис- полнения команды SLEEP. Когда тактирование переключено на мультиплексор INTOSC, первичный генератор отключается, и флаг-бит OSTS сбрасывается. Если биты IRCF установлены в любое ненулевое значение, или установлен бит INSRC, то включается выход INTOSC. Когда, по истечении интервала Тювбт. выходные колебания становятся стабильными, устанавливается флаг-бит IOFS. Когда происходит пробуждающее событие, периферия продолжает тактиро- ваться от мультиплексора INTOSC. После задержки TCSD ядро начинает испол- нение команд, тактируясь также от мультиплексора. Значение битов IDLEN и SCS не изменяется. Если включены сторожевой таймер или монитор тактовой часто- ты, они продолжают тактироваться от источника INTRC. Выход из режимов Idle и Sleep Выход из энергосберегающих режимов Sleep и Idle происходит по прерыва- нию, по переполнению сторожевого таймера или по сбросу. Любое из доступных прерываний может перевести контроллер в режим Run. Но для этого к моменту выполнения команды Sleep прерывания должны быть разрешены установкой управляющего бита в одном из регистров, INTCON или PIE. Как только случается событие прерывания, устанавливается соответствую- щий флаг-бит и начинается возврат из энергосберегающего режима. Если бит GIE/GIEH (]NTCON<7>) установлен, начинается исполнение кода, расположенно- го по вектору прерывания. В ином случае возобновляется исполнение кода с те- кущей позиции. Реакция на переполнение сторожевого таймера зависит от того, в каком ре- жиме находился контроллер на момент события. Если код программы не испол- нялся (все режимы группы Idle и режим Sleep), то происходит возврат из режима 42
Структура и базовые функции микроконтроллеров энергосбережения и возобновляется исполнение кода. Если контроллер нахо- дился в режиме Run, то происходит его сброс (подробнее см. раздел «Стороже- вой таймер»). Сторожевой таймер и постделитель очищаются при исполнении команд SLEEP и CLRWDT, при отключении источника тактирования таймера и при мо- дификации битов IRCF регистра OSCCON (если источником тактирования явля- ется первичный генератор). Рассмотрим выход по сбросу. Обычно, контроллер удерживается в состоянии сброса при помощи таймера запуска до момента готовности первичного источни- ка. После этого устанавливается бит готовности OSTS. Если новым источником тактирования является блок внутреннего генератора, то устанавливается, наобо- рот, флаг-бит IOFS. Задержка выхода по сбросу до момента начала исполнения кода зависит от обоих генераторов, их состояния до и после «пробуждения», а также типа гене- ратора, если новым источником тактирования является первичный генератор. Различные значения задержек сведены в табл. 1.7. Таблица 1.7 Задержка выхода по сбросу из режимов Sleep и Idle Источник тактирования Задержка выхода Бит готовности генератора (OSCCON) До выхода После выхода Первичный генератор (режим PRIJDLE) XT, HS Нет OSTS XTPLL, HSPLL EC INTOSC(3) IOFS T1OSC или INTRC(1) XT, HS Tost41 OSTS XTPLL, HSPLL TosT + trc(4) EC Tcsd(2) intosc(2) T iobst(5) IOFS INTOSC(3) XT, HS Tqst(5) OSTS XTPLL, HSPLL Tost + trc(4) EC Tcsd(2) intosc(2) Нет IOFS Нет (режим Sleep) XT, HS Tost(4) OSTS XTPLL, HSPLL T ost + Lc(4> EC Tcsd12) intosc(2) Tiobst(5) IOFS (1) В этом случае см. описание источника 31 кГц INTRC. (2) Параметр TOsd является необходимой задержкой при выходе из режимов Sleep и Idle и действует одновременно с остальными задержками. (3) Включая источник INTOSC 8 МГц и выход постделителя. <4> Tosc является периодом запуска генератора; trc это время захвата ФАПЧ, обозна- чаемое также, как Tpll. (5) Выполнение продолжается во время периода стабилизации Tiobst генератора INTOSC. 43
Гпава 1 Исполнение командного кода может начаться до того, как будет готов первич- ный источник. Если включен режим двухскоростного запуска или монитор такто- вой частоты, то контроллер будет тактироваться от мультиплексора INTOSC до тех пор, пока первичный генератор не войдет в рабочий режим. В некоторых случаях при выходе из энергосберегающих режимов задержка на время запуска генератора не требуется. Это бывает в двух случаях: в режиме PRIJDLE, когда первичный генератор не выключается, и если первичный источ- ник работает не в режимах XT или HS. Очевидно, что если микроконтроллер так- тировался от независимого внешнего источника или блока встроенного генера- тора, они не прекращали работать. Аналогично можно говорить о первичном ге- нераторе в режиме PRIJDLE. Тем не менее, фиксированная задержка TCSD не- обходима для подготовки ядра к началу выполнения операций. Команды начи- нают исполняться в первом же такте после истечения этой задержки. Сброс В семействе PIC18F2455/2550/4455/4550 доступны следующие варианты сброса: . По включению питания (POR, Power-on Reset). • Через MCLR в обычном режиме. . Через MCLR в энергосберегающем режиме. . По переполнению сторожевого таймера (WDT). . Программируемый сброс по спаду питания (BOR, Brown-Out Reset). . Команда RESET. . По заполнению стека. По переполнению стека. Здесь мы рассмотрим сброс, генерируемый событиями MCLR, POR и BOR. Сброс по событиям стека и сторожевого таймера рассмотрен в соответствующих разделах, описывающих эти модули. Упрощенная структурная схема показана на рис. 1.24. Регистр RCON События сброса микроконтроллера отслеживаются через регистр RCON. Младшие пять битов регистра показывают, какое событие сброса имело место. В большинстве случаев эти биты обнуляются только событием и должны быть установлены обратно приложением пользователя. Состояние этих флаг-битов, вместе взятых, может быть прочитано программой пользователя для определе- ния того, какое событие вызвало сброс. Кроме того, регистр RCON содержит управляющие биты для установки при- оритета прерывания (IPEN) и программного управления модулем BOR обнаруже- ния спада питания (SBOREN). Приоритеты прерываний подробно описаны в раз- деле «Прерывания». Модуль BOR будет описан ниже в этом разделе. bit7 IPEN бит включения приоритета прерывания 1 - система приоритетов включена О = система приоритетов выключена (совместимость с PIC16XXX) bit6 SBOREN бит включения BOR(1) если BOREN1 :BORENO = 01 44
Структура и базовые функции микроконтроллеров Рис. 1.24. Упрощенная структурная схема узла сброса: (1) Генератор INTRC из блока встроенного генератора, отличный от RC-генератора на выводе CLKI.(2) См. табл. 1.9 1 = BOR включен О = BOR выключен если BOREN1 :BORENO = 00, 10 или 11 бит не действует, всегда читается «О» bit5 Не используется. Читается, как О bit4 RI флаг-бит команды RESET 1 = команда RESET не исполнялась (устанавливается только ап- паратно) О = команда RESET исполнялась по причине сброса устройства (должен быть установлен программно после события BOR) bit3 ТО флаг-бит сброса по переполнению сторожевого таймера 1 = установлен по включению или командами CLRWDT, SLEEP О = случился сброс по сторожевому таймеру bit2 PD флаг-бит отключения питания 1 = установлен по включению или командой CLRWDT О = после команды SLEEP 45
Гпава 1 bit1 POR статус-бит сброса по включению питания(2) 1 = сброса по питанию не было (устанавливается только аппаратно) О = был сброс по питанию (должен быть установлен программно после события сброса по включению питания) bitO BOR статус-бит сброса по снижению питания 1 - сброса по снижению питания не было (устанавливается аппа- ратно) О = был сброс по снижению питания (должен быть установлен программно после события сброса по снижению питания) Примечания: 1. Рекомендуется устанавливать бит POR после программного обнаружения сброса по включению питания, для того, чтобы иметь возможность обнаруживать каждый из та- ких сбросов. 2. Считается, что сброс по BOR случился, если BOR = 0 и POR = 1 (полагая, что POR был программно установлен в 1 немедленно после события POR). Общий сброс (MCLR) Сброс через вывод MCLR генерируется путем перевода напряжения на выво- де в низкий логический уровень. Микроконтроллеры имеют встроенный фильтр шума, отсекающий короткие импульсы. Напряжение на выводе MCLR никаким образом не может быть приведено в низкий уровень «изнутри» контроллера, и на него не влияют никакие события внутреннего сброса, включая WDT. На рис. 1.25 показана схема внешних цепей сброса для устройств с медленно нарастающим напряжением питания. Такая схема применяется, только когда нет уверенности в том, что питание успеет стабилизироваться за время задержки встроенного пускового таймера. В большинстве приложений такая схема не ис- пользуется. Диод D предназначен для быстрой разрядки конденсатора С после отключе- ния питания. Номинал резистора R должен быть меньше 40 кОм, резистора R1 больше 1 кОм. Резистор R1 ограничивает ток, протекающий через вывод из кон- денсатора в случае обрыва питания, при статическом разряде или превышении питания. В семействе PIC18F2455/2550/4455/4550 вывод MCLR может быть отключен при помощи бита конфигурации MCLRE. Когда функция сброса отключена, вывод превращается в линию цифрового входа. Рис. 1.25. Схема внешних цепей сброса 46
Структура и базовые функции микроконтроллеров Сброс по включению питания (POR) Импульс сброса по включению питания генерируется внутренним узлом сбро- са всякий раз, когда фронты VDD превышают определенный порог. Это позволяет контроллеру стартовать из начального состояния, как только напряжение пита- ния становится приемлемым для работы. Для обеспечения нормальной работы POR следует подключить вывод MCLR через резистор номиналом 1 ...10 кОм к линии питания. Это позволит исключить внешние элементы цепи сброса. Но если напряжение питания нарастает слиш- ком медленно, придется прибегнуть к схеме рис. 1.25. К моменту выхода из состояния сброса все внешние параметры (напряжение питания, температура, частота внешнего генератора и т.д.) должны полностью соответствовать спецификации прибора. В противном случае следует обеспе- чить удержание прибора в состоянии сброса до установления параметров. Событие POR фиксируется флаг-битом POR (RCON<1>). Этот бит всегда сбрасывается в «0» по событию POR и не изменяется при остальных событиях сброса. Бит не может быть аппаратно установлен в «1» каким-либо событием. Чтобы получить возможность отслеживать все события сброса, пользователь должен программно установить бит в «1» после события POR. Сброс по снижению питания (BOR) Эта опция предназначена для защиты приложения пользователя от плавного снижения напряжения питания ниже определенного уровня, при котором ста- бильная работа микроконтроллера уже не гарантируется. Если модуль BOR включен, и напряжение питания снижается от уровня VDD до некоторого уровня VBOR, определенного в типовых электрических параметрах микросхемы, то мо- дуль BOR генерирует сигнал общего сброса микроконтроллера. Если напряжение снижается на время меньшее, чем параметр TB0R, то сброс не происходит. В противном случае устройство остается в состоянии сброса все время, пока на- пряжение питания ниже порога VB0R. Порог срабатывания схемы BOR устанав- ливают при помощи битов BORV1.BORVO. Встроенная схема слежения за снижением питания допускает наличие не- скольких конфигураций, которые сведены в табл. 1.8. Таблица 1.8 Варианты конфигурации BOR Конфигурация BOR Статус SBOREN (RCON<6>) Состояние BOR BOREN1 BORENO 0 0 Недоступен BOR выключен, включается только програм- матором 0 1 Доступен BOR доступен программно, управляется через SBOREN 1 0 Недоступен BOR аппаратно включен для режимов Run и Idle; выключен в режиме Sleep 1 1 Недоступен BOR включен аппаратно. Может быть выклю- чен только при помощи программатора 47
Глава 1 Если включен таймер запуска по включению питания, он стартует после воз- врата питающего напряжения к нормальному уровню, и удержит прибор в со- стоянии сброса на дополнительное время TPWRT. Если напряжение снизится во время работы таймера задержки, прибор снова перейдет в сброс по BOR и тай- мер будет инициализирован повторно. BOR и таймер включения конфигурируют- ся независимо. Разрешение работы BOR не означает автоматическое разреше- ние таймера задержки. Когда биты конфигурации BOREN1:BORENO при помощи программатора уста- новлены в состояние «01», режим BOR может быть включен и выключен про- граммно при помощи управляющего бита SBOREN (RCON<6>). При остальных значениях битов BOREN1-.BORENO состояние бита SBOREN ни на что не влияет и всегда читается, как «0». Возможность управлять работой BOR программно дает пользователю дополнительную гибкость в управлении прибором в зависи- мости от внешних условий, без необходимости изменять биты конфигурации при помощи программатора. Но нужно помнить, что порог срабатывания ВОН ус- танавливается только при записи слова конфигурации программатором. Поскольку в состоянии сброса энергопотребление микроконтроллера чрезвы- чайно невелико, существует возможность переводить устройство в режим пони- женного энергопотребления просто при снижении питающего напряжения (функ- ция «отсечки» питания). Это может быть важно, например, при питании изделия от литий-полимерных источников, которым вреден чрезмерный разряд. Существует определенная сложность в программном распознавании события сброса по BOR. Дело в том, что флаг-бит BOR всегда устанавливается в «0», как по событию BOR, так и по событию POR. Поэтому, читая только бит BOR, невоз- можно достоверно определить, чем вызван перезапуск программы - начальным включением питания или его кратковременным снижением. Более достоверный метод состоит в обработке битов POR и BOR: после запуска программы по вклю- чению питания следует возвратить бит POR в исходное состояние «1». Теперь, если мы обнаружим, что после сброса бит POR = 1, тогда как BOR = 0, это озна- чает обнаружен-, э спада питающего напряжения. Конфигурация, когда схема BOR отключается в режиме Sleep, позволяет до- полнительно уменьшить потребляемый в этом режиме ток за счет отключения модуля BOR. Предполагается, что в режиме Sleep последствия непредвиденного снижения напряжения будут незначительными, поскольку программный код в это момент не исполняется и почти вся периферия отключена. Выбор компромисса между минимальным энергопотреблением и максимальной защищенностью от сбоев возлагается на разработчика потребительского изделия. Таймеры сброса Рассматриваемые микроконтроллеры включают в себя три различных тайме- ра, обслуживающих процесс включения. Их основная функция состоит в том, чтобы перед началом исполнения кода программы иметь гарантию, что тактиро- вание прибора стабилизировалось. Это следующие таймеры: . Таймер включения питания (PWRT, Power-up Timer). • Таймер запуска генератора (OST, Oscillator Start-up). • Таймер захвата ФАПЧ (PLL Lock Time). Таймер PWRT представляет собой 11-разрядный счетчик, тактируемый счет- ными импульсами от внутреннего генератора INTRC. Создаваемая этим счетчи- 48
Структура и базовые функции микроконтроллеров ком задержка составляет примерно 2048 х 32 мкс - 65,6 мс. В течение этого ин- тервала времени контроллер удерживается в состоянии сброса. Точное значение задержки зависит от частоты INTRC и колеблется от кристалла к кристаллу в за- висимости от температуры и напряжения питания. Работа таймера разрешается установкой бита PWRTEN - 0 в слове конфигу- рации при помощи программатора. Таймер запуска генератора отсчитывает 1024 импульса на входе OSC1 после того, как отработана задержка таймера PWRT. Таким образом, гарантируется, что генератор на основе кварцевого или керамического резонатора запущен и стабилен. Задержка по OST отрабатывается только в режимах XT, HS и HSPLL и только при сбросе по включению питания или выходе из энергосберегающих ре- жимов, требующих повторного включения упомянутых источников тактирования. Если включен умножитель частоты с петлей ФАПЧ, задержка по включению пи- тания несколько отличается от других вариантов тактирования. Подключается до- полнительный специальный таймер, который создает задержку порядка 2 мс для захвата частоты петлей ФАПЧ после того, как предыдущие задержки отработаны. Если в процессе отработки задержки по сбросу или перепаду питания вновь произойдет одно из событий, вызывающих перезапуск таймеров задержки включе- ния, то отработка интервалов задержки повторится вновь. Длительность интервала задержки зависит от того, каким событием вызван за- пуск микроконтроллера. Значения длительностей при различных вариантах запуска показаны в табл. 1.9. Диаграммы процессов при запуске в различных режимах приведены на рис. 1.26 - 1.30. Таблица 1.9 Интервалы задержки в различных ситуациях Конфигурация генератора Сброс по включeнию<2, и BOR Выход из режима энергосбережения PWRTEN х 0 PWRTEN = 1 HS, XT 66 мс(1)+ 1024 Tosc 1024 Tosc 1024 Tosc HSPLL, XTPLL 66 mc(1)+1024Tosc+ 2мс(2) 1024Tosc+ 2мс(2) 1024Tosc+ 2мс(2) ЕС, ЕСЮ 66 мс(1) - - ECPLL, ЕСРЮ 66 мс(1)+ 2мс(2) 2мс<2) 2мс(2) INTIO, INTCKO 66 мс(1) - - INTHS, INTXT 66 мс<1) + 1024 Tosc 1024Tosc 1024Tosc (1) 66 мс (65,5мс) - номинальная задержка таймера PWRT (2) 2 мс - номинальное время захвата петли ФАПЧ Схема сброса построена таким образом, что при включении питания таймеры начинают работать независимо от уровня на выводе MCLR. Если этот вывод удерживать в состоянии низкого уровня достаточно долго, все задержки будут отработаны. В таком случае исполнение кода начнется немедленно после отпус- кания вывода MCLR в высокий уровень. Данное свойство может применяться для отладки или для синхронизации нескольких микроконтроллеров при одновремен- ной работе. 49
Гпава 1 Рис. 1.26. Сброс по включению питания (MCLR = Vdd) Рис. 1.27. Сброс по включению питания. MCLR не подключен к VDd- Вариант 1 Vdd MCLR Fnternal POR PWRT TIME-OUT OST TIME-OUT INTERNAL RESET Рис. 1.28. Сброс по включению питания. MCLR не подключен к Vdd. Вариант 2 50
Структура и базовые функции микроконтроллеров Vdd MCLR INTERNAL POR PWRT TIME-OUT OST TIME-OUT INTERNAL RESET Рис. 1.29. Сброс при медленном нарастании питания (MCLR = Vdd) vdd MCLR iNTERNAL”POR PWRT TIME-OUT OST TIME-OUT PLL TIME-OUT INTERNAL RESET Рис. 1.30. Сброс при включении питания. ФАПЧ включена, MCLR = Vdd Начальное состояние регистров после сброса Большинство регистров не изменяет свое состояние по сбросу. Их начальное состояние не определено при сбросе по включению питания и не изменяется при остальных событиях сброса. Но некоторые регистры устанавливаются в особое определенное состояние, в зависимости от типа сброса. Большинство регистров также не зависит от пробуждения по переполнению сторожевого таймера, поскольку это рассматривается, как продолжение нор- мальной работы. Биты состояния регистра RCON, такие, как Rl, ТО, PD, POR и BOR устанавли- ваются или обнуляются в зависимости от ситуации, что отражено в табл. 1.10. Перечисленные флаг-биты могут быть программно проанализированы для опре- деления причины сброса. В табл. 1.11 описано состояние всех специальных регистров после различных событий сброса. 51
Глава 1 Таблица 1.10 Биты состояния, их назначение и начальные значения Условие Счетчик команд<1) Регистр RCON Регистр STKPTR SBOREN Rl TO PD POR BOR STKFUL STKUNF Сброс по включению 0000h 1 1 1 1 0 0 0 0 Команда RESET 0000h u(2) 0 u u u u u u Спад питания 0000h u<2> 1 1 1 u 0 u u MCLR в ре- жимах серии Run 0000h u'2’ u 1 u u u u u MCLR в ре- жимах серии Idle и Sleep OOOOh u(2> u 1 0 u u u u WDT в режи- ме полного потребления или Run OOOOh u<2> u 0 u u u u u MCLR в ре- жиме полного потребления OOOOh u(2> u u u u u u u Сброс по за- полнению стека (STVREN= 1) OOOOh u<2> u u u u u 1 u Сброс по опустошению стека (STVREN = 1) OOOOh u(2) u u u u u u 1 Ошибка опус- тошения стека (STVREN = 0) OOOOh u(2) u u u u u u 1 WDT в режи- мах Idle или Sleep PC+ 2 u'2' u 0 0 u u u u Выход по прерыванию из энергосбе- регающих режимов PC+ 2 u<21 u u 0 u u u u {1) Если «пробуждение» происходит во время прерывания и биты GIEH и GIEL уста- новлены, в счетчик команд загружается вектор прерывания (008h или 0018h). <2) Состояние по сбросу «1» для POR и не изменяется при остальных событиях сброса ко- гда BOR разрешен (BOREN1 :BORENO = 01, SBOREN = 1); иначе состояние по сбросу = «0». Обозначения: и - без изменений 52
Начальные значения для всех регистров Таблица 1.11 Регистр Применимость к приборам POR, BOR Сброс по событиям MCLR, WDT, стека и команде RESET «Пробуждение» по событию WDT или прерыванию TOSU 2455 2550 4455 4550 —-0 0000 —0 0000 0 uuuu(1) TOSH 2455 2550 4455 4550 0000 0000 0000 0000 UUUU uuuu(1) TOSL 2455 2550 4455 4550 0000 0000 0000 0000 uuuu uuuu(1) STKPTR 2455 2550 4455 4550 00-0 0000 uu-0 0000 uu-u uuuu(1) PCLATU 2455 2550 4455 4550 —0 0000 —0 0000 u uuuu PCLATH 2455 2550 4455 4550 0000 0000 0000 0000 uuuu uuuu PCL 2455 2550 4455 4550 0000 0000 0000 0000 PC + 2(2) TBLPTRU 2455 2550 4455 4550 —00 0000 —00 0000 —uu uuuu TBLPTRH 2455 2550 4455 4550 0000 0000 0000 0000 uuuu uuuu TBLPTRL 2455 2550 4455 4550 0000 0000 0000 0000 uuuu uuuu TABLAT 2455 2550 4455 4550 0000 0000 0000 0000 uuuu uuuu PRODH 2455 2550 4455 4550 хххх хххх UUUU UUUU uuuu uuuu PRODL 2455 2550 4455 4550 ХХХХ ХХХХ UUUU UUUU uuuu uuuu INTCON 2455 2550 4455 4550 0000 ОООх 0000 OOOu uuuu uuuu!3) INTCON2 2455 2550 4455 4550 1111 -1-1 1111 -1-1 uuuu -u-u(3) INTCON3 2455 2550 4455 4550 11-0 0-00 11-0 0-00 uu-u u-uu(3) INDF0 2455 2550 4455 4550 N/A N/A N/A POSTINCO 2455 2550 4455 4550 N/A N/A N/A POSTDECO 2455 2550 4455 4550 N/A N/A N/A PREINCO 2455 2550 4455 4550 N/A N/A N/A Структура и базовые функции микроконтроллеров
Регистр Применимость к приборам POR, BOR Сброс по событиям MCLR, WDT, стека и команде RESET «Пробуждение» по событию WDT или прерыванию PLUSWO 2455 2550 4455 4550 N/A N/A N/A FSROH 2455 2550 4455 4550 0000 0000 uuuu FSROL 2455 2550 4455 4550 xxxx xxxx uuuu uuuu uuuu uuuu WREG 2455 2550 4455 4550 xxxx xxxx uuuu uuuu uuuu uuuu INDF1 2455 2550 4455 4550 N/A N/A N/A P0STINC1 2455 2550 4455 4550 N/A N/A N/A P0STDEC1 2455 2550 4455 4550 N/A N/A N/A PREINC1 2455 2550 4455 4550 N/A N/A N/A PLUSW1 2455 2550 4455 4550 N/A N/A N/A FSR1H 2455 2550 4455 4550 0000 0000 uuuu FSR1L 2455 2550 4455 4550 xxxx xxxx uuuu uuuu uuuu uuuu BSR 2455 2550 4455 4550 0000 0000 uuuu INDF2 2455 2550 4455 4550 N/A N/A N/A P0STINC2 2455 2550 4455 4550 N/A N/A N/A P0STDEC2 2455 2550 4455 4550 N/A N/A N/A PREINC2 2455 2550 4455 4550 N/A N/A N/A PLUSW2 2455 2550 4455 4550 N/A N/A N/A FSR2H 2455 2550 4455 4550 0000 0000 uuuu FSR2L 2455 2550 4455 4550 xxxx xxxx uuuu uuuu uuuu uuuu STATUS 2455 2550 4455 4550 X xxxx u uuuu —u uuuu TMROH 2455 2550 4455 4550 0000 0000 0000 0000 uuuu uuuu TMROL 2455 2550 4455 4550 xxxx xxxx uuuu uuuu uuuu uuuu Гпава 1
Регистр Применимость к приборам POR, BOR Сброс по событиям MCLR, WDT, стека и команде RESET «Пробуждение» по событию WDT или прерыванию TOCON 2455 2550 4455 4550 1111 1111 11111111 uuuu uuuu OSCCON 2455 2550 4455 4550 0100 qOOO 0100 OOqO uuuu uuqu HLVDCON 2455 2550 4455 4550 0-00 0101 0-00 0101 u-uu uuuu WDTCON 2455 2550 4455 4550 0 o (J rcon(4) 2455 2550 4455 4550 0q-1 llqO Oq-q qquu uq-u qquu TMR1H 2455 2550 4455 4550 xxxx xxxx uuuu uuuu uuuu uuuu TMR1L 2455 2550 4455 4550 xxxx xxxx uuuu uuuu uuuu uuuu T1CON 2455 2550 4455 4550 0000 0000 uOuu uuuu uuuu uuuu TMR2 2455 2550 4455 4550 0000 0000 0000 0000 uuuu uuuu PR2 2455 2550 4455 4550 1111 1111 1111 1111 11111111 T2CON 2455 2550 4455 4550 -000 0000 -000 0000 —uuu uuuu SSPBUF 2455 2550 4455 4550 xxxx xxxx uuuu uuuu uuuu uuuu SSPADD 2455 2550 4455 4550 0000 0000 0000 0000 uuuu uuuu SSPSTAT 2455 2550 4455 4550 0000 0000 0000 0000 uuuu uuuu SSPCON1 2455 2550 4455 4550 0000 0000 0000 0000 uuuu uuuu SSPCON2 2455 2550 4455 4550 0000 0000 0000 0000 uuuu uuuu ADRESH 2455 2550 4455 4550 xxxx xxxx uuuu uuuu uuuu uuuu ADRESL 2455 2550 4455 4550 xxxx xxxx uuuu uuuu uuuu uuuu ADCONO 2455 2550 4455 4550 —00 0000 —00 0000 --UU uuuu ADCON1 2455 2550 4455 4550 —00 Oqqq --00 Oqqq —uu uuuu ADCON2 2455 2550 4455 4550 0-00 0000 0-00 0000 u-uu uuuu CCPR1H 2455 2550 4455 4550 xxxx xxxx uuuu uuuu uuuu uuuu Структура и базовые функции микроконтроллеров
Регистр Применимость к приборам POR, BOR Сброс по событиям MCLR, WDT, стека и команде RESET «Пробуждение» по событию WDT или прерыванию CCPR1L 2455 2550 4455 4550 хххх хххх uuuu uuuu uuuu uuuu ССР 1 CON 2455 2550 4455 4550 —00 0000 —00 0000 —uu uuuu 2455 2550 4455 4550 0000 0000 0000 0000 uuuu uuuu CCPR2H 2455 2550 4455 4550 хххх хххх uuuu uuuu uuuu uuuu CCPR2L 2455 2550 4455 4550 хххх хххх uuuu uuuu uuuu uuuu CCP2CON 2455 2550 4455 4550 0000 0000 0000 0000 uuuu uuuu BAUDCON 2455 2550 4455 4550 01-0 0-00 01 -0 0-00 uu-u u-uu ECCP1DEL 2455 2550 4455 4550 0000 0000 0000 0000 uuuu uuuu ECCP1AS 2455 2550 4455 4550 0000 0000 0000 0000 uuuu uuuu CVRCON 2455 2550 4455 4550 0000 0000 0000 0000 uuuu uuuu CMCON 2455 2550 4455 4550 0000 0111 0000 0111 uuuu uuuu TMR3H 2455 2550 4455 4550 хххх хххх uuuu uuuu uuuu uuuu TMR3L 2455 2550 4455 4550 хххх хххх uuuu uuuu uuuu uuuu T3CON 2455 2550 4455 4550 0000 0000 uuuu uuuu uuuu uuuu SPBRGH 2455 2550 4455 4550 0000 0000 0000 0000 uuuu uuuu SPBRG 2455 2550 4455 4550 0000 оооо 0000 0000 uuuu uuuu RCREG 2455 2550 4455 4550 0000 0000 0000 0000 uuuu uuuu TXREG 2455 2550 4455 4550 0000 0000 0000 0000 uuuu uuuu TXSTA 2455 2550 4455 4550 0000 0010 0000 0010 uuuu uuuu RCSTA 2455 2550 4455 4550 0000 ОООх 0000 OOOx uuuu uuuu EEADR 2455 2550 4455 4550 0000 0000 0000 0000 uuuu uuuu EEDATA 2455 2550 4455 4550 0000 0000 0000 0000 uuuu uuuu Гпава 1
Регистр Применимость к приборам POR, BOR Сброс по событиям MCLR, WDT, стека и команде RESET «Пробуждение» по событию WDT или прерыванию EEC0N2 2455 2550 4455 4550 0000 0000 0000 0000 0000 0000 EEC0N1 2455 2550 4455 4550 xx-0x000 uu-0 uOOO uu-0 uOOO IPR2 2455 2550 4455 4550 1111 1111 1111 1111 uuuu uuuu PIR2 2455 2550 4455 4550 0000 0000 0000 0000 uuuu uuuu(3) Р1Е2 2455 2550 4455 4550 0000 0000 0000 0000 uuuu uuuu IPR1 2455 2550 4455 4550 1111 1111 1111 1111 uuuu uuuu 2455 2550 4455 4550 -111 1111 -111 1111 -uuu uuuu PIR1 2455 2550 4455 4550 0000 0000 0000 0000 uuuu uuuu(3) 2455 2550 4455 4550 -ООО 0000 -000 0000 -uuu uuuu PIE1 2455 2550 4455 4550 0000 0000 0000 0000 uuuu uuuu 2455 2550 4455 4550 -000 0000 -000 0000 -uuu uuuu OSCTUNE 2455 2550 4455 4550 0—0 0000 0—0 0000 u—u uuuu TRISE 2455 2550 4455 4550 111 111 uuuu -uuu TRISD 2455 2550 4455 4550 1111 1111 11111111 uuuu uuuu TRISC 2455 2550 4455 4550 11—111 11—111 uu uuu TRISB 2455 2550 4455 4550 1111 1111 11111111 uuuu uuuu trisa!5) 2455 2550 4455 4550 -1111111<5) -1111111(5) -uuu uuuu(5) LATE 2455 2550 4455 4550 XXX uuu uuu LATD 2455 2550 4455 4550 xxxx xxxx uuuu uuuu uuuu uuuu LATC 2455 2550 4455 4550 XX XXX uu uuu uu uuu LATB 2455 2550 4455 4550 xxxx xxxx uuuu uuuu uuuu uuuu Структура и базовые функции микроконтроллеров
Регистр Применимость к приборам POR, BOR Сброс по событиям MCLR, WDT, стека и команде RESET «Пробуждение» по событию WDT или прерыванию lata(5) 2455 2550 4455 4550 -xxx xxxx(S) -uuu uuuu(5) -uuu uuuu(5) PORTE 2455 2550 4455 4550 0—X000 0— X000 u uuuu PORTD 2455 2550 4455 4550 xxxx xxxx uuuu uuuu uuuu uuuu PORTC 2455 2550 4455 4550 XXXX -XXX uuuu -uuu uuuu -uuu PORTS 2455 2550 4455 4550 xxxx xxxx uuuu uuuu uuuu uuuu porta(5) 2455 2550 4455 4550 -xOx 0000(5) -uOu 0000(5) -uuu uuuu(5) UEP15 2455 2550 4455 4550 —0 0000 —0 0000 u uuuu UEP14 2455 2550 4455 4550 —0 0000 —0 0000 u uuuu UEP13 2455 2550 4455 4550 —0 0000 —0 0000 u uuuu UEP12 2455 2550 4455 4550 0 0000 —0 0000 u uuuu UEP11 2455 2550 4455 4550 —0 0000 —0 0000 u uuuu UEP10 2455 2550 4455 4550 —0 0000 —0 0000 —u uuuu UEP9 2455 2550 4455 4550 —0 0000 0 0000 u uuuu UEP8 2455 2550 4455 4550 —0 0000 —0 0000 u uuuu UEP7 2455 2550 4455 4550 —0 0000 —0 0000 u uuuu UEP6 2455 2550 4455 4550 —0 0000 —0 0000 —u uuuu UEP5 2455 2550 4455 4550 —0 0000 —0 0000 u uuuu UEP4 2455 2550 4455 4550 —0 0000 —0 0000 u uuuu UEP3 2455 2550 4455 4550 —0 0000 —0 0000 u uuuu UEP2 2455 2550 4455 4550 —0 0000 —-0 0000 u uuuu UEP1 2455 2550 4455 4550 —0 0000 —0 0000 u uuuu Гпаеа 1
Регистр Применимость к приборам POR, BOR Сброс по событиям MCLR, WDT, стека и команде RESET «Пробуждение» по событию WDT или прерыванию UEP0 2455 2550 4455 4550 -—0 0000 —0 0000 u uuuu UCFG 2455 2550 4455 4550 00-0 0000 00-0 0000 uu-u uuuu UADDR 2455 2550 4455 4550 -000 0000 -000 0000 -uuu uuuu UCON 2455 2550 4455 4550 -0x0 000- -0x0 000- -uuu uuu- U STAT 2455 2550 4455 4550 -XXX XXX- -XXX XXX- -uuu uuu- UEIE 2455 2550 4455 4550 0-0 0000 0--0 0000 u—u uuuu UEIR 2455 2550 4455 4550 0—0 0000 0—0 0000 u—u uuuu UIE 2455 2550 4455 4550 -000 0000 -000 0000 -uuu uuuu UIR 2455 2550 4455 4550 -000 0000 -000 0000 -uuu uuuu UFRMH 2455 2550 4455 4550 XXX XXX uuu UFRML 2455 2550 4455 4550 хххх хххх хххх хххх uuuu uuuu SPPCON 2455 2550 4455 4550 оо оо uu SPPEPS 2455 2550 4455 4550 00-0 0000 00-0 0000 uu-u uuuu SPPCFG 2455 2550 4455 4550 0000 0000 0000 0000 uuuu uuuu SPPDATA 2455 2550 4455 4550 0000 0000 0000 0000 uuuu uuuu (1) Если «пробуждение» из энергосберегающего режима происходит по прерыванию, и биты GIEL или GIEH установлены, то биты TOSU, TOSH и TOSL обновляются текущим значением счетчика команд. Указатель STKPTR устанавливается на следующее значение аппаратного стека. f21 Будут затронуты один или более битов регистра INTCONx или PIRx. (3) Если «пробуждение» из энергосберегающего режима происходит по прерыванию, и биты GIEL или GIEH установлены, в счетчик ко- манд загружается вектор прерывания (0008И или 0018h). {4) См. табл. 1.10 со значениями по сбросу при определенных условиях. (5) PORTA<6>, LATA<6> и TRISA<6> включаются в зависимости от выбранного режима. Если линия не включена, как вывод PORTA, они недоступны и читаются как «0». ел Обозначения: и - без изменений, х - не известно, q - зависит от условий, — не используется, читается как «0». Структура и базовые функции микроконтроллеров
Гпаеа 1 Память В микроконтроллерах серии PIC18 применяется три типа памяти: память ко- манд, энергозависимая память данных и энергонезависимая память данных EEPROM. В соответствии с принятой для серии PIC Гарвардской архитектурой, шина команд и шина данных являются раздельными. Это позволяет одновре- менно обращаться к разным областям памяти. Память EEPROM с точки зрения структуры памяти можно рассматривать как отдельное устройство, адресация и доступ к которому производятся через специальные регистры. Структура памяти команд Микроконтроллеры PIC18 имеют 21-разрядный счетчик команд, который по- зволяет адресовать до 2 мегабайт памяти команд. На практике контроллеры имеют значительно меньший объем памяти команд. При попытке обращения за пределы физической памяти всегда возвращается значение «О» (команда NOP). Карта памяти микроконтроллеров PiCl8Fx455 и PJC18Fx550 показана на рис. 1.31. PIC18FX455 PIC18FX550 Рис. 1.31. Карта памяти микроконтроллеров PIC18Fx455 и PIC18Fx550 60
Структура и базовые функции микроконтроллеров PIC18F2455 и PIC18F4455 каждый имеют по 24 кб флэш-памяти, в которой мо- гут хранить до 12288 команд, состоящих из одного слова. Микроконтроллеры PIC18F2550 и PJC18F4550 имеют 32 кб флэш-памяти и могут хранить до 16384 команд. Микроконтроллеры серии Р1С18имеют два вектора прерывания, которые ад- ресуются значениями 0008h и 0018h. Вектор сброса расположен по адресу OOOOh. Счетчик команд Счетчик команд (или указатель команд) определяет адрес, по которому про- изойдет выборка команды для исполнения в следующем шаге (см. рис. 1.34). Счетчик имеет разрядность 21 бит и состоит из трех различных регистров. Младший байт <7:0> хранится в регистре PCL. Этот регистр доступен как для чтения, так и для записи. Старший байт <15:8> хранится в регистре РСН, кото- рый недоступен для прямого чтения/записи. Обращение к нему происходит через регистр PCLATH. Наконец, самые старшие разряды <20:16> хранятся в регистре PCU; они также недоступны для прямого чтения/записи. Обращение к этим раз- рядам происходит через регистр PCLATU. Содержимое регистров PCLATH и PCLATU переносится в счетчик команд при исполнении любой операции, осуществляющей запись в регистр PCL. Аналогич- но, два старших байта счетчика переносятся в PCLATH и PCLATU при чтении из PCL. Это позволяет выполнять вычисляемое смещение исполнения кода про- граммы. Подробнее этот момент описан в разделе «Вычисляемый переход GOTO». Счетчик команд указывает на байты в физической памяти программ. Для пре- дотвращения попадания на адрес, указывающий между словами инструкции, младший разряд регистра PCL имеет фиксированное значение «0». Указатель команд каждый раз увеличивается на 2, указывая на очередную команду. Команды CALL, RCALL и GOTO осуществляют прямую запись в счетчик ко- манд. В случае исполнения этих команд содержимое регистров PCLATH и PCLATU не переносится в счетчик. Стек адреса возврата Стек позволяет хранить до 31 адреса возврата из прерываний или внутренних подпрограмм. Как только распознается прерывание или выполняется одна из команд CALL или RCALL, содержимое счетчика команд сохраняется в стек. Со- держимое стека переносится обратно в счетчик команд при выполнении инструк- ций RETURN, RETLW или RETFIE. Содержимое регистров PCLATH и PCLATU не изменяется при выполнении этих инструкций. Стек оперирует 31 словом памяти разрядностью 21 бит и 5-разрядным указа- телем стека STKPTR. Пространство стека обособленное, оно не является частью памяти программ или данных. Регистр указателя стека доступен для чтения и записи. В самом стеке для чтения и записи доступна только вершина стека. Под вершиной стека подразумевается положение стека, на которое в данный мо- мент показывает указатель STKPTR. Используя специальные регистры TOS, можно поместить данные в стек, или извлечь их. При исполнении команды CALL значение указателя стека увеличивается на 61
Глава 1 единицу, и в стек заносится адрес программной памяти, следующий за адресом команды CALL. При выполнении любой команды возврата значение адреса из стека переносится в счетчик команд, значение указателя стека уменьшается на единицу. Начальным значением стека по сбросу является «00000». С этим значением стека не ассоциировано никакое значение памяти программ. Специальные биты статуса показывают заполнение стека, переполнение или опустошение. Доступ к вершине стека Для чтения и записи доступна только вершина стека (TOS). Набор трех реги- стров TOSU:TOSH:TOSL удерживает содержимое стека, на которое указывает регистр STKPTR (рис. 1.32). Это позволяет пользователю при необходимости организовать программный стек. После выполнения команд CALL, RCALL или распознавания прерывания программа может прочитать сохраненное значение, обращаясь к регистрам TOSU:TOSH:TOSL. Эти значения могут быть сохранены в программный стек пользователя. Во время возврата программа может вернуть значения в регистры TOSU:TOSH:TOSL и затем отработать возврат. Во избежание непреднамеренного искажения стека пользователь должен установить глобальный запрет прерываний на время обращения к стеку. Стек адреса возврата <20:0> Регистры вершины стека TOSU TOSH TOSL | 00h | | 1Ah | | 34h | К_______________V________________J _______ Вершина стека 11111 11110 11101 00011 00010 00001 00000 Указатель стека STKPTR<4:0> | 00010 I Рис. 1.32. Стек адреса возврата и ассоциированные регистры Регистр STKPTR содержит следующие биты: bit7 STKFUL флаг-бит заполнения стека 1 = стек заполнен или переполнен 0 = стек не заполнен bit6 STKUNF флаг-бит опустошения стека 1 = произошло опустошение стека 0 = опустошения стека не было bits Не используется, всегда читается «0» bit4-0 SP4.-SP0 биты указателя стека Указатель положения стека STKPTR содержит значение указателя, флаг-бит STKFUL (Stack Full, стек заполнен) и флаг-бит STKUNF (Stack Underflow, стек 62
Структура и базовые функции микроконтроллеров опустошен). Значение указателя может меняться в пределах от 0 до 31. Указа- тель инкрементируется до того, как в стек будет помещено значение, и декре- ментируется после того, как оно извлечено. Пользователь может читать значе- ние указателя. Данная опция может быть использована в системах реального времени для возврата текущего состояния стека. Как только в стек записано 31-е значение (но при этом выборки из стека не было ни разу), флаг-бит STKFUL устанавливается в «1», что сигнализирует о за- полнении стека. Обратно этот флаг-бит сбрасывается только программно или сбросом по включению питания. По событию заполнения стека может быть выполнено определенное дейст- вие, которое зависит от состояния бита конфигурации STVREN. Если этот бит установлен (по умолчанию), то 31-я запись в стек сохраняет адрес РС+2, уста- навливает флаг-бит STKFUL и сбрасывает микроконтроллер («мягкий» сброс, при котором значения многих регистров сохраняются, см. табл. 1.11). После сброса флаг-бит STKFUL остается установленным, но указатель стека сбрасы- вается в ноль. Если бит конфигурации STVREN = 0, то флаг-бит STKFUL устанавливается в момент 31 -й записи и указатель инкрементируется до 31. Дальнейшие попытки со- хранения в стек не меняют значение указателя и сохраненные в стеке значения. Если количество выгрузок из стека оказывается больше, чем количество запи- сей, то в счетчик команд возвращается нулевое значение и устанавливается флаг-бит STKUNF. Этот бит может быть сброшен только программно или при сбросе по включению питания. Возврат нулевого значения из стека приводит к тому, что указатель ко- манд указывает на вектор сброса, с которого начинается исполнение про- граммы пользователя. Такая ситуация не является полноценным сбросом, по- скольку ни одно значение каких специальных либо регистров не изменяется. В случае использования сложно структурированных программ рекомендуется при старте программы проверять, каким событием вызван сброс. Команды PUSH и POP Поскольку вершина стека доступна для чтения и записи, можно сохранять данные в стек и извлекать их из стека, не нарушая нормальное исполнение про- граммы. Набор команд серии PIC18 включает в себя две команды, PUSH и POP, которые позволяют программно манипулировать содержимым группы регистров TOS. В них можно поместить новый адрес возврата. Команда PUSH помещает в стек текущее значение счетчика команд. При этом инкрементируется текущее значение указателя стека. Команда POP отменяет текущую установку TOS путем декремента указателя стека. Соответственно, новым значением TOS становится предыдущее значение. Стек «быстрого возврата» Стек быстрого возврата предоставляется для регистров STATUS, WREG и BSR, реализуя опцию «быстрого возврата» из прерываний. Каждый такой стек имеет единичную глубину и никогда не читается и не записывается. По событию прерывания в него записывается содержимое соответствующего регистра. Со- держимое регистра восстанавливается при выполнении специальных команд возврата RETURN, FAST или RETFIE, FAST. 63
Глава 1 Если разрешены прерывания как высшего, так и низшего приоритета, стек бы- строго возврата не может быть достоверно использован для возврата из преры- вания с низшим приоритетом. Если в момент обработки прерывания низшего приоритета случится прерыва- ние высшего приоритета, то ранее сохраненные в стеке значения будут перепи- саны новым прерыванием. Поэтому при обработке прерывания низшего приори- тета пользователь должен сохранять значения ключевых регистров программно, во временных ячейках пользовательской памяти. В случае, если прерывания вообще не используются, стек быстрого возврата может быть использован для сохранения значений регистров STATUS, WREG и BSR до конца исполнения любой другой подпрограммы. Далее показано, каким образом сохраняется и восстанавливается значение ключевых регистров при вызове пользовательской подпрограммы. CALL SUB1, FAST ;STATUS, WREG и BSR ; сохранены в стеке быстрого возврата SUB1 RETURN, FAST ; Восстановление значений регистров ; при выходе из подпрограммы. Вычисляемый переход Вычисляемый переход осуществляется прибавлением смещения к счетчику команд. Далее показан пример использования вычисляемого перехода. MOVF OFFSET, W ; заносим величину смещения в ак- кумулятор W CALL TABLE ; вызываем подпрограмму TABLE ORG nnOOh ; задаем физический адрес блока программы TABLE ADDWF PCL ; прибавляем W к счетчику команд RETLW OAh RETLW FEh RETLW 93h В данном примере показано использование так называемой переводной таб- лицы. Это наиболее простое и распространенное применение вычисляемого пе- рехода. Суть метода состоит в том, что в зависимости от величины, заданной ранее в аккумуляторе W, происходит смещение на соответствующую команду RETLW, которая возвращает в аккумуляторе новое значение. Так, например, ес- 64
Структура и базовые функции микроконтроллеров ли сначала W = OOh, то в нашем примере будет возвращено OAh; если W = 01 h, будет возвращено FEh. Таким образом, значения из аккумулятора переводятся в другие при помощи заранее составленной таблицы соответствий. Это позволяет, например, перекодировать значения для правильного отображения на индикато- ре и т.п. Поскольку мы можем работать напрямую только с регистром PCL, то длина таблицы не может превышать 256 байт и таблица должна располагаться в пре- делах одного сегмента памяти (директива ассемблера ORG nnOOh принудитель- но установила размещение кода с начала сегмента). В рассмотренном примере только один байт данных может быть расположен по каждому адресу команды и требуется занять один уровень стека для возврата. Существует метод, позволяющий хранить два байта данных по каждому адре- су памяти программ при помощи специального метода табличной записи и таб- личного чтения. Специальный регистр табличного указателя TBLPTR определяет адрес байта, специальный регистр табличной защелки TABLAT содержит дан- ные, прочитанные из памяти или подлежащие записи в нее. Командный цикл в семействе PIC18 Независимо от того, поступают ли тактирующие импульсы от внешнего источ- ника, или от внутреннего, исходная частота подвергается делению на четыре для формирования непересекающихся квадратурных тактовых последовательностей Q1, Q2, Q3 и Q4. Счетчик команд инкрементируется с каждым тактом Q1. Коман- да считывается из памяти программ и защелкивается в регистре команд в тече- ние такта Q4. В это же время, в течение тактов с Q1 по Q4, выполняется коман- да, полученная в предыдущем цикле. Диаграмма процессов продемонстрирована на рис. 1.33 и 1.34. Большинство команд выполняется за один цикл. Но если команда предусмат- ривает принудительное изменение счетчика команд (например, GOTO), то она выполняется за два цикла. Команда, защелкнутая в регистре команд, декодируется и исполняется в те- чение циклов Q2, Q3 и Q4. Данные из памяти читаются в цикле Q2, результат операции записывается в память данных в цикле Q4. Стандартные команды микроконтроллеров PIC18 могут быть односложными (состоящими из одного слова) и двусложными (состоящими из двух слов). i Q1 | 02 | ОЗ ) 04 । Q1 | 02 | Q3 | 04 । Q1 | 02 | Q3 | 04 ’ OSC2/CLKO I г— -----------1____________!------------1____________,----------- (режим RC) р ' । Выполнение команды (РС-2) _________________________| । Захват команды (PC)________Выполнение команды (PC)__________________________ Захват команды (РС+2) Выполнение команды (РС+2) Захват команды (РС+4) Рис. 1.33. Распределение фаз тактирующих импульсов 65
Гпава 1 TCYO TCY1_____________ TCY2 | TCY3 I Tcy4 | ТСУ5 1.MOVLW55h | Захват 1 Выполнение! 2. MOVWF PORTB Захват 2 Выполнение 2 3. BRASUB_1 4. BSF PORTA, B!T3 (вынужденный NOP) 5. Команда и адрес SUB_1 Захват 3 Выполнение 3 Захват 4 Сдвиг (NOP) Захват SUB_1 Выполнение SUB_1 Рис. 1.34. Пример последовательности захвата-выполнения команд В стандартном наборе команд PIC18 присутствует четыре двусложных команды: CALL, MOVFF, GOTO и LSFR. Во всех случаях второе слово содержит «1111» в старших разрядах; остальные разряды содержат литерал (обычно это адрес памяти данных). Комбинация «1111» является необходимой для отработки команды NOP в особых случаях. Если двусложная команда выполняется в обычном порядке, то после первого слова считывается второе, которое используется для исполнения двусложной команды в целом. Если по какой-либо причине первое слово оказы- вается пропущенным и получается так, что второе слово должно выполняться само по себе, то благодаря комбинации «1111» оно исполняется, как команда NOP. Такая ситуация не столь уж редка и может возникнуть, если непосредст- венно перед командой перехода стоит переход по условию, тоже меняющий со- стояние счетчика команд. В приведенных ниже примерах показано, как работает эта опция. Вариант 1. Объектный код Исходный код 0110 0110 0000 0000 1100 0001 0010 0011 1111 0100 0101 0110 0010 0100 0000 0000 TSTFSZ REG1 ; содержимое ячейки REG1 = 0? MOVFF REG1, REG2 ; нет, пропускаем это слово команды ; это слово выполняем, как NOP ADDWF REG3 ; продолжаем выполнять программу Вариант 2. Объектный код Исходный код 0110 0110 0000 0000 1100 0001 0010 0011 1111 0100 0101 0110 0010 0100 0000 0000 TSTFSZ REG1 ; содержимое ячейки REG1 = 0? MOVFF REG1, REG2 ; нет, пропускаем это слово команды ; это слово выполняем, как NOP ADDWF REG3 ; продолжаем выполнять программу Структура памяти данных Память данных микроконтроллеров PIC18 представляет собой ячейки стати- ческого ОЗУ. Эти ячейки представляют собой 8-разрядные регистры. При отклю- чении питания содержимое регистров необратимо теряется. При включении пи- тания особым образом инициализируются только некоторые специальные регистры, память пользователя содержит произвольные данные. 66
Структура и базовые функции микроконтроллеров Каждый регистр памяти данных имеет 12-разрядный адрес, позволяющий ад- ресовать до 4096 байт данных. Область памяти данных делится на 16 банков по 256 байтов в каждом. Реальный объем памяти может зависеть от модификации микроконтроллера. В семействе PIC18F2455/2550/4455/4550 доступно 8 полных банков, итого 2048 байт. На рис. 1.35 показана структура памяти данных. Память данных состоит из специальных регистров (SFR, Special Function Registers) и регистров общего назначения (GPR, General Purpose Registers). Специальные регистры применяются для управления контроллером и перифе- рийными модулями. Некоторые из этих регистров содержат флаг-биты, позво- ляющие наблюдать текущее состояние модулей и ход выполнения некоторых операций. Регистры общего назначения используются для хранения оператив- ных данных пользователя и промежуточных результатов вычислений. Попытка чтения данных из недоступной области всегда возвращает «0». Набор и архитектура команд позволяют работать со всеми банками. При этом может применяться прямая, косвенная или индексная адресация. Регистр выбора банка Разбиение памяти микроконтроллера на отдельные банки требует наличия специального регистра выбора банка BSR (Bank Select Register). В зависимости от конкретной команды, ячейка памяти может быть адресована либо полным 12- разрядным адресом, либо комбинацией 8-разрядного адреса в теле команды и 4- разрядного указателя из регистра BSR. Содержимое регистра BSR используется большинством команд. В этом реги- стре доступны только четыре младших разряда. Старшие разряды недоступны для записи и всегда читаются, как «0». Для записи в регистр BSR существует специальная команда MOVLB. В произвольный момент времени может быть выбран любой банк, но опера- ции чтения/записи будут производиться только с выбранным банком. Из всего набора команд ядра PIC18 только MOVFF полностью определяет 12-разрядные адреса ячейки-источника и ячейки-приемника. Эта команда игнорирует содержи- мое регистра BSR. Банк быстрого доступа Для обеспечения доступа к наиболее часто применяемым регистрам (все спе- циальные регистры SFR и выборочные общие регистры GPR) микроконтроллеры PIC18 содержат специальный банк быстрого доступа. Это 256-байтное про- странство памяти обеспечивает быстрый доступ ко всем специальным регистрам и меньшей части регистров общего назначения в Банке 0 без обращения к битам выбора банка BSR. Рассмотрим этот вопрос подробнее. Применение битов BSR в сочетании с восьмиразрядным адресом, содержа- щимся в слове команды, позволяет использовать полный диапазон доступной памяти. Но, с другой стороны, при этом пользователь всегда должен быть уве- рен, что выбрал нужный банк памяти. Ошибки, вызванные обращением не к нуж- ной ячейке памяти, иногда очень трудно обнаружить. Особенно печальные по- следствия случаются, если ячейкой назначения подразумевался регистр GPR, но реальная запись произошла в специальный регистр. Например, если пользова- тель будет производить запись по 8-разрядному адресу F9h, но при этом ре- гистр BSR содержит OFh, то это приведет к сбросу счетчика команд. 67
Глава 1 Проверка и/или изменение битов BSR при каждом обращении к памяти дан- ных в большой и разветвленной программе может оказаться очень затрудни- тельным процессом. Конфигурирование памяти при помощи банка быстрого доступа позволяет ус- корить доступ к наиболее часто применяемым регистрам без использования BSR. Банк быстрого доступа содержит первые 96 байт памяти Банка 0 (00h - 5Fh) и последние 160 байт Банка 15 (60h - FFh). Низшие адреса, именуемые, как «Access RAM» (ОЗУ быстрого доступа) соответствуют регистрам общего приме- нения. Высшие адреса отображают расположение специальных регистров. Два этих пространства непрерывно отображаются в банке быстрого доступа и могут быть линейно адресованы при помощи 8-разрядного адреса (рис. 1.36). Банк быстрого доступа используется в командах, которые содержат специ- альный параметр «а», определяющий обращение к ОЗУ быстрого доступа. Если а = 1, ядро контроллера использует для адресации регистр BSR и 8-разрядный адрес, содержащийся в теле команды. Если а = 0, применяется адресное про- странство банка быстрого доступа, регистр BSR игнорируется. Использование «принудительной» адресации позволяет оперировать адресом данных в одном цикле, без предварительного обновления регистра BSR. Это оз- начает более рациональное обращение к специальным регистрам начиная с ад- реса 60h и выше. ОЗУ быстрого доступа с адресами ниже 60h является хорошим местом для хранения результатов промежуточных вычислений или часто упот- ребляемых переменных. Если включен расширенный набор команд (бит конфигурации XINST = 1), то применение банка быстрого доступа имеет некоторые отличия. Этот вопрос рас- смотрен в разделе «Применение банка быстрого доступа в режиме индексного смещения». Сегмент памяти USB Банки памяти с 4-го по 7-й подключены к специальному двунаправленному порту ОЗУ. Когда модуль USB выключен, эти банки используются аналогично прочим банкам памяти данных, содержащим регистры общего назначения (рис. 1.35). Если модуль USB включен, эта область памяти используется в качестве бу- ферного ОЗУ при работе USB. Она располагается между ядром контроллера и узлом последовательного интерфейса USB и применяется для обмена данными между ними. Теоретически существует возможность использовать область ОЗУ USB, свободную от буферных данных, в качестве регистров общего назначения (рис. 1.36). Однако динамическая природа размещения данных от USB, когда за- ранее не известны их объем и точное месторасположение, делает такой подход чрезвычайно рискованным. Кроме того, Банк 4 применяется для управления бу- фером USB, и по этой причине не может применяться для иных целей, если мо- дуль USB включен. Более подробно применение ОЗУ USB рассмотрено в разде- ле «Модуль USB». Специальные регистры Специальные регистры используются вычислителем и периферийными моду- лями микроконтроллера для управления функционированием как модулей, так и контроллера в целом. Физически эти регистры представлены, как статическое 68
Структура и базовые функции микроконтроллеров BSR<3:0> Карта памяти данных Рис. 1.35. Структура памяти данных. (п Эти банки также используются, как буферное ОЗУ для работы модуля USB 69
Глава 1 Рис. 1.36. Использование регистра выбора банка (прямая адресация). (1) Бит быстрого доступа «а» в команде может быть использован для игнорирования би- тов BSR<3.0>.(2) Команда MOVFF содержит в себе полный 12-разрядный адрес ОЗУ в области памяти данных. Они расположены в Банке 15 по адресам F6Oh - FFFh. Карта адресов специальных регистров приведена в табл. 1.12. Специальные регистры можно условно разделить на два набора: ассоциирован- ные с функционированием ядра (АЛУ, сброс и прерывания) и обслуживающие пери- ферийные модули. Регистры, связанные со сбросом и прерываниями, описаны в со- ответствующих разделах. Регистр состояния АЛУ, мы рассмотрим в этом разделе. Регистры, относящиеся к периферийным модулям, описываются в разделах, посвя- щенных этим модулям. Общий перечень регистров приведен в табл. 1.13. Регистр STATUS Содержимое регистра STATUS отражает состояние арифметико-логического устройства (АЛУ) микроконтроллера: bit7-5 Не используются, читаются, как «О» bit4 N Флаг-бит отрицательного результата Это бит используется в знакозависимой арифметике (двоичный дополнительный код). Он сигнализирует, что результат отрицательный (ALU MSB = 1) 1 - результат был отрицательный О = результат был положительный bit3 OV Флаг-бит переполнения Это бит используется в знакозависимой арифметике (двоичный дополнительный код). Он сигнализирует, что перепол- нение 7-разрядной размерности могло привести к смене знака числа 1 = было переполнение (для знакозависимой арифметики) О - переполнения не было 70
Таблица 1.12 Карта адресов специальных регистров Адрес Название Адрес Название Адрес Название Адрес Название Адрес Название FFFh TOSU FDFh INDF2(1) FBFh CCPR1H F9Fh IPR1 F7Fh UEP15 FFEh TOSH FDEh POSTINC2(1) FBEh CCPR1L F9Eh PIR1 F7Eh UEP14 FFDh TOSL FDDh POSTDEC2(1) FBDh CCP1CON F9Dh PIE1 F7Dh UEP13 FFCh STKPTR FDCh PREINC2(1) FBCh CCPR2H F9Ch _(2) F7Ch UEP12 FFBh PCLATU FDBh PLUSW2(1) FBBh CCPR2L F9Bh OSCTUNE F7Bh UEP11 FFAh PCLATH FDAh FSR2H FBAh CCP2CON F9Ah _(2) F7Ah UEP10 FF9h PCL FD9h FSR2L FB9h J2) F99h J2) F79h UEP9 FF8h TBLPTRU FD8h STATUS FB8h BAUDCON F98h _(2) F78h UEP8 FF7h TBLPTRH FD7h TMROH FB7h ECCP1DEL F97h J2) F77h UEP7 FF6h TBLPTRL FD6h TMROL FB6h ECCP1AS F96h TRISE(3) F76h UEP6 FF5h TABLAT FD5h TOCON FB5h CVRCON F95h TRISD<3) F75h UEP5 FF4h PRODH FD4h _(2) FB4h CMCON F94h TRISC F74h UEP4 FF3h PRODL FD3h OSCCON FB3h TMR3H F93h TRISB F73h UEP3 FF2h INTCON FD2h HLVDCON FB2h TMR3L F92h TRISA F72h UEP2 FF1h INTCON2 FD1h WDTCON FB1h T3CON F91h _(2) F71h UEP1 FFOh INTCON3 FDOh RCON FBOh SPBRGH F9Oh J2) F70h UEPO FEFh INDF0(1) FCFh TMR1H FAFh SPBRG F8Fh _(2) F6Fh UCFG FEEh POSTINCO(1) FCEh TMR1L FAEh RCREG F8Eh _(2) F6Eh UADDR FEDh POSTDECO(1 > FCDh T1CON FADh TXREG F8Dh LATE(3) F6Dh UCON FECh PREINC0(1) FCCh TMR2 FACh TXSTA F8Ch LATD(3) F6Ch USTAT FEBh PLUSW0(1) FCBh PR2 FABh RCSTA F8Bh LATC F6Bh UEIE FEAh FSROH FCAh T2CON FAAh _(2) F8Ah LATB F6Ah UEIR Структура и базовые функции микроконтроллеров
Адрес Название Адрес Название Адрес Название Адрес Название Адрес Название FE9h FSROL FC9h SSPBUF FA9h EEADR F89h LATA F69h UIE FE8h WREG FC8h SSPADD FA8h EEDATA F88h „(2) F68h UIR FE7h INDF1(1) FC7h SSPSTAT FA7h EECON2(1) F87h _(2) F67h UFRMH FE6h POSTINC1(1) FC6h SSPCON1 FA6h EECON1 F86h _(2) F66h UFRML FE5h POSTDEC?’ FC5h SSPCON2 FA5h _(2) F85h _(2) F65h SPPCON(3) FE4h PREINC1(1) FC4h ADRESH FA4h _(2) F84h PORTE F64h SPPEPS<3) FE3h PLUSW1(1) FC3h ADRESL FA3h _(2) F83h PORTD(3) F63h SPPCFG<3) FE2h FSR1H FC2h ADCONO FA2h IPR2 F82h PORTC F62h SPPDATA(3) FE1h FSR1L FC1h ADCON1 FA1h PIR2 F81h PORTB F61h _(2) FEOh BSR FCOh ADCON2 FAOh PIE2 F80h PORTA F60h _(2) Таблица 1.13 (1) Не является физическим регистром. (2) Не используется, читается, как «О». (3) Эти регистры применяются только в микросхемах с 40/44 выводами. Гпава 1 Общий перечень регистров PIC18F2455/2550/4455/4550 Обозначение Bit 7 Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 Bit 0 Значение по POR, BOR TOSU - - - Высший байт вершины стека (TOS<20:16>) — 0 0000 TOSH Старший байт вершины стека (TOS<15:8>) 0000 0000 TOSL Младший байт вершины стека (TOS<7:0>) 0000 0000 STKPTR STKFUL STKUNF - Указатель стека возврата 00-0 0000 PCLATU - - - Регистр-защелка счетчика команд <20:16> — 0 0000 PCLATH Регистр-защелка счетчика команд <15:8> 0000 0000 PCL Младший байт счетчика команд (<7:0>) 0000 0000
Обозначение Bit 7 Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 BitO Значение no POR, BOR TBLPTRU - bit21(1) Высший байт табличного указателя (TBLPTR<20:16>) -00 0000 TBLPTRH Старший байт табличного указателя памяти программ (TBLPTR<15:8>) 0000 0000 TBLPTRL Младший байт табличного указателя памяти программ (TBLPTR<7:0>) 0000 0000 TABLAT Защелка таблицы памяти программ 0000 0000 PRODH Старший байт регистра результата xxxx xxxx PRODL Младший байт регистра результата xxxx xxxx INTCON GIE/GIEH PEIE/ G!EL TMROIE INTOIE RBIE TMR0IF INTOIF RBIF 0000 OOOx INTCON2 RBPU INTEDG0 INTEDG1 INTEDG2 - TMR0IP - RBIP 1111 -1-1 INTCON3 INT2IP INTI IP - INT2IE INT1IE - INT2IF INT1IF 11 -0 0-00 1NDF0 Использует содержимое FSR0 для адресации памяти данных. FSR0 не меняется. N/A POSTINCO Использует содержимое FSR0 для адресации памяти данных с постинкрементом FSR0 N/A POSTDECO Использует содержимое FSR0 для адресации памяти данных с постдекрементом FSR0 N/A PREiNCO Использует содержимое FSR0 для адресации памяти данных с прединкрементом FSR0 N/A PLUSW0 Использует содержимое FSR0 для адресации памяти данных с постдекрементом FSRO, значе- ние FSRQ смещается на величину W N/A FSR0H - - - - Указатель 0 косвенной адресации данных, стар- шие разряды —- 0000 FSR0L Указатель 0 косвенной адресации данных, младший байт xxxx xxxx WREG Рабочий регистр xxxx xxxx INDF1 Использует содержимое FSR1 для адресации памяти данных. FSR1 не меняется. N/A POST1NC1 Использует содержимое FSR1 для адресации памяти данных с постинкрементом FSR1 N/A POSTDEC1 Использует содержимое FSR1 для адресации памяти данных с постдекрементом FSR1 N/A PRE!NC1 Использует содержимое FSR1 для адресации памяти данных с прединкрементом FSR1 N/A PLUSW1 Использует содержимое FSR1 для адресации памяти данных с постдекрементом FSR1, значе- ние FSR1 смещается на величину W N/A Структура и базовые функции микроконтроллеров
Обозначение Bit 7 Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 BitO Значение no POR, BOR FSR1H - - - - Указатель 1 косвенной адресации данных, стар- шие разряды —- 0000 FSR1L Указатель 1 косвенной адресации данных, младший байт xxxx xxxx BSR - - Регистр выбора банка памяти данных —- 0000 INDF2 Использует содержимое FSR2 для адресации памяти данных. FSR2 не меняется. N/A POSTINC2 Использует содержимое FSR2 для адресации памяти данных с постинкрементом FSR2 N/A POSTDEC2 Использует содержимое FSR2 для адресации памяти данных с постдекрементом FSR2 N/A PREINC2 Использует содержимое FSR2 для адресации памяти данных с прединкрементом FSR2 N/A PLUSW2 Использует содержимое FSR2 для адресации памяти данных с постдекрементом FSR2, значе- ние FSR2 смещается на величину W N/A FSR2H - - - - Указатель 2 косвенной адресации данных, стар- шие разряды —- 0000 FSR2L Указатель 2 косвенной адресации данных, младший байт xxxx xxxx STATUS I I N 0V Z DC c — x xxxx TMROH Старший байт таймера TimerO 0000 0000 TMROL Младший байт таймера TimerO xxxx xxxx TOCON TMROON T08BIT TOCS T0SE PSA T0PS2 T0PS1 TOPSO 11111111 OSCCON IDLEN IRCF2 IRCF1 IRCF0 OSTS IOFS SCSI SCSO 0100 qOOO HLVDCON VDIRMAG - IRVST HLVDEN HLVDL3 HLVDL2 HLVDL1 HLVDLO 0-00 0101 WDTCON - - - - - - - SWDTEN - - 0 RCON IPEN SBOREN® - RI ТО PD POR BOR 0q-1 11q0 TMR1H Старший байт таймера Timerl xxxx xxxx TMR1L Младший байт таймера Timerl xxxx xxxx T1CON RD16 I T1RUN | T1CKPS1 | T1CKPS0 | T1OSCEN | T1SYNC | TMR1CS I TMR1ON 0000 0000 TMR2 Регистр таймера Timer2 0000 0000 PR2 Регистр периода таймера Timer2 1111 1111 Глава 1
Обозначение Bit 7 Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 BitO Значение no POR, BOR T2CON - T2OUTPS3 T2OUTPS2 T2OUTPS1 T2OUTPS0 TMR2ON T2CKPS1 T2CKPS0 -000 0000 SSPBUF Буферный регистр SSP xxxx xxxx SSPADD Регистр адреса SSP в режиме I2C™ Slave. Регистр скорости SSP в режиме I2C™ Master. 0000 0000 SSPSTAT SMP СКЕ D/А P S FVW UA BF 0000 0000 SSPCON1 WOOL SSPOV SSPEN CKP SSPM3 SSPM2 SSPM1 SSPMO 0000 0000 SSPCON2 GCEN ACKSTAT ACKDT ACKEN RCEN PEN RSEN SEN 0000 0000 ADRESH Старший байт результата АЦП xxxx xxxx ADRESL Младший байт результата АЦП xxxx xxxx ADCONO - - CHS3 CHS2 CHS1 CHSO GO/DONE ADON -00 0000 ADCON1 - - VCFG1 VCFGO PCFG3 PCFG2 PCFG1 PCFGO -00 Oqqq ADCON2 ADFM - ACQT2 ACQT1 ACQTO ADCS2 ADCS1 ADCSO 0-00 0000 CCPR1H Старший байт регистра 1 компаратора/захвата/ШИМ xxxx xxxx CCPR1L Младший байт регистра 1 компаратора/захвата/ШИМ xxxx xxxx CCP1CON Р1М1(3) Р1М0(3) DC1B1 DC1B0 CCP1M3 CCP1M2 CCP1M1 CCP1M0 0000 0000 CCPR2H Старший байт регистра 2 компаратора/захвата/ШИМ xxxx xxxx CCPR2L Младший байт регистра 2 компаратора/захвата/ШИМ xxxx xxxx CCP2CON - DC2B1 DC2B0 CCP2M3 CCP2M2 CCP2M1 CCP2M0 - -00 0000 BAUDCON ABDOVF RCIDL - SCKP BRG16 - WUE ABDEN 01-0 0-00 ECCP1DEL PRSEN PDC6(3) PDC5(3) PDC4(3) PDC3(3) PDC2(3) PDC1(3) PDC0(3) 0000 0000 ECCP1AS ECCPASE ECCPAS2 ECCPAS1 ECCPASO PSSAC1 PSSACO PSSBD1(3) PSSBD0(3) 0000 0000 CVRCON CVREN CVROE CVRR CVRSS CVR3 CVR2 CVR1 CVRO 0000 0000 CMCON C2OUT сюит C2INV C1INV CIS СМ2 CM1 CMO 0000 0111 TMR3H Старший байт регистра Timer3 xxxx xxxx TMR3L Младший байт регистра Timer3 xxxx xxxx Структура и базовые функции микроконтроллеров
Обозначение Bit 7 Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 BitO Значение no POR, BOR T3CON RD16 T3CCP2 T3CKPS1 T3CKPS0 T3CCP1 T3SYNC TMR3CS TMR3ON 0000 0000 SPBRGH Старший байт регистра генератора тактов EUSART 0000 0000 SPBRG Младший байт регистра генератора тактов EUSART 0000 0000 RCREG Регистр приемника EUSART 0000 0000 TXREG Регистр передатчика EUSART 0000 0000 TXSTA CSRC TX9 TXEN SYNC SENDS BRGH TRMT TX9D 0000 0010 RCSTA SPEN RX9 SREN CREN ADDEN FERR OERR RX9D 0000 OOOx EEADR Регистр адреса EEPROM 0000 0000 EEDATA Регистр данных EEPROM 0000 0000 EECON2 Управляющий регистр 2 EEPROM (не является физическим регистром) 0000 0000 EECON1 EEPGD CFGS - FREE WRERR WREN WR RD XX -0 xOOO IPR2 OSCFIP CMIP USBIP EEIP BCLIP HLVDIP TMR3IP CCP2IP 11111111 PIR2 OSCFIF CMIF USBIF EEIF BCLIF HLVDIF TMR3IF CCP2IF 0000 0000 PIE2 OSCFIE CMIE USBIE EEIE BCLIE HLVDIE TMR3IE CCP2IE 0000 0000 1PR1 Spp|p(3) ADIP RCIP TXIP SSPIP CCP1IP TMR2IP TMR1IP 11111111 PIR1 SPPIF(3) ADIF RCIF TXIF SSPIF CCP1IF TMR2IF TMR1IF 0000 0000 PIE1 SPPIE(3) ADIE RCIE TXIE SSPIE CCP1IE TMR2IE TMR1IE 0000 0000 OSCTUNE INTSRC - - TUN4 TUN3 TUN2 TUN1 TUNO 0-0 0000 TRISE(3) - - - - - TRISE2 TRISE1 TRISEO 111 TRISD(3) TRISD7 TRISD6 TRISD5 TRISD4 TRISD3 TRISD2 TRISD1 TRISDO 11111111 TRISC TRISC7 TRISC6 - - - TRISC2 TRISC1 TRISCO 11--111 TRISB TRISB7 TRISB6 TRISB5 TRISB4 TRISB3 TRISB2 TRISB1 TRISBO 1111 1111 TRISA - TRISA6M' TRISA5 TRISA4 TRISA3 TRISA2 TRISA1 TRISAO -1111111 LATE(3) - - - - - LATE2 LATE1 LATEO XXX Глава 1
Обозначение Bit 7 Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 Bit 0 Значение no POR, BOR LATD<3) LATD7 LATD6 LATD5 LATD4 LATD3 LATD2 LATD1 LATDO xxxx xxxx LATC LATC7 LATC6 - - - LATC2 LATC1 LATCO XX-- -XXX LATB LATB7 LATB6 LATB5 LATB4 LATB3 LATB2 LATB1 LATBO xxxx xxxx LATA - LATA6<4> LATA5 LATA4 LATA3 LATA2 LATA1 LATAO -XXX xxxx PORTE RDPU(3) - - - RE3(5) RE2(3) RE1(3) RE0t3) 0 - xOOO PORTD(3) RD7 RD6 RD5 RD4 RD3 RD2 RD1 RDO xxxx xxxx PORTC RC7 RC6 RC5(6) RC4(6) - RC2 RC1 RCO XXXX -XXX PORTS RB7 RB6 RB5 RB4 RB3 RB2 RB1 RBO xxxx xxxx PORTA - RA6(4) RA5 RA4 RA3 RA2 RA1 RAO -xOx 0000 UEP15 - - - EPHSHK EPCONDIS EPOUTEN EPINEN EPSTALL - - - 0 0000 UEP14 - - - EPHSHK EPCONDIS EPOUTEN EPINEN EPSTALL - - - 0 0000 UEP13 - - - EPHSHK EPCONDIS EPOUTEN EPINEN EPSTALL - - - 0 0000 UEP12 - - - EPHSHK EPCONDIS EPOUTEN EPINEN EPSTALL - - - 0 0000 UEP11 - - - EPHSHK EPCONDIS EPOUTEN EPINEN EPSTALL - - - 0 0000 UEP10 - - - EPHSHK EPCONDIS EPOUTEN EPINEN EPSTALL - - - 00000 UEP9 - - - EPHSHK EPCONDIS EPOUTEN EPINEN EPSTALL - - - 0 0000 UEP8 - - - EPHSHK EPCONDIS EPOUTEN EPINEN EPSTALL • - - 00000 UEP7 - - - EPHSHK EPCONDIS EPOUTEN EPINEN EPSTALL - - - 0 0000 UEP6 - - - EPHSHK EPCONDIS EPOUTEN EPINEN EPSTALL - - - 00000 UEP5 - - - EPHSHK EPCONDIS EPOUTEN EPINEN EPSTALL - - - 0 0000 UEP4 - - - EPHSHK EPCONDIS EPOUTEN EPINEN EPSTALL - - - 0 0000 UEP3 - - - EPHSHK EPCONDIS EPOUTEN EPINEN EPSTALL - - - 0 0000 UEP2 - - - EPHSHK EPCONDIS EPOUTEN EPINEN EPSTALL - - - 00000 Структура и базовые функции микроконтроллеров
Обозначение Bit 7 Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 BitO Значение no POR, BOR UEP1 - - EPHSHK EPCONDIS EPOUTEN EPINEN EPSTALL - - - 0 0000 UEP0 - - - EPHSHK EPCONDIS EPOUTEN EPINEN EPSTALL - - - 0 0000 UCFG UTEYE UOEMON - UPUEN UTRDIS FSEN PPB1 PPBO 00-0 0000 UADDR - ADDR6 ADDR5 ADDR4 ADDR3 ADDR2 ADDR1 ADD RO -000 0000 UCON - PPBRST SEO PKTDIS USBEN RESUME SUSPND - -0x0 000- USTAT - ENDP3 ENDP2 ENDP1 ENDP0 DIR PPBI - - XXX xxx - UEIE BTSEE - - BTOEE DFN8EE CRC16EE CRC5EE PIDEE 0- -0 0000 UEIR BTSEF - - BTOEF DFN8EF CRC16EF CRC5EF PIDEF 0- -0 0000 UIE - SOFIE STALLIE IDLEIE TRNIE ACTVIE UERRIE URSTIE -000 0000 UIR. - SOFIF STALL! F 1DLEIF TRNIF ACTVIF UERRIF URSTIF -000 0000 UFRMH - - - - - FRM10 FRM9 FRM8 xxx UFRML FRM7 FRM6 FRM5 FRM4 FRM3 FRM2 FRM1 FRM0 xxxx xxxx SPPCON(3) - - - - - - SPPOWN SPPEN 00 SPPEPS(3) RDSPP WRSPP - SSPBUSY ADDR3 ADDR2 ADDR1 ADDR0 00-0 0000 SPPCFG<3) CLKCFG1 CLKCFG0 CSEN CLK1EN WS3 WS2 WS1 WS0 0000 0000 SPPDATA(3) DATA7 DATA6 DATA5 DATA4 DATA3 DATA2 DATA1 DATA0 0000 0000 Глава 1 Обозначения: х - не определено; и - не меняется; - - не используется; q - зависит от условий. <1) Бит 21 регистра TBLPTRU разрешает доступ к битам конфигурации прибора (2) Бит SBOREN доступен, только если BOREN<1:0> = 01, иначе всегда читается, как «0». (3) Эти регистры и/или биты недоступны в 28-выводных приборах и читаются, как «0». Состояния по сбросу показаны для 40/44-выводных приборов. (4) RA6 конфигурируется, как вывод порта в зависимости от режима первичного тактового генератора. Если вывод порта от- ключен, все ассоциированные с ним биты читаются, как «0». (S) RE3 конфигурируется, как вывод порта, только если бит конфигурации MCLRE сброшен. В ином случае читается, как «0». RC5 и RC4 конфигурированы, как выводы порта, только если модуль USB выключен (UCON<3> - 0).
Структура и базовые функции микроконтроллеров bit2 Z Флаг-бит нулевого результата 1 - результат арифметической или логической операции равен О О = результат арифметической или логической операции не равен О bit1 DC Бит переноса/займа внутри числа Для команд ADDWF, ADDLW, SUBLW и SUBWF 1 - был перенос из младшего полубайта в старший О = не было переноса из младшего полубайта в старший Для займа полярность бита обратная. Вычитание выполняется путем прибавление двоичного дополнения, как второго операнда. Для команд цикли- ческого сдвига (RRF, RLF) этот бит загружается содержимым бита 4 или 3 регистра -источника. bitO С Бит переноса/займа Для команд ADDWF, ADDLW, SUBLW и SUBWF 1 - был перенос из старшего значащего разряда результата О - не было переноса из старшего значащего разряда результата Для займа полярность бита обратная. Вычитание выполняется путем прибавление двоичного дополнения, как второго операнда. Для команд цикли- ческого сдвига (RRF, RLF) этот бит загружается содержимым старшего или младшего бита регистра-источника. Регистр STATUS может являться операндом различных инструкций. Если этот регистр является приемником для команд, которые влияют на состояние битов Z, DC, С, OV или N, то результат выполнения команды не записывается. Напротив, в регистр записываются признаки результата выполнения операции. Поэтому содержимое регистра STATUS может оказаться не таким, как ожидалось. Напри- мер, команда CLRF STATUS установит в 1 бит Z и не изменит остальные биты. Рекомендуется применять к регистру STATUS только команды BCF, BSF, SWAPF, MOVFF и MOVWF. Способы адресации (указания) данных Если память программ адресуется лишь одним способом - через содержимое программного счетчика команд, то источник данных для операции может быть указан несколькими способами. Для большинства команд способ адресации фик- сирован. Остальные команды могут использовать до трех вариантов адресации, в зависимости от того, какие операнды используются и включен ли расширенный набор команд. Возможны следующие типы адресации (указания) источника данных: • адресация кодом команды; .литеральная; . прямая; .косвенная. Дополнительный способ адресации, индексный литеральный сдвиг, доступен при включении расширенного набора команд. Этот способ адресации рассматри- вается отдельно, в разделе «Индексная адресация с литеральным сдвигом». Некоторые команды серии PIC18 не нуждаются в аргументе. Они влияют на 79
Глава 1 строго определенные специальные регистры, зависимость которых предусмот- рена внутренней структурой микроконтроллера. Это, например, команды SLEEP. RESET и DAW. Такой способ обращения к регистрам называется адресацией кодом команды. Другие команды работают аналогично, но требуют наличия дополнительного аргумента в коде. Такой способ указания на источник данных называется лите- ральным, поскольку данные указаны в виде литерала. Это, например, команды ADDLW и MOVLW. Условно сюда можно отнести команды CALL и GOTO, в кото- рых в виде литерала дан адрес перехода, являющийся аргументом команды. Прямая адресация определяет полностью или частично источник и/или при- емник. В наборе команд ядра Р1С18 бит-ориентированные и байт- ориентированные команды по умолчанию используют одинаковый способ адре- сации. Все эти команды содержат 8-битный адрес в своем младшем байте кода. Этот адрес прямо указывает на некоторую ячейку памяти в выбранном банке (выбор банка памяти мы рассмотрели выше). Интерпретация прямого адреса зависит от того, задано ли в коде команды ис- пользование банка быстрого доступа (бит «а»). Адресация с применением памя- ти быстрого доступа иногда называется режимом прямого принудительного дос- тупа (Direct Forced Addressing Mode). Напомним, что некоторые инструкции, на- пример MOVFF, содержат полный 12-разрядный адрес и игнорируют содержимое регистра выбора банка. Получатель результата операции определяется битом назначения «d» в коде команды. Если d = 1, результат сохраняется в регистре-источнике, заменяя собой начальное значение. Если d = О, результат сохраняется в аккумулятор W. Коман- ды, не имеющие в своем составе бита «d», используют подразумеваемый в кон- тексте приемник результата. Это может быть как регистр, над которым выполня- ется действие, так и аккумулятор W. Косвенная адресация (рис. 1.37) позволяет пользователю обращаться к ячейке памяти данных без указания фиксированного адреса в команде. Это дос- тигается использованием регистров-указателей (FSR, File Select Register). По- скольку регистры-указатели располагаются в ОЗУ, как и специальные регистры, они могут быть модифицированы программно. Это делает регистры-указатели очень удобным инструментом при работе со структурами данных: таблицами и массивами. Регистры для косвенной адресации используются с операндом косвенной ад- ресации, что позволяет автоматически манипулировать указателем, используя автоинкремент, автодекремент или сдвиг на заданную величину. Ниже приведен пример обнуления всех ячеек Банка 1 с применением косвенной адресации, что позволило сократить код команды. NEXT LFSR CLRF FSR0, 100h POSTINCO ; очищаем регистр INDF, CONTINUE BTFSS BRA FSR0H, 1 NEXT ; затем инкремент указателя ; Банк1 очищен полностью? ; нет, очищаем следующую ячейку ; да, продолжаем программу В основе косвенной адресации лежит три набора регистров: FSRO, FSR1 и FSR2. Каждый состоит из пары 8-разрядных регистров FSRnH и FSRnL. 80
Структура и базовые функции микроконтроллеров Команда, использующая регистр косвенной адресации, как операнд Используем 12-разрядный адрес, сохраненный в паре FSR, ассоциированной с регистром косвенной адресации, определяя физический адрес ячейки памяти FSR1H:FSR1L В нашем примере пара FSR1 содержит адрес ECCh Содержимое ячейки по этому адресу складывается с аккумулятором W. результат сохраняется в ячейке Память данных Рис. 1.37. Пример косвенной адресации Поскольку память адресуется 12-разрядным значением, четыре старших раз- ряда регистра FSRnH не используются. Таким образом, пара регистров позволя- ет представить память данных в виде линейного поля. Содержимое этой пары используется в качестве указателя на ячейку памяти. Система косвенной адресации завершается набором операндов косвенной адресации INDF0...INDF2. Их следует рассматривать, как «виртуальные» регист- ры: они отображаются на адресное пространство, но не существуют физически. Операция чтения или записи в регистр INDFn фактически означает обращение к ячейке памяти, адресованной соответствующей парой FSRnH:FSRnL. Например, чтение из регистра INDF1 означает чтение из ячейки, адрес кото- рой указан в паре FSR1H.-FSR1L. Очевидно, что при таком способе адресации содержимое регистра выбора банка и бита быстрого доступа «а» в коде команды полностью игнорируется. В дополнение к операнду INDFn, каждая пара регистров FSRn имеет четыре дополнительных косвенных операнда. Это «виртуальные регистры», к которым нельзя обратиться напрямую. Обращение к ним происходит в неявном виде, при обращении к соответствующей паре FSRn, при этом выполняется определенная операция над сохраненным в паре значением адреса, а именно: . POSTDEC: доступ к значению FSR, затем декремент этого значения на 1. . POSTING: доступ к значению FSR, затем инкремент этого значения на 1. . PREINC: инкремент значения FSR на 1, затем использование нового значения. PLUSW: прибавление содержимого W (в диапазоне от -127 до 128) к содер- жимому FSR и использование нового значения. При обращении к виртуальному регистру INDF используется содержимое FSR, которое не изменяется. Обращение к регистру PLUSW дает сдвиг адреса на ве- личину, находящуюся в W. Обращение к остальным регистрам в качестве опе- ранда приводит к выполнению соответствующей операции над FSR (как описано выше) и обращению к ячейке памяти по адресу из FSR. 81
Глава 1 Изменение касается всей пары FSR. Так, например, при переполнении FSRnL происходит перенос в FSRnH. Но флаг-биты регистра STATUS при этом не затрагиваются! Применение сдвига адреса с помощью аккумулятора W помогает организо- вать такие полезные структуры, как программный стек, расположенный в памяти данных. Особым случаем является косвенное обращение через один регистр косвен- ной адресации к другому регистру косвенной адресации. Например, использова- ние FSR для указания на один из виртуальных регистров не будет успешным. Предположим, что пара FSROHrFSROL содержит значение FE7h, являющееся значением INDF1. Попытка прочитать значение INDF1, используя INDF0 как опе- ранд, вернет 00h. Попытка записи в INDF1 с использованием INDF0 в качестве операнда будет выполнена, как NOP. С другой стороны, использование виртуальных регистров для записи значений в пары FSR может пройти не так, как планировалось. В этом случае значение в FSR будет записано без инкремента или декремента. Например, запись в вирту- альный регистр INDF2 или POSTDEC2 сохранит одинаковое значение. Поскольку регистры группы FSR являются физическими регистрами, располо- женными в области памяти специальных регистров, с ними можно выполнять прямые операции. Для повышения надежности выполнения программы следует избегать косвенного обращения к регистрам FSR. Аналогичным образом, косвен- ная запись допускается и для других специальных регистров, но разработчик программы должен быть чрезвычайно аккуратен при использовании косвенной записи в специальные регистры. Работа с памятью данных при расширенном наборе команд Расширенный набор команд включается установкой бита конфигурации XINST = 1. Включение расширенного набора добавляет восемь дополнительных двухсложных команд: ADDFSR, ADDULNK, CALLW, MOVSF, MOVSS, PUSHL, SUBFSR и SUBULNK. При этом существенно изменяются некоторые аспекты ра- боты с памятью данных и ее адресации. В частности, использование банка быст- рого доступа для большинства команд различается. Здесь мы рассмотрим новый режим адресации пространства памяти данных. Этот режим также изменяет по- ведение при косвенной адресации с применением FSR2 и ассоциированных с ним операндов. Сначала перечислим, что не изменяется. Размер памяти данных, равно как и ее линейная адресация, остаются прежними. Не меняется карта размещения специальных регистров. Ядро PIC18 сохраняет возможность работы в режиме прямой и косвенной адресации; косвенная адресация с применением регистров FSR0 и FSR1 также не изменяется. При работе со штатным набором команд инструкции, использующие банк бы- строго доступа, могут реализовать форму индексной адресации, используя сдвиг, заданный в теле команды. Такая адресация, напомним, называется индексной адресацией с литеральным сдвигом или режимом индексного литерального сдвига. Когда используется расширенный набор команд, этот режим адресации требует соблюдения следующих условий: . принудительное использование банка быстрого доступа («а» = 0); • аргумент адреса ячейки меньше или равен 5Fh. 82
Структура и базовые функции микроконтроллеров При этих условиях адрес ячейки в команде не интерпретируется, как младший байт адреса (применяясь совместно с BSR для прямой адресации), или как 8- разрядный адрес банка быстрого доступа. Наоборот, это значение интерпрети- руется, как значение сдвига относительно адресного указателя, определенного в FSR2. Сдвиг и содержимое FSR2 суммируются, образуя конечный адрес. Любая команда ядра PIC18, способная использовать прямую адресацию, по- тенциально неприменима в режиме индексного литерального сдвига. Речь идет обо всех байт-ориентированных и бит-ориентированных командах, т.е. почти о половине набора стандартных команд PIC18. Инструкции, которые используют адресацию в теле команды или литеральную адресацию, не подвергаются изме- нениям. Бит-ориентированные и байт-ориентированные команды не изменяются, если они используют банк быстрого доступа («а» = 1) или содержат адрес от 60h или более. Команды, удовлетворяющие этим условиям, выполняются, как было опи- сано в предыдущих разделах. Сравнительная картина различных допустимых режимов адресации при расширенном наборе команд показана на рис. 1.38. Пользователи, желающие использовать бит-ориентированные и байт- ориентированные команды в режиме индексного литерального сдвига, должны учитывать изменения синтаксиса ассемблерных команд в этом режиме. Детали рассмотрены в разделе «Описание расширенного набора команд». Проекция банка быстрого доступа в режиме индексного литерального сдвига Использование режима индексного литерального сдвига изменяет отображе- ние младшей части ОЗУ быстрого доступа (00h - 5Fh) на пространство памяти данных. В отличие от стандартного отображения, содержащего только нижнюю часть Банка 0, в рассматриваемом режиме отображается содержимое Банка 0 и определяемое пользователем «окно», которое может располагаться в произ- вольном месте памяти данных. Значение FSR2 устанавливает нижнюю границу адресов, попадающих в «ок- но», тогда как верхняя граница «окна» вычисляется прибавлением к значению FSR константы 5Fh (или 95 в десятичной системе). Отображение адресов бан- ка быстрого доступа более 5Fh происходит в обычном порядке, как описано в предыдущих разделах для стандартного набора команд. Пример отображения банка быстрого доступа на адресное пространство памяти данных показан на рис. 1.39. Описанное перераспределение отображения адресов применимо исключи- тельно к режиму индексного литерального сдвига. Операции, использующие BSR (бит «а» = 1), продолжают использовать прямую адресацию. Любая прямая или индексная операция, которая явно использует содержимое регистров косвенной адресации (включая FSR2), продолжит работать в стандартном режиме. Любые команды, использующие банк быстрого доступа, но содержащие адрес больший, чем 5Fh, будут использовать непосредственную адресацию и обычную карту ад- ресов банка быстрого доступа. В отличие от банка быстрого доступа, отображение которого перераспреде- ляется, действие регистра выбора банка BSR не изменяется. Непосредственная адресация с использованием BSR для выбора банка работает в стандартном режиме, который был описан выше. 83
Глава 1 ПРИМЕР КОМАНДЫ: ADEWF, f, d, а (Код: 0010 Oida ffff ffff) Если а = 0 и f >= 60h: Команда исполняется в режиме Direct Forced (непосредственный ускоренный). Т интерпретируется, как адрес памяти быстрого доступа между 060h и OFFh. Это тоже самое, что специальные регистры или проекция на адреса F60h - FFFh в памяти данных. Если а = 0 Mf<=5Fh: Команда выполняется в режиме индексированного литерального сдвига. •4»интерпретируется, как сдвиг значения адреса в FSR2. Адрес может указывать на произвольную ячейку памяти данных Предупреждение: в этом режиме теперь используется такой корректный синтаксис команды: ADDWF (kJ. d где«к»-то же самое, что «Ь. Если а = 1 (любое значение f): Команда выполняется в непосредственном режиме (известном также, как непосредственный долгий режим. Direct Long mode). <4» интерпретируется, как адрес в одном из 16 банков памяти данных Банк определяется содержимым регистра BSR. Адрес может указывать на любую ячейку в доступном банке. [~FSR2H | FSR2L | Рис. 1.38. Сравнение вариантов адресации при расширенном наборе команд 84
Структура и базовые функции микроконтроллеров Пример. ADDWF f, d, а FSR2H:FSR2L= 120h Рис. 1.39. Пример отображения банка быстрого доступа в расширенном режиме FLASH память программ FLASH память программ является читаемой, записываемой и стираемой при работе в нормальном режиме, в диапазоне типовых значений питающего на- пряжения VDD. Чтение памяти программ происходит по одному байту за один прием. Запись в память программ производится блоками по 32 байта за один прием. Стирание производится блоками по 64 байта. Полная очистка (Bulk Erase) не может быть инициирована кодом пользователя и производится только при помощи програм- матора. Запись в память программ приостанавливает выборку команд до тех пор, пока процедура записи не будет завершена. Память программ недоступна во время записи или стирания, следовательно, исполнение программы в это время оста- навливается. Встроенный таймер управляет процессом записи и стирания. Значение, записанное в память программ, не обязательно должно быть ва- лидным кодом команды. Если значение не распознается, как корректный код, оно исполняется, как пустая операция NOP. Табличное чтение и табличная запись Применительно к чтению и записи памяти программ, существуют две проце- дуры, позволяющие процессору переносить байты между памятью программ и ОЗУ данных: . табличное чтение (TBLRD); . табличная запись (TBLWT). Слово памяти программ содержит 16 разрядов, тогда как слово памяти дан- ных восьмиразрядное. Поэтому данные между областями памяти разного типа переносятся при помощи промежуточного регистра-защелки TABLAT. Процедуры 85
Глава 1 Команда: TBLRD* Примечание . Регистр табличного указателя показывает на байт в памяти программ. Рис. 1.40. Табличное чтение из памяти программ табличного чтения запрашивают данные из памяти программ и помещают их в регистр TABLAT, как показано на рис. 1.40. Процедуры табличной записи помещают содержимое памяти данных во вре- менные регистры памяти программ. Процесс записи содержимого временных регистров в память программ детально рассматривается далее, в разделе «За- пись в FLASH память программ». На рис. 1.41 проиллюстрирован перенос данных из табличного регистра-защелки в регистр временного хранения памяти данных. Табличные процедуры работают с байтовыми представлениями. Табличный блок, содержащий данные, отличающиеся от кодов команд, не требует выравни- вания по 16-разрядным словам. Поэтому табличный блок может начинаться и за- Команда: tblwt* Примечание. Табличный указатель показывает на один из 32-х регистров временного хранения, адрес которого определяется разрядами TBLPTR<4:0>. Процесс физической записи данных в память программ рассмотрен в разделе «Запись в FLASH-память программ». Рис. 1.41. Табличная запись в регистры временного хранения 86
Структура и базовые функции микроконтроллеров канчиваться по любому адресу байта. Но, если табличная запись применяется для записи исполняемого кода, данные должны быть выровнены по словам ко- манд. Управляющие регистры записи и чтения Совместно с командами TBLRD и TBLWT используется несколько регистров. . EECON1. . EECON2. .TABLAT. .TBLPTR. Рассмотрим применение этих регистров более подробно. EECON1 является управляющим регистром для доступа к памяти. EECON2 не является физическим регистром и применяется исключительно для выполнения последовательности тактов записи или стирания памяти. Чтение EECON2 всегда возвращает «О». Управляющий бит EEPGD указывает, к какой памяти будет производиться об- ращение - EEPROM или FLASH-памяти программ. Если EEPGD = 0, все опера- ции выполняются с EEPROM, в ином случае - с памятью программ. Управляющий бит CFGS определяет, будет ли происходить обращение к ре- гистрам калибровки/конфигурации или к памяти программ/EEPROM. Если этот бит установлен в «1», то независимо от состояния бита EEPGD происходит об- ращение к регистрам конфигурации. Если бит сброшен, то объект обращения зависит от состояния EEPGD. Если установлен бит FREE, то разрешается операция стирания памяти про- грамм, которая начинается со следующей команды WR. Если бит FREE сброшен, разрешается только запись. Бит WREN, будучи установленным, разрешает операцию записи. По умолча- нию, при включении питания этот бит сброшен. Бит WRERR устанавливается аппаратно, когда устанавливается бит WREN, и сбрасывается, когда время встроенного таймера программирования истекло и операция записи завершена. Если во время штатной работы бит WRERR читается, как «1», это мо- жет означать, что операция записи прервана сбросом или выполнена неудач- но. Управляющий бит WR инициирует операцию записи. Этот бит не может быть сброшен; его можно только установить программно. Очистка происхо- дит аппаратно, при завершении операции записи. Флаг-бит прерывания EEIF (PIR<4>) устанавливается по событию завер- шения записи. После проверки его состояния, он обязательно должен быть сброшен программой пользователя. Рассмотрим побитную раскладку содержимого регистра EECON1: bit7 EEPGD бит выбора FALSH памяти программ или EEPROM памяти данных 1 = доступ к FLASH памяти программ О = доступ к EEPROM памяти данных bit6 CFGS бит выбора между памятью данных/программ и регистрами конфигурации 1 = доступ к регистрам конфигурации О = доступ к FLASH или EEPROM памяти 87
Гпава 1 bits Не используется, читается, как «О» bit4 FREE бит разрешения на стирание строки памяти FLASH 1 = стирание строки памяти программ, адресованной указателем TBLPTR в следующей команде WR (сбрасывается по завершению операции) О = разрешена только запись bit3 WRERR флаг-бит ошибки памяти FLASH или EEPROM 1 = операция записи досрочно прервана (сбросом в момент записи или неправильным обращением для записи) О = операция записи завершена успешно Когда случается событие WRERR, биты EEPGD и CFGS не сбрасываются Это позволяет отследить условие ошибки bit2 WREN бит разрешения записи в FLASH или EEPROM 1 = разрешены циклы записи в FLASH или EEPROM О = запрещены циклы записи bit1 WR управляющий бит записи 1 = инициирует цикл стирания/записи EEPROM или записи в FLASH О = запись завершена bitO RD управляющий бит чтения 1 = инициирует цикл чтения EEPROM (чтение занимает один цикл Бит устанавливается программно и сбрасывается аппаратно Бит не может быть установлен, если EEPGD = 1 или CFGS = 1) О - чтение из EEPROM не инициировано или завершено Регистр табличного указателя TBLPTR Регистр табличного указателя адресует байт в памяти программ. Он состоит из трех самостоятельных регистров специального назначения: высшего байта табличного указателя (TBLPTRU, Table Pointer Upper Byte), старшего байта таб- личного указателя (TBLPTRH, Table Pointer High Byte), младшего байта таблично- го указателя (TBLPTRL, Table Pointer Low Byte). Эти три регистра вместе форми- руют 22-разрядный указатель. Младшие разряды с 0 по 21-й позволяют адресо- вать до 2 Мб памяти программ. 22-й разряд позволяет обращаться к идентифи- катору микросхемы (device ID), пользовательскому идентификатору (user ID) и битам конфигурации. Табличный указатель используется в командах TBLRD и TBLWT. Эти команды могут обновить содержимое указателя TBLPTR одним из четырех способов, как показано в табл. 1.14. Изменению подвергается только 21 разряд, начиная с младшего. 88
Структура и базовые функции микроконтроллеров Таблица 1.14 Изменение указателя TBLPTR в зависимости от инструкции Пример Операция, производимая над указателем TBLRD* TBLWT* TBLPTR не изменяется TBLRD*+ TBLWT*+ TBLPTR инкрементируется после чтения/записи TBLRD*- TBLWT*- TBLPTR декрементируется после чтения/записи TBLRD+* TBLWT+* TBLPTR инкрементируется перед чтением/записью Когда выполняется инструкция TBLRD, все 22 разряда указателя определяют, какой байт памяти программ будет прочитан в регистр TABLAT. Когда выполняется команда TBLWT, пять младших разрядов указателя (TBLPTR<4:0>) определяют, в какой из 32-х временных регистров памяти про- грамм произойдет запись. Затем, сразу после установки бита WR, начинается запись в память программ блока из 32 байт, по адресу, определяемому старшими 17-ю разрядами указателя (TBLPTR<21:5>). В процессе стирания памяти программ 16 старших разрядов указателя (TBLPTR <21:6>) указывают на 64-байтовый блок, который будет стерт. Младшие значащие разряды (TBLPTR <5:0>) игнорируются. На рис. 1.42 наглядно показа- ны диапазоны используемых разрядов указателя TBLPTR. Как уже было сказано, команда TBLRD используется для считывания данных из памяти программ и переноса их в оперативную память данных. За один прием считывается один байт. Указатель TBLPTR указывает на адрес байта в памяти программ. Выполнение TBLRD помещает указанный байт в регистр TABLAT. Ука- затель может быть автоматически модифицирован для следующей операции чтения. Размещение данных в памяти программ организовано в виде слов. Младший значащий разряд указателя определяет, какой байт слова будет считан, как пока- зано на рис. 1.43. Рис. 1.42. Диапазоны используемых разрядов указателя 89
Глава 1 Рис. 1.43. Чтение из FLASH-памяти программ Пример программы чтения слова из памяти программ: MOVLV MOVWF MOVLW MOVWF MOVLW MOVWF READJ/VORD TBLRD*+ MOVF MOVWF TBLRD*+ MOVF MOVWF CODE_ADDR_UPPER TBLPTRU CODE_ADDR_HIGH TBLPTRH CODE_ADDR_LOW TBLPTRL ; Загружаем в ; указатель TBLPTR ; начальный адрес ;слова TABLAT, W WORD_EVEN TABLAT, W WORD_ODD ; читаем четный байт ; забираем данные в акк. ; переносим значение в ОЗУ ; читаем следующий байт ; забираем данные в акк. ; переносим значение в ОЗУ Стирание FLASH-памяти программ Минимальный стираемый блок памяти составляет 32 слова или 64 байта. Стереть блок памяти большего размера или произвести полное стирание можно только при помощи программатора. Стирание отдельного слова в памяти про- грамм не поддерживается. Регистр EECON1 управляет процессом стирания. Бит EEPGD должен быть ус- тановлен, чтобы указывать на память программ, как объект операции. Бит WREN также должен быть установлен для разрешения операции записи, а бит FREE устанавливается для разрешения операции стирания. Производитель настоятельно требует перед стиранием реализовать обязательную последовательность поочередной записи в регистр EECON2 значений 55h и AAh. Для стирания FLAS-памяти требуется «длинный» цикл записи. На время 90
Структура и базовые функции микроконтроллеров «длинного» цикла выполнение программы останавливается. Завершение цикла происходит по истечении интервала специального встроенного таймера записи. Пример программы стирания фрагмента FLASH-памяти программ: MOVLV CODE_ADDR_UPPER ; Загружаем в MOVWF TBLPTRU ; указатель TBLPTR MOVLW CODE_ADDR_HIGH ; начальный адрес MOVWF MOVLW MOVWF ERASE.ROW TBLPTRH CODE_ADDR_LOW TBLPTRL ; блока BSF EECON1, EEPGD ; указываем на FLAS-память BCF EECON1.CFGS ; доступ к FLASH BSF EECON1, WREN ; разрешаем запись в память BSF EECON1, FREE ; разрешаем блочное стирание BCF INTCON, GIE ; запрещаем все прерывания MOVLW 55h ; обязательная MOVWF EECON2 ; последовательность MOVLW OAAh ; команд MOVWF EECON2 ; перед записью/стиранием BSF EECON1, WR ; старт стирания (процессор оста- ; новлен) BSF INCON, GIE ; разрешение прерываний Запись в FLASH-память программ Минимальный размер блока для записи составляет 16 слов или 32 байта. За- пись отдельного слова или байта не поддерживается. Для записи используются 32 регистра временного хранения, содержимое которых переносится в память программ при записи. Поскольку регистр табличной защелки TABLAT однобайтный, команду TBLWT необходимо выполнить 32 раза для каждой операции записи. Когда заполнены все 32 временных регистра, стартует операция записи. Для записи данных во временные регистры используется «короткий» цикл записи, для переноса данных во FLASH-память требуется «длинный» цикл, на время которого процессор оста- навливается. Длительность «длинного» цикла определяется встроенным тайме- ром программирования. Напряжение записи/стирания генерируется встроенным источником, напряже- ние которого превышает питающее. По умолчанию после сброса, а также после окончания операции записи, во временных регистрах содержится значение FFh. Если необходимо модифициро- вать только один байт программной памяти, можно изменить только один вре- менный регистр, не обращаясь к остальным. В процессе записи в память программ должна быть исполнена следующая по- следовательность: Чтение 64 байтов в ОЗУ. 91
Гпава 1 Рис. 1.44. Табличная запись в память программ Изменение данных в ОЗУ, если необходимо. Загрузка в табличный указатель адреса, с которого начнется стирание. Выполнение процедуры стирания. Загрузка в табличный указатель адреса, с которого начнется запись первого байта. Запись с автоинкрементом 32 байт во временные регистры. Настройка регистра EECON1 для операции записи Запрет всех прерываний Запись 55h в EECON2 Запись AAh в EECON2 Установка бита WR = 1. Это начинает цикл записи. Процессор останавливается на время записи (около 2мс по встроенному тай- меру). Разрешение прерываний (если необходимо). Повтор шагов с 6 по 14 для записи еще 32 байт. Проверка памяти (табличное чтение). Полная процедура обновления 64 байт памяти программ занимает около 8 мс. Пример программы записи в FLASH-память программ: MOVLW MOVWF MOVLW MOVWF MOVLW MOVWF MOVLW MOVWF MOVLW MOVWF MOVLW MOVWF READBLOCK TBLRD*+ D'64' COUNTER BUFFER_ADDR_HIGH FSROH BUFFER_ADDR_LOW FSROL CODE_ADDR_UPPER TBLPTRU CODE„ADDR_HIGH TBLPTRH CODE_ADDR_LOW TBLPTRL ; количество байт в блоке ; указатель на буфер ; загрузка в TBLPTR начального ; адреса блока памяти ; чтение в TABLAT с инкрементом 92
Структура и базовые функции микроконтроллеров MOVF TABLAT, W ; получаем данные MOVWF POSTINCO ; сохраняем данные DECFSZ COUNTER ;закончили? BRA MODIFY.WORD READ„BLOCK ; нет, продолжить MOVLW DATA.ADDR.HIGH ; указатель на буфер MOVWF FSROH MOVLW DATA .ADDR..LOW MOVWF FSROL MOVLW NEW_DATA„LOW ; обновляем слово MOVWF POSTINCO MOVLW NEW_DATA_HIGH MOVWF ERASE. BLOCK INDFO MOVLW CODE .ADDR..UPPER ; загрузка в TBLPTR начального MOVWF TBLPTRU ; адреса блока памяти MOVLW CODE.ADDRHIGH MOVWF TBLPTRH MOVLW CODE. ADDR .LOW MOVWF TBLPTRL BSF EECON1, EEPGD ; указываем на FLASH, как объект BCF EECON1.CFGS ; доступ к FLASH BSF EECON1, WREN ; разрешаем запись в память BSF EECON1.FREE ; разрешаем стирание BCF INTCON, GIE ; запрет всех прерываний MOVLW 55h MOVWF EECON2 ; обязательная MOVLW OAAh ; последовательность MOVWF EECON2 BSF EECON1, WR ; старт стирания (останов процесс- ; сора) BSF INTCON, Gl ; разрешение прерываний TBLRD*- ; ложное чтение для декремента MOVLW BUFFER_ADDR_HIGH ; указатель на буфер MOVWF FSROH MOVLW BUFFER_ADDR_LOW MOVWF FSROL MOVLW D’2’ MOVWF COUNTERI WRITE BUFFER. .BACK MOVLW D'321 ; кол-во байт во временном регистре MOVWF COUNTER 93
Глава 1 WRITE_BYTE_TO_HREGS MOVF POSTINCO, W ; получение младшего байта буфера MOVWF TABLAT ; размещение данных в защелке TBLWT+' ; запись данных (короткий цикл) DECFSZ COUNTER ; во временные регистры ; повторяем до заполнения буфера BRA PROGRAM, BSF WRITE_WORD_TO_HREGS MEMORY EECON1, EEPGD ; указываем на FLASH, как объект BCF EECON1.CFGS ; доступ к FLASH BSF EECON1, WREN ; разрешаем запись в память BCF INTCON, GIE ; запрет всех прерываний MOVLW MOVWF 55h EECON2 ; обязательная MOVLW OAAh ; последовательность MOVWF BSF EECON2 EECON1, WR ; старт записи (останов процессора) DECFSZ BRA BSF COUNTERI WRITE_BUFFER_BACK INTCON, GIE ; разрешение прерываний BCF EECON1, WREN ;запрет записи в память Если некоторое незапланированное событие, такое, как отключение питания или аппаратный сброс, прерывает процесс записи, то пользователь может обна- ружить факт этого события, проверив состояние бита WRERR. Практика коррект- ного программирования требует выполнять если не полную верификацию запи- санного блока данных, то хотя бы состояние бита, сигнализирующего об ошибке записи. К сожалению, бит ошибки позволяет обнаружить только сброс по входу MCLR или по сторожевому таймеру. Ошибка записи, вызванная отключением питания, при помощи бита WRERR не обнаруживается. Таблица 1.15 Регистры, ассоциированные с записью в FLASH-память программ Имя Bit 7 Bit 6 Bit 5 Bit 4 | Bit 3 | Bit 2 | Bit 1 | BitO TBLPTRU - - bit 21 Высший байт указателя (TBLPTR<20:16>) TBPLTRH Старший байт указателя (TBLPTR<15:8>) TBLPTRL Младший байт указателя (TBLPTR<7:0>) TABLAT Регистр-защелка INTCON GIE/GIEH | PEIE/GIEL |tmroie | INTOIE | RBIE | TMROIF INTOIF | RBIF EECON2 Управляющий регистр 2 EEPROM (не являете) я физическим регистром) EECON1 EEPGD CFGS - FREE WRERR WREN WR RD IPR2 OSCFIP ' CMIP USBIP EEIP BCLIP HLVDIP TMR3IP CCP2IP PIR2 OSCFIF CMIF USBIF EEIF BCLIF HLVDIF TMR3IF CCP21F PIE2 OSCFIE CMIE USBIE EEIE BCLIE HLVDIE TMR3IE CCP2IE 94
Структура и базовые функции микроконтроллеров EEPROM память данных Память данных EEPROM представляет собой энергонезависимую память, от- личную от памяти программ и ячеек ОЗУ (регистров общего применения), EEPROM используется для хранения пользовательских данных, как предуста- новленных при программировании микроконтроллера, так и записываемых в процессе работы устройства и доступна для чтения и записи в диапазоне нор- мального напряжения питания. Доступ к EEPROM осуществляется только кос- венно, через специальные регистры: . EECON1. . EECON2. . EEDATA. . EEADR. Регистр EEADR содержит адрес ячейки, к которой будет происходить обраще- ние, a EEDATA хранит данные, которые подлежат записи, или были прочитаны из EEPROM. При записи не требуется отдельная операция предварительного стирания; каждый вновь записываемый байт полностью заменяет в ячейке старые данные по системе «erase-before-write» (стирание перед записью). Длительность цикла записи контролируется встроенным таймером и может незначительно варьиро- ваться в зависимости от температуры корпуса и напряжения питания. Регистры EECON1 и EECON2 Регистры EECON1 и EECON2 применяются для управления доступом к EEPROM. Это те же самые регистры, которые управляют доступом к памяти про- грамм, и применительно к EEPROM они работают аналогично. Регистр EECON1 был рассмотрен выше. Регистр EECON2 не является физи- ческим регистром. Он применяется исключительно в последовательностях сти- рания и записи в память. Чтение EECON2 возвращает «О». Чтение данных из EEPROM Для чтения данных из ячейки EEPROM нужно записать адрес ячейки в регистр EEADR, сбросить управляющий бит EEPGD (EECON1<7>) и затем установить управляющий бит RD (EECON1<0>). Данные становятся доступны для чтения уже в следующем цикле. Поэтому следующим циклом можно выполнить чтение из виртуального регистра EEDATA и получить искомое значение ячейки. Регистр EEDATA удерживает это значение до тех пор, пока оно не будет вытеснено сле- дующей операцией чтения или записи. Пример чтения данных из EEPROM: MOVLW DATAEE.ADDR ; MOVWF EEADR ; загружаем адрес ячейки BCF EECON1, EEPGD ; указываем на память данных BCF EECON1, CFGS ; доступ к памяти BSF EECON1.RD ; чтение EEPROM MOVF EEDATA, W ; получаем прочитанное значение 95
Гпава 1 Запись в EEPROM Для записи данных в ячейку EEPROM сначала записывают адрес в EEADR, затем байт, подлежащий записи, в EEDATA и выполняют настройку управляющих битов регистра EECON1. Запись не начнется, если не будет выполнена строго определенная после- довательность команд: запись 55h в EECON2, запись OAAh в EECON2, уста- новка в «1» бита WR. Настоятельно рекомендуется запрещать все прерыва- ния на время выполнения этой последовательности. Для разрешения записи должен быть установлен бит WREN регистра EECON1. Этот бит защищает содержимое EEPROM от случайной записи при «вылетании» программы за пределы штатного исполнения кода. Этот бит следу- ет держать сброшенным всегда, кроме момента непосредственной записи в EEPROM. Бит WREN не сбрасывается аппаратно! После того, как инициирована последовательность записи, содержимое реги- стров EECON1, EEADR и EEDATA не может быть модифицировано. Бит WR нельзя установить, пока не установлен бит WREN. Эти биты нельзя установить одной командой. По завершению операции записи бит WR аппаратно сбрасывается и выстав- ляется флаг-бит прерывания по событию EEPROM (EEIF). Пользователь может как разрешить это прерывание, так и просто опрашивать бит. Бит EEIF должен быть сброшен программно. В ответственных приложениях следует производить верификацию записи, сравнивая записанное значение с исходным. Особенно актуально это для при- менений микроконтроллера, когда внешние величины (температура, питающее напряжение и т.п.) могут достигать критических значений в момент записи. Пример записи данных в EEPROM: MOVLW DATA_EE_ADDR MOVWF EEADR адрес ячейки для записи MOVLW DATA_EE_DATA MOVWF EEDATA значение для записи BCF EECON1, EPGD указатель на EEPROM BCF EECON1, CFGS доступ к памяти BSF EECON1, WREN разрешение записи BCF INTCON, GIE запрет всех прерываний MOVLW 55h MOVWF EECON2 обязательная MOVLW OAAh последовательность MOVWF EECON2 BSF EECON1, WR старт записи BSF INTCON, GIE разрешение прерываний BSF EECON1, WREN запрет записи в EEPROM Память данных EEPROM имеет в слове конфигурации микроконтроллера соб- ственные биты защиты от считывания извне. Если защита установлена, данные 96
Структура и базовые функции микроконтроллеров EEPROM не могут быть прочитаны при помощи программатора. Тем не менее, внутри себя микроконтроллер может производить операции чтения и записи не- зависимо от состояния битов защиты. Обновление данных в EEPROM Память EEPROM, применяемая в рассматриваемом семействе, оптимизи- рована для частой перезаписи и допускает значительно большее число циклов записи, чем это установлено спецификациями изготовителя D124 или D124A. В этой памяти теперь допускается хранить оперативные данные програм- мы: переменные, результаты измерений и т.п. Но если данные меняются не- достаточно часто, их необходимо обновлять. По этой причине данные, изме- няемые редко (константы, идентификаторы, калибровочные значения) следу- ет сохранять во FLASH памяти (например, в теле программы). Ниже приведен пример подпрограммы для обновления данных в EEPROM. Пример подпрограммы обновления данных в EEPROM: EEADR EECON1.CFGS EECON1, EEPGD INTCON, GIE EECON1, WREN EECON1, RD 55h EECON2 OAAh EECON2 EECON1, WR EECON1, WR $-2 EEADR, F LOOP EECON1, WREN INTCON, GIE CLRF BCF BCF BCF BSF LOOP BSF MOVLW MOVWF MOVLW MOVWF BSF BTFSC BRA INCFSZ BRA BCF BSF ; старт с адреса 0 ; доступ к памяти ; указатель на EEPROM ; запрет всех прерываний ; разрешение записи ; чтение текущего адреса ; обязательная ; последовательность ; старт записи ; ждем, пока запись закончится ; инкремент адреса ; еще не все ячейки, продолжаем ; закончили, запрет записи ; разрешение прерываний Таблица 1.16 Регистры, ассоциированные с EEPROM Имя Bit 7 Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 BitO INTCON GIE/GIEH PEIE/GIEL TMROIE INTOIE RBIE TMROIF INTOIF RBIF EEADR Регистр адреса EEPROM EEDATA Регистр данных EEPROM EECON2 Управляющий регистр EEPROM (не является физическим регистром) EECON1 EEPGD | CFGS IFREE WRERR | WREN WR | RD 97
Гпава 1 Имя Bit 7 Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 BitO IPR2 OSCFIP CMIP USBIP EEIP BCLIP HLVDIP TMR3IP CCP2IP PIR2 OSCFIF CMIF USBIF EEIF BCLIF HLVDIF TMR3IF CCP2IF PIE2 OSCFIE CMIE USBIE EEIE BCLIE HLVDIE TMR3IE CCP2IE Аппаратный умножитель 8x8 Все микроконтроллеры серии PIC18 содержат аппаратный умножитель 8x8, как часть АЛУ. Умножитель выполняет операцию без знака и выдает результат в пару регистров PRODH:PRODL. Для учета знака требуются дополнительные опе- рации со знаковым разрядом. Операция аппаратного умножения не изменяет состояние флаг-битов регистра STATUS. Реализация умножения, как аппаратной операции позволяет завершить ее за один командный цикл. Это повышает производительность вычислений, одновре- менно сокращая код программы, и позволяет использовать PIC18 в тех приложе- ниях, которые раньше реализовывались за счет цифровых сигнальных процес- соров. В табл. 1.17 приведено сравнения аппаратного и программного методов умножения с учетом занимаемой памяти и времени выполнения. Таблица 1.17 Сравнение операций умножения аппаратным и программным способом Задача Метод Кол- во слов в па- мяти Кол- во цик- лов Время выполнения, мкс 40 МГц 10 МГц 4 МГц 8x8 без знака Без аппаратной поддержки 13 69 6,9 27,6 69 С аппаратной поддержкой 1 1 100 400 1 8x8 co знаком Без аппаратной поддержки 33 91 9,1 36,4 91 С аппаратной поддержкой 6 6 600 2,4 6 16x 16 без знака Без аппаратной поддержки 21 242 24,2 96,8 242 С аппаратной поддержкой 28 28 2,8 11,2 28 1бх 16 со знаком Без аппаратной поддержки 52 254 25,4 102,6 254 С аппаратной поддержкой 35 40 4,0 16,0 40 Так выглядит пример умножения с аппаратной поддержкой: MOVF ARG1.W ; MULWF ARG2 ; ARG1 * ARG2 -> PRODHrPRODL Аппаратная поддержка может применяться для умножения со знаком. Для учета знака аргументов тестируется старший значащий разряд каждого аргумен- та и выполняется соответствующее вычитание: MOVF ARG1.W MULWF ARG2 BTFSC ARG2, SB ARG1 * ARG2 -> PRODH:PRODL тестирование знакового разряда 98
Структура и базовые функции микроконтроллеров SUBWF PRODH, F ; PRODH = PRODH - ARG1 MOVE ARG2, W : BTFSC ARG1, SB ; тестирование знакового разряда SUBWF PRODH. F ; PRODH = PRODH - ARG2 Следующий пример иллюстрирует умножение 16x16 без знака. 32-разрядный результат сохраняется в четырех регистрах. Алгоритм умножения следующий: RES3:RES0 - ARG1H:ARG1L • ARG2H.ARG2L = (ARG1H«ARG2H’216) + (ARG1H-ARG2L-28) + (ARG1L • ARG2H • 28) + (ARG1L • ARG1L) MOVF MULWF ARGIL, W ARG2L ; ARG1L * ARG2L-> PRODHPRODL MOVFF MOVFF MOVF MULWF PRODH, RES1 PRODL, RESO ARG1H, W ARG2H ; ARG1H * ARG2H-> PRODH:PRODL MOVFF MOVFF MOVF MULWF PRODH, RES3 PRODL, RES2 ARGIL, W ARG2H ; ARG1L * ARG2H-> PRODH:PRODL MOVF ADDWF MOVF ADDWFC CLRF ADDWFC MOVF MULWF PRODL, W RES1, F PRODH, W RES2, F WREG RES3, F ARG1H, W ARG2L ; ARG1H * ARG2L-> PRODH:PRODL MOVF ADDWF MOVF ADDWFC CLRF ADDWFC PRODL, W RES1, F PRODH, W RES2, F WREG RES3, F Теперь рассмотрим пример умножения 16x16 с учетом знака. 32-разрядный результат сохраняется в четырех регистрах RES3:RES0. Чтобы учесть знаки множителей, производится тестирование их знаковых разрядов. Обобщенный алгоритм выглядит, как показано ниже: RES3:RES0 = ARG1 H:ARG1 L ARG2H:ARG2L = (ARG1H - ARG2H 216) + 99
Гпава 1 (ARG1H ARG2L-28) + (ARG1L- ARG2H 28)+ (ARG1L- ARG2L)+ (-1 ARG2H<7> ARG1H:ARG1L 216) + (-1 - ARG1H<7> ARG2H:ARG2L 216) Пример программы, реализующей алгоритм умножения 16x16 с учетом знака: MOVF ARG1L, W MULWF ARG2L ; ARG1L * ARG2L -> PRODH: PRODL MOVFF PRODH, RES1 MOVFF PRODL, RESO MOVF ARG1H, W MULWF ARG2H ; ARG1H * ARG2H -> PRODH: PRODL MOVFF PRODH, RES3 MOVFF PRODL, RES2 MOVF ARG1L,W MULWF ARG2H ; ARG1L * ARG2H -> PRODH:PRODL MOVF PRODL, W ADDWF RES1, F MOVF PRODH, W ADDWFC RES2, F CLRF WREG ADDWFC RES3, F MOVF ARG1H, W MULWF ARG2L ARG1H * ARG2L -> PRODH:PRODL MOVF PRODL, W ADDWF RES1, F MOVF PRODH, W ADDWFC RES2, F CLRF WREG ADDWFC RES3, F BTFSS ARG2H, 7 ; ARG2H:ARG2L отрицательный? BRA SIGNARG1 ; нет, проверяем ARG1 MOVF ARG1L, W SUBWF RES 2 MOVF ARG1H, W SUBWFB RES3 SIGN.ARG1 BTFSS ARG1H, 7 ; ARG1H: ARG1L отрицательный? 100
Структура и базовые функции микроконтроллеров BRA CONTCODE ; нет, продолжаем MOVE ARG2L, W SUBWF RES2 MOVF ARG2H, W SUBWFB RES3 CONT_CODE ; продолжение кода пользователя Прерывания Микроконтроллеры PIC18F2455/2550/4455/4550 поддерживают множество различных источников прерываний и имеют опцию приоритета прерывания, что позволяет назначить высокий или низкий приоритет каждому источнику в отдель- ности. Для прерываний с высоким приоритетом назначен постоянный вектор 000008h, для прерываний с низким приоритетом - вектор 000018h. Прерывания с высоким приоритетом могут прерывать любой обрабатываемый процесс преры- вания низкого приоритета. Для управления прерываниями используются десять регистров: RCON INTCON INTCON2 INTCON3 PIR1 PIR2 PIE1 PIE2 IPR1 IPR2 Производитель рекомендует при написании текстов программ использовать файлы заголовка, поставляемые в комплекте MPLAB IDE, что позволит исполь- зовать символьные имена регистров и составляющих их битов. Благодаря этому ассемблер/компилятор автоматически обеспечит правильное ассоциирование битов в соответствующем регистре. Каждому источнику прерывания назначены три управляющих бита, имеющих следующие функции: • Флаг-бит, извещающий о событии, вызвавшем прерывание. . Разрешающий бит, который разрешает прервать выполнение основной про- граммы и перейти на вектор прерывания, если случилось событие, установившее флаг-бит. . Бит приоритета, задающий высокий или низкий приоритет. Опция определения приоритета включается установкой бита IPEN (RCON<7>). Если определение приоритета включено, задействуются два бита глобального разрешения прерываний. Установка бита GIEH (INTCON<7>) разре- шает прерывания, для которых установлен бит высокого приоритета. Установка бита GIEL (INTCON<6>) разрешает прерывания, для которых сброшен бит высо- кого приоритета (низкий приоритет). Это глобальные биты, разрешающие преры- вания в целом. Прерывание от каждого отдельно взятого периферийного модуля может быть разрешено или запрещено при помощи управляющего бита, ассо- циированного с этим модулем. 101
Гпава 1 Если бит IPEN сброшен (по умолчанию), то опция определения приоритета не работает, и система прерываний совместима с существующей для микро- контроллеров PIC среднего уровня. В режиме совместимости бит приоритета каждого прерывания игнорируется. Соответственно, меняется роль битов реги- стра INTCON. В совместимом режиме бит INTCON<6> называется PEIE и раз- решает/залрещает прерывания от периферийных модулей, а бит INTCON<7> называется GIE и служит для глобального разрешения/запрета всех прерыва- ний в целом. В режиме совместимости все прерывания адресуются на 0000086. Если вы используете в своей программе приоритеты прерываний, не забудьте на этапе начальной настройки контроллера в явном виде включить опцию при- оритета битом IPEN. Как только прерывание распознано, бит глобального разрешения прерываний сбрасывается, чтобы не допустить следующие прерывания. Если бит IPEN сбро- шен, таким битом будет GIE. Но если приоритеты включены (IPEN = 1), то сбро- шен будет один из битов GIEH или GIEL. Высшее прерывание может прервать низшее, но не наоборот. Адрес возврата сохраняется в стеке и в счетчик команд загружается адрес вектора прерывания (000008h или 000018b). Источник прерывания может быть определен в подпрограмме обработки путем опроса флаг-битов прерываний. Следует обязательно сбрасывать флаг-биты прерываний перед выходом из подпрограммы обработки прерывания, иначе произойдет рекурсивная обра- ботка прерывания и «зацикливание» программы. Флаг-биты устанавливаются независимо от состояния разрешающих би- тов. Это позволяет анализировать некоторые события, не прибегая к ис- пользованию прерываний. Команда возврата из прерывания RETFIE завершает работу подпрограммы и восстанавливает бит глобального запрета/разрешения в исходное состояние. Для внешних прерываний, поступающих через вывод INT или по изменению состояния выводов порта В, задержка в обслуживании составляет от трех до че- тырех командных циклов. Точное значение задержки совпадает с длительностью одно- или двухтактной команды. Внимание! Не используйте команду MOVFF для модификации какого-либо регистра, управляющего прерываниями, в то время, когда любое из прерыва- ний разрешено. Это может привести к непредсказуемому поведению микро- контроллера. Прерывания от модуля USB В отличие от других периферийных модулей, модуль USB может генерировать широкий диапазон прерываний для множества типов событий. В них входят не- сколько типов событий штатной коммуникации и событий текущего статуса, а также несколько событий ошибок разного уровня (рис. 1.45). Для обслуживания этих событий модуль USB оснащен собственной логикой обработки прерываний. Функции этой логики по своей сути схожи с микрокон- троллерной, где каждое прерывание имеет собственный флаг-бит и разрешаю- щий бит. Все прерывания модуля в конечном итоге сводятся к одиночному пре- рыванию с флаг-битом USBIF (PIR2<5>). В отличие от логики микроконтроллера, индивидуальные события прерываний USB не имеют собственных раздельных 102
Структура и базовые функции микроконтроллеров Рис. 1.45. Логическая структура системы обработки прерываний приоритетов. В логике микроконтроллера для них существует единый бит при- оритета USBIP. Прерывания модуля USB детально рассматриваются в гл. 2. Регистр INTCON Регистр INTCON доступен для чтения и записи; содержит различные биты приоритета, флагов и разрешения. Флаги прерываний устанавливаются независимо от того, разрешено ли соответствующее прерывание или установлен бит глобального разрешения прерываний. Благодаря этому программа пользователя может опрашивать флаги прерываний независимо от состояния битов разрешения. Но не следу- ет забывать сбрасывать флаги перед включением прерывания! bit7 GIE/GIEH бит глобального разрешения прерываний Когда IPEN = О 1 = Разрешены все немаскированные прерывания О = Запрещены все прерывания 103
Глава 1 Когда IPEN = 1 1 = Разрешены все прерывания высокого приоритета О = Запрещены все прерывания высокого приоритета bit6 PEIE/GIEL бит разрешения прерываний от периферии Когда IPEN = О 1 = Разрешены все немаскированные прерывания от периферии О = Запрещены все немаскированные прерывания от периферии Когда IPEN = 1 1 = Разрешены все прерывания низкого приоритета от периферии О = Запрещены все прерывания низкого приоритета от периферии bit5 TMR0IE бит разрешения прерывания по переполнению TMR0 1 = Разрешает прерывание по переполнению TMR0 О = Запрещает прерывание по переполнению TMR0 bit4 INT0IE бит разрешения внешнего прерывания по входу INTO 1 = Прерывание по INTO разрешено О - Прерывание по INTO запрещено bit3 RBIE бит разрешения прерывания по изменению на выводах порта RB 1 = Прерывание по изменению на RB разрешено О = Прерывание по изменению на RB запрещено bit2 TMR0IF флаг-бит прерывания по переполнению TMR0 1 = регистр TMR0 был переполнен (сбрасывается программно) О = регистр TMR0 не переполнялся bit1 INTOIF флаг-бит внешнего прерывания по INTO 1 = сгенерировано прерывание по входу INTO (сбрасывается про- граммно) О = прерывания по INTO не было bitO RBIF флаг-бит прерывания по изменению порта RB 1 = как минимум один из выводов RB71RB4 изменил состояние (сбрасывается программно) О = ни один из выводов RB7:RB4 не менял состояние Регистр INTCON2 bit7 RBPU бит включения подтягивающих резисторов порта В 1 = все подтягивающие резисторы для порта В выключены О = резисторы включены в соответствии с назначением каждой линии порта 104
Структура и базовые функции микроконтроллеров bit6 INTEDGO бит выбора фронта внешнего прерывания О 1 = прерывание по нарастанию О = прерывание по спаду bit5 INTEDG1 бит выбора фронта внешнего прерывания 1 1 = прерывание по нарастанию О = прерывание по спаду bit4 INTEDG2 бит выбора фронта внешнего прерывания 2 1 = прерывание по нарастанию О = прерывание по спаду bit3 Не используется, читается, как О bit2 TMR0IP бит приоритета прерывания по переполнению TMR0 1 = высокий приоритет О = низкий приоритет bitl Не используется, читается, как О bitO RBIP бит приоритета прерывания по изменению состояния порта В 1 = высокий приоритет О = низкий приоритет Регистр INTCON3 bit7 INT2IP бит приоритета внешнего прерывания 2 1 = высокий приоритет О = низкий приоритет bit6 INTI IP бит приоритета внешнего прерывания 1 1 = высокий приоритет О = низкий приоритет bit5 Не используется, читается, как О bit4 INT2IE бит разрешения внешнего прерывания 2 1 = прерывание разрешено О = прерывание запрещено bits INT1IE бит разрешения внешнего прерывания 1 1 = прерывание разрешено О = прерывание запрещено bit2 Не используется, читается, как О bitl INT2IF флаг-бит внешнего прерывания 2 1 = событие прерывания INT2 произошло (сбрасывается программно) О = события не было 105
Гпава 1 bitO INT1IF флаг-бит внешнего прерывания 1 1 = событие прерывания INT1 произошло (сбрасывается программно) О = события не было Регистр PIR1 bit7 SSPIF флаг-бит прерывания от потокового параллельного порта SPP 1 = совершена операция чтения или записи О = чтение или запись не происходили Примечание: этот бит резервирован для 28-выводных корпусов. Всегда оставляйте этот бит сброшенным. bit6 ADIF флаг-бит АЦП 1 = преобразование АЦП завершено (сбрасывается программно) О = преобразование не завершено или не начиналось bit5 RCIF флаг-бит прерывания по приему порта EUSART 1 = буфер приема EUSART (RCREG) заполнен (сбрасывается при считывании буфера) О = буфер EUSART пуст bit4 TXIF флаг-бит прерывания по передаче EUSART 1 = буфер передачи EUSART (TXREG) пуст (сбрасывается при передаче буфера) О = буфер передачи наполнен bit3 SSPIF флаг-бит прерывания ведущего синхронного последовательного порта 1 = передача/прием завершены (сбрасывается программно) О = ожидание передачи/приема bit2 CCP1IF флаг-бит прерывания от модуля ССР1 Режим захвата 1 = произошел захват регистра TMR1 (сбрасывается программно) О = события захвата не было Режим компаратора 1 = совпадение с регистром TMR1 (сбрасывается программно) О - события не было bit1 TMR2IF флаг-бит прерывания по совпадению TMR2 и PR2 1 = произошло совпадение TMR2 и PR2 (сбрасывается программно) О - совпадения не было bitO TMR1IF флаг-бит прерывания по переполнению TMR1 1 = регистр TMR1 переполнен (сбрасывается программно) О = регистр TMR1 не переполнен 106
Структура и базовые функции микроконтроллеров Регистр PIR2 bit7 OSCIF флаг-бит прерывания по сбою тактового генератора 1 = сбой генератора, тактирование переключено на fNTOSC (бит должен быть сброшен программно) О = нормальное тактирование, сбоя не было bit6 CM1F флаг-бит прерывания компаратора 1 = вход компаратора изменился О = вход компаратора не менялся bit5 USBiF флаг-бит прерывания по USB 1 = модуль USB затребовал прерывание (сбрасывается программно) О = прерывание от USB не запрашивалось bit4 EEIF флаг-бит прерывания по записи в EEPROM/FLASH 1 = операция записи завершена (сбрасывается программно) О - операция не завершена или не начиналась bit3 BCLIF флаг-бит прерывания по конфликту шины 1 - произошел конфликт шины (сбрасывается программно) О = не было конфликта шины bit2 HLVDIF флаг бит прерывания по обнаружению перепада напряжения 1 = был перепад питающего напряжения (сбрасывается программно) О = событие перепада не обнаружено bit1 TMR3IF флаг-бит прерывания по переполнению TMR3 1 = регистр TMR3 переполнен (сбрасывается программно) О - регистр TMR3 не переполнен bitO CCP2IF флаг-бит прерывания от модуля ССР2 Режим захвата 1 - произошел захват регистра TMR1 или ТМВЗ(сбрасывается програм- мно) О = события захвата не было Режим компаратора 1 = совпадение с регистром TMR1 или TMR3 (сбрасывается програм- мно) О = события не было Режим ШИМ В этом режиме не используется 107
Гпава 1 Регистры PIE1 и PIE2 содержат индивидуальные биты разрешения перифе- рийных прерываний. Если IPEN = 0, то для разрешения перечисленных далее периферийных прерываний должен установлен бит PEIE. Регистр PIE1 bit7 SPPIE бит разрешения прерывания по чтению/записи в параллельный потоковый порт 1 = прерывание по чтению/записи SPP разрешено О = прерывание запрещено Примечание: этот бит резервирован для 28-еыводных корпусов. Всегда оставляйте этот бит сброшенным. bit6 ADIE бит разрешения прерывания от АЦП 1 = прерывание от АЦП разрешено О = прерывание запрещено bit5 RCIE бит разрешения прерывания по приему от EUSART 1 = прерывание от EUSART разрешено О = прерывание запрещено bit4 TXIE бит разрешения прерывания по передаче EUSART 1 ~ прерывание от EUSART разрешено О = прерывание запрещено bits SSPIE бит разрешения прерывания от ведущего синхронного последовательного порта 1 = прерывание от MSSP разрешено О = прерывание запрещено bit2 ССР1 IE бит разрешения прерывания от ССР1 1 = прерывание разрешено О = прерывание запрещено bitl TMR2IE бит разрешения прерывания по равенству TMR2 и PR2 1 = прерывание разрешено О = прерывание запрещено bitO TMR1IE бит разрешения прерывания по переполнению TMR1 1 = прерывание разрешено О = прерывание запрещено Регистр Р1Е2 bit7 OSCFIE бит разрешения прерывания по сбою тактового генератора 1 = прерывание разрешено О = прерывание запрещено 108
Структура и базовые функции микроконтроллеров bit6 CMIE бит разрешения прерывания от компаратора 1 = прерывание разрешено О - прерывание запрещено bit5 USBIE бит разрешения прерывания от модуля USB 1 = прерывание разрешено О = прерывание запрещено bit4 EEIE бит разрешения прерывания по записи/чтению EEPROM/Flash 1 = прерывание разрешено О = прерывание запрещено bit3 BCLIE бит разрешения прерывания по конфликту шины 1 = прерывание разрешено О = прерывание запрещено bit2 HLVDIE бит разрешения прерывания по перепаду питающего напря- жения 1 = прерывание разрешено О = прерывание запрещено bit1 TMR3IE бит разрешения прерывания по переполнению TMR3 1 = прерывание разрешено О = прерывание запрещено bitO CCP2IE бит разрешения прерывания от ССР2 1 = прерывание разрешено О = прерывание запрещено Регистры IPR1 и IPR2 содержат индивидуальные биты приоритета для пери- ферийных прерываний. Чтобы значения этих битов вступили в силу, необходимо установить бит включения приоритетов IPEN. Регистр IPR1 bit7 SPPIP бит приоритета прерывания от потокового параллельного порта 1 = высокий приоритет О = низкий приоритет Примечание: этот бит резервирован для 28-выводных корпусов. Всегда оставляйте этот бит сброшенным. bit6 ADIP бит приоритета прерывания от АЦП 1 = высокий приоритет О = низкий приоритет 109
Глава 1 bit5 RCIP бит приоритета прерывания от передатчика EUSART 1 = высокий приоритет О - низкий приоритет bit4 TXIP бит приоритета прерывания от приемника EUSART 1 = высокий приоритет О = низкий приоритет bit3 SSPIP бит приоритета прерывания от ведущего синхронного последовательного порта 1 = высокий приоритет О = низкий приоритет bit2 CCP1IP бит приоритета прерывания от ССР1 1 = высокий приоритет О = низкий приоритет bitl TMR2IP бит приоритета прерывания по равенству TMR2 и PR2 1 = высокий приоритет О = низкий приоритет bitO TMR1 IP бит приоритета прерывания по переполнению TMR1 1 = высокий приоритет О = низкий приоритет Регистр IPR2 bit7 OSCFIP бит приоритета прерывания по сбою тактового генератора 1 = высокий приоритет О = низкий приоритет bit6 CMIP бит приоритета прерывания от компаратора 1 = высокий приоритет О = низкий приоритет bit5 USBIP бит приоритета прерывания от модуля USB 1 = высокий приоритет О = низкий приоритет bit4 EEIP бит приоритета прерывания по записи в EEPROM/Flash 1 = высокий приоритет О = низкий приоритет bits BCLIP бит приоритета прерывания по конфликту шины 1 - высокий приоритет О = низкий приоритет 110
Структура и базовые функции микроконтроллеров bit2 HLVDIP бит приоритета прерывания по перепаду питания 1 = высокий приоритет О - низкий приоритет bitl TMR3IP бит приоритета прерывания по переполнению TMR3 1 = высокий приоритет О = низкий приоритет bitO CCP2IP бит приоритета прерывания от ССР2 1 = высокий приоритет О - низкий приоритет Регистр RCON Регистр RCON содержит флаг-биты, которые используются для определения факта последнего сброса или пробуждения из режима Sleep или Idle. Также этот ре- гистр содержит бит IPEN, разрешающий использование приоритетов прерываний. bit7 IPEN бит разрешения приоритета прерываний 1 = разрешено использование различных приоритетов прерываний О = приоритеты прерываний не используются (режим совместимости с Р1С16Сххх) bit6...bit0 детально описаны ранее, в разделе «Сброс». Внешние прерывания по фронтам INTn Внешние прерывания по выводам RB0/AN12/INT0/FLT0/SDI/SDA, RB1/AN10/INT1/SCK/SCL и RB2/AN8/INT2/VMO являются запускаемыми по фронту. Если соответствующий бит INTEDGx регистра INTCON2 установлен в «1», прерывание генерируется по нарастанию сигнала, если бит сброшен, то по спаду. Когда валидный фронт сигнала поступает на один из выводов RBx/INTx, уста- навливается соответствующий флаг-бит INTxF. Это прерывание может быть за- прещено сбросом соответствующего разрешающего бита INTxE. Флаг-бит пре- рывания должен быть сброшен программно перед выходом из подпрограммы обработки прерывания. Все внешние прерывания(1МТ0, INT1 и INT2) могут пробудить процессор из энергосберегающего режима, если разрешающий бит INTxE был установлен до перехода в энергосберегающий режим. Если установлен бит глобального разре- шения прерываний, то сразу после пробуждения процессор перейдет на вектор •’рерывания. Приоритет прерываний INT1 и INT2 зависит от состояния разрядов INT1IP :NTCON3<6>) и INT2IP (INTCON3<7>). С прерыванием INTO не ассоциирован бит приоритета, потому что зто прерывание всегда имеет высший приоритет. 111
Гпава 1 Прерывание по переполнению TMRO В 8-разрядном режиме (по умолчанию) флаг-бит TMR0IF устанавливается при переполнении TMRO (FFh -> OOh). В 16-разрядном режиме флаг-бит прерывания устанавливается при переполнении регистровой пары TMR0H:TMR0L (FFFFh -> OOOOh). Прерывание может быть разрешено/запрещено при помощи бита TMR0IE (INTCON<5>). Приоритет прерывания зависит от состояния бита TMR0IP (INTCON2<2>). Прерывание по изменению порта PORTB Изменение входного уровня хотя бы на одном из выводов PORTB<7:4> уста- навливает флаг-бит RBIF (INTCON<0>). Прерывание может быть разреше- но/запрещено при помощи бита RBIE (INTCON<3>). Приоритет прерывания зави- сит от состояния бита RBIP (INTCON2<0>). Сохранение переменных при обработке прерывания При обработке прерывания адрес возврата сохраняется в стеке. Кроме того, аккумулятор W, регистр STATUS и регистр BSR сохраняются в стеке быстрого возврата. Если быстрый возврат из прерывания не используется, то пользовате- лю может потребоваться сохранить эти регистры при входе в процедуру обра- ботки прерывания. В зависимости от нужд пользователя, могут быть сохранены и другие регистры. Приведенный ниже пример показывает, как следует сохранять аккумулятор W, регистр STATUS и регистр BSR при входе в подпрограмму обра- ботки прерывания: MOVWF MOVFF MOVFF W-TEMP STATUS, STATUS_TEMP BSR, BSR.TEMP КОД ПОДПРОГРАММЫ ПОЛЬЗОВАТЕЛЯ MOVFF MOVFF MOVF BSR_TEMP, BSR STATUS_TEMP, STATUS W„TEMP, W Порты ввода-вывода В зависимости от того, как настроена конфигурация микроконтроллера, поль- зователю доступно до пяти портов ввода-вывода. Многие выводы микроконтрол- лера мультиплексируются с другими функциями периферийных модулей. В большинстве случаев, если включен периферийный модуль, то ассоциированные с ним выводы не могут быть использованы в качестве портов. С каждым портом ассоциировано три регистра: • TRIS - регистр, управляющий направлением передачи данных; • PORTx - регистр для чтения внешних уровней на выводах (операция ввода); . регистр-защелка LAT для защелкивания данных, подлежащих выводу. 112
Структура и базовые функции микроконтроллеров Примечание: Вывод порта оснащен защитными диодами Рис. 1.46. Структурная схема обобщенного порта ввода-вывода Структурная схема базового порта, без связи с прочей периферией, показана на рис. 1.46. Регистры PORTA, TRISA и LATA PORTA является семиразрядным двунаправленным портом. Установка в «1» бита регистра TRISA настраивает соответствующую линию порта на ввод и пере- водит выходной каскад в высокоимпедансное состояние. Сброс бита регистра TRISA переключает соответствующую линию порта в режим вывода и устанавли- вает на ней уровень, определяемый состоянием защелки данных. Чтение регистра PORTA возвращает значения реально присутствующих ло- гических уровней, запись в регистр помещает новые данные в защелку LATA. Регистр защелки данных LATA также отображается на область памяти. Опера- ция «чтение-модификация-запись» позволяет прочитать текущее состояние уров- ней на выводах порта, модифицировать их и вывести обновленные значения. Вывод RA4 мультиплексируется с входом тактовых импульсов таймера TimerO. Кроме того, RA4 мультиплексируется с модулем USB и может использо- ваться, как вход приемника встроенного трансивера USB. 113
Гпава 1 Вывод RA6 мультиплексируется с выводом основного тактового генератора. Функция этого вывода зависит от выбора источника тактирования в регистре конфигурации. Если этот вывод не используется, как линия порта, то попытка чтения бита RA6 и соответствующих битов TRIS и LAT будет возвращать «О». Некоторые выводы порта мультиплексируются с аналоговыми входами АЦП, аналоговыми входами VREF+ и VREF. и выходами опорных напряжений компарато- ра. Работа выводов R5 и RA3:RA0 в качестве входов АЦП зависит от состояния управляющих битов регистра ADCON1. По умолчанию, после сброса по включению питания, выводы R5 и RA3:RA0 сконфигурированы, как аналоговые входы и читаются, как «О». Вывод RA4 скон- фигурирован, как цифровой вход. Состояние битов регистра TRISA определяет использование линии порта в качестве входа не только в цифровом режиме. Если пользователь использует линию порта в качестве аналогового входа, он должен убедиться, что соответст- вующий бит регистра TRISA установлен в «1». В противном случае включится цифровой выходной каскад и сделает прием аналогового сигнала невозможным. Пример инициализации порта А: CLRF PORTA ; инициализация порта очисткой выходных значений CLRF LATA ; альтернативный метод инициализации MOVLW OFh ; конфигурирование линий АЦП MOVWF ADCON1 ; для использования в качестве цифровых входов ; порта MOVLW 07h ; конфигурирование входов компараторов MOVWF CMCON ; для использования в качестве цифровых входов ;порта MOVLW OCFh ; константа для определения направлений пере- ; Дачи MOVWF TRISA ; настроили RA3-.RA0 как входы и RA51RA4 как ; выходы Таблица 1.18 Описание функций выводов порта А Вывод Функция TRIS I/O Тип I/O Описание RAO/ANO RAO 0 OUT D Выход данных LATA<0> 1 IN TTL Вход данных PORTA<0>. Отключен, если включен аналоговый вход AND 1 IN A Вход канала 0 АЦП и компаратора С1. Состоя- ние по умолчанию при сбросе. Не влияет на цифровой выход RA1/AN1 RA1 0 OUT D Выход данных LATA<1> 1 IN TTL Вход данных PORTA<1>. По сбросу читается «0» AN1 1 IN A Вход канала 1 АЦП и компаратора С2. Состоя- ние по умолчанию при сбросе. Не влияет на цифровой выход 114
Структура и базовые функции микроконтроллеров Вывод Функция TRIS I/O Тип I/O Описание RA2 AN2 Vref- CVref RA2 0 OUT D Выход данных LATA<2>. Отключен, если включен выход CVref 1 IN TTL Вход данных PORTA<2>. Отключен при вклю- чении аналоговых функций. Отключен, если включен выход CVref AN2 1 IN A Вход канала 2 АЦП и компаратора С2. Состоя- ние по умолчанию при сбросе Vref- 1 IN A Вход опорного напряжения АЦП и компаратора CVref X OUT A Выход опорного напряжения компаратора. Включение этого режима отключает цифровой ввод/вывод RA3 AN3 Vref+ RA3 0 OUT D Выход данных LATA<3> 1 IN TTL Вход данных PORTA<3>. Отключен при вклю- чении аналогового входа AN3 1 IN A Вход канала 3 АЦП и компаратора С1+. Кон- фигурация по умолчанию после сброса Vref+ 1 IN A Вход высокого опорного напряжения АЦП и компаратора RA4 TOCKI сюит RCV RA4 0 OUT D Выход данных LATA<4> 1 IN ST Вход данных PORTA<4>. Отключен при вклю- чении аналогового входа TOCKI 1 IN ST Вход тактовых импульсов таймера TimerO сюит 0 OUT D Выход компаратора 1; имеет приоритет перед данными порта RCV X IN TTL Вход RCV внутреннего приемопередатчика USB RA5 AN4 ss HLVDIN C2OUT RA5 0 OUT D Вход данных LATA<5> 1 IN TTL Вход данных PORTA<5>. Отключен при вклю- чении аналогового входа AN4 1 IN A Вход канала 4 АЦП. Конфигурация по умолча- нию после сброса SS 1 IN TTL Вход выбора режима ведомого SSP (модуль MSSP). HLVDIN 1 IN A Вход контроля за спадом питающего напряжения C2OUT 0 OUT D Выход компаратора 2; имеет приоритет перед данными порта OSC2 CLKO RA6 RA6 0 OUT D Выход данных LATA<6>. Доступен только в ре- жимах ЕСЮ, ЕСРЮ и INTIO, иначе читается «0» 1 IN TTL Вход данных PORTA<6>. Доступен только в ре- жимах ЕСЮ, ЕСРЮ и INTIO, иначе читается «0» OSC2 X OUT A Вывод внешнего тактового генератора (все режимы XT и HS) CLKO X OUT D Выход тактовых импульсов Fosc/4. Доступен в режимах ЕС, ECPLL и INTCKO Обозначения: OUT - выход, IN - вход, А - аналоговый сигнал, D - цифровой выход, ST - вход с триггером Шмита, TTL - вывод с буфером TTL, X - не используется или не имеет значения. 115
Гпава 1 Таблица 1.19 Регистры, ассоциированные с портом А Название Bit 7 Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 BitO PORTA - RA6(1) RA5 RA4 RA3 RA2 RA1 RAO LATA - LATA6<1) LATA5 LATA4 LATA3 LATA2 LATA1 LATAO TRISA - TRISA6(1) TRISA5 TRISA4 TRISA3 TRISA2 TRISA1 TRI- SAO ADCON1 - - VCFG1 VCFGO PCFG3 PCFG2 PCFG1 PCFGO CMCON C2OUT сюит C2INV C1INV CIS СМ2 CM1 CMO CVRCON CVREN CVROE CVRR CVRSS CVR3 CVR2 CVR1 CVRO UCON - PPBRST SEO PKTDIS USBEN RESUME SUSPND (1) RA6, ассоциированная защелка и указатель направления передачи данных вклю- чаются в зависимости от конфигурации тактового генератора. Регистры PORTB, TRISB и LATB PORTB является восьмиразрядным двунаправленным портом. Установка в «1» бита регистра TRISB настраивает соответствующую линию порта на ввод и переводит выходной каскад в высокоимпедансное состояние. Сброс бита реги- стра TRISB переключает соответствующую линию порта в режим вывода и уста- навливает на ней уровень, определяемый состоянием защелки данных. Чтение регистра PORTB возвращает значения реально присутствующих на выво- дах логических уровней, запись в регистр помещает новые данные в защелку LATB. Регистр защелки данных LATB также отображается на область памяти. Опера- ция «чтение-модификация-запись» позволяет прочитать текущее состояние уров- ней на выводах порта, модифицировать их и вывести обновленные значения. Каждый из выводов порта имеет встроенный подтягивающий резистор. Един- ственный управляющий бит RBPU (1NTCON2<7>) управляет включением одно- временно всех резисторов. Подтягивающий регистр автоматически отключается, если линия порта настраивается, как выход. По умолчанию после сброса подтягивающие резисторы отключены, линии RB4-.RB0 сконфигурированы, как аналоговые входы и при чтении возвращают «О». RB7:RB5 сконфигурированы, как цифровые входы. Путем программирования бита конфигурации PBADEN (CONFIG3H<1>) линии RB4:RB0 также могут быть настроены, как цифровые входы по умолчанию после сброса. Четыре линии (RB7:RB4) поддерживают генерацию прерывания по изменению состояния. Но только линии, сконфигурированные на ввод, могут генерировать прерывание по изменению входного сигнала. Текущие логические уровни на вхо- дах RB7:RB4 сравниваются с защелкнутыми в момент последнего чтения регист- ра PORTB. При несовпадении хотя бы одного бита генерируется прерывание. При обработке прерывания невозможно определить, какая именно линия вызва- ла прерывание. Прерывание по изменению уровня может использоваться для пробуждения микроконтроллера из режима Sleep. В процессе обработки прерывания пользо- ватель может сбросить флаг-бит двумя способами: 116
Структура и базовые функции микроконтроллеров - любым чтением или записью в PORTB (кроме команды MOVFF (***), PORTB). Это аннулирует состояние несовпадения; - непосредственно сбросить флаг-бит RBIF. Но если несовпадение сохраня- ется, то этот флаг-бит будет немедленно установлен вновь. Опция прерывания по изменению состояния удобна для обнаружения нажатия кнопок. Не рекомендуется производить программный опрос линий порта, если задействована опция прерывания по изменению (при опросе состояние несовпа- дения может быть устранено до того, как сгенерируется прерывание). Выводы RB2 и RB3 мультиплексируются с периферийным модулем USB и ис- пользуются, как дифференциальный выход приемопередатчика. Более подробно функционирование USB рассмотрено в Главе 2. Вывод RB4 мультиплексируется с модулем CSSPP, функцией выбора кри- сталла для потокового параллельного порта. Подробнее эта функция рассмотре- на в разделе «Потоковый параллельный порт» Главы 2. Пример инициализации порта В: CLRF PORTB; инициализация порта очисткой выходных значений CLRF LATB ; альтернативный метод инициализации MOVLW OEh ; конфигурирование линий АЦП MOVWF ADCON1 ; для использования в качестве цифровых входов ;порта MOVLW OCFh ; константа для определения направлений передачи MOVWF TRISB ; настроили RB31RB0 как входы, RB51RB4 как ; выходы и ; RB7:RB6 как входы. Таблица 1.20 Описание функций выводов порта В Вывод Функция TRIS I/O Тип I/O Описание RB0 AN12 INTO FLT0 SDI SDA RB0 0 OUT D Выход данных LATB<0> 1 IN TTL Вход данных PORTB<0>, имеется подтяги- вающий резистор. Отключен, если включен аналоговый вход(1) AN12 1 IN A Вход канала 12 АЦП(1) INTO 1 IN ST Вход внешнего прерывания 0 FLTO 1 IN ST Вход расширенного ШИМ (модуль ЕССР). Включается программно SDI 1 IN ST Вход данных SPI™ (модуль MSSP) SDA 1 OUT D Выход данных 12С™ (модуль MSSP); имеет приоритет перед данными порта 1 IN l2C SMB Вход данных 12С (модуль MSSP); тип входа за- висит от настройки модуля 117
Глава 1 Вывод Функция TRIS I/O Тип I/O Описание RB1 AN10 INT1 SCK SCL RB1 0 OUT D Выход данных LATB<1> 1 IN TTL Вход данных PORTB<1>, имеется подтяги- вающий резистор. Отключен, если включен аналоговый вход(1) AN10 1 IN A Вход канала 10 АЦП(1) INT1 1 IN ST Вход внешнего прерывания 1 SCK 0 OUT D Выход тактов SPI (модуль MSSP); имеет при- оритет перед данными порта 1 IN ST Вход тактов SPI (модуль MSSP) SCL 0 OUT D Выход тактов l2C (модуль MSSP); имеет при- оритет перед данными порта 1 IN l2C SMB Вход тактовое (модуль MSSP); тип входа за- висит от настройки модуля RB2 AN8 INT2 VMO RB2 0 OUT D Выход данных LATB<2> 1 IN TTL Вход данных PORTB<2>, имеется подтяги- вающий резистор. Отключен, если включен аналоговый вход(1) AN8 1 IN A Вход канала 8 АЦП(1) INT2 1 IN ST Вход внешнего прерывания 2 VMO 0 OUT D Выход данных VMO внешнего приемопередат- чика USB RB3 AN9 ССР2 VPO RB3 0 OUT D Выход данных LATB<3> 1 IN TTL Вход данных PORTB<3>, имеется подтяги- вающий резистор. Отключен, если включен аналоговый вход(1> AN9 1 IN A Вход канала 9 АЦП(1> CCP2(2> 0 OUT D Выход ШИМ и сравнения ССР2 1 IN ST Вход захвата ССР2 VPO 0 OUT D Выход данных VPO внешнего приемопередат- чика USB RB4 AN11 KBIO CSSPP RB4 0 OUT D Выход данных LATB<4> 1 IN TTL Вход данных PORTB<4>, имеется подтяги- вающий резистор. Отключен, если включен аналоговый вход(1> AN11 1 IN A Вход канала 11 АЦП(1) KBIO 1 IN TTL Прерывание по изменению состояния CSSPP(4> 0 IN D Выход сигнала выбора кристалла SPP 118
Структура и базовые функции микроконтроллеров Вывод Функция TRIS I/O Тип I/O Описание RB5 КВ11 PGM RB5 0 OUT D Выход данных LATB<5> 1 IN TTL Вход данных PORTB<5>, имеется подтяги- вающий резистор КВИ 1 IN TTL Прерывание по изменению состояния. PGM X IN ST Вход внутрисхемной отладки (ICSP™). Вклю- чается битом конфигурации LVP, при этом ос- тальные функции отключаются RB6 KBI2 PGC RB6 0 OUT DIG Выход данных LATB<6> 1 IN TTL Вход данных PORTB<6>, имеется подтяги- вающий резистор KBI2 1 IN TTL Прерывание по изменению состояния PGC X IN IN Вход тактов последовательного выполнения (ICSP) для ICSP и ICD(3> RB7/KBI3Z PGD RB7 0 OUT DIG Выход данных LATB<7> 1 IN TTL Вход данных PORTB<7>, имеется подтяги- вающий резистор KBI3 1 IN TTL Прерывание по изменению состояния PGD X OUT DIG Выход данных последовательного выполнения ICSP и ICD(3) X IN ST Вход данных последовательного выполнения ICSP и ICD(3) Обозначения: OUT - выход, IN - вход, А - аналоговый сигнал, D - цифровой выход, ST - вход с триггером Шмита, TTL - вывод с буфером TTL, X - не используется или не имеет значения. <1> Конфигурация после сброса по питанию зависит от бита конфигурации PBADEN. Вывод сконфигурирован, как аналоговый вход, если PBADEN = 1, и как цифровой вход, если PBADEN = 0. <2> Назначением по умолчанию является RC1. Если бит ССР2МХ = 0, назначением яв- ляется ССР2. (3> Если включены функции ICSP или ICD, все остальные функции вывода отключаются. (4> Только для микросхем с 40/44 выводами. Таблица 1.21 Регистры, ассоциированные с портом В Название Bit 7 Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 BitO PORTB RB7 RB6 RB5 RB4 RB3 RB2 RB1 RBO LATB LATB7 LATB6 LATB5 LATB4 LATB3 LATB2 LATB1 LATBO TRISB TRISB7 TRISB6 TRISB5 TRISB4 TRISB3 TRISB2 TRISB1 TRISB 0 INTCON GIE/GIEH PEIE/GIEL TMROIE INTOIE RBIE TMROIF INTOIF RBIF INTCON2 RBPU INTEDGO INTEDG1 INTEDG2 - TMR0IP - RBIP INTCON3 INT2IP INT1IP - INT2IE INT1IE - INT2IF INTI IF 119
Глава 1 Название Bit 7 Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 BitO ADCON1 - VCFG1 VCFGO PCFG3 PCFG2 PCFG1 PCFGO SPPCON(1) - - - - - - SPPOW N SPPEN SPPCFG(1> CLKCFG1 CLKCFGO CSEN CLK1EN WS3 WS2 WS1 WSO UCON - PPBRST SEO PKTDIS USBEN RESUME SUSPND - (1> Эти регистры недоступны в 28-выводных микросхемах. Регистры PORTC, TRISC и LATC PORTC является семиразрядным двунаправленным портом. В микрокон- троллерах PIC18F2455/2550/4455/4550 линия RC3 недоступна. Установка в «1» бита регистра TRISC настраивает соответствующую линию порта на ввод и переводит выходной каскад в высокоимпедансное состояние. Сброс бита регистра TRISC переключает соответствующую линию порта в режим вывода и устанавливает на ней уровень, определяемый состоянием защелки данных. Чтение регистра PORTC возвращает значения реально присутствующих на выводах логических уровней, запись в регистр помещает новые данные в защел- ку LATC. Регистр защелки данных LATC также отображается на область памяти. Опера- ция «чтение-модификация-запись» позволяет прочитать текущее состояние уров- ней на выводах порта, модифицировать их и вывести обновленные значения. Выводы порта мультиплексируются с модулями последовательного обмена данными, включая EUSART, MSSP и USB. За исключением RC4 и RC5, осталь- ные линии порта имеют на входе триггеры Шмита. Выводы RC4 и RC5 мультиплексированы с модулем USB. В зависимости от конфигурации модуля, они могут быть использованы, как дифференциальная линия данных для встроенного приемопередатчика USB, или как вход данных от внешнего приемопередатчика. Эти выводы имеют входные буферы TTL. В отличие от остальных выводов порта С, линии RC4 и RC5 не имеют ассо- циированных с ними разрядов регистра TRISC. В режиме цифрового порта эти линии работают только на ввод. При работе с модулем USB направление пере- дачи данных через эти выводы зависит от конфигурации и текущего статуса мо- дуля USB. Если используется внешний приемопередатчик, эти выводы всегда работают, как входы от приемопередатчика. Если подключен внешний приемопередатчик USB, вывод RC2 также исполь- зуется для управления выходом приемопередатчика. Более подробно работа модуля USB рассмотрена в гл. 2. Когда включаются периферийные модули, мультиплексируемые с иными, чем RC4 и RC5 линиями, необходимо соблюдать аккуратность при настройке битов регистра TRISC. Требования периферийного модуля к направлению передачи данных могут вступать в противоречие с текущей установкой бита TRIS. Для кор- ректной установки всех битов TRIS следует изучить описание соответствующих периферийных модулей. Содержимое регистра TRISC игнорируется периферийными модулями. Чтение регистра TRISC будет возвращать записанное в него значение, то- гда как реально некоторые модули могут изменить направление передачи 120
Структура и базовые функции микроконтроллеров данных в соответствии со своим алгоритмом работы. По умолчанию все вы- воды порта настроены, как цифровые входы. Пример инициализации порта С: CLRF PORTC ; инициализация порта путем его очистки CLRF LATC ; альтернативный метод очистки выходной защелки MOVLW 07h ; константа, определяющая направление передачи MOVWF TRISC ; RC51RC0 как выходы, RC7:RC6 как входы Таблица 1.22 Описание функций выводов порта С Вывод Функция TRIS I/O Тип I/O Описание 1 RC0 RC0 0 OUT D Выход данных LATC<0> 1 IN ST Вход данных PORTC <0> : Tioso T13CKI T1OSO X OUT A Выход тактов от генератора Timerl. Включа- ется при включении генератора, отменяя цифровой ввод/вывод T13CKI 1 IN ST Вход счетчика Timerl /Timer3 RC1 T1OSI ССР2 UOE RC1 0 OUT D Выход данных LATC<1 > 1 IN ST Вход данных PORTC<1 > T1OSI X IN A Вход генератора Timerl; Включается при включении генератора, отменяя цифровой ввод/вывод ССР2<1) 0 OUT D Выход сравнения ССР2 и ШИМ; имеет при- оритет перед данными порта 1 IN ST Вход захвата ССР2 UOE 0 OUT D Выход ОЕ внешнего приемопередатчика USB RC2 ССР1 Р1А RC2 0 OUT D Выход данных LATC<2> 1 IN ST Вход данных PORTC<2> ССР1 0 OUT D Выход сравнения ЕССР1 и ШИМ; имеет при- оритет перед данными порта 1 IN ST Вход захвата ЕССР1 Р1А(3) 0 OUT D Выход ЕССР1 ШИМ; Имеет приоритет перед данными порта. Может быть сконфигуриро- ван, как тристабильный при событиях отклю- чения расширенного ШИМ RC4 D- VM RC4 _<2) IN TTL Вход данных PORTC<4>; отключается при включении USB D- _(2) OUT XCVR Выход линии D- встроенного приемопере- датчика USB _(2) IN XCVR Вход линии D- встроенного приемопередат- чика USB VM J2) IN TTL Вход УМ внешнего приемопередатчика USB | 121
Глава 1 Вывод Функция TRIS I/O Тип I/O Описание RC5 D+ VP RC5 J2) IN TTL Вход данных PORTC<5>; отключается при включении USB D+ _(2) OUT XCVR Выход линии D+ встроенного приемопере- датчика USB _(2) IN XCVR Вход линии D+ встроенного приемопередат- ( чика USB i VP _(2) IN TTL Вход VP внешнего приемопередатчика USB RC6 ТХ СК RC6 0 OUT D Выход данных LATC<6> 1 IN ST Вход данных PORTC<6> ТХ 0 OUT D Выход асинхронного последовательного пор- та (модуль EUSART); имеет приоритет перед данными порта СК 0 OUT D Выход тактов синхронного последовательно- го порта (модуль EUSART). Имеет приоритет перед данными порта 1 IN ST Вход тактов синхронного последовательного порта (модуль EUSART) RC7 RX DT SDO RC7 0 OUT D Выход данных LATC<7> 1 IN ST Вход данных PORTC<7> RX 1 IN ST Вход данных асинхронного порта (модуль EUSART) DT 1 OUT D Выход данных синхронного порта (модуль EUSART); имеет приоритет перед данными SPI и порта 1 IN ST Выход данных синхронного порта (модуль EUSART) SDO 0 OUT D Выход данных SPI (модуль MSSP); имеет приоритет перед данными порта Обозначения: OUT - выход, IN - вход, А - аналоговый сигнал, D - цифровой выход, ST - вход с триггером Шмита, TTL - вывод с буфером TTL, X - не используется или не имеет значения, XCVR - приемопередатчик USB. (1) Назначение выводов по умолчанию. Альтернативным назначением вывода являет- ся RB3 (когда бит ССР2МХ = 0). (2) RC4 и RC5 не связаны с регистром TRISC. В режиме порта они работают только как входы. Направление передачи USB зависит от конфигурации этого модуля. (3) Только для 40/44-выводных корпусов. Таблица 1.23 Регистры, ассоциированные с портом С Название Bit 7 Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 BitO PORTC RC7 RC6 RC5(1) RC4(1) - RC2 RC1 RCO LATC LATC7 LATC6 - - - LATC2 LATC1 LATCO TRISC TRISC7 TRISC6 - TRISC2 TR1SC1 TRISCO UCON - PPBRST SEO PKTDIS USBEN RESUME SUSPND - (1) RC5 и RC4 доступны, как выводы порта, когда модуль USB отключен (UCON<3> - 0). 122
Структура и базовые функции микроконтроллеров Регистры PORTD, TRISD и LATD Порт D доступен только в 40/44-выводных корпусах. Он является восьми- разрядным двунаправленным портом. Установка в «1» бита регистра TRISD на- страивает соответствующую линию порта на ввод и переводит выходной каскад в высокоимпедансное состояние. Сброс бита регистра TRISD переключает соот- ветствующую линию порта в режим вывода и устанавливает на ней уровень, оп- ределяемый состоянием защелки данных. Чтение регистра PORTD возвращает значения реально присутствующих на выводах логических уровней, запись в регистр помещает новые данные в защел- ку LATD. Регистр защелки данных LATD также отображается на область памяти. Опера- ция «чтение-модификация-запись» позволяет прочитать текущее состояние уров- ней на выводах порта, модифицировать их и вывести обновленные значения. Все выводы порта D оснащены на входе триггерами Шмита. Каждый из выво- дов порта имеет встроенный подтягивающий резистор. Единственный управ- ляющий бит RDPU (PORTE<7>) управляет включением одновременно всех рези- сторов. Подтягивающий регистр автоматически отключается, если линия порта настраивается, как выход. По умолчанию после сброса подтягивающие резисто- ры отключены. Порт Е описан в следующем разделе. Три вывода порта D мультиплексируются с выходами Р1В, Р1С и P1D модуля ЕССР. По умолчанию после сброса по питанию эти выводы сконфигурированы, как цифровые входы. Также порт D может быть сконфигурирован, как 8-разрядный потоковый па- раллельный порт (SPP). В этом режиме используются входные буферы TTL. Ес- ли режим расширенной ШИМ используется с парными или квадратурными выхо- дами, то функция SSP порта D автоматически отключается. Пример инициализации порта D: CLRF PORTD ; инициализация порта путем очистки выходной защелки CLRF LATD ; альтернативный способ очистки защелки MOVLW OCFh ; константа для настройки направления передачи данных MOVWF TRISD ; RD3:RD0 входы, RD5.RD4 выходы, RD7.-RD6 входы Таблица 1.24 Описание функций выводов порта D Вывод Функция TRIS I/O Тип I/O Описание RDO SPPO RD0 0 OUT D Выход данных LATD<0> 1 IN ST Вход данных PORTD<0> SPPO 1 OUT D Выход данных SPP<0>. Имеет приоритет перед данными порта 1 IN TTL Вход данных SPP<0> ! RD1 SPP1 RD1 0 OUT D Выход данных LATD<1> 1 IN ST Вход данных PORTDd > SPP1 1 OUT D Выход данных SPP<1>. Имеет приоритет перед данными порта 1 IN TTL Вход данных SPP<1 > 123
Гпаеа 1 Вывод Функция TRIS I/O Тип I/O Описание RD2 SPP2 RD2 0 OUT D Выход данных LATD<2> 1 IN ST Вход данных PORTD<2> SPP2 1 OUT D Выход данных SPP<2>. Имеет приоритет перед данными порта 1 IN TTL Вход данных SPP<2> RD3 SPP3 RD3 0 OUT D Выход данных LATD<3> 1 IN ST Вход данных PORTD<3> SPP3 1 OUT D Выход данных SPP<3>. Имеет приоритет перед данными порта 1 IN TTL Вход данных SPP<3> RD4 SPP4 RD4 0 OUT D Выход данных LATD<4> 1 IN ST Вход данных PORTD<4> SPP4 1 OUT D Выход данных SPP<4>. Имеет приоритет перед данными порта 1 IN TTL Вход данных SPP<4> RD5 SPP5 Р1В RD5 0 OUT D Выход данных LATD<5> 1 IN ST Вход данных PORTD<5> SPP5 1 OUT D Выход данных SPP<5>. Имеет приоритет перед данными порта 1 IN TTL Вход данных SPP<5> Р1В 0 OUT D Выход канала В ЕССР1 ШИМ. Имеет при- оритет перед данными порта и SSP<1) RD6 SPP6 Р1С RD6 0 OUT D Выход данных LATD<6> 1 IN ST Вход данных PORTD<6> SPP6 1 OUT D Выход данных SPP<6>. Имеет приоритет перед данными порта 1 IN TTL Вход данных SPP<6> Р1С 0 OUT D Выход канала С ЕССР1 ШИМ. Имеет приоритет перед данными порта и SSP<1). RD7 SPP7 P1D RD7 0 OUT D Выход данных LATD<7> 1 IN ST Вход данных PORTD<7> SPP7 1 OUT D Выход данных SPP<7>. Имеет приоритет перед данными порта 1 IN TTL Вход данных SPP<7> P1D 0 OUT D Выход канала D ЕССР1 ШИМ. Имеет приоритет перед данными порта и SSP<1) Обозначения: OUT - выход, IN - вход, D - цифровой выход, ST ~ вход с триггером Шмита, TTL - вывод с буфером TTL. <1) Может быть сконфигурирован в тристабильное состояние по событию выключения ШИМ 124
Структура и базовые функции микроконтроллеров Таблица 1.25 Регистры, ассоциированные с портом D Название Bit 7 Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 Bit 0 PORTD<3) RD7 RD6 RD5 RD4 RD3 RD2 RD1 RDO LATD(3) LATD7 LATD6 LATD5 LATD4 LATD3 LATD2 LATD1 LATDO TRISD<3) TRISD7 TRISD6 TRISD5 TRISD4 TRISD3 TRISD2 TRISD1 TRISDO PORTE RDPU(3) - - - RE3(1’2) RE2(3) RE1<3) RE0<3) CCP1CON P1M1(3) P1MO(3) DC1B1 DC1B0 CCP1M3 CCP1M2 CCP1M1 CCP1M0 SPPCON<3) - - - - - - SPPOWN SPPEN <1) Доступен, только если функциональность вывода общего сброса отключена (бит конфигурации MCLRE = 0). <2) RE3 в качестве вывода порта доступен как для 28- так и 40/44-выводных корпусов. Все остальные линии и соответствующие разряды PORTE доступны только для 40/44- выводных корпусов. <3) Эти регистры и/или разряды недоступны в 28-выводных корпусах. Регистры PORTE, TRISE и LATE В зависимости оттого, какой из микроконтроллеров PIC18F2455/2550/4455/4550 выбран, PORTE доступен двумя разными путями. Для 40/44-выводных корпусов PORTE является 4-разрядным портом. Три вы- вода (RE0/AN5/CK1SPP, RE1/AN6/CK2SPP и RE2/AN7/OESPP) индивидуально конфигурируются на ввод или вывод. Эти выводы по входу оснащены триггером Шмита. Будучи сконфигурированными, как аналоговые входы, они возвращают при чтении «0». Установка в «1» бита регистра TRISE настраивает соответствующую линию порта на ввод и переводит выходной каскад в высокоимпедансное состояние. Сброс бита регистра TRISE переключает соответствующую линию порта в режим вывода и устанавливает на ней уровень, определяемый состоянием защелки данных. В дополнение к данным порта, регистр PORTE содержит бит RDPU (PORTE<7>), который управляет включением подтягивающих резисторов порта D. Если RDPU = 1, подтягивающие резисторы порта D подключены. Регистр TRISE влияет на направление передачи данных, даже если линии порта настроены, как аналоговые входы. Пользователь обязан убедиться, что значение TRISE соответствует направлению передачи данных при использова- нии аналоговых входов. По умолчанию, при включении питания, линии RE2:RE0 сконфигурированы, как аналоговые входы. Четвертый вывод (MCLRA/PP/RE3) работает только как вход. Его функция за- висит от состояния бита конфигурации MCLRE. Если MCLRE = 0, этот вывод ра- ботает только как цифровой вход. По этой причине он не ассоциирован с регист- рами TRISE и LATE. В противном случае этот вывод является входом общего сброса MCLR. В любой конфигурации этот вывод используется для подключения напряжения программирования. В 28-выводном корпусе порт Е доступен в виде единственной линии RE3, и -олько в случае, когда вход общего сброса отключен (MCLRE = 0). 125
Глава 1 Пример инициализации порта Е: CLRF PORTE ; инициализация порта путем очистки выходной за- ; щелки CLRF LATE ; альтернативный способ очистки выходной за- ; щелки MOVLW OAh ; константа конфигурации АЦП MOVWF ADCON1 ; конфигурируем линии АЦП как цифровые входы MOVLW 03h ; константа конфигурации направления передачи MOVWF TRISE ; RE0 вход, RE1 выход, RE2 вход MOVLW 07h ; константа конфигурации компараторов MOVWF CMCON ; выключаем все компараторы Таблица 1.26 Описание функций выводов порта Е Вывод Функция TRIS I/O Тип I/O Описание RE0 AN5 CK1SPP RED 0 OUT D Выход данных LATE<0> 1 IN ST Вход данных PORTE<0>. Отключается при включении аналогового входа AN 5 1 IN A Вход канала 5 АЦП. Конфигурация по сбросу CK1SPP 0 OUT D Выход тактов 1 SPP (SPP включен) RE1 AN6 CK2SPP RE1 0 OUT D Выход данных LATE<1 > 1 IN ST Вход данных PORTE<1>. Отключается при включении аналогового входа AN6 1 IN A Вход канала 6 АЦП. Конфигурация по сбро- су. CK2SPP 0 OUT D Выход тактов 2 SPP (SPP включен) RE2 AN7 OESPP RE2 0 OUT D Выход данных LATE<2> 1 IN ST Вход данных PORTE<2>. Отключается при включении аналогового входа AN7 1 IN A Вход канала 7 АЦП. Конфигурация по сбросу OESPP 0 OUT D Выход включения SPP (SPP включен) MCLR Vpp RE3 RES _(1) IN ST Вход данных PORTE<3>. Включен, когда сброшен бит конфигурации MCLRE MCLR _<1) IN ST Вход сигнала общего сброса, если бит кон- фигурации MCLRE установлен Vpp _(D IN A Вход напряжения программирования. Досту- пен всегда Обозначения: OUT - выход, IN - вход, А - аналоговый сигнал, D - цифровой выход, ST - вход с триггером Шмита. (1) RE3 не связан с регистром TRISE и всегда работает как вход. 126
Структура и базовые функции микроконтроллеров Таблица 1.27 Регистры, ассоциированные с портом Е Название Bit 7 Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 BitO PORTE RDPU(3) - - - RE3(1'2’ RE2<3> RE1<3) RE0<3) LATE<3) - - - - - LATE2 LATE1 LATEO TRISE(3) - - - - - TR1SE2 TRISE1 TRISEO ADCON1 - - VCFG1 VCFGO PCFG3 PCFG2 PCFG1 PCFGO CMCON C2OUT сюит C2INV C1INV CIS СМ2 CM1 CMO SPPCON(3) - - - - - - SPPOWN SPPEN SPPCFG(3) CLKCFG1 CLKCFGO CSEN CLK1EN WS3 WS2 WS1 WSO (1) Доступен, если вход общего сброса отключен (MCLRE = 0) <2) RE3 доступен в 28- и 40/44-выводных корпусах. Остальные разряды PORTE доступны только в 40/44-выводных корпусах. <3) Зти регистры или биты недоступны в 28-выводных корпусах. Модуль TIMER0 . Модуль TIMER0 обладает следующими опциями: • Программно выбираемые функции таймера и счетчика в 8- и 16-разрядном режиме. • Читаемые и записываемые регистры. • Специальный 8-разрядный программируемый предделитель. • Выбираемый источник тактирования (внешний или внутренний). • Выбор активного фронта для внешних тактов. • Прерывание по переполнению. Регистр TOCON Специальный управляющий регистр T0CON определяет все параметры рабо- ты модуля, включая выбор предделителя. Он доступен для чтения и записи. bit7 TMROON бит включения/выключения модуля TIMER0 1 = модуль включен 0 = модуль остановлен (но не сброшен) bit6 T08BIT бит переключения режимов 8 и 16 разрядов 1 = режим 8-разрядного таймера/счетчика 0 - режим 16-разрядного таймера/счетчика bit5 T0CS бит выбора источника тактов 1 = импульсы с входа T0CKI 0 = внутренние машинные такты (CLKO) bit4 T0SE бит выбора активного фронта тактирующего импульса 1 = инкремент по спаду (переход высокий-низкий на T0CKI) 0 = инкремент по нарастанию (переход низкий-высокий на T0CKI) 127
Гпава 1 Рис. 1.47. Структурная диаграмма модуля TIMERO в 8-разрядном режиме. По сбросу включены 8-разрядный режим, максимальный коэффициент деления и тактирования от TOCKI bits PSA бит управления подключением предделителя 1 = предделитель не подключен, импульсы идут напрямую на модуль О = предделитель подключен ЬИ2-0 T0PS2:T0PS0 биты выбора коэффициента деления 000 = 1:2 001 = 1:4 010= 1:8 011 = 1:16 100 = 1:32 101 = 1:64 110 = 1:128 111 = 1:256 На рис. 1.47 показана упрощенная структурная диаграмма таймера/счетчика в 8-разрядном режиме, а на рис. 1.48, соответственно, в 16-разрядном режиме. Рис. 1.48. Структурная диаграмма модуля T1MER0 в 16-разрядном режиме. 128
Структура и базовые функции микроконтроллеров Модуль может работать как в режиме таймера, так и в режиме счетчика. Это зависит от того, какой источник тактовых импульсов выбран при помощи бита TOCS (T0CON<5>). В режиме таймера модуль инкрементируется с каждым командным циклом (по умолчанию, если не подключен предделитель). Если происходит запись в ре- гистр TMR0, то инкремент блокируется на следующие два цикла. Пользователь может скомпенсировать неточность счета, подкорректировав начальное значе- ние TMR0. Режим счетчика установлен при внешнем тактировании через вывод RA4/T0CKI. К параметрам внешних импульсов предъявляются определенные требования, которые мы рассмотрим ниже. Эти импульсы должны иметь дли- тельность и частоту следования, позволяющие синхронизировать счетчик с фа- зой внутренних тактовых импульсов. Синхронизация приводит к задержке отсче- та на два машинных такта. Чтение и запись в 16-разрядном режиме Регистр TMR0H в действительности не является старшим байтом модуля TimerO в 16-разрядном режиме. На самом деле это буферизированное значение настоящего старшего байта TimerO, недоступного для прямого чтения или записи (см. рис. 1.48). TMR0H обновляется содержимым старшего байта TimerO при чтении регистра TMR0L. Эта техническая тонкость дает гарантию того, что про- грамма прочитает валидное значение счетчика (не произойдет переноса из младшего разряда в старший в промежутке между считыванием младшего и старшего разрядов). В микроконтроллерах, не имеющих этой опции, приходится прибегать к специальным ухищрениям для проверки валидности прочитанного значения таймера, а именно: дважды подряд читать значения старшего байта и сравнивать их между собой. Аналогично, запись в старший байт TimerO происходит через регистр TMR0H. Предварительно записанное в этот регистр значение переносится в TimerO по команде записи в TMR0L. Это позволяет обновить 16-разрядный счетчик в один прием и избежать переноса в процессе обновления. Предделитель и модуль TimerO В качестве предделителя используется 8-разрядный программируемый счет- чик. Он не доступен для прямого чтения или записи, коэффициент деления зада- ется битами T0PS2:T0PS0 (T0CON<2:0>). Если предделитель подключен к модулю TimerO, все команды записи в ре- гистр TMR0 обнуляют счетчик предделителя, начиная отсчет заново. Подключе- ние предделителя к модулю таймера не отменяется. Изменить подключение предделителя можно в любой момент исполнения программы, «на лету». Специ- альная последовательность команд, применяемая для серии PIC16, в данном случае не нужна. Во всяком случае, производитель не оговаривает это в фир- менной документации. Прерывание от TimerO Прерывание по переполнению модуля генерируется, когда регистр TMR0 пе- реполняется с FFh в 00h (8-разрядный режим) или с FFFFh в OOOOh 129
Глава 1 (16-разрядный режим). Это переполнение устанавливает флаг-бит TMR0IF. Пре- рывание можно замаскировать, сбросив бит TMROIE (INTCON<5>). При обработ- ке прерывания следует программно сбросить флаг-бит до выхода из подпро- граммы, в противном случае произойдет зацикливание. Поскольку модуль TimerO отключается в режиме Sleep, прерывание от это- го модуля не может быть использовано для пробуждения процессора. Таблица 1.28 Регистры, ассоциированные с модулем TimerO Назва- ние Bit 7 Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 BitO TMR0L Регистр младшего байта TMR0H Регистр старшего байта INTCON GIE/GIEH PEIE/GIEL TMROIE INTOIE RBIE TMROIF INTOIF RBIF TOCON TMROON Т08В1Т TOCS TOSE PSA T0PS2 T0PS1 TOPSO TRISA -- TRISA6 TRISA5 TRISA4 TRISA3 TRISA2 TRISA1 TRISAO Модуль TIMER1 Модуль Timerl имеет следующие опции: • Программно задаваемый режим 16-разрядного счетчика или таймера. • Доступные для записи и чтения 8-разрядные регистры TMR1H и TMR1L. • Выбираемый источник тактирования (внутренний или внешний) с возможно- стью тактирования от тактовых импульсов процессора или от собственного так- тового генератора. • Прерывание по переполнению. • Сброс модуля запускаемым триггером ССР. • Флаг состояния тактового генератора (Т1 RUN). Упрощенная структурная диаграмма модуля показана на рис. 1.49. Структур- ная диаграмма в режиме 16-разрядного чтения/записи показана на рис. 1.50. Примечание: Если бит T1OSCEN сброшен, инвертор и резистор обратной связи отключаются для снижения потребляемого тока Рис. 1.49. Структурная диаграмма модуля Timerl 130
Примечание: Если бит Т10SCEN сброшен, инвертор и резистор обратной связи отключаются для снижения потребляемого тока. Рис. 1.50. Структурная диаграмма модуля TIMER1 в 16-разрядном режиме Модуль включает в себя экономичный генератор, являющийся дополнитель- ным источником тактирования. Этот источник может быть использован для так- тирования микроконтроллера в энергосберегающих режимах. Модуль Timerl может быть использован в качестве часов реального времени (Real-Time Clock, RTC), что требует минимального количества внешних компо- нентов и незначительного увеличения кода программы. Для управления модулем используется регистр Т1 CON, который также содер- жит бит включения собственного тактового генератора T1OSCEN (T1CON<3>). Модуль может быть включен или выключен при помощи бита TMR1ON (T1CON<0>). bit7 RD16 бит включения 16-разрядного режима 1 = разрешает чтение/запись одной 16-разрядной операцией 0 = разрешает чтение/запись двумя 8-разрядными операциями bit6 Т1 RUN бит состояния системного тактирования 1 = контроллер тактируется от генератора Timerl 0 = контроллер тактируется от другого источника bit5-4 T1CKPS1:T1CKPS0 биты определения коэффициента предделителя 00 = 1:1 01 = 1:2 10 = 1:4 11 = 1:8 bit3 Т1OSCEN бит включения генератора Timerl 131
Гпава 1 1 = генератор Timerl включен О = генератор выключен bit2 T1SYNC бит выбора синхронизации внешних тактовых импульсов Если TMR1CS = 1: 1 = внешние импульсы не синхронизируются О = внешние импульсы синхронизируются Если TMR1CS = 0: Этот бит игнорируется. Модуль использует внутренние импульсы bit1 TMR1CS бит выбора источника тактирования 1 = внешние импульсы с вывода RCO/T10SO/T13CKI (по нарастанию) О - внутренние такты (FOsc/4) bitO TMR1ON бит включения модуля 1 = модуль включен О = модуль остановлен Модуль функционирует в одном из трех режимов: * Таймер. . Синхронный счетчик. . Асинхронный счетчик. Режим работы зависит от бита выбора тактирования TMR1CS (T1CON<1>). Когда этот бит сброшен, Timerl инкрементируется с каждым командным циклом. Если бит установлен, Timerl инкрементируется по нарастанию внешних тактов или тактов собственного генератора (если он включен). Когда модуль Timerl включен, выводы RC1/T1OSC/UOE и RC0/T1OSOrT13CKI становятся входами. Значения управляющих битов регистра TRISC<1:0> при этом игнорируются, значение уровней на выводах читается, как «О». Чтение/запись Timerl в 16-разрядном режиме Когда управляющий бит RD16 (T1CON<7>) установлен, регистр TMR1H ото- бражается на буферный регистр старшего байта счетчика (рис. 1.50). При чтении регистра TMR1L содержимое старшего байта загружается в буфер. Как и в слу- чае с модулем TimerO, эта опция дает гарантию того, что программа прочитает валидное значение счетчика (не произойдет переноса из младшего разряда в старший в промежутке между считыванием младшего и старшего разрядов). Запись в старший байт модуля Timed также происходит через буферный ре- гистр, в момент записи в регистр TMR1L. Поэтому значение в TMR1H должно быть записано до записи в TMR1L. Запись в TMR1H не обнуляет предделитель. Это происходит только при записи в TMR1L. Генератор Timerl Кварцевый резонатор для встроенного тактового генератора модуля Timed подключается между выводами T1OSI и T1OSO. Генератор включается установ- кой в «1» бита T1OSCEN (T1CON<3>). Энергосберегающая схема генератора рассчитана на резонатор с частотой 32 кГц. Она продолжает работать во всех энергосберегающих режимах. 132
Структура и базовые функции микроконтроллеров С1 33 пФ 33 пФ PIC18FXXXX &" T10SI 32,768 кГц T1OSO Рис. 1.51. Типовая схема включения резонатора генератора Timed На рис. 1.51 показана типовая схема включения резонатора. Номиналы конденсаторов имеют ориентировочное значение. Чем больше но- минал конденсатора, тем стабильнее генератор, но тем больше время его запус- ка. На практике применяются конденсаторы с номиналом от 18 до 33 пФ. Произ- водитель рекомендует в качестве начального значения при разработке использо- вать конденсаторы емкостью 27 пФ. Генератор модуля Timerl может использоваться, как источник тактовой часто- ты всего микроконтроллера в энергосберегающих режимах. Установкой битов SCS1:SCSO (OSCCON<1:0>) в состояние «01» микроконтроллер переключается в режим тактирования от вторичного источника SEC_RUN. При этом как процессор, так и периферия тактируются от генератора Timerl. Если бит IDLEN (OSCCON<7>) сброшен, и выполнена команда SLEEP, микроконтроллер пере- ключается в режим SECJDLE. (Режимы SECJ4UN и SECJDLE были описаны выше в этой главе). Всякий раз, когда генератор Timerl является источником тактовой частоты, устанавливается флаг-бит T1RUN (T1CON<6>). Этот бит можно использовать для программного определения текущего режима тактирования. Кроме того, бит может быть установлен при срабатывании системы мониторинга тактовых им- пульсов. Если мониторинг включен и генерация Timerl срывается в момент так- тирования, опрос бита T1RUN будет показывать, тактируется ли прибор от гене- ратора Timerl или от другого источника. Генератор модуля Timerl может работать с двумя уровнями энергопотребле- ния, зависящими от конфигурации прибора. Если установлен бит LPT1OSC, ге- нератор работает в экономичном режиме. В противном случае генератор работа- ет в режиме полного потребления. Потребляемый генератором ток относительно стабилен, независимо от режима работы микроконтроллера в целом. По умолча- нию генератор находится в режиме полного потребления. Поскольку в экономичном режиме генератор Timerl склонен острее реагиро- вать на помехи, высокий уровень окружающих электромагнитных шумов может привести к нестабильной работе генератора. Таким образом, экономичный ре- жим больше подходит для приложений, мало подверженных шумам, но требую- щих предельной экономии энергии источника питания. Особые требования к рисунку печатной платы Чувствительная слаботочная схема генератора может реагировать на им- пульсные сигналы от проводников печатной платы, находящихся в непосредст- венной близости к выводам генератора. 133
Гпава 1 Рис. 1.52. Условная схема разводки платы с защитным кольцом Компоненты схемы, изображенные на рис. 1.51, должны находиться как мож- но ближе к микроконтроллеру. Никакие другие проводники, кроме линий VSs или VDD не должны проходить внутри области монтажа элементов генератора или по границе этой области. Если высокочастотная разводка (такая, как цепи ШИМ или первичного генера- тора на выводах OSC1/OSC2) должна быть расположена рядом с элементами генератора Timerl, то разводку их выводов следует заключить в защитное про- водящее кольцо, как показано на рис. 1.52. Этот рисунок выполнен не в масшта- бе, но дает представление о форме защитных проводников. Такой рисунок может быть выполнен как на односторонней плате, так и на двухсторонней, в дополне- ние к заземляющей поверхности. Прерывание от Timerl Регистровая пара TMR1H:TMR1L инкрементируется с OOOOh до FFFFh с пере- ходом по переполнению вновь в OOOOh. В момент перехода генерируется преры- вание по переполнению, при этом устанавливается флаг-бит TMR1IF (PIR1<0>). Прерывание разрешается при помощи бита TMR1IE (PIE1 <0>). Сброс Timerl при помощи запускаемого триггера ССР Если один из модулей ССР сконфигурирован в режим сравнения для запуска триггера (ССР1 МЗ:ССР1 МО или ССР2МЗ:ССР2М0 = 1011), то сигнал этого собы- тия будет сбрасывать Timerl. Триггер модуля ССР2 при этом также запускает процесс преобразования АЦП, если модуль АЦП включен. Чтобы реализовать эту функцию, модуль Timerl должен быть сконфигуриро- ван как таймер или синхронный счетчик. При использовании этого способа реги- стровая пара CCPRH:CCPRL становится регистром периода Timerl. Если Timerl работает в асинхронном режиме, функция сброса модуля мо- жет не сработать. В случае пересечения во времени операции записи в Timerl и события спе- циального запускаемого триггера, операция записи имеет приоритет. Запускаемые триггеры модуля ССР2 не устанавливают флаг прерывания TMR1IF. 134
Структура и базовые функции микроконтроллеров Использование модуля Timerl е качестве часов реального времени Если к выводам встроенного генератора Timerl подключить недорогой часо- вой кварц, мы получим часы реального времени с точным ходом. Несколько строк программы могут вычислить время на основе содержимого регистров мо- дуля. В режиме Sleep генератор может питаться от миниатюрной батарейки или конденсатора повышенной емкости, чего вполне достаточно для поддержания точного хода часов. Приведенный далее листинг программы демонстрирует простой способ ин- кремента счетчика один раз в секунду, с применением подпрограммы обработки прерывания. Переполнение регистровой пары генерирует прерывание и увели- чивает программный счетчик секунд на единицу. Дополнительные счетчики минут и часов инкрементируются по переполнению предыдущего счетчика. RTCinit MOVLW 80h ; предзагрузка регистровой пары MOVWF TMR1H ; для переполнения за 1 с CLRF TMR1L MOVLW 6’00001111' ; конфигурация для внешнего тактирования, MOVWF T10SC ; асинхронный режим CLRF SEC ; инициализация рабочих регистров CLRF MIN ; в которых хранится значение времени MOVLW d'12’ MOVWF HOUR BSF RETURN RTCisr PIE1.TMR1IE ; разрешаем прерывания от Timerl BSF TMR1H, 7 ; предзагрузка для переполнения за 1 с BCF PIR1.TMR1IF ; сброс флага прерывания INCF SEC, F ;инкремент секунд MOVLW d'59' CPFSGT SEC ; 60 с прошло? RETURN ; нет, продолжаем CLRF SEC ; да, обнуляем секунды INCF MIN, F ; инкремент минут MOVLW d'59' CPFSGT MIN ; 60 мин прошло? RETURN ; нет, продолжаем CLRF MIN ; да, обнуляем минуты INCF HOUR, F ; инкремент часов MOVLW d'23‘ ; CPFSGT HOUR ; 24 ч прошло? RETURN ; нет, продолжаем MOVLW d'OI' ; да, устанавливаем 01 ч. 135
Гпава 1 MOVWF RETURN HOUR ; продолжаем Поскольку регистровая пара Timerl имеет 16 разрядов, при тактовой частоте 32768 Гц переполнение происходит за 2 с. Чтобы ускорить переполнение до 1 с. применяется предварительная загрузка регистров значением, равным половине от максимального. Простейшим методом является установка старшего разряда TMR1H в «1». Помните, что младший регистр мы никогда не загружаем и не ме- няем. Если это делать, начнет накапливаться кумулятивная ошибка. Для повышения точности хода Timerl должен работать в асинхронном режи- ме. Работа генератора Timerl должна быть всегда разрешена. Таблица 1.29 Регистры, ассоциированные с модулем Timerl Назва- ние Bit 7 Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 Bit 0 INTCON GIE/GIEH PEIE/GIEL TMROIE INTOIE RBIE TMROIF INTOIF RBIF PIR1 SPPIF(1) ADIF RCIF TXIF SSPIF CCP1IF TMR2IF TMR1IF PIE1 SPPIE<1) ADIE RCIE TXIE SSPIE CCP1IE TMR2IE TMR1IE IPR1 sppip*1) ADIP RCIP TXIP SSPIP CCP1IP TMR2IP TMR1IP TMR1L TMR1H T1CON RD16 T1RUN T1CKPS1 | T1CKPSO | T1OSCEN | T1 SYNC | TMR1CS |TMR1 ON <1) Эти биты недоступны в 28-разрядных корпусах. Всегда оставляйте их сброшенными. Модуль Timer2 Модуль Timer2 обладает следующими опциями: . 8-разрядные регистры периода и таймера. . Оба регистра доступны для записи и чтения. . Программно настраиваемый предделитель (1:1,1:4 и 1:16). . Программно настраиваемый постделитель (от 1:1 до 1:16). . Прерывание по совпадению TMR2 и PR2. . Опционально используется для сдвига тактов модуля MSSP. Модуль управляется через регистр T2CON, который включает/выключает мо- дуль и настраивает предделитель и постделитель. Для уменьшения потребляе- мого тока модуль можно отключить, сбросив бит TMR2ON (T2CON<2>). bit7 Не используется, читается, как «О» bit6-3 T2OUTPS3:T2OUTPS0 биты настройки постделителя выхода Timer2 0000-1:1 0001 = 1:2 1111 =1:16 136
Структура и базовые функции микроконтроллеров bit2 TMR20N бит включения модуля Timer2 1 = модуль включен О = модуль выключен bit1-0 T2CKPS1 :T2CKPS0 биты настройки предделителя Timer2 00= 1:1 01 = 1:4 11 =1:16 В нормальном режиме регистр TMR2 инкрементируется, начиная с 00h, каж- дым машинным тактом. Двухразрядный счетчик-предделитель может делить входную частоту на 4 или на 16. Содержимое регистра TMR2 в каждом такте сравнивается с регистром периода PR2. Когда два значения совпадают, компа- ратор генерирует сигнал совпадения в качестве выходного сигнала таймера. Этот сигнал в следующем цикле сбрасывает значение TMR2 в 00h и воздейству- ет на выходной постделитель. Регистры TMR2 и PR2 доступны для непосредственной записи и чтения. По сбросу TMR2 обнуляется, тогда как PR2 устанавливается в FFh. Предделитель и постделитель обнуляются при следующих событиях: • запись в регистр TMR2; . запись в регистр PR2; . любой сброс микроконтроллера. Регистр TMR2 не сбрасывается при записи в T2CON. Прерывание от Timer2 Модуль Timer2 (табл. 1.30) может генерировать прерывание. Выходной сиг- нал (совпадение TMR2 и PR2) поступает на вход 4-разрядного счетчи- ка/постделителя. Этот счетчик генерирует прерывание «равенство TMR2», которое фиксиру- ется флагом TMR2IF (PIR1<1>). Прерывание разрешается установкой бита TMR2IE (PIE1 <1 >). Коэффициент пересчета счетчика/постделителя выбирается в пределах от 1:1 до 1:16 при помощи битов T2OUTPS3:T2OUTPS0 (T2CON<6:3>). 137
Гпава 1 Таблица 1.30 Регистры, ассоциированные с модулем Timer2 Назва- ние Bit 7 Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 BitO INTCON GIE/ GIEH PEIE/ GIEL TMROIE INTOIE RBIE TMROIF INTOIF RBIF PIR1 SPPIF(1) ADIF RCIF TXIF SSPIF CCP1IF TMR2IF TMR1IF PIE1 SPPIE(1) ADIE RCIE TXIE SSPIE CCP1IE TMR2IE TMR1IE IPR1 SPPIP(1) ADIP RCIP TXIP SSPIP CCP1IP TMR2IP TMR1IP TMR2 Регистр модуля Timer2 T2CON - T2OU- TPS3 T2OU- TPS2 T2OU- TPS1 T2OU- TPSO TMR2ON T2CKPS1 T2CKPS0 PR2 I Регистр периода Timer2 (1 * Эти биты недоступны в 28-разрядных корпусах. Всегда оставляйте их сброшенными. Выход Timer2 Немасштабированный выход TMR2 доступен в основном для модулей ССР, поскольку он используется в качестве базы тайминга при работе ШИМ. Timer2 может быть опционально использован в качестве источника сдвигаю- щих импульсов модуля MSSP, работающего в режиме SPL Более подробно этот момент оговорен в разделе «Ведущий синхронный последовательный порт». Модуль Timer3 Модуль Timer3 (рис. 1.54) обладает следующими опциями: • Программно выбираемые режимы 16-разрядного счетчика и таймера. . Читаемые и записываемые 8-разрядные регистры TMR3H и TMR3L. . Выбираемый источник тактирования (внутренний или внешний) от внутрен- них тактов или от генератора модуля Timerl. • Прерывание по переполнению. . Сброс модуля запускаемым триггером ССР. Модуль управляется при помощи регистра T3CON. Этот регистр также управ- ляет выбором источника тактовых импульсов для модулей ССР. bit7 RD16 бит включения режима 16-разрядного чтения/записи 1 = включен 16-разрядный режим 0 = включен 8-разрядный режим bit6,3 ТЗССР2:ТЗССР1 биты подключения Timerl и Timer3 к модулям ССРх 1х = Timer3 является источником тактов для обоих модулей 01 = Timer3 является источником тактов для ССР2, Timerl является источником тактов для ССР1 00 = Timerl является источником тактов для обоих модулей bit5-4 T3CKPS1 :T3CKPS0 биты настройки предделителя 138
Структура и базовые функции микроконтроллеров Примечание; Если бит Т1OSCEN сброшен, инвертор и резистор обратной связи отключаются для снижения потребляемого тока. Рис. 1.54. Структурная схема модуля Timer3 11 = 1:8 10 = 1.4 01 =1:2 00= 1:1 bit2 T3SYNC бит синхронизации внешних тактовых импульсов для Timer3 Если TMR3CS = 1 1 = внешние импульсы не синхронизируются 0 = внешние импульсы синхронизируются с внутренними тактами Если TMR3CS = 0 Бит игнорируется. Используются внутренние тактовые импульсы. bitl TMR3CS бит выбора источника тактовых импульсов 1 = внешние импульсы от генератора Timerl или через вывод Т13CKI (по нарастающему фронту, после первого спада) 0 = внутренние тактовые импульсы (FOsc/4) brtO TMR3ON бит включения модуля 1 = модуль включен 0 = модуль выключен Модуль Timer3 может функционировать в одном из трех режимов: • Таймер. • Синхронный счетчик. • Асинхронный счетчик. Режим работы определяется состоянием бита TMR3CS (T3CON<1>). Если этот бит сброшен, Timer3 инкрементируется с каждым командным циклом. Если бит установлен, Timer3 инкрементируется по нарастанию внешнего импульса или импульсов от генератора модуля Timerl (разумеется, если генератор включен). Как и в случае с Timerl, при включении генератора выводы RC1/T1OSI/UOE и RC0/T1OSO/T13CKI становятся выводами для подключения резонатора. Это означает, что соответствующие разряды регистра TRISC<1:0> игнорируются, зна- -ение линий RC0 и RC1 читается, как «0». 139
Гпава 1 Примечание: Если 6htT1OSCEN сброшен, инвертер и резистор обратней связи отключаются для снижения потребляемого тока. Рис. 1.55. Структурная схема модуля Timer3 в 16-разрядном режиме Чтение/запись Timer3 в 16-разрядном режиме Если бит RD16 (T3CON<7>) установлен в «1», модуль Timer3 настроен в 16-разрядный режим (рис. 1.55). Адрес регистра TMR3H проецируется на бу- ферный регистр, содержащий старший байт модуля Timer3. Чтение из регистра TMR3L загружает старший байт в буферный регистр. Как и в случае с модулями TimerO и Timerl, эта опция дает гарантию того, что программа прочитает валид- ное значение счетчика (не произойдет переноса из младшего разряда в старший в промежутке между считыванием младшего и старшего разрядов). Запись старшего байта в Timers также происходит через буферный регистр. Предварительная запись значения в TMR3H фактически означает запись в бу- ферный регистр. Затем, по команде записи в TMR3L содержимое буферного ре- гистра переносится в Timer3. Это позволяет одновременно записать старший и младший байты. Запись в TMR3H не обнуляет предделитель модуля. Он обнуляется только при записи в TMR3L. Использование генератора Timerl е качестве источника тактов Timer3 Встроенный генератор Timerl может быть использован в качестве источника тактов для Timer3. Для этого необходимо, во-первых, включить генератор уста- новкой бита T1OSCEN (T1CON<3>). Во-вторых, установить бит TMR3CS. Как уже было сказано, при этом Timer3 инкрементируется по нарастанию каждого им- пульса генератора. 140
Структура и базовые функции микроконтроллеров Прерывание от "ПтегЗ Регистровая пара TMR3H:TMR3L инкрементируется с OOOOh до FFFFh с пере- ходом по переполнению вновь в OOOOh. В момент перехода генерируете:-.1 преры- вание по переполнению, при этом устанавливается флаг-бит TMR3IF (PIR2<1 >). Прерывание разрешается при помощи битаТМЯ31Е (Р1Е2<1 >). Сброс "ПтегЗ с использованием запускаемого триггера ССР Если модуль ССР2 сконфигурирован в режим сравнения для переключения триггера (ССР2МЗ:ССР2М0 - 1011), то сигнал этого события будет сбрасывать Timer3. При этом также запускается процесс преобразования АЦП, если модуль АЦП включен. Чтобы реализовать эту функцию, модуль Timer3 должен быть сконфигуриро- ван как таймер или синхронный счетчик. При использовании этого способа реги- стровая пара CCPR2H:CCPR2L становится регистром периода Timer3. Если Timers работает в асинхронном режиме, функция сброса модуля мо- жет не сработать. В случае пересечения во времени операции записи в Timer3 i события специального запускаемого триггера, операция записи имеет при- оритет. Запускаемые триггеры модуля ССР2 не устанавливают флаг прерывания TMR3IF. Таблица 1.31 Регистры, ассоциированные с модулем Timer2 । Назва- [ ние Bit 7 Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 BitO I INTCON I GIE/ GIEH PEIE/ GIEL TMROIE INTOIE RBIE TMROIF INTOIF RBIF ; PIR2 OSCFIF CMIF USBIF EEIF BCLIF HLVDIF | TMR3IF CCP2IF i PIE2 OSCFIE CMIE USB1E EEIE BCLIE HLVDIE TMR3IE CCP2IE IPR2 OSCFIP CMIP USBIP EEIP BCUP HLVDIP TMR3IP CCP2IP TMR3L Младший байтТ!тегЗ ' TMR3H Старший байт Timer3 T1CON RD16 T1RUN T1CKPS1 T1CKPS0 T1OSCEN T1SYNC TMR1CS TMR1ON T3CON RD16 T3CCP2 T3CKPS1 T3CKPS0 T3CCP1 T3SYNC TMR3CS TMR3ON Модуль захвата/сравнения/ШИМ (ССР) Все микроконтроллеры PIC18F2455/2550/4455/4550 оснащены двумя модуля- ми ССР (Capture/Compare/PWM). Каждый модуль содержит 16-разрядный ре- гистр, способный работать в качестве 16-разрядного регистра захвата, "6-разрядного регистра сравнения или регистра скважности ШИМ. В 28-выводных корпусах модули ССР1 и ССР2 работают в стандартном ре- жиме, как описано в этом разделе. В 40/44-выводных корпусах модуль ССР1 реализован в виде расширенного модуля ЕССР, со стандартными режимами за- 141
Глава 1 хвата и сравнения, но с расширенным режимом ШИМ. Описание ЕССР приведе- но в следующем разделе. Функции захвата и сравнения описаны в этом разделе и не зависят от режима ШИМ. В этом и следующем разделах мы будем использовать обозначение «х» или «у» вместо номера модуля. Так, например, CCPxCON может обозначать управ- ляющий регистр для ССР1, ССР2 или ЕССР1, в зависимости от контекста. bit7-6 Не используются, читаются, как «О» Примечание: эти биты не используются в 28-выводных корпусах bit5-4 DCxB1 :DCxB0 биты скважности ШИМ для модуля ССРх Режим захвата Не используются Режим сравнения Не используются Режим ШИМ Это два младших разряда (1 и 0) из 10-разрядного регистра скважности ШИМ Восемь старших разрядов (DCx9:DCx2) находятся в CCPRxL bit3-0 ССРхМЗ:ССРхМ0 биты выбора режима модуля ССРх 0000 = все режимы отключены (сброс модуля) 0001 = зарезервировано 0010 = режим сравнения, переключение выхода по равенству, установка CCPIF 0011 = зарезервировано 0100 = режим захвата, по каждому спаду 0101 = режим захвата, по каждому нарастанию 0110 = режим захвата, по каждому 4-му нарастанию 0111= режим захвата, по каждому 16-му нарастанию 1000 = режим сравнения: инициализация вывода ССР в 0, по равенству установка вывода ССР в 1 и установка флага CCPIF 1001 = режим сравнения: инициализация вывода ССР в 1, по равенству установка вывода ССР в 0 и установка флага CCPIF 1010 = режим сравнения: генерируется программное прерывание по равенству (установка флага CCPIF), вывод ССР работает как порт ввода/вывода 1011= режим сравнения: генерируется событие запускаемого триггера, сброс таймера, запуск преобразования АЦП по равенству ССР2, уста- новка CCPIF 11хх = режим ШИМ Конфигурация модуля ССР Каждый модуль захвата/сравнения/ШИМ ассоциирован с управляющим реги- стром CCPxCON и регистром данных CCPRx. В свою очередь, регистр данных делится на два 8-разрядных регистра CCPRxL и CCPRxH. Все регистры доступ- ны для записи и чтения. 142
Структура и базовые функции микроконтроллеров Модули ССР используют таймеры 1,2 или 3 в зависимости от выбранного ре- жима. Таймеры 1 и 3 используются в режимах захвата и сравнения, таймер 2 в режиме ШИМ. Подключение определенного таймера к модулю ССР определяет- ся состоянием управляющих разрядов регистра T3CON, рассмотренного ранее. Оба модуля могут быть активны в любой момент времени и могут одновременно использовать один и тот же таймер, если оба сконфигурированы в одинаковый режим. Взаимосвязь между модулями показана на рис. 1.57. В режиме асинхрон- ного счетчика функция захвата работать не будет. Назначение вывода ССР2 Назначение вывода ССР2 (вход захвата, выход сравнения и ШИМ) меняется в зависимости от конфигурации. Бит конфигурации ССР2МХ указывает, куда мультиплексируется вывод. По умолчанию он подключен к линии порта RC1 ССР2МХ = 1). Если бит сброшен, ССР2 переключается на вывод RB3. Изменение подключения ССР2 не означает автоматическое изменение -юнфигурации линий порта. Пользователь должен всегда проверять коррект- ность содержимого регистра TRIS для правильной работы модуля ССР2. Таблица 1.32 Взаимодействие между модулями ССР1 и ССР2 Режим ССР1 Режим ССР2 Взаимодействие Захват Захват Каждый модуль может использовать TMR1 или TMR2 как синхробазу. Синхробаза может быть разной для разных ССР Захват Сравнение ССР2 может быть сконфигурирован, как запускаемый триг- гер для сброса TMR1 или TMR3 (в зависимости от того, ка- кой из них используется в качестве синхробазы). Может за- пускаться конвертация АЦП по событию триггера. Если мо- дуль ССР1 использует ту же самую синхробазу, его работа может быть нарушена сравнение Захват ССР1 сконфигурирован, как запускаемый триггер для сбро- са TMR1 или TMR3 (в зависимости от того, какой из них ис- пользуется в качестве синхробазы). Если модуль ССР2 ис- пользует ту же самую синхробазу, его работа может быть нарушена Гэавнение Сравнение Каждый модуль ССР может быть сконфигурирован, как за- пускаемый триггер для сброса синхробазы. От модуля ССР2 может быть запущена конвертация АЦП. Если оба модуля используют одну синхробазу, может возникнуть конфликт Захват ШИМ(1) Нет равнение ШИМ(1) Нет шим(1) Захват Нет 11ИМ(1) Сравнение Нет шим(1> ШИМ Оба источника ШИМ имеют одинаковую частоту и период обновления (по прерыванию от TMR2) Включая стандартный и расширенный режимы ШИМ. 143
Гпава 1 Рис. 1.56. Структурная схема режима захвата Режим захвата В режиме захвата регистровая пара CCPRxH:CCPRxL захватывает 16-разрядное значение из регистров TMR1 или TMR3 по событию на соответствую- щем выводе ССРх (рис. 1.56). Событие захвата может быть одно из следующих: • каждый нарастающий фронт импульса; • каждый спадающий фронт импульса; . каждый 4-й нарастающий фронт; • каждый 16-й нарастающий фронт. Событие выбирается битами выбора режима ССРхМЗ:ССРхМ0 (CCPxCON<3:0>). Когда захват осуществлен, выставляется флаг прерывания CCPxIF. Этот флаг пользователь должен сбросить программно. Если новый за- хват происходит до того, как из CCPRx прочитано предыдущее значение, то но- вое значение заменяет собой старое. В режиме захвата вывод ССРх должен быть настроен на ввод установкой со- ответствующего бита регистра TRIS. Если RB3/CCP2 или RC1/CCP2 сконфигу- рирован на вывод, запись в порт может привести к срабатыванию захвата. Если режим захвата изменился, может быть сгенерировано ложное преры- вание по событию захвата. Перед любым изменением режима модулей ССРх пользователь должен обязательно сбросить флаги CCPxlE и CCPxIF. Предделитель ССРх Коэффициент деления предделителя определяется битами ССРхМЗ.’ССРхМО как часть текущего режима работы. Если модуль выключается или отменяется режим захвата, предделитель сбрасывается. Любой сброс сбрасывает предделитель. 144
Структура и базовые функции микроконтроллеров Переключение из одного режима предделителя в другой может сгенерировать прерывание. Кроме того, предделитель не сбрасывается при смене режима и первый захват после переключения может быть произведен не с нулевого на- чального значения счетчика предделителя. Приведенный далее пример показы- вает рекомендованный метод переключения режимов предделителя. В этом ме- тоде также сбрасывается счетчик предделителя и не генерируется ложное пре- рывание. CLRF CCP2CON ; отключение модуля ССР MOVLW NEW_CAPT_PS ; загрузка в W настройки нового режима ;предделителя MOVWF CCP2CON ; и включение модуля ССР Режим сравнения В режиме сравнения (рис. 1.57) значение 16-разрядного регистра CCPRx посто- янно сравнивается со значением регистровой пары TMR1 или TMR3. Когда проис- ходит совпадение, вывод ССРх может выполнить одно из следующих действий: .установиться в «1»; . установиться в «О»; • переключиться в противоположный уровень; . остаться неизменным (отражая при этом состояние выходной защелки порта). Действие зависит от значения битов выбора режима. В то же время устанав- ливается флаг-бит прерывания CCPxIF. Пользователь должен настроить вывод ССРх как выход при помощи очи- стки соответствующего разряда регистра TRIS. Очистка регистра CCP2CON вынудит выходные защелки RB3 или RC1 установиться в низкий Г Установка ССР1 IF Сброс TIMER1fTimer3 | CCPR1H | CCPR1L I Равенство CCP1CON<3.0 Сброс TIMER1/TIMER3 Р Компаратор * TMR3H [ TMR3L |=>1 I Z Z—ТЗССР1 ТЗССР2 Рис. 1.57. Структурная схема режима сравнения 145
146 Таблица 1.33 Регистры, ассоциированные с захватом, сравнением, Timerl, Timer2 Название Bit 7 Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 BitO INTCON GIE/GIEH PEIE/GIEL TMROIE INTOIE RBIE TMROIF INTOIF RBIF RCON IPEN SBOREN(1) - Rl TO PD POR BOR PIR1 SPPIF(2) ADIF RCIF TXIF SSPIF CCP1IF TMR2IF TMR1IF PIE1 sppie(2) ADIE RCIE TXIE SSPIE CCP1IE TMR2IE TMR1IE IPR1 sppip(2) ADIP RCIP TXIP SSPIP CCP1IP TMR2IP TMR1IP PIR2 OSCFIF CMIF USBIF EEIF BCLIF HLVDIF TMR3IF CCP2IF PIE2 OSCFIE CMIE USBIE EEIE BCLIE HLVDIE TMR3IE CCP2IE IPR2 OSCFIP CMIP USBIP EEIP BCLIP HLVDIP TMR3IP CCP2IP TRISB TRISB7 TRISB6 TRISB5 TRISB4 TRISB3 TRISB2 TRISB1 TRISBO TRISC TRISC7 TRISC6 - - - TRISC2 TRISC1 TRISCO TMR1L Младший байт регистра Timerl Глава 1
Название Bit 7 Bit 6 Bit 5 Bit 4 ВИЗ Bit 2 Bit 1 Bit 0 TMR1H Старший байт регистра Timerl T1CON RD16 T1RUN T1CKPS1 T1CKPS0 T1OSCEN T1SYNC TMR1CS TMR1ON TMR3H Младший байт регистра Timer3 TMR3L Старший байт регистра Timer3 T3CON RD16 ТЗССР2 T3CKPS1 T3CKPS0 ТЗССР1 T3SYNC TMR3CS TMR3ON CCPR1L Младший байт регистра 1 захвата/сравнения/ШИМ CCPR1H Старший байт регистра 1 захвата/сравнения/ШИМ ССР 1 CON Р1М1(2) Р1М0(2) DC1B1 DC1B0 ССР1МЗ ССР1 М2 ССР1М1 ССР1МО CCPR2L Младший байт регистра 2 захвата/сравнения/ШИМ CCPR2H Старший байт регистра 2 захвата/сравнения/ШИМ CCP2CON - - DC2B1 DC2B0 ССР2МЗ ССР2М2 ССР2М1 ССР2МО (1) Бит SBOREN доступен, только если BORENd :0> = 01. Иначе бит читается, как «0». (2) Эти биты не используются в 28-выводных корпусах. Всегда оставляйте их сброшенными. Структура и базовые функции микроконтроллеров
Глава 1 уровень. Эти защелки не имеют отношения к выходным защелкам портов PORTB и PORTC. Если установлен режим генерации программного прерывания (ССРхМЗ:ССРхМО= = 10011), то состояние выхода ССРх не меняется. Генерируется только прерыва- ние, если установлен разрешающий бит CCPxlE. Оба модуля ССР оснащены специальным триггером, в режиме сравнения ге- нерирующим особый аппаратный сигнал, воздействующий на другие модули При переключении триггера сбрасывается регистровая пара таймера, используемого в качестве синхробазы. Это позволяет использовать регистры CCPRx в качестве программируемых регистров периода для обоих таймеров. Специальный запус- каемый триггер модуля ССР2 может также запускать процесс преобразования АЦП. Для этого модуль АЦП должен быть включен заранее. Режим ШИМ В режиме широтно-импульсной модуляции (ШИМ) на выводе ССРх присутст- вуют импульсы ШИМ с разрядностью до 10 бит. Разрядность ШИМ фактически связана с количеством единичных шагов (градаций) на которые может быть раз- бит диапазон изменений длительности импульса от нулевой длительности до полного заполнения. То есть, чем больше разрядность ШИМ, тем плавнее и точ- нее меняется длительность импульса. Поскольку вывод ССР2 мультиплексируется с защелкой данных PORFI3 или PORTC, соответствующий бит TRIS должен быть сброшен, для настройки выво- да в качестве выходной линии. Очистка регистра CCP2CON по умолчанию пере- водит выходную защелку RB3 или RC1 (в зависимости от конфигурации) в низкии уровень. Эта защелка не является защелкой данных PORTB или PORTC. Упрощенная структурная схема модуля ССР в режиме ШИМ показана на рис. 1.58. Примечание 1: 8-разрядное значение таймера Timer2 сцепляется с двумя битами внутреннего счетчика Q или предделителя для создания 10-разрядной опорной синхробазы Рис. 1.58. Структурная схема режима ШИМ 148
Структура и базовые функции микроконтроллеров Период Рабочий цикл TMR2 = PR2 TMR2 - [Рабочий цикл] TMR2 = PR2 Рис. 1.59. Выходной сигнал ШИМ Выходной сигнал ШИМ характеризуется периодом повторения, определяемым значением синхробазы модуля и временем, в течение которого на выводе при- сутствует высокий уровень (длительность рабочего цикла). Диаграмма выходного сигнала показана на рис. 1.59, связанные регистры в табл. 1.34. Период ШИМ задают путем записи значения в регистр PR2. Период можно рассчитать по следующей формуле: PWMperiod = [(PR2) + 1] • 4 • Tqsc (значение предделителя TMR2). Частота следования импульсов ШИМ вычисляется, как 1/ PWMPERiod- Когда значение TMR2 становится равно PR2, происходят следующие три со- бытия: . TMR2 сбрасывается; • вывод ССРх устанавливается в «1». Исключение составляет случай, когда дли- тельность рабочего цикла = 0%, следовательно, ССРх не будет установлен в «1»; • длительность рабочего цикла копируется из CCPRxL в CCPRxH и защелки- вается там. Постделитель TMR2 не используется в формировании частоты ШИМ. Он мо- жет быть использован для формирования частоты, отличающейся от частоты импульсов ШИМ. Рабочий цикл ШИМ Длительность рабочего цикла ШИМ задают при помощи записи значения в ре- гистр CCPRxL и разряды CCPxCON<5:4> (младшие разряды). Таким образом, получается 10-разрядное значение. Следующая формула применяется для рас- чета длительности рабочего цикла: PWMDUty = (CCPRxL:CCPxCON<5:4>) TOsc (значение предделителя TMR2) Новое значение длительности рабочего цикла можно записать в любой момент, но оно будет отработано только в следующем периоде ШИМ. В режиме ШИМ регистр CCPRxH доступен только для чтения. Регистр CCPRxH и внутренняя 2-разрядная защелка используются в качестве буфера длительности рабочего цикла. Когда объединенное значение в CCPRxH и 2-разрядной защелке становится равным объединенному значению TMR2 и двух разрядов предделителя TMR2 или двух разрядов внутреннего счетчика тактов, вывод ССРх сбрасывается в низкий уровень. Если длительность рабочего цикла окажется больше, чем пе- риод ШИМ, вывод ССРх не будет сброшен. 149
Гпава 1 Для модуля ССР1 в 28-выводных корпусах применима опция автоотключения ШИМ, применяемая в расширенном модуле ССР. Использование этой опции бу- дет рассмотрено ниже, в описании расширенного режима ССР. Автоотключение не применимо к модулю ССР2. Для конфигурирования модуля ССР в режиме ШИМ необходимо проделать следующую последовательность операций: • Установить период ШИМ, записав значение в регистр PR2. • Установить длительность рабочего цикла ШИМ, записав 10-разрядное зна- чение в регистр CCPRxL и разряды CCPxCON<5:4>. • Настроить вывод ССРх как выход, сбросив соответствующий разряд TRIS. • Установить значение предделителя TMR2, затем включить Timer2, используя регистр T2CON. . Сконфигурировать модуль ССРх для работы в режиме ШИМ. Расширенный модуль захвата/сравнения/ШИМ (ЕССР) Модуль ЕССР доступен только в 40/44-выводных корпусах. В микроконтрол- лерах PIC18F4455/4550 модуль ССР1 представлен, как стандартный ССР модуль с расширенными функциями ШИМ. Они включают в себя предоставление 2 или 4 выходных каналов, выбираемую пользователем полярность, контроль мертвой зоны, автоматическое отключение и рестарт. Функции захвата, сравнения и оди- ночной ШИМ полностью идентичны функциям стандартного ССР, описанным в предыдущем разделе. Для управления модулем ЕССР также используется регистр CCP1CON. На- значение большинства разрядов совпадает с вариантом для стандартного ССР. Добавляется только использование двух старших разрядов, и младшие раз- ряды имеют дополнительные рабочие значения. Регистр CCP1CON в расширенном режиме ШИМ bit7-6 Р1М1 :Р1М0 биты конфигурации выхода расширенной ШИМ Если ССР1МЗ:ССР1М2 = 00, 01,10 хх - Р1А подключен, как вход/выход для захвата/сравнения; Р1 В, Р1С и Р1D используются, как выводы портов Если ССР1МЗ:ССР1М2= 11 00 = Одиночный выход. Р1А модулируется, Р1В, Р1С и P1D используются, как выводы портов 01 = Мостовой выход (прямой): P1D модулируется, Р1А активен; Р1В, Р1С не активны 10 = Полу мостовой выход: Р1А, Р1В модулируются с контролем мертвой зоны, Р1С, P1D используются, как выходы портов 11 = Мостовой выход (обратный): Р1В модулируется, Р1С активный; Р1 А, Р1D не активны. bit5-4 DCxB1:DCxB0 биты скважности ШИМ для модуля ССРх Режим захвата Не используются Режим сравнения Не используются 150
Таблица 1.34 Регистры, ассоциированные с ШИМ и Timer2 Название Bit 7 Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 Bit 0 INTCON GIE/ GIEH PEIE/ GIEL TMROIE INTOIE RBIE TMROIF INTOIF RBIF RCON IPEN SBOREN(1) - Rl TO PD POR BOR PIR1 SPPIF'2’ ADIF RCIF TXIF SSPIF CCP1IF TMR2IF TMR1IF PIE1 sppie(2) ADIE RCIE TXIE SSPIE CCP1IE TMR2IE TMR1IE IPR1 SPPIP(2) ADIP RCIP TXIP SSPIP CCP1IP TMR2IP TMR1IP TRISB TRISB7 TRISB6 TRISB5 TRISB4 TRISB3 TRISB2 TRISB1 TRISBO TRISC TRISC7 TRISC6 - - - TRISC2 TRISC1 TRISCO TMR2 Регистр Timer2 PR2 Регистр периода Timer2 T2CON - I T2OUTPS3 | T2OUTPS2 | T2OUTPS1 T2OUTPS0 TMR2ON T2CKPS1 I T2CKPS0 CCPR1L Регистр 1 захвата/сравнения/ШИМ (младший байт) CCPR1H Регистр 1 захвата/сравнения/ШИМ (старший байт) CCP1CON Р1 М1(2) | P1 M0(2) | DC1B1 | DC1B0 | CCP1M3 | CCP1M2 I CCP1M1 CCP1M0 CCPR2L Регистр 2 захвата/сравнения/ШИМ (младший байт) CCPR2H Регистр 2 захвата/сравнения/ШИМ (старший байт) CCP2CON - - DC2B1 DC2B0 CCP2M3 CCP2M2 CCP2M1 CCP2M0 ECCP1AS ECCPASE ECCPAS2 ECCPAS1 ECCPASO PSSAC1 PSSACO PSSBD1(2) PSSBDO(2) ECCP1DEL PRSEN PDC6(2) PDC5(2) PDC4(2) PDC3t2) PDC2(2) PDC1(2) pdco(2) Структура и базовые функции микроконтроллеров Р’ Бит SBOREN доступен, только если BORENd ;0> = 0:1. Иначе бит читается, как «0». ’ Эти биты недоступны в 28-выводных корпусах, всегда оставляе их сброшенными.
Гпаеа 1 Режим ШИМ Это два младших разряда (1 и 0) из 10-разрядного регистра скважности ШИМ Восемь старших разрядов (DCx9:DCx2) находятся в CCPRxL bit3-0 ССРхМЗ:ССРхМ0 биты выбора режима модуля ССРх 0000 = все режимы отключены (сброс модуля) 0001 = зарезервировано 0010 = режим сравнения, переключение выхода по равенству, установка CCPIF 0011 =зарезервировано 0100 = режим захвата, по каждому спаду 0101 = режим захвата, по каждому нарастанию 0110 = режим захвата, по каждому 4-му нарастанию 0111= режим захвата, по каждому 16-му нарастанию 1000 = режим сравнения: инициализация вывода ССР1 в 0, по равенству установка вывода ССР1 в 1 и установка флага ССР1 IF 1001 = режим сравнения: инициализация вывода ССР1 в 1, по равенству установка вывода ССР1 в 0 и установка флага ССР1 IF 1010 = режим сравнения: генерируется программное прерывание по равенству (установка флага ССР1 IF), вывод ССР1 работает как порт ввод a/вы вода 1011 = режим сравнения: генерируется событие запускаемого триггера, сброс таймера TMR1 или TMR3, установка ССР1 IF 1100 = режим ШИМ: Р1 А, Р1С активные в 1; Р1 В, Р1С активные в 1 1101= режим ШИМ: Р1 А, Р1С активные в 1; Р1 В, Р1С активные в 0 1110 = режим ШИМ: Р1 А, Р1С активные в 0; Р1 В, Р1С активные в 1 1111= режим ШИМ: Р1 А, Р1С активные в 0; Р1 В, Р1С активные в 0 В дополнение к возможностям настройки, предоставляемым регистром CCP1CON, для управления модулем ЕССР используются два регистра: ECCP1DEL (задержка мертвой зоны) и ECCP1AS (конфигурация автоотключения). Выходы и конфигурация модуля ЕССР Расширенный модуль ЕССР может иметь до четырех выходов ШИМ, в зави- симости от настройки. Эти выходы, обозначаемые, как P1A...P1D, мультиплекси- руются с линиями портов PORTC,и PORTD. Выводы становятся активными в соот- ветствии с заданной настройкой модуля. Их распределение показано в табл. 1.35. Таблица 1.35 Распределение выводов в различных режимах ЕССР Режим ЕССР Конфигурация ССР 1 CON RC2 RD5 RD6 RD7 Все микроконтроллеры PIC18F4455/4550 Совместимость с ССР 00хх 11хх ССР1 RD5/SPP5* RD6/SPP6* RD7/SPP7* Двойная ШИМ 10хх 11 хх Р1А Р1В RD6/SPP6* RD7/SPP7* Квадратурная ШИМ х1хх 11хх Р1А Р1В Р1С P1D Примечаниям -не имеет значения; *ячейки обозначают выводы, не используемые модулем ЕССР в данном режиме. 152
Структура и базовые функции микроконтроллеров Для настройки выводов портов, как выходов ШИМ, необходимо установить требуемый режим ШИМ при помощи битов Р1МТ.Р1М0 и ССР1 МЗ:ССР1М0. За- тем следует установить соответствующие биты регистров TRISC и TRISD, чтобы настроить линии портов, как цифровые выходы. Модуль ЕССР и ресурсы таймеров По аналогии с модулями ССР, модуль ЕССР может использовать Timerl, Timer2 или Timer3. Таймеры 1 и 3 применяются в режимах захвата и сравнения, тогда как таймер 2 используется в режиме ШИМ. Взаимодействие между стан- дартными и ЕССР модулями аналогично взаимодействию между стандартными ССР модулями, описанному выше. Режимы захвата и сравнения Работа модуля ЕССР в режимах захвата и сравнения идентична работе стан- дартного ССР, за исключением запускаемого триггера. Специальный триггер своим выходным сигналом сбрасывает регистровые пары TMR1 или TMR3, в за- висимости от того, какой таймер используется. Это позволяет использовать реги- стры CCPR1 H:CCPR1 L в качестве 16-разрядного программируемого регистра периода для Timerl или Timer3. Режим расширенной ШИМ В расширенном режиме модуль обратно совместим со стандартной версией ШИМ, но позволяет использовать четыре выхода, для которых можно выбирать полярность активного сигнала (активный высокий или активный низкий). Режим модуля и полярность сигнала задаются разрядами Р1М1:Р1М0 и ССР1 МЗ:ССР1М0 регистра CCP1CON (рис. 1.60). Примечание 1: 8-разрядное значение таймера Т:тег2 сцепляется с двумя битами внутреннего счетчика Q или предделителя для создания 10-разрядной опорной синхробазы Рис. 1.60. Структурная схема режима расширенной ШИМ 153
Глава 1 Все управляющие регистры имеют двойную буферизацию и загружаются в на- чале нового цикла ШИМ (момент, когда сбрасывается Timer2). Это помогает пре- дотвратить помехи (выбросы) на выходах. Исключение составляет регистр задержки ECCP1DEL, который загружается по границе каждого рабочего цикла, либо по границе периода (смотря, что на- ступит раньше). По причине буферизации модуль ждет, пока будет сброшен таймер, а не стартует немедленно. Это означает, что в отличие от стандартной ШИМ, импульсы расширенной ШИМ смещены по фазе на один полный команд- ный цикл (4TOsc)- Как и прежде, пользователь должен самостоятельно настроить соответст- вующие разряды регистров TRIS на вывод. Период ШИМ Период задают записью значения в регистр PR2. Длительность периода мо- жет быть рассчитана по формуле: PWMperiod = [(PR2)+1 ] - 4 Tqsc (значение предделителя TMR2). Частота следования импульсов ШИМ вычисляется, как 1/ PWMPEriod- Когда значение TMR2 становится равно PR2, происходят следующие три со- бытия: . TMR2 сбрасывается; • вывод ССР1 устанавливается в «1». Исключение составляет случай, когда дли- тельность рабочего цикла = 0%, следовательно, ССР1 не будет установлен в «1»; • длительность рабочего цикла копируется из CCPR1L в CCPR1H и защелки- вается там. Постделитель TMR2 не используется в формировании частоты ШИМ. Он мо- жет быть использован для формирования частоты, отличающейся от частоты импульсов ШИМ. Рабочий цикл ШИМ Длительность рабочего цикла ШИМ задают при помощи записи значения в ре- гистр CCPR1L и разряды CCP1CON<5:4> (младшие разряды). Таким образом, получается 10-разрядное значение. Следующая формула применяется для рас- чета длительности рабочего цикла: PWMDUty = (CCPR1L:CCP1CON<5:4>) • Tosc (значение предделителя TMR2). Новое значение длительности рабочего цикла можно записать в любой мо- мент, но оно будет отработано только в следующем периоде ШИМ. В режиме ШИМ регистр CCPR1H доступен только для чтения. Регистр CCPR1H и внутрен- няя 2-разрядная защелка используются в качестве буфера длительности рабоче- го цикла. Когда объединенное значение в CCPRxH и 2-разрядной защелке становится равным объединенному значению TMR2 и двух разрядов предделителя TMR2 или двух разрядов внутреннего счетчика тактов, вывод ССРх сбрасывается в низкий уровень. Если длительность рабочего цикла окажется больше, чем пе- риод ШИМ, вывод ССРх не будет сброшен. 154
Структура и базовые функции микроконтроллеров Конфигурация выводов ШИМ Биты Р1М1:Р1М0 регистра CCP1C0N позволяют выбрать один из четырех режимов: • одиночный выход; . полумостовой выход; • мостовой выход, прямой режим; • мостовой выход, обратный режим. CCP1CON СИГНАЛ ° Рабочий • РЯ <7:6> J ЧИКЛ 2 + 1 00 Одиночный выход Р1А модулированный } | _ ; (D ; (1) Р1А модулированный 10 Полумост Р1В модулированный ; 1 | Р1А активный ; Р1В не активный ’ ; 01 Полный мост, • J прямой Р1 с не активный J РЮ модулированный j [ Р1А не активный i j Р1В модулированный 1 [ И Полный мост, “ ’ ' обратный РЮактивный - г - , РЮ активный 2ZZ Рис. 1.61. Соотношения выходов ШИМ (активный уровень высокий) Первый режим является стандартным режимом ШИМ. Остальные режимы мы рассмотрим далее. На рис. 1.61 и 1.62 показаны основные взаимосвязи между состояниями выводов в различных режимах. Символами (1) обозначена задерж- ка, программируемая при помощи регистра ECCP1DEL. Длительность задержки вычисляется по формуле Delay = 4 • Tosc * (ECCP1DEL<6:0>). Режим полумоста В режиме полумоста два вывода используются для управления двухтактной нагрузкой. Выходной сигнал ШИМ поступает на вывод Р1А, тогда как дополни- тельный выходной сигнал поступает на вывод Р1В (рис. 1.63). Этот режим может быть использован для двухтактной нагрузки, подключенной к полумостовой схеме или к мостовой схеме, управляемой двумя сигналами ШИМ. Примеры включения показаны на рис. 1.64. 155
Глава 1 0 PRI CCP1CON СИГНАЛ . - Рабочий <7:6> ; ЦИКЛ 00 Одиночный выход Р1А модулированный | | Р1А модулированный 1 : (D , о) 10 Полумост Р1В модулированный 1 , | | Р1А активный ___j ! Р1В не активный ; 01 Полный мост, , прямой рте не активный “у , P1D модулированный | | Р1А не активный j Р1В модулированный ~ | | 11 Полный мост ’ обратный Р1С активный ~ ; Р1D активный । > Рис. 1.62. Соотношения выходов ШИМ (активный уровень низкий) Поскольку выходы Р1А и Р1В мультиплексируются с выходами защелки дан- ных РОРТС<2> и PORTD<5>, соответствующие биты TRISC<2> и TRISD<5> должны быть сброшены, чтобы сконфигурировать Р1А и Р1В как выходы. Программируемая задержка мертвой зоны При работе схем управления нагрузкой может возникнуть такое отрица- тельное явление, как сквозной ток, который появляется, если открыты одно- временно два ключа из разных плеч управления нагрузкой, поскольку реальные Рис. 1.63. Выходной сигнал в режиме полумоста: td - задержка «мертвой» зоны; * - в этот момент значение TMR2 равно значению PR2; ** - выходной сигнал показан, как активный высокий 156
Структура и базовые функции микроконтроллеров Рис. 1.64. Примеры применения полумостового выхода ключи не закрываются мгновенно. На верхней части рис. 1.64 сквозной ток возникает, если в какой-то момент времени окажутся открытыми оба ключа. На нижней части рис. 1.64, в мостовой схеме, сквозной ток возникнет, если откроются одновременно два левых ключа или два правых. В любом из пере- численных случаев ток от источника питания будет протекать через ключи, минуя полезную нагрузку. Это грозит возникновением мощных импульсных помех и выходом из строя как ключей, так и источника питания. Для защиты от возникновения сквозного тока в полумостовом режиме ис- пользуется программируемая задержка мертвой зоны. Это означает, что вклю- чение следующего выхода задерживается на некоторое время, пока выключит- ся предыдущий. Значение разрядов PDC61PDC0 задает количество командных циклов, пропускаемых перед включением активного выхода. Если это значение больше, чем длительность рабочего цикла, выход останется неактивным в те- чение всего цикла. 157
Глава 1 Прямой режим ______________Период_________________J Р1А<2> zzz ; ! ; । j Рабочий цикл^ j ' ] Р1в<2> ZZ______________’______________;_______________________;________________ Р1С(2> _________!______________‘.......;_________________________________________________ pid<2> ZZ--------------! |-----------------------! I----------------- си! ' !<ч) ! Обратный режим (реверс) 1 Период । Рабочий цикл 1 1 • Р1А(2> 1 1 । । । 1 1 Р1В<2) f " | 1 1 1 । । । Р1С<2> — । । | 1 1 1 РЮ<2) — | । । । । । !(i) ! !(П ' (1) В это время значение регистра TMR2 равно значению регистра PR2 (2) Выходной сигнал активный высокий Рис. 1.65. Выходы ШИМ в режиме полного моста Программируемая задержка недоступна в 28-выводных устройствах, так как стандартный модуль ЕССР не поддерживает полумостовое включение. Режим полного моста В режиме полного моста все четыре вывода используются, как выходы, одна- ко в любой момент времени активны только два выхода (иначе возникнет явле- ние сквозного тока). В прямом режиме вывод Р1А постоянно активен и вывод P1D модулируется. В обратном (реверсивном) режиме постоянно активен вывод Р1С и модулируется вывод Р1В. Соответствующие диаграммы приведены на рис. 1.65. Поскольку все выводы мультиплексируются с защелками данных PORTC и PORTD, соответствующие биты регистров TRIS должны быть сброшены. Пример применения режима полного моста приведен на рис. 1.66. Изменение направления тока через нагрузку В режиме полного моста бит Р1М1 регистра CCP1CON позволяет пользова- телю менять направление тока через нагрузку, реализуя функцию «вперед- назад». Если программа пользователя меняет состояние этого бита, в следую- щем цикле ШИМ будет реализовано новое (противоположное) направление тока. 158
Структура и базовые функции микроконтроллеров Непосредственно перед окончанием текущего периода ШИМ модулируемые выводы Р1В и P1D переводятся в неактивное состояние, тогда как немодулируе- мые выходы Р1А и Р1С переводятся в противоположное состояние. Это проис- ходит в интервале времени (4-T0Sc- (значение предделителя ~Птег2)) перед на- чалом следующего периода ШИМ. Предделитель Timer2 может принимать значения 1, 4 или 16 в зависимости от состояния разрядов T2CKPS1 :T2CKPS0 (T2CON<1:0>). В интервале времени от переключения немодулируемых выводов до начала следующего периода моду- лируемые выводы остаются неактивными. Диаграммы сигналов показаны на рис. 1.67. Р1А (Активный высокий) Р1В (Активный высокий) Р1С (Активный высокий) P1D (Активный высокий) -< — Период^) 1 „ Период -—.— Период | i i р. ЦИКЛ I <2) ! i IT р. цикл Рис. 1.67. Переключение направления тока через нагрузку: (1) бит направления CCP1CON<7> записывается в любой момент цикла ШИМ;(2) при из- менении направления сигналы Р1А и Р1С переключаются до окончания текущего цикла ШИМ, в интервале 4TOSC, 16TOSC, 64TOSC, в зависимости от значения предделителя Timer2. Модулированные сигналы Р1В и P1D в это время неактивны 159
Глава 1 ,2) t0N- задержка выключения ключа QC и его буфера (3) tQFF- задержка выключения ключа QD и его буфера. Рис. 1.68. Изменение направления ШИМ при рабочем цикле, близком к 100% Следует иметь в виду, что в режиме полного моста модуль ЕССР не предос- тавляет задержку мертвой зоны. В общем случае, так как в каждый момент вре- мени модулирован только один выход, защитная зона не требуется. Тем не ме- нее, иногда возникают ситуации, когда мертвая зона необходима. Эти ситуации возникают в одном из двух случаев: Направление тока через нагрузку меняется, когда рабочий цикл на выходе близок или равен 100%. Время отключения силового ключа (включая сам ключевой элемент и схему буфера) больше, чем время включения. На рис. 1.68 показан пример, где направление ШИМ меняется с прямого на обратное при рабочем цикле, близком к 100%. В момент времени Н выходы Р1А и P1D становятся неактивными, тогда как вы- ход Р1С остается активным. В этом примере время выключения силового ключа больше, чем время включения, и через транзисторы QC и QD (см. рис. 1.66) может протекать импульс сквозного тока длительностью t. Аналогичное явление может проявиться и для транзисторов QA и QB при обратной смене направления. Чтобы избежать возникновения сквозного тока, в пользовательских разработ- ках следует соблюдать следующие правила: Снижать длительность рабочего цикла перед сменой направления. Использовать силовые ключи, для которых время выключения меньше, чем время включения. Автоотключение расширенной ШИМ Когда модуль ЕССР сконфигурирован в один из расширенных режимов, ак- тивные выводы могут быть настроены на автоотключение. В этом случае, если 160
Структура и базовые функции микроконтроллеров происходит событие отключения, выводы ШИМ автоматически устанавливаются в заранее заданное статическое состояние. Событие отключения может быть сгенерировано одним из двух компараторов, низким уровнем на выводе RB0/AN12/iNT0/FLT0/SDI/SDA или произвольным со- четанием этих факторов. Компараторы могут быть использованы для слежения за напряжением, пропорциональным потребляемому нагрузкой току. Если на- пряжение на токовом шунте (и, соответственно, потребляемый ток) превышают допустимое значение, компаратор останавливает ШИМ и переводит выводы в заданное состояние. Таким образом, реализуется защита нагрузки и силовых це- пей от перегрузки по току. Для отключения можно использовать цифровой сигнал на выводе FLT0. Функция автоотключения отменяется, если не выбрать ни один из источников события автоотключения. Для выбора источника события служат биты ECCPAS2:ECCPAS0 (ECCP1AS<6:4>). Как только происходит событие автоотключения, выходы ШИМ асинхронно ус- танавливаются в состояния, определенные битами PSSAC1:PSSAC0 и PSSBD1:PSSBD0. Каждая пара выводов (Р1А/Р1С и P1B/P1D) может быть уста- новлена в высокий уровень, низкий уровень или в состояние высокого импедан- са. Для удержания выводов в их отключенном состоянии устанавливается бит ECCPASE (ECCP1AS<7>). Этот бит устанавливается аппаратно когда происходит событие отключения. Если автоматический рестарт не предусмотрен, сброс этого бита осуществляется программно, при выходе из состояния отключения. Если же автоматический рестарт используется, то бит ECCPASE сбрасывается автомати- чески при перезапуске ШИМ. Если бит ECCPASE устанавливается в начале периода ШИМ, то выводы ос- таются в отключенном состоянии в течение всего периода. Если бит ECCPASE сбрасывается, то выводы ШИМ переходят в рабочее состояние в начале сле- дующего периода. Пока условие автоотключения не отменено, запись в бит ECCPASE невоз- можна. Регистр ЕССР1 AS имеет следующую структуру: bit7 ECCPASE бит статуса события автоотключения 1 = произошло событие автоотключения, выходы модуля отключены О ~ выходы модуля функционируют bit6-4 ECCPAS2:ECCPAS0 биты выбора источника события автоотключения 111= FLT0 или компаратор 1 или компаратор 2 110— FLTO или компаратор 2 101 = FLTO или компаратор 1 100 = FLT0 011 = компаратор 1 или компаратор 2 010 = компаратор 2 001 = компаратор 1 000 = автоотключения нет bit3-2 PSSAC1 :PSSAC0 биты состояния выводов А и С при отключении 1х = выводы А и С в высокоимпедансном состоянии (40/44-выводные корпуса) 161
Глава 1 01 = установка А и С в «1» 00 = установка А и С в «0» bit1-0 PSSBD1: PSSBD0 биты состояния выводов В и D при отключении, зарезервированы для 28-выводных корпусов. 1х - выводы В и D в высокоимпедансном состоянии 01 = установка В и D в «1» 00 = установка В и D в «0» Структура регистра ЕССР1 DEL: bit7 PRSEN бит разрешения рестарта ШИМ 1 - после автоотключения бит ECCPASE сбрасывается автоматически, как только проходит отключающее событие; ШИМ перезапускается 0 = после завершения отключающего события для запуска ШИМ бит ECCPASE необходимо сбросить программно. bit6-0 PDC6-PDC0 биты счетчика задержки мертвой зоны ШИМ; зарезервиро- ваны для 28-выводных микроконтроллеров. Автоматический перезапуск ШИМ после автоотключения Функция автоотключения может быть настроена таким образом, что позволит автоматически перезапускать ШИМ после каждого отключения. Это достигается установкой бита PRSEN (ECCP1DEL<7>). Если PRSEN = 1, то после окончания события, вызвавшего отключение, бит ECCPASE автоматически сбрасывается. Как только бит ECCPASE будет сбро- шен, ШИМ возобновляет работу с начала следующего периода (рис. 1.69). Период ШИМ Событие отключения Бит ECCPASE Период ШИМ Период ШИМ Рис. 1.69. Автоотключение ШИМ (PRSEN = 1, автоперезапуск включен) Независимо от состояния бита PRSEN, если автоотключение вызвано одним из компараторов, то условием автоотключения является уровень на выходе ком- паратора. Поэтому бит ECCPASE не может быть сброшен, пока не снят уровень компаратора, вызвавший отключение. Режим автоотключения может быть включен принудительно, записью «1» в бит ECCPASE. Автоотключение ШИМ (PRSEN = 0, авторестарт выключен) показано на рис. 1.70. 162
Структура и базовые функции микроконтроллеров Рис. 1.70. Автоотключение ШИМ (PRSEN = 0, авторестарт выключен) Требования к ШИМ при начальном запуске программы Когда микроконтроллер находится в состоянии сброса и начинает выходить из него, все выводы находятся в высокоимпедансном состоянии. Схема силовых цепей устройства должна быть оснащена добавочными резисторами, которые будут подтягивать цепи управления силовыми ключами ШИМ к потенциалу линии питания или линии общего провода таким образом, чтобы исключить появление сквозного тока или незапланированное включение нагрузки. Все силовые ключи должны быть выключены до того момента, пока выводы микроконтроллера не будут настроены программно и не начнут работать в штатном режиме. Биты ССР1М1:ССР1М0 (CCP1CON<1:0>) позволяют пользователю выбрать, будет ли сигнал ШИМ активным высоким или активным низким, для каждой пары выводов. Полярность выходного сигнала должна быть установлена до того, как соответствующие выводы будут сконфигурированы, как выходы ШИМ. После- дующая смена полярности категорически не рекомендуется, поскольку может вывести схему из строя. Выходные защелки Р1А, Р1В, Р1С и P1D к моменту инициализации модуля ШИМ могут не находиться в корректном состоянии. Включение выводов ШИМ на выход одновременно с инициализацией модуля может вывести внешние компо- ненты схемы из строя. Перед включением выводов ШИМ на выход должен быть отработан хотя бы один полный период ШИМ. Завершение полного периода ШИМ индицируется флаг-битом TMR2IF, который устанавливается по началу второго периода ШИМ. Последовательность действий по настройке ШИМ Последовательность действий по конфигурированию модуля ЕССР для рабо- ты в режиме ШИМ выглядит следующим образом: 1. Конфигурируем выводы ШИМ Р1А и Р1В (а также Р1С и P1D, если исполь- зуются) как входы, установкой соответствующих разрядов TR(S. 2. Устанавливаем длительность периода ШИМ загрузкой значения в регистр PR2. • Если требуется автоотключение, проделываем следующее: . Отменяем автоотключение (ЕССР 1 AS - 0). 163
Глава 1 . Конфигурируем источник события (FLT0, компаратор 1 или компаратор 2). • Ждем установление состояния, не вызывающего автоотключение. 4. Настраиваем модуль ЕССР в желаемый режим ШИМ и конфигурацию путем загрузки в регистр CCP1CON соответствующих значений: . Выбираем одну из доступных конфигураций и направление битами Р1М1.Р1М0. . Выбираем полярность выходных сигналов ШИМ битами ССР1МЗ:ССР1М0. 5. Устанавливаем длительность рабочего цикла ШИМ загрузкой регистра CCPR1L и битов CCP1CON<5:4>. 6. В случае полумостового режима настраиваем длительность мертвой зоны загрузкой в регистр ECCP1DEL<6:0> нужного значения. 7. Если нужна функция автоотключения, загружаем регистр ECCP1AS: • Выбираем источник события автоотключения, используя биты ECCPAS2:ECCPAS0. • Выбираем состояние выходов ШИМ при отключении, используя биты PSSAC1:PSSAC0h PSSBDUPSSBDO. . Устанавливаем бит ECCPASE (ECCP1AS<7>). . Конфигурируем компараторы, используя регистр CMCON. . Настраиваем входы компаратора, как аналоговые входы. 8. Если нужен авторестарт, устанавливаем бит PRSEN (ЕССР1 DEL<7>). 9. Конфигурируем и запускаем TMR2: • Сбрасываем флаг прерывания от TMR2 путем очистки бита TMR2IF (PIR1<1>). • Устанавливаем значение предделителя, используя биты T2CKPS (T2CON<1:0>). • Включаем модуль Timer2 установкой бита TMR2ON (T2CON<2>). 10. Включаем выходы ШИМ после того, как начнется новый цикл ШИМ: • Ждем, пока не переполнится TMR2 (установится флагТМИ21Р). • Включаем выводы ССР1/Р1А, Р1В, Р1С и/или P1D сбросом соответствующих битов TRIS. • Сбрасываем бит ECCPASE (ECCP1AS<7>). Перечень ассоциированных регистров приведении в табл. 1.36. Работа ШИМ в энергосберегающих режимах В режиме Sleep все источники тактирования отключены. Timer2 не инкремен- тируется и состояние модуля ШИМ не меняется. Если вывод ЕССР удерживал какой-либо уровень, он будет продолжать его удерживать. Когда микроконтрол- лер пробуждается из Sleep, он продолжает работу с этого состояния. Если вклю- чен быстрый запуск, частота от источника INTOSC в первое время может быть нестабильной. В режиме PRIJDLE первичный источник продолжает тактировать ШИМ без изменений. В остальных энергосберегающих режимах Timer2 будет тактировать- ся от выбранного альтернативного источника тактирования. Если включен мониторинг тактового генератора, то пропадание тактирования вынуждает микропроцессор переключиться в режим RC_RUN и установить флаг OSCFIF (PIR2<7>). В этом случае модуль ЕССР будет тактироваться от встроенного RC- генератора, частота которого в общем случае значительно отличается от часто- ты первичного источника. 164
Таблица 1.36 Регистры, ассоциированные с модулями ЕССР, Timerl, Timer2, Timer3 Название Bit 7 Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 BitO INTCON GIE/GIEH PEIE/GIEL TMROIE INTOIE RBIE TMROIF INTOIF RBIF RCON IPEN SBORENin — Rl TO PD POR BOR IPR1 Sppipw ADIP RCIP TXIP SSPIP CCP1 IP TMR2IP TMR1IP PIR1 SPPIF^ ADIF RCIF TXIF SSPIF CCP1IF TMR2IF TMR1IF PIE1 sppie{2) ADIE RCIE TXIE SSPIE CCP1IE TMR2IE TMR1IE IPR2 OSCFIP CMIP USBIP EEIP BCLIP HLVDIP TMR3IP CCP2IP PIR2 OSCFIF CMIF USBIF EEIF BCLIF HLVDIF TMR3IF CCP2IF PIE2 OSCFIE CMIE USBIE EEIE BCLIE HLVDIE TMR3IE CCP2IE TRISB TRISB7 TRISB6 TR1SB5 TRISB4 TRISB3 TRISB2 TRISB1 TRISBO TRISC TRISC7 TRISC6 — - — TRISC2 TRISC1 TRISCO TRISDW TRISD7 TRISD6 TRISD5 TRISD4 TRISD3 TRISD2 TRISD1 TRISDO TMR1L Младший байт регистра Timerl TMR1H Старший байт регистра Timerl T1CON RD16 | ( T1RUN | | T1CKPS1 | I T1CKPS0 | 1 T1OSCEN | | T1SYNC | | TMR1CS | | TMR1ON TMR2 Регистр модуля Timer2 T2CON - I | T2OUTPS3 I T2OUTPS2 I T2OUTPS1 I I T2OUTPS0 I I TMR2ON | I T2CKPS1 I I T2CKPS0 PR2 Регистр периода Timer2 TMR3L Младший байт регистра Timers TMR3H Старший байт регистра Timers T3CON RD16 | | T3CCP2 I I T3CKPS1 | I T3CKPS0 I I T3CCP1 I ! T3SYNC | ( TMR3CS I I TMR3ON CCPR1L Регистр 1 захвата/сравнения/ШИМ (младший байт) CCPR1H Регистр 1 захвата/сравнения/ШИМ (ста рший байт) CCP1CON Р1М1(2’ P1M0(2) DC1B1 DC1B0 CCP1M3 CCP1M2 CCP1M1 CCP1M0 ECCP1AS ECCPASE ECCPAS2 ECCPAS1 ECCPASO PSSAC1 PSSACO PSSBD1W PSSBDOW ECCP1DEL PRSEN PDC612) PDC5/y PDC4<2> PDC3!2) PDC2|2) PDC1l2) PDCOt2> Структура и базовые функции микроконтроллеров 165 (1i Бит SBOREN доступен, только если BORENd :0> = 01, иначе бит читается, как «0». (2!Эти биты или регистры недоступны в 28-выводной версии, всегда оставляйте их сброшенными.
Глава 1 Модуль АЦП Модуль аналого-цифрового преобразователя имеет 10 входов для микропро- цессоров в 28-выводном корпусе и 13 входов для 40/44-выводных корпусов. Ана- логовый входной сигнал преобразовывается в 10-разрядное двоичное значение. С модулем ассоциировано пять регистров (табл. 1.38): • регистр старшего байта результата (ADRESH); . регистр младшего байта результата (ADRESL); . управляющий регистр О (ADCONO); • управляющий регистр 1 (ADCON1); . управляющий регистр 2 (ADCON2). Регистр ADCONO управляет работой модуля АЦП. Регистр ADCON1 использу- ется для конфигурирования выводов портов. Регистр ADCON2 конфигурирует источник тактирования, программируемого времени захвата и выравнивания ре- зультата. Структура регистра ADCONO: bit7-6 Не используется, всегда читается, как «0» bit5-2 CHS3:CHS0 биты выбора аналогового канала 0000 = канал 0 (AN0) 0001 = канал 1 (AN1) 0010 = канал 2 (AN2) 0011 = канал 3 (AN3) 0100 = канал 4 (AN4) 0101 = канал 5 (AN5)*1'21 0110 = канал 6 (AN6)*1,21 0111 = канал 7 (AN7)*1'21 1000 = канал 8 (AN8) 1001 = канал 9 (AN9) 1010 = канал 10 (AN10) 1011 = канал 11 (AN11) 1100 = канал 12 (AN12) 1101 = не используется*21 1110 = не используется*21 1111 = не используется*21 bill GO/DONE бит состояния АЦП Когда ADON = 1 1 = происходит процесс преобразования 0 = АЦП в состоянии готовности bitO ADON бит включения АЦП 1 = модуль АЦП включен 0 = модуль АЦП выключен Примечания. Эти каналы недоступны в 28-выводных корпусах. Подключение несуществующих каналов к измерительному тракту приведет к измерению некоего плавающего значения. 166
Структура и базовые функции микроконтроллеров Структура регистра ADC0N1: bit7-6 Не используются, читаются, как «О» bit5 VCFG1 бит конфигурации опорного напряжения (источник VREF-) 1 = VHEF_ (AN2) О - Vss bit4 VCFG0 бит конфигурации опорного напряжения (источник VHEF+) 1 = VREF+ (AN3) О = Vdd bit3-0 PCFG3:PCFG0 биты конфигурации портов АЦП: PCFG3: PCFG0 0000(1) AN12 А AN11 А AN10 А AN9 А AN8 А AN7 А AN6 А AN5 А AN4 А AN3 А AN2 А AN1 А AN0 А 0001 А А А А А А А А А А А А А 0010 А А А А А А А А А А А А А 0011 D А А А А А А А А А А А А 0100 D D А А А А А А А А А А А 0101 D D D А А А А А А А А А А 0110 D D D D А А А А А А А А А 0111(1> D D D D D А А А А А А А А 1000 D D D D D D А А А А А А А 1001 D D D D D D D А А А А А А 1010 D D D D D D D D А А А А А 1011 D D D D D D D D D А А А А 1100 D D D D D D D D D D А А А 1101 D D D D D D D D D D D А А 1110 D D D D D D D D D D D D А 1111 D D D D D D D D D D D D D (1) Значение битов PCFG при сбросе по включению питания зависит от состояния бита конфигурации PBADEN. Когда PBADEN = 1, то PCFG<3:0> = 0000; когда PBADEN = 0, то PCFG<3:0> = 0111. (2) Каналы с AN5 по AN7 доступны только в 40/44-выводных корпусах. Структура регистра ADCON2: bit7 ADFNI бит выбора формата результата преобразования 1 = выравнивание вправо 0 = выравнивание влево bit6 Не используется, читается, как «0» bit5-3 ACQT2:ACQT0 биты выбора времени захвата 111 =20Tad 167
Гпава 1 110 = 16TAD 101 = 12Tad 100 = 8 Тдо 011 = 6 Тдо 010 = 4 Tad 001 =2 Tad 000 = 0 TAD 1 bit2-0 ADCS2:ADCS0 биты выбора частоты преобразования АЦП 111= Frc (тактирование от RC-генератора АЦП){1> 110 = Fosc/64 101=FOSC/16 100 = Fosc/4 011 = Frc (тактирование от RC-генератора АЦП)(1) 010 = FOsc/32 001 - Fqsc/8 000 = Fosc/2 (1)Если выбран источник тактирования FrC АЦП, то прежде чем стартует тактирование АЦП, добавляется задержка в один командный цикл. Это позволяет команде SLEEP быть выполненной до начала преобразования. Опорное напряжение АЦП может быть выбрано из питающих напряжений (VDd и Vss) или из напряжений, приложенных к выводам VREF+ и VREF_. Модуль АЦП обладает уникальной способностью продолжать работу, пока микроконтроллер находится в режиме Sleep. Для этой цели используется соб- ственный встроенный ПС-генератор модуля АЦП. Каждый вывод, ассоциированный с АЦП, может быть сконфигурирован либо как аналоговый вход АЦП, либо как цифровой порт ввода/вывода. Соответст- вующие биты регистра TRIS должны быть установлены в режим ввода. Регистры ADRESH и ADRESL содержат результат преобразования. Когда процесс преоб- разования завершен, результат загружается в регистровую пару ADRESH:ADRESL, бит GO/DONE сбрасывается, флаг прерывания ADIF устанав- ливается. Структурная схема модуля показана на рис. 1.71. После того как модуль АЦП сконфигурирован и включен, необходимо произ- вести выборку/захват аналогового значения, прежде чем начнется процесс пре- образования. После того, как время выборки/захвата исчерпано, начинается процесс собственно преобразования. Время выборки может быть запрограмми- ровано таким образом, чтобы попадать между установкой бита GO/DONE и стар- том преобразования. Для того чтобы осуществить аналого-цифровое преобразование, необходимо выполнить следующие шаги. 1. Сконфигурировать модуль АЦП: • настроить аналоговые входы, опорное напряжение и порты ввода/вывода; • выбрать входной канал АЦП (ADCON0); . задать время захвата (ADCON2); • задать частоту преобразования (ADCON2); . выключить модуль АЦП (ADCON0); 2. Настроить прерывание от АЦП (если требуется): . сбросить бит ADIF; 168
Структура и базовые функции микроконтроллеров • установить бит ADIE; . установить бит GIE; 3. Подождать в течение времени захвата (если требуется). Запустить преобразование: . установить бит GO/DONE (ADCONO). 4. Дождаться окончания преобразования, для этого: . опрашивать состояние бита GO/DONE, ожидая его сброс или • ждать появление прерывания. 6. Прочитать результат в ADRESH:ADRESL, сбросить флаг ADIF если требуется 7. Для следующего преобразования, если нужно, повторить шаги 1 и 2. Время преобразования составляет TAD на один разряд. Требуется подождать минимум 3 Тдо перед началом следующего захвата. 2. Все входы оснащены защитными диодами на VDD и Vgs Рис. 1.71. Структурная схема АЦП 169
Гпава 1 Рис. 1.72. Функция преобразования АЦП Аналоговое входное напряжение Выбор и настройка времени захвата При помощи регистра ADCON2 пользователь может задавать время захва- та, который происходит каждый раз, когда устанавливается бит GO/DONE. Су- ществует возможность использовать автоматически устанавливаемое время захвата. Время захвата может быть установлено битами ACQT2:ACQT0 (ADCON<5:3>) в диапазоне от 2 до 20 TAD. Когда бит GO/DONE установлен, модуль преобразо- вателя удерживает ключ дискретизатора (рис. 1.73) в подключенном состоянии в течение заданного времени захвата, затем автоматически начинает преобразо- вание (рис. 1.72). Поскольку время захвата можно программировать, нет необхо- димости программно выдерживать паузу между выбором канала и установкой бита GO/DONE. Рис. 1.73. Эквивалентная схема аналогового входа: Cpin - входная емкость; Vr - падение напряжения; Leakage - суммарный ток утечек; Flic - проходное сопротивление: SS - ключ выборок (дискретизатор); Chold - емкость выборки/хранения; Rss - сопротивление дискретизатора 170
Структура и базовые функции микроконтроллеров Принудительное управление временем захвата происходит, если ACQT2:ACQT0 - ООО. Как только бит GO/DONE установлен, выборка прекращается и начинается преобразование. В этом случае пользователь сам отвечает за то, хватит ли времени для зарядки емкости выборки/хранения до уровня входного на- пряжения с момента подключения аналогового входа. Режим принудительного управления устанавливается по умолчанию при сбросе и обеспечивает совмести- мость с микроконтроллерами, не имеющими программируемого времени захвата. В обоих случаях, как только преобразование завершено, бит GO/DONE сбра- сывается, флаг ADIF устанавливается и модуль начинает следующий захват на- пряжения на выбранном входе. Индикация окончания времени захвата или нача- ла преобразования не предусмотрена. Выбор частоты преобразования Время преобразования на один разряд определено, как Tad- Полное 10- разрядное преобразование занимает 11 TAD. Источник частоты преобразования выбирается программно, при помощи разрядов ADCS2:ADCS0 (ADCON2<2:0>). Для правильного преобразования длительность TAD должна быть как можно короче, но не меньше, чем минимальное значение Tad, указанное в параметрах микросхемы. В табл. 1.37 показаны значения Tad- вычисленные на основе такто- вой частоты микропроцессора и выбранного источника тактовой частоты. Таблица 1.37 Значения TAD при заданных рабочих частотах [ Источник и значение Tad Максимальная частота Длительность ADCS2:ADCS0 PIC18FXXXX PIC18LFXXXX(4) 2 Tosc 000 2,86 МГц 1,43 МГц 4 Tosc 100 5,71 МГц 2,86 МГц 8 Tosc 001 11,43 МГц 5,72 МГц 16 Tosc 101 22,86 МГц 11,43 МГц 32 Tosc 010 40,00 МГц 22,86 МГц 64 Tosc 110 40,00 МГц 22,86 МГц RC{3) X11 1,00МГц{1) 1,00 МГц{2) (1) Источник RC обеспечивает типичное значение Tad = 4 мс. <2) Источник RC обеспечивает типичное значение TAD = 6 мс. <3) При частоте около 1 МГц микроконтроллер должен находиться в режиме Sleep, ина- че точность преобразования АЦП не будет соответствовать спецификации. (4) Только для микроконтроллеров с пониженным энергопотреблением. Работа АЦП в энергосберегающих режимах Выбор автоматического поддержания времени захвата и частоты преобразо- вания частично зависит от работы в энергосберегающем режиме. Если предполагается, что модуль АЦП будет работать, пока устройство нахо- дится в энергосберегающем режиме, биты ACQT2:ACQT0 и ADCS2:ADCS0 реги- стра ADCON2 должны быть обновлены в соответствии с тем, какой источник так- тирования будет использован в этом режиме. Захват и преобразование с новыми 171
Глава 1 параметрами настройки могут быть начаты после вхождения в энергосберегаю- щий режим. Тактирование от этого источника должно продолжаться, пока не бу- дет закончен процесс преобразования. Если требуется, контроллер может быть переведен в режим Idle во время преоб- разования. Если при этом частота тактирования контроллера меньше 1 МГц, следует заранее выбрать тактирование АЦП от собственного RC-генератора. Работа в режиме Sleep однозначно подразумевает тактирование АЦП от собст- венного RC-генератора. Если биты ACQT2-.ACQT0 установлены в «ООО» и преобра- зование запущено, то оно начнется с задержкой в один командный цикл, чтобы оста- вить возможность выполнения команды SLEEP и перехода в режим Sleep. Бит IDLEN (OSCCON<7>) всегда должен быть сброшен до начала преобразования. Конфигурирование аналоговых входов На конфигурирование аналоговых входов влияют регистры ADCON1, TRISA, TRISB и TRISE. Чтобы выводы работали в режиме аналогового ввода, ассоции- рованные с ними разряды регистров TRIS должны быть установлены в «1». Если ассоциированный разряд регистра TRIS будет сброшен (настроен, как цифровой выход), то преобразованию подвергнется не внешний аналоговый сигнал, а логи- ческий уровень выходной защелки (V0H или VOL)- Процесс преобразования не зависит от состояния разрядов CHS3:CHS0 и ре- гистров TRIS. Если производится чтение регистра PORTx, то всем линиям, которые на- строены на аналоговый вход, будет присвоен низкий логический уровень. Если линия настроена, как цифровой ввод, аналоговый сигнал на ней будет правильно преобразован модулем АЦП. Но при этом нужно помнить, что аналоговый сигнал, поданный на цифровой вход, может вывести микроконтроллер из строя по при- чине превышения допустимого тока, протекающего через вывод. Бит конфигурации PBADEN определяет конфигурацию выводов PORTB по сбросу, как цифровых или аналоговых входов, управляя тем, в какое состояние сбрасывается бит PCFG0 регистра ADCON1 (см. описание регистра, приведен- ное выше). Процесс преобразования На рис. 1.74 приведена работа АЦП, когда бит GO/DONE установлен, а все биты ACQT2:ACQT0 сброшены. Преобразование стартует спустя один командный цикл. усу - Тар Тар1 , Тдо2 ; ТарЗ f Тдо4 , Tad5 , Тдоб , Tad7 t Tad8 | Tad9 Tad10Tad11 Тар1 । | Ь9 Ь8 Ь7 Ь6 Ь5 Ь4 ЬЗ Ь2 Ы ЬО | Старт преобразования Разряд Накопительный конденсатор отключен от аналогового входа (около 100 нс) Установка бита GO/DONE В следующем цикле: ADRESHADRESL загружены, GO/DONE сброшен, ADIF установлен, конденсатор подключен ко входу Рис. 1.74. Циклы преобразования (ACQT<2:0> = ООО, Тдсо = 0) 172
Структура и базовые функции микроконтроллеров На рис. 1.75 показана диаграмма преобразования для случая, когда биты ACQT2:ACQT0 установлены в состояние «010» и выбрано время захвата 4TAD до момента начала преобразования. Сброс бита GO/DONE в процессе преобразования приведет к прекращению этого процесса. Регистровая пара результата не будет обновлена. Это значит, что регистры ADRESH:ADRESL будут продолжать хранить результат последнего законченного преобразования. После того, как преобразование завершено или прервано, выдерживается пауза 2 TAD перед началом следующего прерывания. По истечении этого интер- вала новое преобразование стартует автоматически. Внимание! Бит GO/DONE не может быть установлен при помощи той же самой инструкции, которая включает модуль АЦП. Разряд накопительного конденсатора Накопительный конденсатор предназначен для захвата значения входного напряжения и хранения его в процессе преобразования. Когда конденсатор под- ключен к аналоговому входу, он заряжается до значения входного напряжения (именно поэтому время задержки захвата должно быть достаточным для зарядки конденсатора до входного напряжения). Момент отключения конденсатора от входа считается моментом захвата текущего аналогового значения. С этого мо- мента изменение входного напряжения не влияет на текущий результат АЦП. На практике применяется не один конденсатор, а массив емкостей, подклю- ченных к измерительно-преобразовательной линейке. Перед началом следующе- го захвата/преобразования массив емкостей должен быть принудительно разря- жен. Это позволяет упростить схему входного единичного усилителя, поскольку схема, работающая только на заряд, заметно проще, чем схема, работающая на заряд/разряд от входного сигнала. Применение триггера ССР2 Преобразование АЦП может быть запущено от триггера специальных событий модуля ССР2. Для этого необходимо, чтобы биты ССР2МЗ:ССР2М0 (CCP2CON<3:0>) были установлены в состояние «1011» и модуль АЦП был включен ;бит ADON установлен) (рис. 1.75). Когда происходит событие, включающее триг- Рис. 1.75. Циклы преобразования (ACQT<2:0> = 010, Тдсо - 4Tad) 173
Глава 1 гер, устанавливается бит GO/DONE, стартует выборка и преобразование АЦП и счетчик Timerl (или Timer3) обнуляется. Выбрать нужный аналоговый канал и время выборки/захвата необходимо до того, как триггер установит бит GO/DONE. Если модуль АЦП выключен, событие триггера не включит модуль, но все равно сбросит счетчик Timerl или Timer3. Таблица 1.38 Регистры, ассоциированные с функционированием АЦП Название Bit 7 Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 BitO INTCON GIE/ GIEH РЕ1Е/ GIEL TMROIE INTOIE RBIE TMROIF INTOIF RBIF IPR1 SPPIP(4) ADIP RCIP TXIP SSPIP CCP1IP TMR2IP TMR1IP PIR1 SPP|F<4> ADIF RCIF TXIF SSPIF CCP1IF TMR2IF TMR1IF PIE1 sppie(4) ADIE RCIE TXIE SSPIE CCP1IE TMR2IE TMR1IE IPR2 OSCFIP CMIP USBIP EEIP BCLIP HLVDIP TMR3IP CCP2IP PIR2 OSCFIF CMIF USBIF EEIF BCLIF HLVDIF TMR3IF CCP2IF PIE2 OSCFIE CMIE USBIE EEIE BCLIE HLVDIE TMR3IE CCP2IE TRISB TRISB7 TRISB6 TRISB5 TRISB4 TRISB3 TRISB2 TRISB1 TRISBO ADRESH Старший байт результата АЦП ADRESL Младший байт результата АЦП ADCONO - - CHS3 CHS2 CHS1 CHSO GO/DONE ADON ADCON1 - - VCFG1 VCFGO PCFG3 PCFG2 PCFG1 PCFGO ADCON2 ADFM - ACQT2 ACOT1 ACQTO ADCS2 ADCS1 ADCSO PORTA - RA61 (2) RA5 RA4 RA3 RA2 RA1 RAO TRISA - TRISA6<2) TRISA5 TRISA4 TRIS A3 TRISA2 TRISA1 TRISAO PORTB RB7 RB6 RB5 RB4 RB3 RB2 RB1 RBO TRISB TRISB7 TRISB6 TRISB5 TRISB4 TRISB3 TRISB2 TRISB1 TRISBO LATB LATB7 LATB6 LATB5 LATB4 LATB3 LATB2 LATB1 LATBO PORTE rdpu(4> - - - RE3(1'3) RE2(4) RE1(4) RE0(4) trise(4) - - - - - TRISE2 TRISE1 TRISEO late(4> - - - - - LATE2 LATE1 LATEO (1) Доступен, если вход общего сброса отключен (бит конфигурации MCLRE = 0). (2) RA6 и связанные с ним биты защелки и направления передачи зависят от конфигу- дии тактового генератора. (3) RE3 доступен, как порт, если бит конфигурации MCLRE = 0. (4> Эти регистры и/или биты недоступны в 28-выводных корпусах. Модуль компаратора Модуль аналогового компаратора состоит из двух компараторов, которые мо- гут быть сконфигурированы различным образом. Входы могут быть выбраны из мультиплексируемых аналоговых линий RA0...RA5, так же, как источник опорного 174
Структура и базовые функции микроконтроллеров напряжения. Цифровой выход (нормальный или инвертированный) может быть представлен, как уровень на выводе микросхемы или прочитан в управляющем регистре. Регистр CMCON, представленный ниже, определяет входную и выходную конфигурацию компаратора. Структурные диаграммы различных конфигураций показаны на рис. 1.76. bit7 C2OUT выходной бит компаратора 2 Когда C2INV = О 1 = С2 ViN+ > С2 VIN_ О = С2 VIN+ < С2 V|N_ Когда C2INV = 1 1 = С2 V1N+ < С2 VIN_ О = С2 VIN+ > С2 V1N_ bit6 C1OUT выходной бит компаратора 1 Когда C1INV= О 1 =С1 VIN+>C1 V|N_ О = С1 VlN+ < С1 VIN_ Когда C1!NV= 1 1 = С1 VIN+ < С1 VIN_ О = С1 VIN+ > С1 VIN_ bit5 C2INV бит инверсии выхода компаратора 2 1 = выход С2 инвертирован О - выход С2 не инвертирован bit4 C1INV бит инверсии выход компаратора 1 1 - выход С1 инвертирован О = выход С1 не инвертирован bit3 CIS бит переключения входа компаратора Когда СМ2.СМ0-110 1 = С1 V|N_ подключен к RA3/AN3 С2 Vin- подключен к RA2/AN2 О = С1 ViN_ подключен к RAO/ANO С2 V|N_ подключен к RA1/AN1 bit2-0 СМ2:СМ0 биты режима компаратора Зависимость режима от состояния битов показана на рис. 1.76. Конфигурация компаратора Существует восемь режимов работы компаратора, показанных на рис. 1.76. Для выбора одного из этих режимов используются биты СМ2:СМ0 регистра CMCON. Регистр TRIS управляет направлением передачи данных выводов ком- паратора в каждом режиме. Если режим компаратора изменяется, его выходной уровень может быть неправильным в течение некоторого времени. По этой 175
Гпава 1 Сброс компараторов СМ2:СМ0 = ооо Компараторы выключены (по умолчанию по сбросу) СМ2:СМ0 = 111 Off (Читается как “О") Off (Читается, как "О") RAO/ANO _О_ RA3/AN3/ D VREF+ RA1/AN1 О RA2/AN2/ D VREF-/CVREF Два независимых компаратора без внешних выходов СМ2:СМ0 = ою Два независимых компаратора с внешними выходами СМ2:СМ0 = 011 RA0/AN0 А— RA3/AN3/ А VIN+I , С1>г— сюит VREF+ RA4/T0CKI/C10UT7RCV | RA1/AN1 - А - VIN- Г'---. RA2/AN2/ А VlN+ , С2>7- C2OUT VREF-/CVREF RA5/AN4/SS/HLVDIN/C2OUT* | Два компаратора с общим опорным напряжением СМ2:СМО = юо Два компаратора с общей опорой и внешними выходами СМ2:СМ0 = 101 Один независимый компаратор с внешним выходом СМ2.СМ0 = 001 Четыре входа мультиплексируются на два компаратора СМ2:СМ0 = но RA4/T0CKI/C1 OUT'/RCV RAO/ANO -А RA3/AN3,' А VREF+ сюит RA1/AN1 D- RA2/AN2/ О Vref-/CVref RA0/AN0 —0 c|s = RA3/AN3/ -AJO * CIS= i VREF+ RA1/AN1 -A-о _ е CIS = о RA2/AN2/ _А-о CIS = I VREF-/CVREF А = аналоговый вход, порт всегда читается, как "О" D = цифровой вход CIS (CMCON<3>) переключатель входа * Установка битов TRISA<5.4> отключит выходы компаратора, конфигурируя линии порта, как входы Рис. 1.76. Режимы компаратора причине перед изменением режима компаратора следует отключить его пре- рывание, во избежание генерации ложного события прерывания. Работа компаратора Процесс работы компаратора графически проиллюстрирован на рис. 1.77, как взаимосвязь между аналоговыми входными напряжениями и цифровым выходным. 176
Структура и базовые функции микроконтроллеров VIN + VIN- Выход VlN- ' VIN+----- I___I I Рис. 1.77. Простой одиночный компаратор Если аналоговое напряжение на входе V1N+ меньше, чем на входе VtN_, на выходе компаратора присутствует низкий логический уровень. Когда аналоговое напряжение на входе V,N+ больше, чем на входе V|N_, на вы- ходе компаратора появляется высокий логический уровень. Заштрихованные участки на диаграмме выходного сигнала рис. 1.77 показывают зону неопреде- ленности, где уровень выходного сигнала зависит от конкретного экземпляра микросхемы, окружающей температуры, опорного напряжения, времени отклика компаратора и т.п. Опорное напряжение компаратора В зависимости от режима работы компаратора, может применяться как внеш- нее, так и внутренне опорное напряжение. Если используется внешнее опорное напряжение, модуль компаратора может быть сконфигурирован таким образом, что компараторы 1 и 2 будут использовать одинаковый или разные источники опорного напряжения. Однако приложения, реализующие пороговый детектор, могут подразумевать использование одинако- вого источника. Опорный сигнал должен находиться между VSs и VDD и может быть приложен к любому из входов компаратора (или обоих компараторов). Внутренне опорное напряжение генерируется специальным модулем опорного напряжения, который мы рассмотрим ниже. Это напряжение доступно в качестве опорного только в режиме четырех входов, мультиплексируемых на два компара- тора (СМ2:СМ0 = 110). В этом режиме внутреннее опорное напряжение прило- жено к входам VlN+ обоих компараторов. Время отклика компаратора Время отклика - это минимальное время, необходимое для установления достоверного уровня на выходе компаратора после смены опорного напряжения или переключения аналогового входа. Если изменяется внутреннее опорное на- пряжение, предполагаемое максимальное время отклика может основываться на задержке установления опорного напряжения. Во всех остальных случаях долж- 177
Гпава 1 на применяться максимальная задержка компаратора, указанная в электрических параметрах микросхемы. Выходы компаратора Логические уровни на выходах компаратора читаются через регистр CMCON. Это разряды, доступные только для чтения. Кроме того, выходы компаратора могут быть соединены с выводами RA4 и RA5. Подключение достигается мультиплексором вы- ходов, подключающего выводы RA4 и RA5 непосредственно к выходам компарато- ров. Выходы являются асинхронными, т.е. установление уровней никак не привязано к тактовым импульсам. Структурная схема выходов приведена на рис. 1.78. Биты регистра TRISA продолжают управлять функцией вход/выход выводов RA4 и RA5 в режиме подключения этих выводов к компаратору. Полярность выходов ком- паратора может быть изменена при помощи битов C2INV и С1INV (CMCON<5:4>). При чтении регистра порта выводы, сконфигурированные на аналоговый ввод, всегда читаются, как «О». Если вывод сконфигурирован, как цифровой вход, но используется в качестве входа компаратора, то входной аналоговый уровень бу- дет преобразовываться триггером Шмидта в двоичные логические уровни в соот- ветствии со спецификацией пороговых значений этого триггера. Аналоговое напряжение, поданное на вывод, сконфигурированный в качестве цифрового входа, может привести к выходу входного буфера из строя по причине превышения допустимого тока, протекающего через вывод. Прерывания компаратора Флаг прерывания устанавливается при изменении состояния выхода любого компаратора. Действительный источник прерывания определяется программно, путем анализа битов регистра CMCON<7:6> для определения того, состояние какого выхода изменилось. Флагом прерывания по событию компаратора явля- ется бит CMIF (PIR2<6>). В процессе обработки прерывания этот бит должен быть сброшен программно. Поскольку это бит доступен также и для записи, пользователь может организовать фиктивное прерывание. Рис. 1.78. Структурная схема выхода компаратора 178
Структура и базовые функции микроконтроллеров Для разрешения прерывания должны быть установлены два бита, CMIE (Р1Е2<6>) и PEIE (INTCON<6>). Разумеется, бит глобального разрешения преры- ваний тоже должен быть установлен. Если один из перечисленных битов будет сброшен, прерывание по событию компаратора не произойдет, однако бит CMIF будет установлен и может быть прочитан программно. Если изменение регистра CMCON (C1OUT или C2OUT) случится, когда вы- полняется операция чтения (начало цикла Q2), то флаг-бит CMIF может не уста- новиться. В подпрограмме обработки прерывания пользователь может сбросить флаг прерывания следующим образом: • чтение или запись регистра CMCON аннулирует условие возникновения пре- рывания; • сбросить флаг прерывания программно. Внимание! Если не проделать чтение или запись регистра CMCON, то со- бытие прерывания не будет аннулировано, и сбросить флаг прерывания не удастся. Работа компаратора в режиме Sleep Если компаратор включен к моменту перехода микроконтроллера в режим Sleep, то он продолжит работать. Прерывание (если оно разрешено) также будет функционировать. Оно может вывести контроллер из режима Sleep. Каждый ком- паратор является дополнительным потребителем тока от источника питания. Ес- ли пробуждение из Sleep не предусмотрено, следует отключать компараторы пе- ред переходом в Sleep (СМ2:СМ0 = 111). Когда процессор пробуждается из ре- жима Sleep, содержимое регистра CMCON не изменяется. Влияние сброса Сброс микроконтроллера воздействует на регистр CMCON, переводя его в со- стояние, соответствующее сбросу, и отключает модуль компаратора (СМ2:СМ0= = 111). Тем не менее, входные выводы RA0...RA3 по умолчанию по сбросу кон- фигурируются, как аналоговые входы. Конфигурация этих выводов определяется установкой битов PCFG3:PCFG0 (ADCON<3:0>). Структура входных цепей компаратора Упрощенная структурная схема аналогового входа показана на рис. 1.79. По- скольку вывод соединен также и с цифровым выходом, он имеет обратносме- щенные диоды, подключенные к VDD и Vss. Следовательно, напряжение на аналоговом входе должно находиться между VDD и Vss. Если входное напряжение превышает заданные значения более чем на 0,6 В в любом направлении, один из диодов открывается и может зашунтиро- вать аналоговый источник. Желательно, чтобы источник аналогового сигнала имел импеданс не более 10 кОм. Все дополнительные внешние компоненты, подключенные к аналоговому входу, должны иметь минимально возможный ток утечки. 179
Глава 1 Vdd Rs < Юк ivT 0,6 В Ain Вход компаратора Cpin 5 пФ I LEAKAGE +500 НА - VSS Рис. 1.79. Упрощенная схема входных цепей компаратора: Cpin - входная емкость; Vt - падение напряжения; (leakage - суммарный ток утечки через вывод; Ric - проходное сопротивление; Rs - импеданс источника; VA - аналоговое напряжение Таблица 1.39 Регистры, ассоциированные с модулем компаратора Название Bit 7 Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 BitO CMCON C2OUT сюит C2INV C1INV CIS СМ2 CM1 CM0 CVRCON CVREN CVROE CVRR CVRSS CVR3 CVR2 CVR1 CVR0 INTCON GIE/ GIEH PEIE/ GIEL TMROIE INTOIE RBIE TMR0IF INT0IF RBIF IPR2 OSCFIP CMIP . USBIP EEIP BCLIP HLVDIP TMR3IP CCP2IP PIR2 OSCFIF CMIF USBIF EEIF BCLIF HLVDIF TMR3IF CCP2IF PIE2 OSCFIE CMIE USBIE EEIE BCLIE HLVDIE TMR3IE CCP2IE PORTA - RA6<1) RA5 RA4 RA3 RA2 RA1 RAO LATA - LATA6(1) LATA5 LATA4 LATA3 LATA2 LATA1 LATA0 TRISA - TRISA6(1) TRISA5 TRISA4 TRISA3 TRISA2 TRISA1 TRISA0 (1) PORTA6, его направление и защелка конфигурируются индивидуально, в зависимо- сти от режима тактового генератора. В отключенном состоянии всегда читается, как «0». Модуль источника опорного напряжения компаратора Источник опорного напряжения компаратора представляет собой 16- ступенчатый делитель напряжения с отводом от каждой ступени. Этот делитель может как подключаться к компаратору, так и использоваться независимо от него. Структурная схема модуля приведена на рис. 1.80. Резистивный делитель сегментирован, чтобы обеспечить два диапазона напряжений CVREF, а также имеет функцию отключения для снижения потребляемого тока, когда источник не используется. Источником питания для модуля может быть как штатный источник питания VDD/VSS, так и независимый внешний источник (например, повышенной точности и стабильности). 180
Структура и базовые функции микроконтроллеров Рис. 1.80. Структурная схема источника опорного напряжения компаратора Модуль управляется при помощи регистра CVRCON: bit7 CVREN бит включения источника опорного напряжения 1 - модуль включен О = модуль выключен bit6 CVROE бит включения выхода CVREF(1) 1 - напряжение CVREF поступает также и на вывод RA2/AN2/VrefJCVref О = напряжение CVREF не поступает на внешний вывод Примечание 1. Значение CVROE отменяется при установке бита TRISA<2> bit5 CVRR бит выбора диапазона опорного напряжения 1 =0- 0.667 CVRSRC с шагом CVrsrc/24 (нижний диапазон) 0 = 0.25 - 0.75 CVRSRC с шагом CVrsrc/32 (верхний диапазон) bit4 CVRSS бит выбора источника питающего напряжения 1 = независимый внешний источник (VREF+) - (VREF_) 0 = штатный источник питания VDD - Vss 181
Гпава 1 bit3-0 CVR3:CVR0 биты выбора значения выходного напряжения CVREF Когда CVRR = 1 CVREF = ((CVR3:CVR0)/24) х (CVRSRC) Когда CVRR = О CVREF = (CVrsrc/4) + (((CVR3:CVR0)/32) x CVRSRC) Погрешность опорного напряжения Полный диапазон значений опорного напряжения не может быть реализован в силу конструктивных особенностей модуля. Транзисторы вверху и внизу ступен- чатого резистивного делителя (рис. 1.80) подключают его к исходному источнику питающего напряжения. Встроенная стабилизация исходного источника не предусмотрена, поэтому все флуктуации напряжения исходного источника влияют на выходное напряже- ние CVREF. Если точность и стабильность этого напряжения имеют критическое значение для приложения, необходимо предусмотреть внешнюю схему точной подстройки и стабилизации исходного опорного напряжения, подаваемого на вы- воды VREF+ и VREF„. Работа в режиме SLEEP Когда микроконтроллер выходит из режима Sleep по прерыванию или по пе- реполнению сторожевого таймера, содержимое регистра CVRCON не изменяет- ся. Для минимизации потребляемого тока в режиме Sleep источник опорного на- пряжения должен быть отключен. Состояние после сброса Общий сброс контроллера отключает источник опорного напряжения, сбрасы- вая бит CVREN (CVRCON<7>). Кроме того, опорное напряжение отключается от выхода RA2 сбросом бита CVROE (CVRCON<6>), устанавливается верхний диа- пазон напряжений сбросом бита CVRR (CVRCON<5>). Значение битов CVR3:CVR0 обнуляется. Варианты подключения выходной цепи Модуль источника опорного напряжения работает независимо от модуля ком- паратора. Выход источника может быть подключен к выводу RA2, если установ- лены биты TRISA<2> и CVROE. Если вывод RA2 сконфигурирован, как цифровой вход, подключение к нему источника опорного напряжения увеличит потребляемый ток. Подключение к RA2, сконфигурированному в качестве цифрового вывода, в случае установлен- ного бита CVRSS также увеличит потребляемый ток. Выход RA2 может быть использован в качестве простейшего ЦАП с ограни- ченным выходным током. При этом должен использоваться буферный каскад (усилитель тока), подключенный к RA2. Пример буферизации показан на рис. 1.81. 182
Структура и базовые функции микроконтроллеров Рис. 1.81. Пример буферизации выхода источника опорного напряжения. Значение R зависит от битов конфигурации CVRCON<3:0> и CVRCON<5> Таблица 1.40 Регистры, ассоциированные с источником опорного напряжения Название Bit 7 Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 BitO CMCON C2OUT сюит C2INV C1INV CIS СМ2 CM1 CMO CVRCON CVREN CVROE CVRR CVRSS CVR3 CVR2 CVR1 CVRO TRISA - TR(SA6(1) TRISA5 TRISA4 TRISA3 TRISA2 TRISA1 TRISAO (1) PORTA6, его направление и защелка конфигурируются индивидуально, в зависимо- сти от режима тактового генератора. Модуль обнаружения перепада питающего напряжения Модуль обнаружения перепада питающего напряжения (High/Low-Voltage De- tect, HLVD) представляет собой программируемую схему, позволяющую пользо- вателю назначить контрольную точку питающего напряжения и направление из- менения напряжения от этой контрольной точки. Если контролер испытал пере- ход через точку в заданном направлении, устанавливается флаг прерывания. Управление модулем происходит при помощи регистра HLVDCON. Модуль может быть программно отключен для минимизации потребляемого тока. bit7 VDIRMAG бит выбора направления изменения напряжения 1 = событие состоялось, когда напряжение равно или больше контрольной точки (HLVDL3:HLVDL0) 0 = событие состоялось, когда напряжение равно или упало ниже контрольной точки (HLVDL3:HLVDL0) bit6 Не используется, читается, как «0» bit5 IRVST флаг-бит стабильности внутреннего источника опорного напряжения 1 = показывает, что логика контроля напряжения сгенерирует флаг 183
Гпава 1 прерывания в назначенном диапазоне напряжений О = показывает, что логика контроля напряжения не будет генерировать флаг прерывания в назначенном диапазоне напряжений и прерывание от HLVD должно быть выключено bit4 HLVDEN бит включения питания модуля HLVD 1 = включено О = выключено bit3-0 HLVD3:HLVD0 биты настройки порога обнаружения 1111= используется внешний аналоговый вход (через вывод HLVD) 1110 = максимальная установка 0000 = минимальная установка Модуль включается установкой бита HLVDEN. Каждый раз, когда модуль включен, ему требуется некоторое время для стабилизации. Бит IRVST доступен только для чтения и применяется для индикации того, что схема стабильна. Мо- дуль способен генерировать прерывание только если схема стабильна и бит IRVST установлен. Бит VDIRMAG определяет общую функцию модуля. Когда этот бит сброшен, модуль отслеживает снижение напряжения питания VDD ниже предустановленной контрольной точки. Если бит установлен, модуль отслеживает превышение на- пряжения VDD над установленной контрольной точкой. Функционирование модуля Обратимся к структурной схеме рис. 1.82. Когда модуль HLVD включен, ком- паратор использует напряжение от внутреннего опорного источника в качестве опорной точки. Напряжение опорной точки сравнивается с напряжением кон- трольной точки, снимаемым с отвода от резистивного делителя. Напряжение контрольной точки - это такое напряжение, при котором происходит совпадение напряжения на выходе мультиплексора «16 в 1» с напряжением опорной точки и генерируется прерывание по событию модуля. Как следует из структурной схемы, напряжение VDD масштабируется в напряжение контрольной точки при помощи резистивного делителя и программируемого мультиплексора. Пользователю доступно 16 значений напряжения контрольной точки, выби- раемых при помощи разрядов HLVDL3.-HLVDL0 регистра HLVDCON. Значению «1111» соответствует внешний источник напряжения контрольной точки. Эта оп- ция увеличивает гибкость при разработке приложений, поскольку позволяет не ог- раничиваться ступенчатыми значениями от встроенного делителя, а выбирать кон- трольную точку плавно и из всего допустимого диапазона питающих напряжений. Настройка HLVD Для настройки модуля HLVD необходимо сделать следующее: 1. Отключить модуль сбросом бита HLVDEN (HLVDCON<4>). 2. Записать значение в HLVD3.-HLVD0 для выбора желаемой контрольной точки. 184
Структура и базовые функции микроконтроллеров Рис. 1.82. Структурная схема модуля HLVD 3. Настроить бит VDIRMAG для обнаружения повышения напряжения (VDIRMAG = 1) или понижения (VDIRMAG = 0). 4. Включить модуль HLVD установкой бита HLVDEN. 5. Очистить флаг прерывания HLVDIF (PIR2<2>), который мог установиться ранее. 6. Если нужно, разрешить прерывание от модуля HLVD установкой битов HLVDIE и GIE/GIEH (Р1Е2<2> и INTCON<7>). Прерывание не будет генериро- ваться, пока установлен бит IRVST. Снижение потребляемого тока Когда модуль включен, он потребляет некоторый статический ток, протекаю- щий через делитель и компаратор. Многие приложения не требуют непрерывного контроля питающего напряжения. Для снижения потребляемого тока модуль HLVD может включаться на корот- кое время, когда нужно проконтролировать напряжение источника питания, и за- тем отключаться. 185
Глава 1 Время запуска HLVD СЛУЧАЙ 2: Рис. 1.83. Обнаружение спада напряжения (VDIRMAG = 0) Внутреннее опорное напряжение модуля HLVD может быть использовано дру- гой внутренней схемой, такой, как программируемый сброс по спаду питания. Ес- ли источник опорного напряжения был выключен для снижения потребляемого тока, то после включения требуется некоторое время, чтобы опорное напряже- ние стабилизировалось и перепад напряжения определялся достоверно. Время запуска T|RVST - это интервал, не зависящий от тактовой частоты контроллера. Он определен в наборе электрических параметров микросхемы. Флаг прерывания от HLVD не будет установлен, пока не исчерпается интер- вал T|RVST и не стабилизируется опорное напряжение. В связи с этим, в течение интервала запуска, кратковременные отклонения от значения опорной точки мо- гут остаться не обнаруженными. Соответствующие ситуации показаны на диа- граммах рис. 1.83 и 1.84. Применение модуля HLVD Достаточно часто возникает необходимость детектировать снижение питаю- щего напряжения или его повышение относительно некоторого порогового зна- чения. Например, модуль HLVD может применяться для обнаружения факта под- ключения к шине USB или отключения от нее и перехода на автономное питание. 186
Структура и базовые функции микроконтроллеров Рис. 1.84. Обнаружение скачка напряжения (VDIRMAG = 1) Это возможно, если автономный источник питания имеет напряжение мень- шее, чем на линии питания USB. Подобный подход позволяет обойтись без не- скольких внешних компонентов и освободить один вывод, который иначе исполь- зовался бы для обнаружения подключения к шине USB. Но чаще модуль HLVD применяется для контроля за батареей питания. Ти- пичная кривая напряжения питания изображена на рис. 1.85. С течением време- ни напряжение питания снижается. Если напряжение источника питания превы- шает порог VA, логика модуля HLVD генерирует прерывание в момент ТА. Это прерывание может быть воспринято, как уведомление о том, что подключена «свежая» батарея, после чего модуль HLVD будет перенастроен на контроль за снижением напряжения. В свою очередь, если напряжение снизится ниже порога VB, это будет истолковано, как разряд батареи ниже допустимого уровня, с пере- ходом в заданный пользователем аварийный режим или отключение устройства. Таким образом, можно организовать «окно» между моментами ТА и Тв, в течение которого приложение может сохранить данные, безопасно отключить внешние управляемые устройства и уведомить пользователя. Модуль HLVD продолжает работать после перехода в режим Sleep. Если в режиме Sleep происходит изменение питающего напряжения, достаточное для срабатывания модуля, то генерируется прерывание и контроллер пробуждается из «спящего» режима. Выполнение программы продолжится по адресу вектора прерывания, если бит глобального разрешения прерываний был предварительно установлен. 187
Глава 1 Время Рис. 1.85. Типичное применение модуля HLVD: VA - опорная точка модуля; VB - минимальное допустимое напряжение питания В случае общего сброса модуль HLVD отключается. Таблица 1.41 Регистры, ассоциированные с источником опорного напряжения Название Bit 7 Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 BitO HLVDCON VDIRMAG - IRVST HLVDEN HLVDL3 HLVDL2 HLVDL1 HLVDLO INTCON GIE/ GIEH PEIE/ GIEL TMROIE INTOIE RBIE TMROIF INTOIF RBIF PIR2 OSCFIF CMIF USBIF EEIF BCLIF HLVDIF TMR3IF CCP2IF PIE2 OSCFIE CMIE USBIE EEIE BCLIE HLVDIE TMR3IE CCP2IE IPR2 OSCFIP CMIP USBIP EEIP BCLIP HLVDIP TMR3IP CCP2IP Сторожевой таймер В рассматриваемых микроконтроллерах сторожевой таймер тактируется от внутреннего источника INTRC. Когда включается сторожевой таймер, вместе с ним включается источник тактирования. Номинальная длительность периода тактирования сторожевого таймера составляет 4 мс. Этот период делится при помощи 16-разрядного постделителя. То, какой выход делителя будет использо- ваться, определяется содержимым регистра конфигурации 2Н. Доступный диапа- зон значений составляет от 4 мс до 131,072 с (2,18 мин). Сторожевой таймер и постделитель сбрасываются по следующим событиям: выполнение команд SLEEP и CLRWDT, изменение состояния битов IRCF (OSCCON<6:4>) или сбой тактовых импульсов (с переключением на аварийный источник). Структурная схема сторожевого таймера изображена на рис. 1.86. Управляющий регистр WDTCON доступен для чтения и записи, и содержит управляющий бит, позволяющий программе включать и выключать сторожевой таймер (но только если сторожевой таймер был отключен управляющим разря- дом слова конфигурации). Если сторожевой таймер включен при помощи слова конфигурации, то выключить его из программы нельзя. 188
Структура и базовые функции микроконтроллеров bit7-1 Не используются, читаются, как «О» bitO SWDTEN бит программного управления включения сторожевого таймера 1 = сторожевой таймер включен О = сторожевой таймер выключен Таблица 1.42 Регистры, ассоциированные с источником опорного напряжения Название Bit 7 Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 BitO RCON IPEN SBOREN0’ - Rl TO PD POR BOR WDTCON - - - - - - - WDTEN (1) Бит SBOREN доступен только если BOREN<1:0> = 01, иначе читается, как «0». Функция ускоренного запуска Функция ускоренного запуска помогает минимизировать задержку от момента включения тактового генератора до начала исполнения кода программы (рис. 1.87). Это достигается использованием генератора INTRC в качестве источ- ника тактирования до тех пор, пока не будет доступен первичный источник. Функция включается установкой бита IESO слова конфигурации микроконтроллера. Ускоренный запуск может быть включен только для тех режимов первичного источника, которые основаны на использовании резонаторов (XT, HS, XTPLL или HSPLL). Остальные источники не требуют специальной задержки запуска и для них функция ускоренного запуска должна быть отключена. Если функция включена, то по событиям пробуждения из режима Sleep или любого сброса микроконтроллер самостоятельно переходит в режим тактирова- ния от блока внутреннего генератора. (Если включен таймер задержки тактиро- вания на время установления питающего напряжения, то задержка этого таймера отрабатывается как обычно.) Использование внутреннего источника позволяет немедленно начать исполнение кода программы, в то время, как «разгоняется» первичный тактовый генератор и отрабатывается задержка OST. Как только ин- тервал OST истекает, процессор автоматически переключается в режим PRLRUN. 189
Глава 1 Рис. 1.87. Диаграммы работы ускоренного запуска (INTOSC и HSPLL): (1) Tost = 1024 Tost; Tpll = 2 мс. Эти интервалы показаны не в масштабе Поскольку по событиям сброса регистр OSCCON очищается, то источник так- тирования INTOSC или постделитель недоступны сразу после сброса; использу- ется только генератор INTRC, подключенный напрямую. Чтобы воспользоваться более быстрым источником, необходимо незамедлительно после сброса устано- вить биты IRCF2:IRCF0. Что касается режима Sleep, то биты IRCF2:IRCF0 можно установить непосредственно перед вхождением в Sleep. В остальных энергосбе- регающих режимах функция ускоренного запуска не используется, так как микро- контроллер продолжает тактироваться от выбранного источника до тех пор, пока не будет доступен первичный источник. Состояние бита IESO игнорируется. Пока контроллер находится в состоянии ускоренного запуска и тактируется от генератора INTRC, он продолжает подчиняться всем доступным командам, пред- назначенным для вхождения в энергосберегающий режим, включая последова- тельные команды SLEEP. На практике это означает, что код пользователя может изменить состояние битов SCS1:SCS0 или выдать команду SLEEP до истечения периода OST. Это позволяет приложению быстро «проснуться», выполнить ко- роткую подпрограмму для обслуживания текущих потребностей и вернуться в Sleep до того, как заработает первичный источник. Пользовательская программа может проверить, тактируется ли контроллер от первичного источника, тестируя бит OSTS (OSCCON<3>). Если этот бит установ- лен, тактирование обеспечено первичным источником. В противном случае так- тирование при запуске после сброса или выхода из Sleep производится от блока встроенного генератора. Монитор тактовых импульсов Монитор тактовых импульсов (Fail-Safe Clock Monitor, FSCM) является средст- вом повышения надежности устройства и позволяет микроконтроллеру продол- жать работу в случае выхода из строя внешнего тактового генератора путем при- нудительного переключения на тактирование от блока встроенного генератора. Монитор включается установкой бита FCMEN слова конфигурации (рис. 1.88). 190
Структура и базовые функции микроконтроллеров Защелка Сигнал наличия сбоя Рис. 1.88. Структурная схема монитора тактовых импульсов Когда монитор включен, генератор INTRC работает постоянно, являясь источни- ком контрольных импульсов схемы монитора. Мониторинг осуществляется генераци- ей импульсов выборки делением на 64 частоты импульсов INTRC. Полученные им- пульсы заметно длиннее, чем импульсы тактирования периферии и перекрывают их. Затем внутренние тактовые импульсы, предназначенные для тактирования периферийных модулей одновременно с контрольными импульсами поступают на триггер монитора. Если тактовые импульсы поступают бесперебойно, они по- стоянно сбрасывают триггер и сигнал сбоя не вырабатывается. В случае исчез- новения импульсов, тактирующих периферию, через некоторое время контроль- ные импульсы переключают триггер монитора, включая сигнал сбоя тактирова- ния и генерируя соответствующее прерывание (рис. 1.89). При переключении источника тактирования частота встроенного генератора может оказаться недостаточно стабильной для приложений, чувствительных к частоте. В таком случае может оказаться полезным выбор иного источника так- тирования и переход в энергосберегающий режим. Для обнаружения события сбоя работы основного генератора используется прерывание от монитора, далее программно задается необходимый энергосберегающий режим. Выход источника [- тактирования 1 Т_П_TL „ГЕПТ ~| Л „Сбой тактирования Выход монитора (Q) U и Сбой обнаружен Пров к \ Пров ерка n j Проверка Рис. 1.89. Диаграмма обнаружения сбоя тактовых импульсов. Частота процессора обычно намного больше частоты выборок. На рисунке частоты показаны не в масштабе 191
Гпава 1 Монитор отслеживает сбой только первичного или вторичного тактового гене- ратора. Если выходит из строя блок встроенного генератора, этот сбой не обна- руживается и никакие защитные действия невозможны. Монитор FCSM и сторожевой таймер Как монитор, так и сторожевой таймер тактируются от генератора INTOSC. Поскольку сторожевой таймер работает с отдельным делителем и счетчиком, отключение сторожевого таймера никак не влияет на работу INTRC если включен монитор тактовой частоты. После обнаружения сбоя тактирования и переключения на источник INTOSC скорость выполнения программного кода может измениться в зависимости от состояния битов IRCF2:IRCF0. Если предделитель сторожевого таймера имеет маленький коэффициент де- ления, уменьшение скорости исполнения кода может привести к тому, что про- изойдет сброс от переполнения сторожевого таймера даже в случае нормальной работы программы. По этой причине монитор FCSM в момент переключения источника тактиро- вания автоматически сбрасывает сторожевой таймер и постделитель, давая за- пас времени для определения события переключения и уменьшая вероятность ошибочного сброса. Выход из режима аварийного тактирования Режим аварийного тактирования прекращается при сбросе или при переходе в энергосберегающий режим. По сбросу контроллер начинает тактироваться как обычно, от источника, указанного в слове конфигурации (регистр 1Н). Мультип- лексор генератора INTOSC обеспечивает тактирование до тех пор, пока первич- ный генератор не стабилизируется (аналогично ускоренному запуску). Затем про- исходит переключение на первичный источник, бит OSTS регистра OSCCON ус- танавливается, сигнализируя о готовности первичного генератора. Затем мони- тор возобновляет слежение за тактовыми импульсами. Может случиться так, что первичный источник никогда не придет в состояние готовности. В этом случае контроллер будет тактироваться от мультиплексора INTOSC, регистр OSCCON останется в состоянии сброса вплоть до перехода в энергосберегающий режим. Прерывание от FCSM в энергосберегающих режимах Входя в энергосберегающий режим, мультиплексор тактирования переключа- ется на источник, выбранный в регистре OSCCON. В энергосберегающем режи- ме процесс мониторинга продолжается. Если сбой тактового генератора происходит в энергосберегающем режиме, последующие события зависят от того, было ли включено прерывание от мони- тора. Если прерывание включено (OSCFIF - 1), исполнение команд будет такти- роваться от мультиплексора INTOSC. Автоматический переход обратно на сбой- ный генератор не произойдет. Если прерывание отключено, последующие прерывания в режиме Idle заста- вят контроллер начать исполнение команд с тактированием от источника INTOSC. 192
Структура и базовые функции микроконтроллеров Сброс по питанию и выход из режима Sleep Монитор FSCM разработан для обнаружения сбоя тактирования в любой мо- мент после выхода из состояния сброса по питанию или режима Sleep. Если пер- вичным тактовый генератор находится в режиме ЕС или INTRC, мониторинг мо- жет начаться немедленно после этих событий. В случае, если генератор использует кварц или керамический резонатор, си- туация несколько иная. Поскольку в этих случаях генератору требуется некото- рое время для запуска, большее, чем длительность контрольной выборки мони- тора, то может произойти ложное обнаружение сбоя. Для предотвращения ошиб- ки блок внутреннего генератора автоматически конфигурируется, как источник тактовых импульсов до тех пор, пока первичный генератор не стабилизируется (таймеры OST и ФАПЧ отработают свои интервалы). Эта ситуация аналогична рассмотренному ранее режиму ускоренного запуска. Когда первичный генератор стабилизировался, генератор INTRC вновь становится источником тактов для монитора. В некоторых случаях время запуска генератора очень велико и ложное срабатывание монитора может произойти даже после истечения интервалов времени, отведенных на стабилизацию генератора и ФАПЧ. В таком случае не- обходимо программно отслеживать состояние бита OSTS, затем запускать под- программу отработки дополнительной задержки, и лишь после этого программно включать монитор и переключаться на первичный источник тактовых импульсов. Защита кода программы Общая структура защиты кода программ FLASH-микроконтроллеров серии PIC18 частично отличается от остальных микроконтроллеров PICmicro®. Пользо- вательская память программ разделена на пять блоков. Один из них - загрузоч- ный блок объемом 2 кбайт. Остальная память делится на четыре блока. Каждый блок «о» имеет три бита защиты: . бит защиты кода (СРп); . бит защиты от записи (WRTn); . бит защиты от внешнего табличного чтения (EBTRn). Организацию памяти для 24- и 32-килобайтных контроллеров и распределе- ние битов защиты, ассоциированных с каждым блоком иллюстрирует рис. 1.90. Физическое размещение битов показано в табл. 1.43. Таблица 1.43 Регистры защиты кода Обозначение Bit 7 Bit 6 Bit 5 Bit 4 ВИЗ Bit 2 Bit 1 BitO 300008h CONFIG5L - -- - - CP3(1) CP2 CP1 CPO 300009h CONFIG5H CPD СРВ - - - - - - 30000Ah CONFIG6L - - - - WRT3(1) WRT2 WRT1 WRTO 30000Bh CONFIG6H WRTD WRTB WRTC - - - - - 30000Ch CONFIG7L - - - - EBTR3(1) EBTR2 EBTR1 EBTRO 30000Dh CONFIG7H - EBRTB - - - - - (1) Недоступен в контроллерах PIC18X455. Всегда оставляйте установленным. 193
Гпава 1 Объем памяти 24 кБ (PIC18F2455/2550) 32 кБ (PIC18F2550/4550) Диапазон адресов Защита блока памяти зависит от: Загрузочный блок Загрузочный блок OOOOOOh 0007FFh СРВ, WRTB, EBTRB БлокО БлокО 000800h OOlFFFh СРО, WRTO, EBTR0 Блок 1 Блок 1 002000P 003FFFP СР1, WRT1, EBTR1 Блок 2 Блок 2 004000h 005FFFh СР2, WRT2, EBTR2 Недоступно Блок 3 006000h 007FFFh СРЗ, WRT3, EBTR3 Недоступно Недоступно 008000h IFFFFFh Недоступное пространство памяти Рис. 1.90. Защищенная память программ PIC18F2455/2550/4455/4550 Память программ может быть прочитана или записана с любого места с при- менением команд табличного чтения или табличной записи. Идентификатор кон- троллера ID может быть прочитан с помощью табличного чтения. Регистры кон- фигурации также могут быть прочитаны и записаны при помощи команд таблич- ного чтения/записи. В режиме штатного исполнения программы биты защиты кода СРп не оказы- вают прямое влияние на табличное чтение/запись. Они запрещают внешний дос- туп к коду программы. Защита блока «п» пользовательской памяти программ от табличной записи производится битом WRTn, а защита от табличного чтения битом EBTRn. Если для какого-то блока памяти программ бит EBTRn = 0, то ко- манда табличного чтения, выполняемая внутри этого блока, работает без огра- ничений. Но если команда табличного чтения выполняется извне этого блока, то чтение запрещается и возвращается «0». Рисунки с 1.91 по 1.93 иллюстрируют защиту от табличного чтения/записи. Внимание! Бит защиты кода может быть переключен только из состояния «1» в состояние «0». Невозможно переключить его обратно какой-либо коман- дой. Бит защиты кода может быть возвращен в «1» только командой пол- 194
Структура и базовые функции микроконтроллеров ного стирания памяти или командой стирания блока. Обе эти функции ини- циируются только через операцию ICSP или при помощи внешнего програм- матора. Таким образом, при установленном бите защиты можно только уничтожить код программы в блоке, но не прочитать или изменить. Рис. 1.91. Запрет табличной записи (бит WRTn). Все табличные записи в блок п запрещены всякий раз, когда WRTn = О Состояние битов конфигурации OOOOOOh WRTB, EBTRB= 11 0007FFh 0008006 WRT0, EBTR0 = 01 001FFF6 002000h WRT1, EBTR1 = 11 003FFF6 004000h WRT2, EBTR2= 11 005FFFh 006000h WRT3, EBTR3= 11 007FFFh Значения регистров TBLPTR = 0008FFh PC = 003FFEh Память программ Состояние битов конфигурации OOOOOOh 0007FFh WRTB, EBTRB = 11 000800h WRT0, EBTRO = 10 OOlFFFh TBLRD* 002000h WRT1, EBTR1 = 11 003FFFh 004000h WRT2, EBTR2 = 11 005FFFh 006000h WRT3, EBTR3 = 11 007FFF6 Результат: Чтение из блока п запрещено всякий раз, когда EBTRn = 0. Регистр TABLAT возвращает значение«0« Рис. 1.92. Запрет внешнего табличного чтения (бит EBTRn) 195
Глава 1 Значения регистров TBLPTR = 0008FF6 PC = 001FFE6 Память программ Состояние битов конфигурации £ 0000006 WRTB, EBTRB = 11 0007FFh 0008006 WRTO, EBTRO= 10 OOlFFFh 0020006 WRT1, EBTR1 = 11 003FFF6 0040006 WRT2, EBTR2 =11 005FFF6 0060006 WRT3, EBTR3 =11 007FFF6 Результат: Табличное чтение блока п разрешено, несмотря на EBTRn = 0. Регистр TABLAT возвращает значение из ячейки, указанной в TBLPTR. Рис. 1.93. Табличное чтение блока разрешено, несмотря на EBTRn = 0 Память EEPROM целиком защищается от внешнего чтения и записи при по- мощи двух битов: CPD и WRTD. Бит CPD запрещает внешнее чтение и запись EEPROM. Бит WRTD запрещает внешнюю и внутреннюю запись, но оставляет возможность внутреннего чтения. Регистры конфигурации также могут быть защищены от записи. Для этого применяется бит WRTC. В обычном режиме этот бит доступен только для чтения и может быть изменен только при помощи механизма ICSP или программатора. Расположение и доступность идентификаторов Восемь ячеек памяти (200000h - 200007h) предназначены для хранения иден- тификатора ID. В этих ячейках пользователь может сохранить контрольную сум- му, номер версии или иной идентификатор записанного программного кода. Ячейки доступны для чтения и записи при помощи команд табличного доступа TBLRD и TBLWR, а также при программировании и верификации. Идентифика- тор доступен для чтения, даже если код программы защищен. Регистры конфигурации микроконтроллера Рассматриваемое семейство имеет множество функциональных модулей, ко- торые призваны повысить гибкость применения микроконтроллеров и уменьшить стоимость устройства. Работа большинства таких модулей зависит от специаль- ных битов конфигурации контроллера (см. табл. 1.44). После полного стирания памяти микроконтроллера биты могут быть запрограм- мированы (читаются, как «0») или оставлены нетронутыми (читаются, как «1»). 196
Таблица 1.44 Перечень битов конфигурации и идентификаторов Обозначение Bit 7 Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 Bit 0 Default/ Unprog rammed Value 300000h CONFIG1L - - USBDIV CPUDIV1 CPUDIVO PLLDIV2 PLLDIV1 PLLDIVO -00 0000 300001h CONFIG1H IESO FCMEN - - FOSC3 FOSC2 FOSC1 FOSCO 00- 0101 300002И CONFIG2L - - VREGEN BORV1 BORVO BOREN1 BORENO PWRTEN -01 1111 300003h CONFIG2H - - - WDTPS3 WDTPS2 WDTPS1 WDTPSO WDTEN —1 1111 300005h CONFIG3H MCLRE - - - - LPT10SC PBADEN CCP2MX 1 300006h CONFIG4L DEBUG XINST ICPRT - - LVP - STVREN 100- -1-1 300008h CONFIG5L - - - - CP3(1) CP2 CP1 CPO —- 1111 300009h CONFIG5H CPD СРВ - - - - - - 11 30000Ah CONFIG6L - - - - WRT3(1) WRT2 WRT1 WRTO -— 1111 30000Bh CONFIG6H WRTD WRTB WRTC - - - - - 111 30000Ch CONFIG7L - - - - EBTR3(n EBTR2 EBTR1 EBTRO — 1111 30000Dh CONFIG7H EBTRB -1 3FFFFEh DEVID1 DEV2 DEV1 DEVO REV4 REVS REV2 REV1 REVO xxxx xxxx(2) SFFFFFh DEVID2 DEV10 DEV9 DEV8 DEV7 DEV6 DEV5 DEV4 DEV3 0001 0010f2) Структура и базовые функции микроконтроллеров 1 Не используется в микроконтроллерах PIC18Fx455. Всегда оставляйте этот бит установленным. Регистры DEVID доступны только для чтения и не могут программироваться пользователем.
Глава 1 Биты распределены по регистрам (или словам) конфигурации. Распределение регистров конфигурации начинается с адреса ЗОООООИ. Как известно, этот адрес является пределом пользовательской памяти программ. Фактически, он связан с пространством конфигурационной памяти (300000h - 3FFFFFh) которая доступна только при помощи табличного чтения и табличной записи. Программирование регистров конфигурации полностью аналогично работе с Flash-памятью. Бит WR регистра EECON1 запускает автоматически таймируемую запись в регистр кон- фигурации. В нормальном режиме команда TBLWT (если указатель TBLPTR вы- ставлен на регистр конфигурации) устанавливает адрес и данные для записи. Установка бита WR запускает «длинную» запись в регистр конфигурации. В ре- гистр записывается байт за один прием. Регистр конфигурации CONFIG1L (младший байт регистра конфигурации 1) bit?-6 Не используются, читаются, как «О» bit5 USBDIV бит выбора частоты USB (используется только в режиме полноскоростного USB; UCFG:FSEN = 1) 1 = тактовые импульсы USB получаются из 96 МГЦ ФАПЧ делением на 2 О = тактовые импульсы USB поступают напрямую от первичного источника bit4-3 CPUDIV1 :CPUDIV0 биты выбора постделителя системных тактов Для режимов XT, HS, ЕС и ЕСЮ 11 = частота первичного генератора делится на 4 для тактирования ядра 10 = частота первичного генератора делится на 3 для тактирования ядра 01 = частота первичного генератора делится на 2 для тактирования ядра 00 = импульсы поступают от первичного генератора напрямую Для режимов XTPLL, HSPLL, ECPLL и ЕСРЮ 11 = частота ФАПЧ 96 МГц делится на 6 для тактирования ядра 10 = частота ФАПЧ 96 МГц делится на 4 для тактирования ядра 01 = частота ФАПЧ 96 МГц делится на 3 для тактирования ядра 00 = частота ФАПЧ 96 МГц делится на 2 для тактирования ядра bit2-0 PLLDIV2:PLLDIV0 биты выбора предделителя ФАПЧ 111= деление на 12 (вход генератора 48 МГц) 110 = деление на 10 (вход генератора 40 МГц) 101 = деление на 6 (вход генератора 24 МГц) 100 = деление на 5 (вход генератора 20 МГц) 011 = деление на 4 (вход генератора 16 МГц) 010 = деление на 3 (вход генератора 12 МГц) 001 = деление на 2 (вход генератора 8 МГц) 000 = деления нет, колебания 4 МГц поступают на ФАПЧ напрямую Регистр конфигурации CONFIG1H (старший байт регистра конфигурации 1) bit? IESO бит переключения внешнего/внутреннего генератора 1 = режим переключения «внешний/внутренний генератор» разрешен 198
Структура и базовые функции микроконтроллеров О = режим переключения «внешний/внутренний генератор» запрещен bit6 FCMEN бит включения монитора тактового генератора 1 ~ монитор тактового генератора включен О = монитор тактового генератора выключен bit5-4 Не используется, читается, как «О» bit3-0 FOSC3:FOSCO биты выбора генератора 111 х - генератор HS, ФАПЧ включена (режим HSPLL) 110х = генератор HS (режим HS) 1011 = внутренний генератор, для USB используется генератор HS (INTHS) 1010 = внутренний генератор, для USB используется генератор XT (INTXT) 1001 = внутренний генератор, CLKO на RA6, для USB исп. ЕС (INTCKO) 1000 = внутренний генератор, RA6 как порт, для USB исп. ЕС (INTIO) 0111= генератор ЕС, ФАПЧ включена, CLKO на RA6 (режим ECPLL) 0110 = генератор ЕС, ФАПЧ включена, порт на RA6 (режим ECPIO) 0101 = генератор ЕС, CLKO на RA6 (режим ЕС) 0100 = генератор ЕС, порт на RA6 (режим ECIO) 001 х = генератор XT, ФАПЧ включена (режим XTPLL) ОООх = генератор XT (режим XT) Примечание: В режимах XT, HS и ЕС микроконтроллер и модуль USB оба ис- пользуют выбранный генератор, как источник тактовых импульсов. Модуль USB использует указанный генератор XT, HS или ЕС как источник тактов всегда, когда микроконтроллер использует внутренний источник. Т.е. даже если микроконтроллер тактируется от внутреннего источника, при использовании модуля USB необходим внешний генератор. Регистр конфигурации CONFIG2L (младший байт регистра конфигурации 2) bit7-6 Не используется, читается, как «0» bit5 VREGEN бит включения внутреннего регулятора напряжения USB 1 = встроенный регулятор включен 0 = встроенный регулятор выключен bit4-3 BORV1:BORVO биты настройки сброса по перепаду напряжения'4 11 = минимальная установка 00 = максимальная установка bit2-1 BOREN1 :BOREN0 биты включения сброса по перепаду напряжения'2’ 11 = сброс по перепаду включен только аппаратно (бит SBOREN отключен) 10 = сброс по перепаду включен аппаратно и отключен в режиме Sleep 01 = сброс по перепаду включен и управляется программно (битом SBOREN) 199
Гпава 1 00 = сброс по перепаду отключен как программно, так и аппаратно bitO PWRTEN бит включения таймера задержки на установление питания 1 - таймер PWRT выключен 0 = таймер PWRT включен Примечание 1: См, электрические характеристики Примечание 2: Таймер PWRT отключен от модуля сброса по перепаду питания, что позволяет управлять этими опциями раздельно. Регистр конфигурации CONFIG2H (старший байт регистра конфигурации 2) bit7-5 Не используется, читается, как «0» bit4-1 WDTPS3:WDTPS0 биты настройки постделителя сторожевого таймера 1111= 1:32768 1110 = 1:16384 1101 =1:8192 1100 = 1:4096 1011 = 1:2048 1010= 1:1024 1001 = 1:512 1000= 1:256 0111 = 1:128 0110= 1:64 0101 =1:32 0100 = 1:16 0011 = 1:8 0010 = 1:4 0001 = 1:2 0000 = 1:1 bitO WDTEN бит включения сторожевого таймера 1 = сторожевой таймер включен 0 = сторожевой таймер выключен Регистр конфигурации CONFIG3H (старший байт регистра конфигурации 3) bit? MCLRE бит включения вывода MCLR 1 = вывод MCLR включен, вход RE3 выключен 0 = вход RE3 включен, MCLR выключен bit6-3 Не используются, читаются, как «0» bit2 LPT1OSC бит включения экономичного режима модуля Timerl 1 = Timerl сконфигурирован для экономичного режима 0 = Timerl сконфигурирован в обычный режим потребления bitl PBADEN бит включения входов АЦП на выводы PORTB 200
Структура и базовые функции микроконтроллеров (влияет на состояние ADCON1 по сбросу. ADCON1, в свою очередь, управляет конфигурацией выводов PORTB<4:0>) 1 = PORTB<4:0> сконфигурированы, как аналоговые каналы АЦП по сбросу О = PORTB<4:0> сконфигурированы, как цифровые порты по сбросу bitO ССР2МХ бит мультиплексора ССР2 1 - вход/выход ССР2 мультиплексирован к RC1 О = вход/выход ССР2 мультиплексирован к RB3 Регистр конфигурации CONFIG4L (младший байт регистра конфигурации 4) bit7 DEBUG бит включения фонового отладчика 1 = отладчик выключен, выводы RB6 и RB7 работают в штатном режиме О = отладчик включен, RB6 и RB7 используются для внутрисхемной отладки ЬИ6 XINST бит включения поддержки расширенного набора команд 1 = расширение команд и индексная адресация включены О = расширение команд и индексная адресация выключены bit5 ICPRT бит включения специального порта отладки/программирования (ICPORT) 1 = ICPORT включен О = ICPORT выключен Примечание: Опция доступна только в кристаллах PIC18F4455/4550. В остальных кристаллах бит ICPRT следует всегда оставлять сброшенным. bit4>3 Не используются, всегда читаются, как «О» bit2 LVP бит включения одиночного питания ICSP 1 = одиночное питание ICSP включено О = одиночное питание JCSP выключено bill Не используется, читается, как «О» bitO STVREN бит включения сброса по заполнению/опустошению стека 1 = заполнение/опустошение стека приводит к сбросу О = заполнение/опустошение стека не вызывает сброс Регистр конфигурации CONFIG5L (младший байт регистра конфигурации 5) bit7-4 Не используется, читается, как «О» bit3 СРЗ бит защиты кода(1) 1 = Блок 3 (006000 - 007FFFh) не защищен 0 = Блок 3 (006000 - 007FFFh) защищен Примечание 1:Не применяется в кристаллах PIC18FX455. В этом случае всегда оставляйте его сброшенным. 201
Гпава 1 bit2 СР2 бит защиты кода 1 = Блок 2 (004000 - 005FFFh) не защищен 0 = Блок 2 (004000 - 005FFFh) защищен bitl СР1 бит защиты кода 1 = Блок 1 (002000 - 003FFFh) не защищен 0 = Блок 1 (002000 - 003FFFh) защищен bitO СРО бит защиты кода 1 = Блок 0 (000800 - 001 FFFh) не защищен О = Блок 0 (000800 - 001 FFFh) не защищен Регистр конфигурации CONFIG5H (старший байт регистра конфигурации 5) bit7 CPD бит защиты памяти данных EEPROM 1 - память данных EEPROM не защищена 0 = память данных EEPROM защищена bit6 СРВ бит защиты кода загрузочного блока 1 - Загрузочный блок (000000 - 0007FFh) не защищен 0 = Загрузочный блок (000000 - 0007FFh) защищен bit5-0 Не используется, читается, как «0» Регистр конфигурации CONFIG6L (младший байт регистра конфигурации 6) bit3 WRT3 бит защиты кода от записи(1) 1 = Блок 3 (006000 - 007FFFh) не защищен 0 = Блок 3 (006000 - 007FFFh) защищен Примечание 1: Не применяется в кристаллах P1C18FX455. В этом случае всегда оставляйте его сброшенным. bit2 WRT2 бит защиты кода от записи 1 = Блок 2 (004000 - 005FFFh) не защищен 0 = Блок 2 (004000 - 005FFFh) защищен bitl WRT1 бит защиты кода от записи 1 = Блок 1 (002000 - 003FFFh) не защищен 0 = Блок 1 (002000 - 003FFFh) защищен bitO WRT0 бит защиты кода от записи 1 = Блок 0 (000800 - 001 FFFh) не защищен 0 = Блок 0 (000800 - 001 FFFh) не защищен Регистр конфигурации CONFIG6H (старший байт регистра конфигурации 6) bit7 WRTD бит защиты EEPROM от записи 1 = память данных EEPROM не защищена от записи 0 - память данных EEPROM защищена от записи 202
Структура и базовые функции микроконтроллеров bit6 WRTB бит защиты от записи в загрузочный блок 1 = Загрузочный блок (000000 - 0007FFh) не защищен 0 = Загрузочный блок (000000 - 0007FFh) защищен bit5 WRTC бит защиты от записи в регистр конфигурации!1) 1 = регистры конфигурации (300000 - 3000FFh) не защищены от записи 0 = регистры конфигурации (300000 - 3000FFh) защищены от записи Примечание 1: В обычном режиме этот бит доступен только для чтения, его со- стояние может быть изменено только в режиме программмирования. bit4-0 Не используется, читается, как «0» Регистр конфигурации CONFI7L (младший байт регистра конфигурации 7) ЬИ7-4 Не используется, читается, как «0» bit3 EBTR3 бит защиты блока от табличного чтения(1> 1 = Блок 3 (006000 - 007FFFh) не защищен от табличного чтения из других блоков 0 = Блок 3 (006000 - 007FFFh) защищен от табличного чтения из других блоков Примечание 1:Не применяется в кристаллах PIC18FX455. В этом случае всегда оставляйте его сброшенным. bit2 EBTR2 бит защиты блока от табличного чтения 1 = Блок 2 (004000 - 005FFFh) не защищен от табличного чтения из других блоков 0 = Блок 2 (004000 - 005FFFh) защищен от табличного чтения из других блоков bitl EBTR1 бит защиты блока от табличного чтения 1 = Блок 1 (002000 - 003FFFh) не защищен от табличного чтения из других блоков 0 = Блок 1 (002000 - 003FFFh) защищен от табличного чтения из других блоков bitO EBTR0 бит защиты блока от табличного чтения 1 = Блок 0 (000800 - 001 FFFh) не защищен от табличного чтения из других блоков 0 = Блок 0 (000800 - 001 FFFh) защищен от табличного чтения из других блоков Регистр конфигурации CONFIG6H (старший байт регистра конфигурации 6) bit7 Не используется, читается, как «0» bit6 EBTRB бит защиты загрузочного блока от табличного чтения 1 = загрузочный блок (000000 - 0007FFh) не защищен 203
Гпава 1 от табличного чтения из других блоков О = загрузочный блок (000000 - 0007FFh) защищен от табличного чтения из других блоков bit5-0 Не используется, читается, как «0» Описанные далее регистры-идентификаторы используются для автоматиче- ского распознавания типа микросхемы программатором. Регистр идентификатора DEVID1 для кристаллов PIC18F2455/2550/4455/4550 bit7-5 DEV2:DEV0 младшие биты идентификатора 011 = PIC18F2455 010 = PIC18F2550 001 = PIC18F4455 000 = PIC18F4550 bit4-0 REV4:REV0 биты версии (ревизии) микросхемы Эти биты содержат номер технологической версии (ревизии) кристалла Регистр идентификатора ОЕУЮ2для кристаллов PIC18F2455/2550/4455/4550 bit7-0 DEV10:DEV3 старшие биты идентификатора Эти биты используются совместно с битами DEV2:DEV0 регистра DEVID1 для идентификации номера микросхемы. В данном случае: 0001 0010 = PIC18F2455/2550/4455/4550 Внимание! Эти значения DEV10:DEV3 могут совпадать с идентификато- рами других микроконтроллеров Microchip. Для однозначного определения ти- па микросхемы необходимо использовать полный идентификатор DEV10:DEV0, составленный из содержимого двух регистров 204
Глава 2. Функции обмена данными семейства PIC18F2455/2550/4455/4550 Важным достоинством рассматриваемого семейства микроконтроллеров яв- ляется наличие встроенной аппаратной поддержки всех основных протоколов передачи данных: • Универсальная последовательная шина (Universal Serial Bus, USB). . Потоковый параллельный порт (Streaming Parallel Port, SPP). • Ведущий синхронный последовательный порт (Master Synchronous Serial Port, MSSP) с поддержкой режимов l2C™ и SPI™. . Расширенный универсальный синхронный приемопередатчик. (Enhanced Universal Synchronous Receiver Transmitter, EUSART). Универсальная последовательная шина USB Полное описание стандарта USB чрезвычайно велико и представляет собой от- дельный том, превышающий по объему данную книгу. Поэтому, прежде чем присту- пить к описанию реализации шины USB в семействе PIC18F2455/2550/4455/4550, мы лишь кратко упомянем основные понятия спецификации USB и введем базовые термины. Разумеется, для разработки полнофункционального устройства с под- держкой протокола USB потребуется более глубокое знакомство с требованиями стандарта. В этом поможет официальная спецификация, доступная для свобод- ного скачивания на сайте www.usb.org, а также ряд изданий [1-3]. Первая спецификация, USB 1.0, была опубликована в 1996 г. Осенью 1998 г. утверждена спецификация 1.1, устраняющая проблемы предыдущей версии. Весной 2000 г. введена версия USB 2.0, согласно которой максимальная ско- рость передачи данных увеличилась в 40 раз. Спецификации 1.0 и 1.1 обеспечивают работу на скоростях 1,5 Мбит/с и 12 Мбит/с, тогда как спецификация USB 2.0 - 480 Мбит/с. Согласно действую- щей спецификации, устройства USB должны быть совместимы по версиям «сни- зу вверх». Рассматриваемые микроконтроллеры серии PIC18Fxxxx совместимы с хостами всех версий, включая USB 2.0, но обеспечивают скорость обмена не бо- лее 12 Мбит/с (USB 1.1). Поскольку мы описываем микроконтроллер, применяемый только для созда- ния оконечных устройств пользователя (хост-контроллер представляет собой совершенно иное устройство на основе элементной базы других производите- лей), то обратимся к логической структуре обобщенного USB устройства, пока- занной на рис. 2.1. Каждый логический уровень ассоциирован с функциональным уровнем уст- ройства. Высшему уровню соответствует устройство в целом. Это устройство, в общем случае, может иметь несколько различных конфигураций. Например, уст- ройство может иметь различные конфигурации питания: «питание от внешнего источника» и «питание от шины». Компактный флэш-накопитель может одновре- менно поддерживать конфигурации «двунаправленный обмен» и «только чтение (защита от записи)». Существуют и более сложные примеры. 205
Глава 2 Каждая конфигурация может иметь собственный интерфейс обмена данны- ми. В частности, может быть реализована передача данных по запросу хоста или по запросу устройства и т.д. Далее в логической иерархии следуют конечные точки. Это понятие обозна- чает начальный пункт исходящих данных или конечный пункт входящих данных. В процессе обмена данными хост-контроллер «видит» устройство пользователя, как набор конечных точек. С аппаратной точки зрения конечная точка - это буфер, сохраняющий не- сколько байт. Обычно это регистр микроконтроллера или небольшой блок дан- ных в памяти. По умолчанию, после включения питания и получения устройством сигнала сброса по шине, доступна конечная точка 0, через которую хост запра- шивает тип и параметры устройства, а также производит его конфигурирование. Остальные конечные точки недоступны и пребывают в неопределенном состоя- нии до окончания процесса конфигурирования. Кроме нулевой конечной точки устройство может иметь до 15 дополнительных конечных точек. Для низкоскоро- стных устройств допускается наличие 1-2 дополнительных конечных точек. Каж- дая дополнительная конечная точка, в зависимости от конфигурации, может ра- ботать или только на прием, или только на передачу. Часто в распространенных USB устройствах (джойстик, мышь и т.п.) для передачи потока данных от устройства используется нулевая точка. Данные через нее переда- ются как содержимое регистра состояния устройства и затем интерпретируются про- граммным обеспечением компьютера, которому принадлежит хост. Все передаваемые данные группируются по кадрам длительностью 1,0 ± 0,0005 мс. Передача кадра инициируется только хост-контроллером, кото- рый производит обмен с устройствами в соответствии со своим планом распре- деления ресурсов. Каждый кадр может содержать несколько транзакций для раз- личных устройств и конечных точек. Структура кадра показана далее, на рис. 2.10. Спецификацией предусмотрены четыре типа передачи данных: • Управляющая передача (Control Transfer) применяется для настройки уст- ройства при подключении, для управления протоколом передачи и получения статусной информации в процессе работы. .Передача массива данных (Bulk Data Transfer) применяется при необходи- мости гарантированной доставки данных от устройства к хосту или наоборот, но время доставки не ограничено. 206
Функции обмена данными семейства PIC18F2455/2550/4455/4550 • Передача по прерываниям (Interrupt Transfer) применяется, когда требуется передавать одиночные пакеты данных небольшого размера. Каждый пакет пере- дается за ограниченное время. Гарантируется целостность передаваемых данных. Этот тип передачи применяется в устройствах ввода, таких как мышь и клавиатура. • Изохронная передача (Isochronous Transfers) применяется для передачи больших блоков данных (до 1023 байт) в режиме реального времени. Целост- ность данных не гарантируется, повторений при сбоях нет, допускается потеря пакетов. Этот тип передачи обычно используется в мультимедийных устройствах для передачи голоса и изображения. Полноскоростные устройства, соответствующие спецификации USB 2.0, под- держивают все типы передачи; низкоскоростные ограничиваются только переда- чей по прерыванию и управляющей передачей. Допускается питание устройства непосредственно от шины, для чего в ней предусмотрены специальные линии питания. В этом случае требования к энерго- потреблению устройства жестко регламентируются спецификацией. Предусмот- рены три класса энергопотребления; • С питанием от шины и малым потреблением, не более 100 мА. • С питанием от шины и большим потреблением; должны потреблять от шины не более 100 мА при включении и конфигурировании и не более 500 мА после окончания конфигурирования. При подключении устройство сообщает хост- контроллеру о потребляемом токе. Если он превышает 500 мА, в подключении будет отказано. • С собственным источником питания; от шины потребляется не более 100 мА, остальной ток от внешнего источника. При пропадании внешнего питания ток, потребляемый от шины, не должен превышать 100 мА. Внимание! Если устройство потребляет ток больший, чем был запрошен при подключении, хост-контроллер откажет в обслуживании и отключит устройство. Согласно спецификации USB, потребляемая мощность измеряется в блоках (units) величиной 100 мА. Таким образом, потребляемая устройством мощность может лежать в пределах 1-5 блоков. Спецификация предусматривает наличие у любого устройства режима пони- женного энергопотребления (Suspend Mode). В этом режиме потребляемый ток пропорционален заявленному потреблению в блоках. Для устройства с потреблением в 1 блок (100 мА) ток в режиме энергосбереже- ния не должен превышать 500 мкА, причем с учетом тока через подтягивающий резистор, подключенный к одной из сигнальных линий. Если для подключения USB устройства применяется концентратор (хаб), то обе его сигнальные линии имеют резисторы 15 кОм, подключенные к «земле». Ток через эти резисторы составляет 200 мА. Соответственно, для питания устройства с потреблением в 1 блок при под- ключении к хабу выделяется не более 300 мА. Чтобы устройство не превысило лимит потребления в экономичном режиме, рекомендуется переводить микрокон- троллер в режим Sleep. Все оконечные устройства должны поддерживать режим «сна» при отсутствии активности на шине более 3 мс. Еще 7 мс дается устройству на то, чтобы перей- ти в «спящий» режим. Для поддержания связи с хост-контроллером устройство должно обеспечивать протекание тока через подтягивающий резистор выбора скорости. Наличие этого резистора говорит о том, что устройство все еще под- ключено к шине. Хост-контроллер может периодически передавать на шину сиг- нал SOF (начало пакета) чтобы предотвратить переход устройства в зкономич- 207
Глава 2 ный режим. Если устройство, находящееся в режиме «сна», получило команду на пробуждение, оно должно выйти из этого режима не более, чем за -10 мс и подтвер- дить пробуждение увеличением потребляемого тока до штатного значения. Перечисление Когда устройство подключено к шине, хост начинает процесс перечисления (enumeration), с целью идентификации устройства. По существу, хост в опреде- ленной последовательности опрашивает устройство, получая в ответ информа- цию об энергопотреблении, скорости передачи и размере блоков данных и про- чую информацию, содержащуюся в дескрипторах. Типичный процесс перечис- ления происходит следующим образом: . Сброс устройства. Устройство не сконфигурировано и не имеет собственного адреса (адрес 0). . Получение дескриптора устройства. Хост получает малую часть описания устройства. . Повторный сброс устройства. . Установка адреса. Хост присваивает адрес устройству. . Получение дескриптора устройства. Хост получает информацию о произво- дителе, типе устройства, максимальном размере управляющих пакетов. . Получение дескрипторов конфигурации. • Получение прочих дескрипторов. • Установка конфигурации. Дескрипторы Рассмотрим подробнее описание дескрипторов. Существует восемь типов деск- рипторов, из которых для рассматриваемых нами устройств наиболее важны пять. 1. Дескриптор устройства. Дескриптор устройства содержит основную ин- формацию о производителе устройства (но не микроконтроллера, а изделия в целом), номер версии изделия, серийный номер, класс устройства и количество конфигураций. Дескриптор устройства всегда бывает только один. 2. Дескриптор конфигурации. Дескриптор конфигурации предоставляет хос- ту информацию о потребляемом токе и о том, сколько различных интерфейсов поддерживается в этой конфигурации. Устройство может иметь более одной конфигурации (например, обычного и пониженного энергопотребления). 3. Дескриптор интерфейса. Дескриптор интерфейса описывает количество конечных точек, используемых данным интерфейсом, а также класс интерфейса. Конфигурация может иметь более одного интерфейса. 4. Дескриптор конечной точки. Дескриптор конечной точки определяет тип и направление передачи, а также некоторые другие специфические параметры конечной точки. Одно устройство может иметь несколько (до 16) конечных то- чек. Некоторые конечные точки могут быть «отключены» в определенной кон- фигурации. 5. Дескриптор строки. Дескриптор строки содержит текст в формате UNICODE и предоставляет текстовую информацию, доступную для восприятия человеком. Эта информация описывает определенный логический уровень уст- ройства. Часто дескриптор строки используется для идентификации потребите- лем устройства, подключенного к хосту. В целях экономии памяти допускается не 208
Функции обмена данными семейства PIC18F2455/2550/4455/4550 использовать строковые дескрипторы. Если устройство не поддерживает деск- рипторы строк, все ссылки на них из дескрипторов устройства, конфигурации или интерфейса должны иметь нулевое значение. Устройство может поддерживать несколько различных языков, поэтому при запросе дескриптора строки применя- ется идентификатор языка. Скорость шины Каждое устройство должно сообщать о своем присутствии на шине и допусти- мой скорости обмена. Это достигается при помощи резистора сопротивлением 1.5 кОм, который подключается к шине в момент подключения устройства к разъ- ему. В зависимости от скорости обмена, поддерживаемой устройством, резистор подключается к линии питания 3,3 В и одной из линий D+ или D-. В устройствах с малой скоростью обмена резистор подключен к линии D-, в полноскоростных устройствах к линии D+. Спецификации классов и драйверы Спецификация USB включает в себя спецификации классов, которые опцио- нально поддерживаются производителями операционных систем. В качестве примера классов можно привести аудиоустройства, внешние накопители, устрой- ства связи, интерфейсные устройства (Human Interface Device, HID). В большин- стве случаев для взаимодействия с устройством требуется драйвер, позволяю- щий хосту «говорить на языке устройства». Драйверы для большинства стан- дартных устройств входят в состав популярных операционных систем по умол- чанию. Это позволяет значительно облегчить и ускорить процесс разработки уст- ройства. Достаточно лишь обеспечить соответствие стандартным требованиям. Встроенная и внешняя периферия USB Рассматриваемое семейство микроконтроллеров содержит встроенный узел последовательного интерфейса USB (USB Serial Interface Engine, SIE), обеспе- чивающий связь между микроконтроллером и хостом. Этот узел поддерживает как полноскоростной, так и низкоскоростной обмен. SIE может быть подключен как непосредственно к шине USB, с использованием встроенного трансивера, так и через внешний трансивер. Предусмотрен также внутренний источник 3,3 В для питания встроенного трансивера в 5-вольтовых устройствах (рис.2.2). Некоторые аппаратные опции предназначены для повышения производитель- ности модуля. Двухпортовая память в пространстве памяти микроконтроллера (ОЗУ USB) предоставляет прямой доступ и обмен данными между ядром и SIE. Дескрипторы буфера позволяют пользователю свободно настраивать использо- вание памяти для конечных точек в пределах ОЗУ USB. Потоковый параллель- ный порт обеспечивает поддержку непрерывной передачи больших объемов данных, таких, как изохронные данные, во внешнюю буферную память. Статус и управление Модуль USB конфигурируется и управляется при помощи трех управляющих регистров. Кроме того, в общей сложности 19 регистров используются для управ- ления текущими транзакциями USB. Это следующие регистры: 209
Глава 2 СЕМЕЙСТВО PIC18Fx455/x550 Рис. 2.2. Периферийный модуль USB и его опции. (1) Сигнал доступен, только если встроенный трансивер отключен (UTRDIS=1).,2) Если применяются внешние резисторы, то встроенные должны быть отключены (UPUEN=0). <3) Не включайте встроенный регулятор, если применяется внешний источник . Управляющий регистр USB (UCON). • Регистр конфигурации USB (UCFG). . Регистр статуса переноса данных USB (USTAT). . Регистр адреса устройства USB (UADR). . Регистр номера кадра (UFRMH:UFRML). . Регистры включения конечных точек от 0 до 15 (UEPn). Управляющий регистр UCON содержит биты, необходимые для управления поведением модуля во время обмена данными. Регистр содержит следующие управляющие биты: . Включение главной периферии USB. . Сброс указателя буфера Ping-Pong. • Управление реакцией на сигнал выхода из режима ожидания (Resume State signaling). . Отключение пакетного режима. Кроме того, регистр UCON содержит бит статуса SEO, который применяется для индикации состояния линейного нуля шины (Single Ended Zero), когда на обоих выводах D- и D+ присутствует низкий уровень. Когда модуль USB включен, состояние этого бита отслеживается для обнаружения выхода дифференциаль- ных линий шины из нулевого состояния. Это позволяет различить начальное включение устройства и сигнал сброса устройства. 210
Функции обмена данными семейства PIC18F2455/2550/4455/4550 Общее функционирование модуля USB зависит от бита USBEN (UCON<3>). Установка этого бита активирует модуль и сбрасывает все биты PPBI в таблице буфера дескрипторов. Кроме этого, включается встроенный регулятор напряжения, и подключаются внутренние нагрузочные резисторы, если их подключение дополнительно задано. Таким образом, этот бит может применяться для программного включе- ния/выключения модуля USB. Несмотря на то, что все биты статуса и конфигура- ции игнорируются, когда этот бит сброшен, модуль USB должен быть полностью сконфигурирован до момента установки бита USBEN в «1». bit7 Не используется, читается, как «О» bit6 PPBRST бит сброса указателей буферов Ping-Pong 1 = сброс всех указателей буферов Ping-Pong в четное состояние О = указатели буферов Ping-Pong не сбрасываются bit5 SEO флаг-бит наличия линейного нуля 1 = шина в состоянии линейного нуля О = линейный ноль не обнаружен bit4 PKTDIS бит отключения передачи пакетов 1 = маркер SIE и обработка пакетов отключены, автоматически устанав- ливается, когда принят маркер SETUP. О = маркер SIE и пакетная обработка включены bit3 USBEN бит включения модуля USB 1 = модуль USB и схемы поддержки включены (устройство USB подключено) О = модуль USB и схемы поддержки отключены (устройство USB отключено) bit2 RESUME бит разрешения сигнала Resume (выход из режима ожидания) 1 - сигнализация Resume активирована О - сигнализация Resume отключена bitl SUSPND бит режима пониженного потребления тока схемой USB 1 = модуль USB и схемы поддержки в экономичном режиме, тактирование SIE отключено О = модуль USB и схемы поддержки в штатном режиме, SIE тактируется в соответствии с конфигурацией bitO Не используется, читается, как «О» Бит PPBRST управляет состоянием Reset, когда используется специальный режим двойной буферизации (Ping-Pong буферизация, рассмотрена далее). Если бит PBRST установлен, все указатели буферов Ping-Pong указывают на «пло- ские» буферы. Бит сбрасывается программно. В режимах, не требующих под- тверждения типа Ping-Pong, этот бит игнорируется. Бит PKTDIS является флагом, индицирующим, что у ядра SIE отключен режим пакетной передачи и приема. При получении ядром SIE маркера SETUP этот бит автоматически устанавливается для разрешения процесса настройки. Бит может 211
Гпава 2 быть только сброшен микроконтроллером, но не установлен. Сброс бита позво- ляет ядру SIE продолжить прием/передачу. Любые события из очереди на обра- ботку остаются доступными и отмечены в буфере FIFO регистров группы USTAT. Бит RESUME разрешает периферии выполнить сигнал дистанционного «про- буждения» по маркеру Resume. Для генерации подтверждения пробуждения бит аппаратно устанавливается на 10 мс и затем сбрасывается. Бит SUSPND переводит модуль USB и сопутствующие схемы в режим в режим пониженного потребления. Тактирование ядра SIE отключается. Этот бит должен быть установлен программно в ответ на прерывание IDLEIF. Сброс бита произ- водится аппаратно, после того, как обнаружено прерывание ACTVIF. Когда этот бит активен, устройство остается подключенным к шине, но выходы трансивера поддерживают состояние Idle (пауза). Напряжение на выводе VUSB может менять- ся в зависимости от значения бита. Установка этого бита до появления запроса IDLEIF вызовет непредсказуемую реакцию шины. Устройство, питаемое от шины, в режиме Suspend должно потреблять ток не более 500 мкА. Это полный ток, потребляемый микроконтроллером и сопутст- вующими компонентами схемы. Поэтому при разработке устройства необходимо гарантировать соблюдение требований к минимальному току в режиме Suspend. Регистр конфигурации UCFG. Перед началом передачи данных по шине USB необходимо произвести конфигурирование внутренней и ассоциированной внешней аппаратной части модуля USB. Основная часть конфигурирования осу- ществляется при помощи регистра UCFG. Регистр содержит большинство битов, влияющих на поведение модуля USB на разных логических уровнях, а именно: . Скорость шины. . Включение встроенных нагрузочных резисторов. . Включение встроенного трансивера. • Использование запросов и буферов Ping-Pong. Регистр UCFG также содержит два бита, которые предназначены для тести- рования модуля, отладки и сертификации. Эти биты управляют мониторингом выходов и генерацией наглядных диаграмм. Скорость шины, а также включение трансивера и нагрузочных резисторов должны быть сконфигурированы один раз, на этапе настройки. Не рекоменду- ется менять установки, когда модуль включен и начал работать. bit7 UTEYE бит включения визуального теста USB 1 = тест разрешен О = тест запрещен bit6 UOEMON бит разрешения мониторинга по сигналу ОЕ(1) 1 - сигнал ОЕ активен; он индицирует интервалы, на которых линии D+/D- активны О -- сигнал ОЕ не активен bit5 Не применяется, читается, как «О» bit4 UPUEN бит включения встроенных нагрузочных резисторов12,3) 1 = встроенная нагрузка включена 212
Функции обмена данными семейства PIC18F2455/2550/4455/4550 (на линию D+ если FSEN=1 или D- если FSEN-O) О = встроенная нагрузка отключена bit3 UTRDIS бит выключения встроенного трансивера(2) 1 = встроенный трансивер отключен; интерфейс цифрового трансивера включен О = встроенный трансивер активен bits FSEN бит включения полной скорости 1 = полноскоростное устройство: требует частоту тактирования 48 МГц О = низкоскоростное устройство: требует частоту тактирования 6 МГц bitl-О РРВ1:РРВ0 биты конфигурации буферов Ping-Pong 11 = зарезервированное сочетание 10 - четные/нечетные буферы Ping-Pong включены для всех точек 01 = четные/нечетные буферы Ping-Pong включены для выхода точки 0 00 = четные/нечетные буферы Ping-Pong выключены Примечания: Если бит UTRDIS установлен, сигнал QE будет активен независимо от уста- новки бита UOEMON. Биты UPUEN, UTRDIS и FSEN никогда не должны менять состояние, если мо- дуль USB включен. Этот бит действителен, только если встроенный трансивер активен (UTRDIS=0). Иначе он игнорируется. Встроенный трансивер Модуль USB имеет встроенный трансивер, соответствующий стандарту USB 2.0 и совместимый с низкоскоростной шиной. Этот трансивер подключен к ядру SIE по внутренним линиям. Наличие встроенного трансивера позволяет разрабатывать недорогие устройства. Бит UTRDIS (UCFG<3>) управляет транси- вером. По умолчанию (UTRDIS=0) встроенный трансивер включен. Бит FSEN (UCFG<2>) управляет скоростью передачи. Когда этот бит установлен, устройство работает в режиме полной скорости. Подключение встроенных нагрузочных резисторов определяется установкой бита UPUEN (UCFG<4>). Встроенные резисторы могут быть подключены, только если включен встроенный трансивер. Спецификация USB требует питать устройство от источника 3,3В. Поскольку вся остальная схема может работать при более высоком напряжении, трансивер питается от отдельного источника Vusb- Внешний трансивер Модуль USB позволяет использовать внешний трансивер, если особенности конструкции требуют раздельного применения трансивера и ядра. Например, это устройства, требующие гальванической развязки между микроконтроллером и шиной USB (рис.2.3). Режим использования внешнего трансивера задается уста- новкой бита UTRDIS. Для управления внешним трансивером и связи с ним используются шесть сиг- нальных линий: 213
Гпава 2 Рис. 2.3. Применение внешнего трансивера с гальванической развязкой . VM: вход несимметричной линии D-. . VP: вход несимметричной линии D+. . RCV: вход от дифференциального приемника. . VMO: выход на дифференциальный каскад. . VPO: выход на дифференциальный каскад. . ОЕ: включение выхода. Сигналы VMO и VPO поступают из ядра SIE на внешний трансивер. Сигнал RCV поступает из внешнего трансивера в ядро SIE. Этот сигнал представляет собой последовательность однополярных импульсов, которая транслирована внешним трансивером из дифференциального сигнала шины USB. Сигналы VM и VP предназначены для передачи в ядро SIE той информации о работе шины, ко- торая не может быть транслирована в сигнал RCV. Комбинации сигналов и их интерпретация приведены в табл. 2.1 и 2.2. Таблица 2.1 Дифференциальные выходы от SIE на трансивер VPO VMO Состояние шины 0 0 Сигнал «нулевая шина» 0 1 Дифференциальный «0» 1 0 Дифференциальная «1» 1 1 Запрещенное состояние Таблица 2.2 Несимметричные сигналы от трансивера к SIE VP VM Состояние шины 0 0 Сигнал «нулевая шина» 0 1 Низкая скорость 1 0 Высокая скорость 1 1 Ошибка Сигнал ОЕ переключает состояние внешнего трансивера. Эта линия перево- дится устройством в низкий уровень, когда необходимо начать передачу данных из SIE во внешнее устройство. 214
Функции обмена данными семейства PIC18F2455/2550/4455/4550 Хост-контроллер / микроконтроллер usg Хаб Рис. 2.4. Подключение подтягивающего резистора к линии шины USB Встроенные нагрузочные резисторы Встроенные резисторы предназначены для оповещения о поддерживаемой скорости работы шины USB (малая скорость, или полная скорость) в соответст- вии со спецификацией. Подключение резисторов производится при помощи бита UPUEN (UCFG<4>). Допускается применение внешних резисторов. Напряжение Vusb используется для «подтягивания» одной из линий, D+ или D-. Резистор должен иметь сопротивление 1,5 кОм (±5%). Пример подключения резистора по- казан на рис.2.4. Опция мониторинга USB ОЕ предоставляет возможность отследить, управля- ет ли ядро SIE шиной, или следит за ее состоянием. Опция включается по умол- чанию, когда используется внешний трансивер, или когда UCGG<6>=1. Монито- эинг ОЕ полезен при начальной отладке системы, поскольку позволяет визуаль- но отследить переключение модуля при помощи осциллографа или логического анализатора. Включение визуального теста Когда установлен бит UCFG<7>, автоматически генерируется последователь- ность сигналов для визуального тестирования при помощи осциллографа. Под- разумевается, что перед началом тестирования пользователь правильно настро- ил тактирование модуля USB, подтягивающие резисторы, режим трансивера и _.п. Разумеется, модуль должен быть включен. Как только бит тестирования установлен, модуль эмулирует переключение из ~риема на передачу, затем начинает передавать последовательность J-K-J-K для полноскоростного режима K-J-K-J). Последовательность повторяется, пока зключей тест. Следует иметь в виду, что тест нельзя включать, если устройство под- лючено к действующей шине USB. Режим тестирования предназначен только оля проверки готовой печатной платы и сертификации ее на соответствие требо- ваниям спецификации. При помощи этого теста можно проверить шумовую со- 215
Гпава 2 ставляющую сигнала, обнаружить несоответствие импедансов и взаимное влия- ние компонентов платы. Однако этот тест не позволяет пройти полную сертифи- кацию по стандарту USB и предназначен только для первичной отладки системы. Встроенный регулятор напряжения Микроконтроллеры PIC18Fx455/x550 оснащены встроенным регулятором на- пряжения для питания встроенного трансивера и подключения внутренних или внешних подтягивающих резисторов. Для большей стабильности выходного на- пряжения требуется внешний конденсатор емкостью 220 нФ. Кроме встроенного трансивера, тока от источника VUSB достаточно для питания внешних нагрузочных резисторов, и не более того. Регулятор включен по умолчанию и может быть выключен при помощи бита конфигурации VREGEN. Когда регулятор включен, напряжение подается на вы- вод VUSB- Если же регулятор отключен, то на этот вывод необходимо подать внешнее напряжение 3,3 В для питания встроенного трансивера. Разумеется, если встроенный трансивер не используется, то напряжение на выводе Vusb не требуется. Внимание! Не включайте встроенный регулятор, если на вывод VUSB пода- но внешнее напряжение. Напряжение VDD всегда должно быть больше, чем Vusb, даже если регулятор отключен. Регистры состояния и управления USB Регистр состояния USTAT демонстрирует статус транзакции в ядре SIE. Когда SIE выставляет прерывание по событию окончания передачи через USB, програм- ма пользователя должна прочитать USTAT для определения статуса передачи. В этом регистре содержится номер конечной точки, задействованной в передаче, на- правление и значение указателя на буфер Ping-Pong (если он используется). Внимание! Данные в регистре USTAT являются валидными, только если установлен флаг TRNIF. Фактически, регистр USTAT является окном для чтения в четырехбайтном стеке статуса, организованном по принципу FIFO и встроенном в ядро SIE. Это позволяет микроконтроллеру обработать одну передачу, пока SIE обслуживает другие конечные точки (рис.2.5). 216
Функции обмена данными семейства PIC18F2455/2550/4455/4550 Когда ядро заканчивает использовать буфер для чтения или записи данных, происходит обновление регистра USTAT. Если следующая передача USB начи- нается прежде, чем прерывание предыдущей передачи обработано, ядро SIE сохранит статус следующей передачи в стек статуса. Сброс флаг-бита TRNIF заставляет ядро сдвинуть стек статуса. Если сле- дующие данные в регистре стека являются валидными, ядро SIE немедленно вновь установит флаг прерывания. Если новых данных нет, флаг-бит TRNIF ос- танется сброшенным, данные в регистре USTAT далее не будут считаться дос- товерными. Внимание! Если запрос к конечной точке будет принят, когда стек стату- са заполнен, ядро автоматически пошлет хосту сигнал NAK (занят, к обмену не готов). Регистр состояния USTAT bit7 Не используется, читается, как «О» bit6-3 ENDP3:ENDP0 - Закодированный номер последней конечной точ- ки, с которой осуществлялся обмен (представляет собой номер в таблице дескрипторов, обновленный при последней передаче) 1111= конечная точка 15 1110 = конечная точка 14 0001 = конечная точка 1 0000 = конечная точка 0 bit2 DIR бит индикации направления последней транзакции 1 = последняя транзакция была токеном IN 0 = последняя транзакция была токеном OUT или SETUP bit1 PPBI бит индикации указателя Ping-Pong<1) 1 = последняя транзакция была в банк Odd (нечетный) 0 = последняя транзакция была в банк Even (четный) Примечание 1: Этот бит имеет валидное значение только для конечных точек с доступными четными и нечетными регистрами буфера. Описание режима Ping-Pong дано далее. bitO Не используется, читается, как «0» Регистр управления конечными точками UEPn Каждая из 16 двунаправленных конечных точек имеет свой независимый управляющий регистр UEPn (где «п» означает номер конечной точки). Каждый регистр имеет идентичный набор управляющих битов, как показано далее: bit7-5 Не используется, читается, как «0» bit4 EPHSHK бит включения опции Handshake (подтверждение) 1 = опция включена 217
Глава 2 О = опция отключена (обычно для изохронных конечных точек) bit3 EPCONDIS управляющий бит двунаправленной конечной точки Если EPOUTEN-1 и EPINEN=1: 1 = конечная точка отключена от управляющих передач; допускаются только передачи типа IN и OUT О = допускаются управляющие передачи типа SETUP; передачи IN и OUT также допускаются bit2 EPOUTEN бит разрешения выхода конечной точки 1 = выход конечной точки п разрешен О = выход конечной точки п запрещен bitl EPINEN бит разрешения входа конечной точки 1 = вход конечной точки п разрешен О = вход конечной точки п запрещен bitO EPSTALL бит остановки конечной точки0’ 1 = конечная точка п остановлена О = конечная точка п не остановлена Примечание 1: используется, если конечная точка п включе- на; в ином случае бит не имеет значения. Бит EPCONDIS определяет, будут ли проходить через конечную точку управ- ляющие команды типа Setup. Для нулевой конечной точки этот бит всегда дол- жен быть сброшен, так как спецификация USB по умолчанию рассматривает ко- нечную точку 0 как конечную точку для управляющих команд. Бит EPSTALL используется для индикации состояния останова (STALL) для данной конечной точки. Если конечная точка остановлена, бит EPSTALL для этой точки устанавливается ядром SIE. Бит остается установленным, пока не будет сброшен прошивкой или по сбросу SIE. Бит EPOUTEN разрешает транзакции типа OUT (с хоста). Аналогично бит EPINEN разрешает транзакции типа IN с хоста. Регистр адреса UADDR Регистр адреса содержит уникальный USB адрес, который декодируется пе- риферией, если она активна. UADDR сбрасывается в 00h при получении коман- ды USB Reset, что индицируется флаг-битом прерывания URSTIF, или по коман- де Reset, полученной от микроконтроллера. Адрес USB должен быть записан микроконтроллером во время этапа настройки устройств USB (перечисления). Регистры номера кадра UFRMH.UFRML Пара регистров UFRMH:UFRML содержит 11-разрядный номер кадра. Млад- ший байт содержит значение UFRML, три старших бита содержатся в UFRMH. Регистровая пара получает новое значение всякий раз, когда поступает токен SOF. Со стороны микроконтроллера этот регистр доступен только для чтения. Регистр номера кадра используется в первую очередь при изохронном обмене данными. 218
Функции обмена данными семейства PIC18F2455/2550/4455/4550 ОЗУ USB Данные USB перемещаются между ядром микроконтроллера и ядром SIE че- рез область памяти, называемую ОЗУ USB. Это специальная двухпортовая па- мять, которая отображается на обычное пространство памяти, расположенное в банках с 4 по 7 (400h...7FFh), суммарным объемом 1 кб (рис.2.6). Банк 4 (400h...4FFh) используется специально для управления буфером ко- нечных точек, тогда как банки с 5 по 7 доступны для данных USB. Несмотря на то, что ОЗУ USB доступно микроконтроллеру, как память данных, сегмент дос- тупный ядру SIE, не может быть доступен микроконтроллеру. Для определения, кто будет иметь доступ к буферной памяти в данный момент, используется спе- циальный семафорный механизм, который мы рассмотрим ниже. OOOh Банки с О по 3 Данные пользователя Дескрипторы буфера, данные USB или польэов. 3FFh 400h 4FFh 500h Банки с 4 по 7 (USB RAM) Данные USB или пользовательские Банки с 8 по 14 Специальные регистры 7FFh 800h FOOh F60h FFFh Рис. 2.6. Отображение ОЗУ USB на пространство памяти 219
Гпава 2 Дескрипторы буфера и таблица дескрипторов Регистры Банка 4 используются исключительно для управления буфером ко- нечных точек в структуре, называемой таблицей дескриптора буфера (Buffer De- scriptor Table, BDT). Эта опция предоставляет пользователю метод гибкого созда- ния и управления буферами контрольных точек различной длины и конфигурации. ВОТ состоит из дескрипторов буфера, которые используются для определе- ния и управления буферами в пространстве ОЗУ USB. Каждый дескриптор буфе- ра (рис. 2.7) состоит из четырех регистров, где п представляет собой 64 возмож- ных номера дескрипторов (в диапазоне от 0 до 63): • BDnSTAT - регистр статуса дескриптора. . BDnCNT - регистр счетчика байтов дескриптора. • BDnADRL - регистр адреса, младший байт. . BDnADRH - регистр адреса, старший байт. Дескрипторы буфера всегда представляют собой четырехбайтный блок в следующей последовательности: BDnSTAT: BDnCNT: BDnADRL: BDnADRH. Ад- рес регистра BDnSTAT всегда отсчитывается со сдвигом (4п - 1) в шестнадцате- ричной системе, от начального адреса 400h. В зависимости от используемой конфигурации буфера, может быть до 32 или 64 наборов дескрипторов буфера. Как минимум, BDT должна иметь длину не ме- нее 8 байт, поскольку спецификация USB подразумевает, что каждое устройство должно иметь нулевую конечную точку с функциями ввода и вывода для началь- ной настройки. В зависимости от конфигурации конечных точек, BDT может иметь длину вплоть до 256 байт. Несмотря на то, что регистры дескрипторов буфера и адреса могут рассмат- риваться, как специальные управляющие регистры, они не отображаются аппа- ратно, в виде условных специальных регистров Банка 15. Если конечная точка, соответствующая определенному дескриптору буфера, отключена, этот регистр не используется. Вместо обращения к несуществующему адресу происходит об- ращение к ОЗУ. Лишь только если конечная точка включена установкой бита UEPn<1>, эти адреса приобретают функциональность регистров дескриптора буфера. Как и любая ячейка ОЗУ, после сброса микроконтроллера регистры де- скриптора буфера хранят непредсказуемое значение. Рис. 2.7. Пример дескриптора буфера (области памяти показаны не в масштабе) 220
Функции обмена данными семейства PIC18F2455/2550/4455/4550 На рис. 2.7 показан пример дескриптора буфера для 40-байтного буфера, на- чинающегося с адреса 500h. Определенный набор регистров дескриптора явля- ется валидным, только если соответствующая конечная точка включена. Все ре- гистры дескриптора буфера доступны в ОЗУ USB. Дескриптор буфера для каж- дой конечной точки должен быть настроен до ее включения. Статус и конфигурация дескрипторов буфера Дескрипторы буфера описывают не только размер буфера конечной точки, но также определяют его конфигурацию и управление. Основная часть конфигура- ции задается через регистр статуса BDnSTAT. Каждый дескриптор буфера имеет собственный уникальный и соответственно пронумерованный регистр BDnSTAT. В отличие от других управляющих регистров, битовое содержание регистра BDnSTAT является контекстно-зависимым. Существует две различных кон- фигурации, зависящие от того, кто модифицирует дескриптор и буфер в данный момент - микроконтроллер или модуль USB. Принадлежность буфера Поскольку буферы и их дескрипторы являются общими для микроконтроллера и модуля USB, для определения того, кому доступны для обновления дескрипто- ры и ассоциированные с ними буферы в памяти, применяется простой семафор- ный механизм. Он реализуется использованием специального бита UOWN (BDnSTAT<7>). При помощи этого бита происходит переключение меяоду двумя конфигурациями BDnSTAT. Когда бит UOWN сброшен, доступ к дескриптору буфера «принадлежит» ядру микроконтроллера. Когда бит установлен, доступ к дескриптору и буферной па- мяти «принадлежит» модулю USB. В это время ядро микроконтроллера не может модифицировать дескрипторы или связанные с ними буферы данных. Имейте в виду, что микроконтроллер может продолжать читать BDnSTAT, пока буфер принадлежит модулю USB и наоборот. Дескрипторы буфера имеют различное значение в зависимости от источника обновления регистра. Преяоде чем передать «право собственности» модулю USB, пользователь может сконфигурировать базовую функциональность пери- ферии при помощи битов BDnSTAT. Когда бит UOWN установлен, пользователь больше не может влиять на зна- чения, записанные в дескрипторы. С этого момента значения дескрипторов, при необходимости, обновляет ядро SIE. Регистр BDnSTAT обновляется ядром SIE с записью токена PID, счетчик обмена байтами BDnCNT также обновляется. Байт BDnSTAT в таблице дескрипторов всегда должен быть последним байтом, обновляемым при подготовке к использованию конечной точки. Ядро SIE сбросит бит UOWN, когда транзакция будет завершена. Исключение составляет ситуация, когда включен KEN и/или BSTALL (см. далее описание регистра BDnSTAT). Не существует аппаратного механизма блокирования доступа, если бит UOWN установлен. Следовательно, если микроконтроллер попытается модифицировать память, когда она «принадлежит» ядру SIE, это может привести к непредсказуемому ре- зультату. Аналогично, чтение той же памяти может возвращать некорректные данные до тех пор, пока ядро SIE не вернет право доступа микроконтроллеру. 221
Гпава 2 Регистр BDnSTATе режиме CPU (принадлежность микроконтроллеру) Когда UOWN=0, право доступа к дескриптору буфера принадлежит микрокон- троллеру. В это время остальные семь разрядов регистра исполняют управляю- щие функции. bit7 UOWN бит принадлежности01 О = ядро микроконтроллера владеет доступом к дескриптору и связанному с ним буферу bit6 DTS бит синхронизации переключения данных121 1 = пакет типа Data 1 О = пакет типа Data О bit5 KEN бит включения режима удержания дескриптора буфера 1 = модуль USB продолжает удерживать дескриптор с момента первой установки бита UOWN (требуется для конфигурации конечной точки в SPP) О = USB отпускает дескриптор, когда токен обработан bit4 INCDIS бит выключения инкремента адреса 1 = инкремент адреса выключен (требуется для конфигурации конечной точки в SPP) О = инкремент адреса включен bit3 DTSEN бит включения синхронизации переключения данных 1 = синхронизация данных включена; пакеты данных с некорректным значением Sync будут игнорированы О = синхронизация данных отсутствует bit2 BSTALL бит останова буфера 1 = останов буфера включен; выдается подтверждение STALL, если токен принят, что позволяет использовать дескриптор в текущем положении (бит UOWN остается установленным, значение дескрипто- ра не меняется) О = останов буфера отключен bifl-О ВС9:ВС8 биты 9 и 8 счетчика байтов Биты счетчика байтов представляют собой количество байтов, которые будут переданы по токену IN или приняты по токену OUT. Вместе с разрядами ВС<7:0> может быть подсчитано от 0 до 1023 байт. Примечания: 1. Этот бит должен быть инициализирован пользователем в нужное значение до включения модуля USB 2. Этот бит игнорируется, пока не установлен бит DTSEN = 1 Рассмотрим подробнее назначение разрядов регистра BDnSTAT в режиме CPU. Разряд KEN (BDnSTAT<5>) влияет на удержание дескриптора буфера. Если разряд установлен, как только устанавливается бит UOWN, регистр начинает принадлежать ядру SIE независимо от работы конечной точки. Это защищает 222
Функции обмена данными семейства PIC18F2455/2550/4455/4550 стек USTAT FIFO от изменения, одновременно не давая установиться прерыва- нию по завершению транзакции для этой точки. Эта опция используется только в том случае, если для передачи данных используется потоковый параллель- ный порт, а не USB. Разряд INCDIS (BDnSTAT<4>) управляет функцией автоматического инкре- мента адреса ядра SIE. Установка этого разряда отключает автоинкремент адре- са буфера под управлением SIE при передаче или приеме каяодого байта. Эта опция должна использоваться, только если применяется потоковый параллель- ный порт, когда каждый байт данных направляется или передается с применени- ем одной и той же ячейки памяти. Разряд DTSEN (BDnSTAT<3>) управляет проверкой четности. Установка раз- ряда включает синхронизацию SIE. Проверяется четность пакета данных приме- нительно к типу, указанному разрядом DTS (BDnSTAT<6>). Если пакет получен с некорректной синхронизацией (принят несинхронно), данные будут игнорирова- ны, они не будут записаны в ОЗУ USB и флаг прерывания по завершению пере- дачи не будет установлен. Тем не менее, ядро SIE передаст хосту токен АСК в качестве квитанции подтверждения приема. Этот режим применяется при пере- даче несинхронных потоковых данных от хоста к приемнику, таких, как звук на USB-колонки, когда невозможно прервать или повторить передачу для синхрони- зации, но необходимо игнорировать сбойные данные. Влияние разряда DTSEN на ядро SIE показано в табл. 2.3. Таблица 2.3. Влияние разряда DTSEN на прием нечетных/четных (DataO/DataT) пакетов Пакеты от хоста (OUT) Установки BDnSTAT Ответ устройства после приема пакета DTSEN DTS Подтвержде- ние UOW N TRNI F BDnSTAT и USTAT DATAO 1 0 АСК 0 1 Обновлены DATA1 1 0 АСК 1 0 Не обновлены DATAO 1 1 АСК 0 1 Обновлены DATA1 1 1 АСК 1 0 Не обновлены Иное 0 X АСК 0 1 Обновлены Иное с ошибкой X X NAK 1 0 Не обновлены х - не обслуживается Разряд BSTALL (BDnSTAT<2>) обеспечивает поддержку управляющих пере- дач, обычно однократные остановы нулевой конечной точки. Кроме того, он обес- печивает поддержку для команд SET_FEATURE/CLEAR_FEATURE, описанных в разделе 9 спецификации USB. Обычно это непрерывное состояние STALL для лю- бой конечной точки, иной, чем управляющая конечная точка по умолчанию. Необходимо пояснить, что устройство пользователя переходит в состояние STALL при серьезной ошибке, когда необходимо вмешательство хоста. В этом случае в ответ на попытку транзакции устройство посылает пакет STALL. В отли- 223
Глава 2 чие от других пакетов, хост доводит информацию о получении отказа типа STALL до системного драйвера, отменяющего все транзакции с этой точкой, и до кли- ентского драйвера (программы). Разряд BSTALL разрешает остановы буфера. Установка бита вынуждает SIE ответить хосту токеном STALL, если полученный от хоста токен пытался исполь- зовать именно данный дескриптор буфера. Как только передан токен STALL, ге- нерируется прерывание типа STALL и устанавливается бит EPSTALL соответст- вующего управляющего регистра UEPn. Бит UOWN остается установленным, и дескрипторы буфера не изменяются, пока не будет принят токен SETUP. В этом случае состояние STALL отменяется и право доступа к дескриптору буфера пе- редается микроконтроллеру. Регистр BDnSTATв режиме SIE (принадлежность модулю USB) Когда дескриптор буфера и соответствующий буфер переходят в собствен- ность ядра SIE, большинство разрядов регистра BDnSTAT приобретает иное значение: bit7 UOWN бит принадлежности 1 = SIE владеет дескриптором и соответствующим буфером bit6 Зарезервирован, не доступен для записи через SIE bit5-2 PID3:PID0 биты идентификатора пакета PID полученного токена последнего обмена (только для транзакций типа IN, OUT или SETUP) bit1-0 ВС9:ВС8 биты 9 и 8 счетчика байтов Эти биты обновляются через SIE, отражая текущее количество байтов, принятых по команде хоста OUT, или переданных по команде хоста IN. Счетчик байтов дескриптора Сумма байтов представляет собой общее количество байтов, которые будут переданы хосту в ответ на команду IN. После передачи типа IN ядро SIE возвра- щает количество байтов, переданных хосту. В случае передачи типа OUT сумма байтов представляет собой максимальное количество байтов, которое может быть принято и сохранено в ОЗУ USB. После передачи типа OUT ядро SIE возвращает реальное количество принятых байтов. Если это количество превышает соответствующую сумму байтов, то принятый пакет данных отвергается и в ответ генерируется квитанция типа NAK. Если это произошло, то счетчик байтов не обновляется. Как уже говорилось, 10-разрядный счетчик распределен между двумя регист- рами. Младшие 8 разрядов занимают регистр BDnCNT. Два старших разряда расположены в BDnSTAT<1:0>. Соответственно, диапазон значений составляет от 0 до 1023 байт. Проверка валидности адреса дескриптора буфера Регистровая пара адреса дескриптора буфера содержит начальный адрес ОЗУ для буфера соответствующей конечной точки. Чтобы начальный адрес ко- 224
Функции обмена данными семейства PIC18F2455/2550/4455/4550 нечной точки был валидным, он должен находиться в диапазоне ОЗУ USB, 400h...7FFh. Аппаратного механизма для проверки валидности адреса дескрип- тора не существует. Если значение адреса дескриптора буфера не указывает на ячейку ОЗУ USB, или указывает на ячейку, занятую буфером другой конечной точки, данные будут утеряны или переписаны. Поэтому при разработке устройства пользователь дол- жен сам позаботиться о программной проверке валидности адресов в своем коде. Буферизация передач типа Ping-Pong Следует внести особую ясность применительно к применяемой далее терми- нологии. Когда мы говорим о буферизации типа Ping-Pong, мы не имеем в виду режим передачи данных, предусмотренный спецификацией USB 2.0, в которую добавлен специальный пакет PING, позволяющий управлять транзакциями больших объемов данных. С помощью этого пакета хост запрашивает готовность устройства к приему пакета максимального размера. В ответ на этот запрос уст- ройство должно ответить либо пакетом АСК, подтвердив готовность к приему данных, либо пакетом NAK, если устройство не готово. Отказ заставит хост по- вторить попытку передачи позже, а положительный разрешает начать передачу. Инженеры компании Microchip применили созвучный названию этого режима термин «Ping-Pong buffering» для обозначения другого процесса, хоть и приме- няемого при передаче данных с максимальной скоростью, но имеющего иную физическую сущность. А именно: используется два буфера конечной точки, и ответственность за прием данных перебрасывается от буфера к буферу, как мячик в пинг-понге. Как известно, при передаче данных происходит чередование типов пакетов данных, DataO и Datal. Если заявлено, что конечная точка поддерживает буфер типа Ping-Pong, она должна иметь два входа указателей дескриптора: один на- бор для четных передач, и один набор для нечетных передач. Это позволяет яд- оу микроконтроллера работать с одним дескриптором, пока ядро SIE работает с другим. Таким образом, двойная буферизация является способом обеспечения максимальной пропускной способности канала USB. Модуль USB поддерживает три режима работы: . Без поддержки Ping-Pong. . Поддержка буфера Ping-Pong только для передачи типа OUT конечной точки 0. . Поддержка буфера Ping-Pong для всех конечных точек. Настройки буферизации задаются разрядами РРВ1:РРВ0 регистра UCFG. Три эежима проиллюстрированы на рис.2.8, где показано, как происходит заполнение ОЗУ USB. Модуль USB поддерживает переключение указателя Ping-Pong индивидуально для каждой конечной точки. Когда модуль включается, все указатели устанавлива- ются на дескрипторы буферов четных пакетов. После окончания транзакции для некоторой конечной точки (когда ядро SIE сбросило бит UOWN), указатель переключается на дескриптор буфера нечетных пакетов. После окончания следующей транзакции указатель переключается на бу- фер четных пакетов и так далее. Статус «четный/нечетный» для последней транзакции хранится в разряде PPBI регистра USTAT. Пользователь может сбросить все указатели Ping-Pong в четное состояние при помощи бита PPBRST. 225
Гпава 2 Дескрипторы буферов имеют фиксированную связь с конкретными конечными точками, в зависимости от конфигурации. Распределение дескрипторов по ко- нечным точкам показано в табл. 2.4. Эта взаимосвязь означает также, что если конечная точка не будет включена постоянно, может образоваться разрыв. Тео- ретически это значит, что ячейки дескриптора буфера выключенной конечной точки могут быть заняты под пространство буфера другой точки. На практике пользователь должен избегать использования общего пространства для таблицы дескриптора буфера, за исключением случая, когда реализована проверка ва- лидности адресации. РРВ1:РРВ0 = О0 Нет буферов типа Ping-Pong Занято памяти максимум 128 байт Максимум дескрипторов: 32 (BOO. BD31) РРВ1 :РРВ0 = 01 Буфер Ping-Pong для к.т. 0, OUT 4006 483h 4FFh — 1 дескриптор Г КТ. 0 OUT Четн Т дескриптор J К.Т 0 OUT Нечет. 1 дескриптор Г* КТ 0 IN 1 дескриптор Г КТ 1 OUT 1 дескриптор Г КТ. 1 IN £ t 1 дескриптор Г КТ. 15 IN Доступно, как ОЗУ данных Занято памяти, максимум, 132 байта Максимум дескрипторов. 33 (BOO .BD32) РРВ1:РРВ0 = Ю Буферы Ping-Pong для всех к.т. 400п 4FF6 [дескриптор Г К Т 0 OUT Четн [ дескриптор Г КТ 0 OUT Нечет. □ 1 I! I дескриптор Г К Т 0 IN Нечет Ц дескриптор Г КТ 1 OUTЧетн I дескриптор Г К.Т 1 OUT Нечет. 1 дескриптор Г К.Т. 1 IN четн. I дескриптор Г К.Т. 1 IN Нечет t 1 дескриптор Г К Т 15 IN Нечет Занято памяти, максимум 256 байт Максимум дескрипторов 64 (BOO ..BD63) Примечание: Области памяти показаны не е масштабе Рис. 2.8. Отображение таблицы дескрипторов на память в различных режимах буферизации Таблица 2.4 Распределение дескрипторов при различных режимах буферизации Конечные точки Дескрипторы, связанные с конечными точками Mode 0 (нет Ping-Pong) Mode I (Ping-Pong для к.т. 0, OUT) Mode 2 (Ping-Pong для всех к.т.) OUT IN OUT IN OUT IN 0 0 1 0 (E), 1 (O) 2 0 (E), 1 (0) 2 (E), 3 (O) 1 2 3 3 4 4 (E), 5 (O) 6 (E), 7 (0) 226
Функции обмена данными семейства PIC18F2455/2550/4455/4550 Конечные точки Дескрипторы, связанные с конечными точками Mode 0 (нет Ping-Pong) Mode I (Ping-Pong для к.т. 0, OUT) Mode 2 (Ping-Pong для всех к.т.) OUT IN OUT IN OUT IN 2 4 5 5 6 8 (E), 9 (О) 10(E), 11 (0) 3 6 7 7 8 12(E), 13(0) 14(E), 15(0) 4 8 9 9 10 16(E), 17(0) 18 (E), 19(0) L 5.. 10 11 11 12 20 (E), 21 (0) 22 (E), 23 (O) 6 12 13 13 14 24 (E), 25 (0) 26 (E), 27 (O) 7 14 15 15 16 28 (E), 29 (O) 30 (E), 31 (O) 8 16 17 17 18 32 (E), 33 (O) 34 (E), 35 (O) 9 18 19 19 20 36 (E), 37 (O) 38 (E), 39 (0) 10 20 21 21 22 40 (E), 41 (0) 42 (E), 43 (O) 11 22 23 23 24 44 (E), 45 (0) 46 (E), 47 (O) 12 24 25 25 26 48 (E), 49 (O) 50 (E), 51 (0) 13 26 27 27 28 52 (E), 53 (O) 54 (E), 55 (O) 14 28 29 29 30 56 (E), 57 (O) 58 (E), 59 (O) 15 30 31 31 32 60 (E), 61 (O) 62 (E), 63 (O) (Е) - буфер четной транзакции, (О) - буфер нечетной транзакции Перечень регистров таблицы дескриптора буф>ера USB приведен в табл. 2.5. Таблица 2.5 Перечень регистров таблицы дескриптора буфера USB Name Bit 7 Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 BitO BDnSTAT'1’ UOWN DTS PID3(2’ KEN'3’ PID2(2’ INCDIS'3’ PIDl'2’ DTSEN'3’ PJDO'2’ BSTALL'3’ BC9 BC8 BDnCNT'1’ Счетчик байтов BDnADRL'1’ Адрес буфера (младшие разряды) BDnADRH'1’ Адрес буфера (старшие разряды) (1> Для регистров дескриптора буфера п может принимать значения от 0 до 63. Для краткости все 64 регистра показаны, как один общий прототип. Все регистры имеют неоп- ределенное состояние после сброса. '2) Биты с 5 по 2 регистра BDnSTAT используются ядром SIE для возврата значения PID3:PID0 когда регистр переходит к SIE (бит UOWN установлен). Как только регистры переходят под управление SIE, значения KEN, INCDIS, DTSEN и BSTALL перестают быть валидными. (3’ Прежде чем регистры переданы под управление SIE, биты с 5 по 2 регистра BDnSTAT используются для установки KEN, INCDIS, DTSEN и BSTALL. 227
Гпава 2 Прерывания USB Модуль USB может генерировать различные прерывания. Для отслеживания событий этих прерываний модуль оснащен собственной логикой, аналогичной логике микроконтроллера. Прерывания USB разрешаются при помощи набора управляющих регистров и фиксируются при помощи набора флаговых регистров. Все источники прерываний сводятся в один запрос прерывания USBIF (PIR2<5>) в логике прерываний микроконтроллера. На рис. 2.9 схематически изображена логика прерываний модуля USB. Суще- ствует два уровня регистров прерываний. Верхний уровень состоит из прерыва- ний по общему состоянию USB; они разрешаются и фиксируются при помощи регистров UIE и UIR соответственно. Нижний уровень обслуживает прерывания по событиям ошибок USB. Эти прерывания разрешаются и фиксируются при по- мощи регистров UEIR и UEIE. В конечном итоге, все события ошибок сводятся в один флаг ошибки USB UERRIF прерываний верхнего уровня. Прерывания могут быть использованы для отслеживания событий транзакции USB. В качестве примера на рис. 2.10 изображены некоторые обычные события в рамках кадра USB, и связанные с ними прерывания. Регистр прерываний по состоянию модуля USB содержит флаг-биты для каж- дого из источников прерывания по текущему статусу USB. Каждый источник пре- рывания имеет связанный с ним бит разрешения прерывания в регистре UIE. Все флаги прерываний при помощи внутренней логики модуля USB объединяются в одно прерывание USBIF, поступающее на микроконтроллер. После того, как прерывание выставлено ядром SIE, оно должно быть сброшено программно. Любой флаг преры- вания, кроме UERRIF, может быть установлен программно для целей отладки. Прерывания USB первичного уровня (Прерывания по статусу USB) Регистры UIR (флаг) и UIE (разрешение) Прерывания USB вторичного уровня (Условия ошибки USB) Регистры UEIR (флаг) и UEIE (разрешение) SOFIF SOFIE TRNIF TRNIE IDLEIF IDLEIE UERRIF UERRIE STALLIF—I—\ stallie-LJ ACTVIF ACTVIE URSTIF URSTIE USBIF Рис. 2.9. Структура логики формирования прерываний USB 228
Функции обмена данными семейства PIC18F2455/2550/4455/4550 От хоста От хоста К хосту —►|токен SETUP] Данные [ АСК ~ |—► ^анОДка От хоста К хосту От хоста ~ токен IN [ Данные [ АСК ^]р°ВКа От хоста От хоста К хосту I 1 77 I 777 I - Установка -►(токен OUT | пустой блок | АСК |—TRN|p ----------Транзакция —...———' \/ Транзакция завершена (’) Управляющая передача показана здесь только в качестве примера, демонстрирующего событие, происходящее при каждой транзакции. Обычные управляющие передачи занимают несколько кадров Рис. 2.10. Пример транзакции USB и связанных с ней прерываний Регистр прерываний по состоянию USB (UIR) bit7 Не используется, читается, как «0» bit6 SOFIF флаг прерывания по токену SOF (Start-Of-Frame, старт кадра) 1 = токен SOF получен ядром SIE 0 = токен SOF не был получен ядром SIE bit5 STALLIF флаг прерывания по квитанции STALL 1 = ядро SIE передало хосту ответ STALL 0 = ответ ST ALL не передавался bit4 IDLEIF прерывание по обнаружению состояния Idle (ожидание)0* 1 = обнаружено состояние простоя (Idle в течение 3 мс или более) 0 = состояние простоя не обнаружено bit3 TRNIF флаг прерывания по завершению транзакции^* 1 = обслуживание запроса транзакции завершено О = транзакция не запрошена или не завершена bit2 ACTVIF флаг прерывания при обнаружении активности шины(3* 1 = на линиях D+/D- обнаружена активность О = активность на линиях шины не обнаружена bitl UERRIF флаг прерывания при обнаружении ошибки USB(4* 1 = обнаружено немаскированное событие ошибки USB О = немаскированных событий ошибки не было bitO URSTIF флаг прерывания по сбросу модуля USB 1 = произошел валидный сброс USB; в UADDR загружено значение 00 0 = сброс USB не происходил 229
Гпава 2 (1> Когда обнаружено состояние Idle, пользователь может перевести модуль USB в режим Suspend. (2) Сброс этого флага приведет к сдвигу стека USTAT FIFO (действительно только для токенов IN, OUT и SETUP). (3) Этот флаг обычно не маскирован только на период обнаружения события прерывания UIDLE. (4) Только события ошибок, разрешенные при помощи регистра UEIE, могут уста- новить этот флаг. Флаг не может быть установлен или сброшен пользователем. Регистр разрешения прерываний USB (UIE) Регистр UIE содержит биты разрешения прерываний по состоянию USB. Ус- тановка разряда в «1» разрешает соответствующее прерывание, фиксируемое в регистре UIR. Значения разрядов этого регистра влияют только на реакцию логи- ки прерываний. Флаг-биты прерываний выставляются в любом случае, что по- зволяет производить программный опрос флагов и обработку событий без гене- рации прерываний. bit7 Не используется, читается, как «О» bit6 SOFIE бит разрешения прерывания по токену SOF 1 = прерывание разрешено О = прерывание запрещено bit5 ST ALLIE бит разрешения прерывания по квитанции STALL 1 = прерывание разрешено О = прерывание запрещено bit4 IDLEIE бит разрешения прерывания по обнаружению Idle 1 = прерывание разрешено О = прерывание запрещено bit3 TRNIE бит разрешения прерывания по завершению транзакции 1 = прерывание разрешено О = прерывание запрещено bit2 ACTVIE бит разрешения прерывания по обнаружению активности 1 = прерывание разрешено О = прерывание запрещено bill UERRIE бит разрешения прерывания по ошибке USB 1 = прерывание разрешено О = прерывание запрещено bitO URSTIE бит разрешения прерывания по сбросу USB 1 = прерывание разрешено О - прерывание запрещено 230
Функции обмена данными семейства PIC18F2455/2550/4455/4550 Регистр прерываний по ошибке USB (UEIR) Регистр UEIR содержит флаг-биты прерываний для каждого источника ошибки в периферии USB. Каждый из этих источников может быть маскирован при по- мощи соответствующего разряда регистра разрешения прерываний UEIE. Все прерывания по ошибке USB объединяются при помощи внутренней логики в од- но, поступающее в логику высшего уровня в виде прерывания UERRIF. Флаг прерывания по ошибке выставляется немедленно после ее обнаруже- ния, поэтому момент прерывания обычно никак не связан с окончанием обработ- ки текущего токена. Установленные флаги должны быть сброшены в «О» про- граммой пользователя. bit7 BTSEF флаг прерывания по ошибке битового заполнения 1 = обнаружена ошибка битового заполнения О = ошибка не обнаружена bit6-5 Не используются, читаются, как «О» bit4 BTOEF флаг ошибки по тайм-ауту реверсирования шины 1 = обнаружен тайм-аут реверсирования шины (Idle длится более 16 бит с момента предыдущего ЕОР) О = тайм-аут не обнаружен bits DFN8EF флаг ошибки размера поля данных 1 = поле данных не является целым числом байтов О = ошибка не обнаружена bit2 CRC16EF флаг ошибки контрольной суммы типа CRC16 1 = ошибка CRC16 О = ошибка не обнаружена bitl CRC5EF флаг ошибки хоста по контрольной сумме CRC5 1 = пакет токена отвергнут из-за ошибки по CRC5 О = пакет токена принят bitO PIDEF флаг ошибки при проверке PID 1 = проверка PID не пройдена О = проверка PID пройдена Регистр разрешения прерываний по ошибке USB (UEIE) Регистр UEIE содержит биты разрешения прерываний по ошибке USB. Уста- новка разряда в «1» разрешает соответствующее прерывание, фиксируемое в регистре UEIR с целью дальнейшей передачи и формирования сигнала UERR верхнего уровня логики (см. рис.2.9). Значения разрядов этого регистра влияют только на реакцию логики прерываний. Флаг-биты прерываний выставляются в любом случае, что позволяет производить программный опрос флагов и обра- ботку событий без генерации прерываний. bit7 BTSEE бит разрешения прерывания по ошибке битового заполнения 1 = прерывание разрешено О = прерывание запрещено 231
Гпаеа2 bit6-5 Не используются, читаются, как «О» bit4 ВТОЕЕ бит разрешения прерывания по тайм-ауту шины 1 = прерывание разрешено О - прерывание запрещено bit3 DFN8EE бит разрешения прерывания по ошибке размера поля данных 1 - прерывание разрешено О ~ прерывание запрещено bit2 CRC16EE бит разрешения прерывания по ошибке к/суммы CRC16 1 - прерывание разрешено О = прерывание запрещено bill CRC5EE бит разрешения прерывания по ошибке к/суммы хоста CRC5 1 = прерывание разрешено О = прерывание запрещено bitO P1DEE бит разрешения прерывания по ошибке проверки PID 1 - прерывание разрешено О = прерывание запрещено Режимы питания устройств USB Устройства USB могут иметь различные варианты питания и конфигурации. Наиболее часто применяемыми режимами питания являются следующие: - питание только от шины USB; - собственный источник питания устройства; - смешанное питание с приоритетом собственного источника. Питание от шины USB является простейшим вариантом питания устройства. Схема подключения показана на рис. 2.11. В случае питания устройства от соб- ственного источника схема включения несколько сложнее (рис. 2.12). Добавляется узел из двух резисторов, предназначенный для обнаружения подключения к шине. При помощи резистора, подключенного между выводом VBUS и общим проводом, хост определяет момент подключения устройства. При помощи второго резистора, через который питание VBUS подается на порт вво- да/вывода микроконтроллера, устройство обнаруживает, что оно подключено к шине и реагирует нужным образом. 232
Функции обмена данными семейства PIC18F2455/2550/4455/4550 Рис. 2.12. Питание устройства от собственного источника Для некоторых приложений может потребоваться смешанное питание (рис.2.13). Будучи отключенными от шины, такие устройства питаются от собст- венного источника, но при подключении могут переходить на питание от нее. Это могут быть, например, переносные устройства сбора данных, измерительные приборы с интерфейсом передачи данных. Также возможен вариант, когда устрой- ство по возможности всегда питается от собственного источника, но автоматически переключается на питание от USB, если этот источник становится недоступен. Рис. 2.13. Смешанное питание устройства Разработчик устройства должен иметь в виду, что согласно спецификации USB 2.0, максимальный потребляемый устройством ток не должен превышать 100 мА для устройств с малым потреблением и 500 мА для устройств с полным потреблением. При превышении лимита хост отключит питание устройства (од- нако возможно и повреждение электронных компонентов схемы хоста при его некорректной работе). USB и потоковый порт SPP Потоковый параллельный порт является альтернативным путем для прохож- дения данных, минуя ОЗУ USB. При помощи SPP конечная точка может быть сконфигурирована на передачу или прием данных напрямую от внешней схемы. 233
Гпава 2 В таком случае микроконтроллер выступает в роли менеджера данных, позво- ляя SPP пропускать большие блоки данных без обработки микроконтроллером. В качестве примера можно назвать систему сбора данных, которые поступают из внешнего стека в хост через шину USB. Функция микроконтроллера заключается только в управлении конечной точкой, а исходные данные поступают извне. Включается SPP, как порт конечной точки через соответствующий дескриптор буфера. Конечная точка должна быть настроена следующим образом: . Установить указатель BDnADRL'.BDnADRH на FFFFh. • Установить бит KEN (BDnSTAT<5>) чтобы ядро SIE удерживало управление буфером. • Установить бит INCDIS (BDnSTAT<4>) для отключения автоматического ин- кремента адреса. Внимание! Если конечная точка сконфигурирована для использования SPP, то и модуль SPP должен быть сконфигурирован для использования модуля USB. В противном случае возможно непредсказуемое поведение устройства. Конечная точка, сконфигурированная для работы через SPP, поддерживает только изохронный тип передачи. Более подробно функционирование SPP рассмотрено в следующем разделе. Таблица 2.6 Регистры, ассоциированные с работой модуля USB^ Ре- гистр Bit 7 Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 BitO INT- GIE/GI PEIE/GIE TMROIE INTOIE RBIE TMROIF INTOIF RBIF IPR2 OSCFI CMIP USBIP EEIP BCLIP HLVDIP TMR3I CCP2IP PIR2 OSCFI CMIF USBIF EEIF BCLIF HLVDIF TMR31F CCP2IF PIE2 OSCFI CMIE USBIE EEIE BCLIE HLVDIE TMR3I CCP2IE UCON - PPBRST SEO PKTDIS USBEN RESUME SUSPN - UCFG UTEYE UOEMO UPUEN UTRDIS FSEN PPB1 PPBO USTAT ENDP3 ENDP2 ENDP1 ENDPO DIR PPBI UADDR - ADDR6 ADDR5 ADDR4 ADDR3 ADDR2 ADDR1 ADDRO UFRML FRM7 FRM6 FRM5 FRM4 FRM3 FRM2 FRM1 FRMO UFRMH - — - FRM10 FRM9 FRM8 UIR SOFIF STALLIF IDLEIF TRNIF ACTVIF UERRI URSTIF UIE SOFIE STALLIE IDLEIE TRNIE ACTVIE UER- URSTIE UEIR BTSEF - BTOEF DFN8EF CRC16EF CRC5E PiDEF UEIE BTSEE - BTOEE DFN8EE CRC16EE CRC5E PIDEE UEPO - - EPHSH EPCONDIS EPOUTEN EPINE EPSTALL UEP1 - - EPHSH EPCONDIS EPOUTEN EPINE EPSTALL UEP2 - - EPHSH EPCONDIS EPOUTEN EPINE EPSTALL UEP3 - EPHSH EPCONDIS EPOUTEN EPINE EPSTALL UEP4 - EPHSH EPCONDIS EPOUTEN EPINE EPSTALL UEP5 EPHSH EPCONDIS EPOUTEN EPINE EPSTALL UEP6 - EPHSH EPCONDIS EPOUTEN EPINE EPSTALL UEP7 - - - EPHSH EPCONDIS EPOUTEN EPINE EPSTALL 234
Функции обмена данными семейства PIC18F2455/2550/4455/4550 Ре- гистр Bit 7 Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 BitO UEP8 EPHSH EPCONDIS EPOUTEN EPINE EPSTALL UEP9 - EPHSH EPCONDIS EPOUTEN EPINE EPSTALL UEP10 - EPHSH EPCONDIS EPOUTEN EPINE EPSTALL UEP11 — EPHSH EPCONDIS EPOUTEN EPINE EPSTALL UEP12 EPHSH EPCONDIS EPOUTEN EPJNE EPSTALL UEP13 - EPHSH EPCONDIS EPOUTEN EPINE EPSTALL UEP14 - - - EPHSH EPCONDIS EPOUTEN EPINE EPSTALL UEP15 - - - EPHSH EPCONDIS EPOUTEN EPINE EPSTALL Примечание. Эта таблица содержит только специальные регистры, физически отображаемые на Банк 15 пространства памяти. Регистры дескриптора буфера, отобра- жаемые на Банк 4, но не являющиеся физическими регистрами, перечислены в табл. 2.5. Потоковый параллельный порт (SPP) Микроконтроллеры PIC18F4455/4550 оснащены потоковым параллельным портом. Это высокоскоростной интерфейс для обмена данными с внешней сис- темой. Он работает как параллельный ведущий порт, предоставляющий сигналы тактирования и выбора для управления ведомыми внешними устройствами. Ка- нал данных может быть коммутирован с ядром микроконтроллера или с ядром SIE (рис. 2.14). Рис. 2.14. Каналы передачи данных через SPP Кроме того, SPP может поддерживать разделение по времени адресной ин- формации и данных при помощи второго выхода стробирования. Линии данных SPP<7:0> имеют встроенные подтягивающие резисторы, которые включаются битом RDPU (PORTE<7>). Конфигурация SPP Модулем SPP управляют при помощи двух регистров, SPPCON и SPPCFG. Регистр SPPCON задает общие параметры работы параллельного порта и указывает, под чьим управлением находится порт - модуля USB или микрокон- троллера: 235
Гпава 2 bit7-2 Не используются, читаются, как «О» bitl SPPOWN бит принадлежности SPP 1 = под управлением USB О = под управлением микроконтроллера bitO SPPEN бит включения SPP 1 = модуль включен О = модуль выключен Регистр SPPCFG управляет конфигурацией временных диаграмм и выходами: bit7-6 CLKCFG1 :CLKCFG0 биты конфигурации тактирования SPP 1х = CLK1 переключается на чтение или запись по нечетному адресу контрольной точки CLK2 переключается на чтение или запись по четному адресу контроль- ной точки 01 = CLK1 переключается по записи, CLK2 переключается по чтению 00 = CLK1 переключается только по записи адреса конечной точки; CLK2 переключается по чтению или записи данных bit5 CSEN бит включения вывода выбора кристалла (CS, chip select) 1 = RB4 под управлением SPP, используется, как вывод SPP CS 0 = RB4 используется, как цифровой порт ввода/вывода bit4 CLK1EN бит включения вывода CLK1 1 = RE0 под управлением SPP, используется, как вывод SPP CLK1 0 = RE0 используется, как цифровой порт ввода/вывода bit3-0 WS3:WS0 биты длительности ожидания SPP 1111 =30 дополнительных тактов «wait» 1110 = 28 дополнительных тактов «wait» 0001 = 2 дополнительных такта «wait» 0000 = 0 дополнительных такта «wait» Для включения модуля SPP необходимо установить бит SPPEN (SPPCON<0>). Кроме этого должны быть правильно сконфигурированы выводы SPP, для чего нужно настроить соответствующие разряды регистров TRIS, как минимум: . Установить в «1» разряды TRISD<7:0>. . Сбросить в «0» разряды TRISE<2:1>. Если используется CK1SPP, то: • Разряд TRISE<0> должен быть сброшен. Если используется CSPP, то: . Разряд TRISB<4> должен быть сброшен. 236
Функции обмена данными семейства PIC18F2455/2550/4455/4550 Тактирование данных Модуль SPP имеет четыре управляющих выхода: • Два независимых выхода тактирования CK1SPP и CK2SPP. • Разрешение выхода OESPP. . Выбор кристалла CSSPP. Вместе они позволяют использовать различные варианты управления обме- ном данными с ведомым устройством. Когда задействованы все управляющие выходы, становятся доступны три базовых режима: . CLK1 тактирует вывод адреса конечной точки, CLK2 тактирует данные. - CLK1 тактирует операции записи, CLK2 тактирует чтение. • CLK1 тактирует нечетные данные адреса, CLK2 тактирует четные данные адреса. Состояние ожидания Модуль SPP поддерживает совместимость с параллельными устройствами, которые требуют дополнительное время для доступа, и способен добавлять в последовательность обмена данными состояние ожидания (Wait State). Отсчет интервала ожидания тактируется импульсами от источника данных. Так, если источником данных является модуль USB, то используются тактовые импульсы USB. Аналогично, если SPP работает под управлением микроконтрол- лера, то отсчет интервала ожидания основан на командных тактах (FOsc/4). Разряды WS3:WS0 (SPPCFG<3:0>) устанавливают длительность ожидания от нуля до 30 тактов с шагом два. Эта длительность симметрично (по половине с каждой стороны) добавляется ко всем транзакциям. На рис. 2.16 и 2.17 показан пример добавления состояния ожидания равного 4 к каждой транзакции, тогда как на рис. 2.15 показан пример транзакции без дополнительного ожидания. Настройка под управление от USB Когда модуль SPP настроен для совместной работы с USB, данные могут так- тироваться непосредственно модулем USB без вмешательства со стороны мик- роконтроллера и без затрат времени на обработку данных. Сначала передается или принимается номер конечной точки, за ним следует один или несколько бай- тов данных, как показано на рис. 2.18. FOSC/4 OESPP CSSPP CK1SPP CK2SPP SPP<7:0> Запись адреса MOVWF SPPEPS Запись данных MOVWF SPPCATA Чтение данных MOVF SPPDATA, И Рис. 2.15. Пример транзакции без дополнительного ожидания 237
Гпава 2 Рис. 2.16. Пример записи адреса и данных с дополнительным ожиданием Такты USB OESPP CSSPP CK1SPP CK2SPP SPP<7:0> ( ( ; \ I \ \ -J Запись адреса ' "i Y” Чтение данных i 2 цикла ожидания 2 цикла ожидания 2 цикла ожидания 2 цикла ожидания Рис. 2.17. Пример записи адреса и чтения данных с дополнительным ожиданием Такой способ идеально подходит для приложений, требующих изохронной пе- редачи больших объемов данных. Настойка производится следующим образом: • конфигурируем SPP как нам нужно, включая циклы ожидания и тактирование; . устанавливаем бит SPPOWN для передачи управления модулю USB; • устанавливаем начальный адрес дескриптора буфера BDnADRLBDnADRH = FFFFh; • устанавливаем бит KEN (BDnSTAT<5>) для неограниченного удержания бу- фера ядром SIE; • устанавливаем бит INCDIS (BDnSTAT<4>) для отключения автоматического инкремента адреса буфера; • устанавливаем бит SPPEN для включения модуля SPP. Напоминаем, что конечная точка USB, настроенная для использования SPP, поддерживает только изохронную передачу. Настройка под управление микроконтроллером Модуль SPP может выступать, как параллельный порт микроконтроллера. В этом режиме регистр SPPEPS управляет состоянием и записью адреса: bit7 RDSPP статус чтения из SPP (валидный, если SPPCON = 1, USB) 238
Функции обмена данными семейства PIC18F2455/2550/4455/4550 Запись адреса К Т. USB a SPP Запись исходящих данных USB в SPP или чтение входящих данных USB из SPP Byte 0 Byte 1 Byte 2 Byte 3. • • • Byte п Рис. 2.18. Передача данных между USB SIE и SPP 1 = последняя транзакция была чтением из SPP О = последняя транзакция не была чтением из SPP bit6 WRSPP статус записи в SPP (валидный, если SPPCON - 1, USB) 1 = последняя транзакция была записью в SPP О - последняя транзакция не была записью в SPP bits Не применяется, читается, как «О» bil4 SPPBUSY бит отмены подтверждения SPP 1 = SPP занят О = SPP готов принять запрос на чтение или запись bi!3-0 ADDR3:ADDR0 адрес конечной точки 1111— конечная точка 15 0001 = конечная точка 1 0000 = конечная точка 0 Данные читаются и записываются через регистр SPPDATA. Тактирование SPP производится командными тактами микроконтроллера. Для использования SPP в качестве порта микроконтроллера необходимо вы- полнить минимальную последовательность действий: • настроить порт SPP как требуется, включая циклы ожидания и тактирование; . сбросить бит SPPUWN; • установить бит SPPEN для включения модуля. Прерывание от SPP Находясь под управлением микроконтроллера, модуль SPP может генериро- вать прерывание, извещающее приложение о завершении каждого чтения или записи. Различие ме>цду чтением и записью применительно к прерыванию отсут- ствует. Флаговым битом является SPPJF (PIR1 <7>), разрешающим битом явля- ется SSPIE (Р1Е1<7>). Как и любое другое прерывание микроконтроллера, это прерывание может иметь низкий или высокий приоритет, определяемый состоя- нием разряда SSPIP (IPR1<7>). Запись в SPP (вывод данных во внешнюю схему) Запись в SPP производится путем записи в регистры SPPEPS и SPPDATA. Если модуль настроен на вывод адреса конечной точки совместно с данными, то 239
Гпава 2 запись в регистр SPPEPS инициирует цикл вывода адреса конечной точки. Под конечной точкой е данном случае подразумевается внешний потреби- тель/источник данных, имеющий свой условный аппаратный адрес от 0 до 15. В ином случае, запись данных во внешнее устройство начинается по записи дан- ных в регистр SPPDATA. Разряд SPPBUSY отражает состояние записи адреса и данных. В качестве примера записи рассмотрим такую последовательность: Записываем 4-разрядный адрес в регистр SPPEPS. Модуль автоматически начинает записывать адрес во внешнюю схему. Если запись адреса не использу- ется, следует начинать с п.З. Проверяем бит SPPBUSY, чтобы удостовериться, что адрес записан. Дли- тельность зависит от наличия циклов дополнительного ожидания. Записываем данные в регистр SPPDATA. Модуль автоматически начинает за- писывать данные во внешнюю схему. Проверяем бит SPPBUSY, чтобы удостовериться, что данные переданы. Дли- тельность зависит от наличия циклов дополнительного ожидания. Возвращаемся на п.1 или п.З для записи нового адреса или данных. Внимание! Следует обязательно проверять состояние бита SPPBUSY чтобы не произошло наложение попытки записи в регистр SPPEPS или SPPDATA на интервал дополнительного ожидания. Чтение SPP (получение данных из внешней схемы) Чтение из SPP представляет собой чтение регистра SPPDATA. Первая попыт- ка чтения регистра SPPDATA инициирует процесс чтения данных извне. Когда чтение завершено, что отображается битом SPPBUSY, в регистр SPPDATA за- гружаются текущие полученные данные. Чтение реализуется такой последовательностью: Записываем 4-разрядный адрес в регистр SPPEPS. Модуль автоматически начинает записывать адрес во внешнюю схему. Если запись адреса не использу- ется, следует начинать с п.З. Проверяем бит SPPBUSY, чтобы удостовериться, что адрес записан. Дли- тельность зависит от наличия циклов дополнительного ожидания. Читаем регистр SPPDATA. При этом получаем результат выполнения преды- дущей операции! Модуль автоматически начинает цикл чтения следующих данных. Проверяем бит SPPBUSY, чтобы удостовериться, что новые данные получе- ны. Длительность зависит от наличия циклов дополнительного ожидания. Возвращаемся на п.1 или п.З для записи нового адреса и получения новых данных. Очевидно, что при самом первом чтении регистра SPPDATA мы не получим достоверное значение и должны его проигнорировать. Таблица 2.6 Регистры, ассоциированные с потоковым параллельным портом Регистр Bit 7 Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 BitO SPPCON'3’ - - - - - - SPPOWN SPPEN SPPCFG'3’ CLKCFG1 CLKCFGO CSEN CLK1EN WS3 WS2 WS1 wso SPPEPS'3’ RDSPP WRSPP - SPPBUSY ADDR3 ADDR2 ADDR1 ADDRO 240
Функции обмена данными семейства PIC18F2455/2550/4455/4550 Регистр Bit 7 Bit 6 Bit 6 I Bit 4 | Bits I Bit 2 I Bit 1 I BitO SPPDATA(3) Регистр данных SPP PIR1 SPPIF(3) ADIF RCIF TXIF SSPIF CCP1IF TMR2IF TMR1IF PIE1 SPPIE(3) ADIE RCIE TXIE SSPIE CCP1IE TMR2IE TMR11E IPR1 SPPIP(3) ADIP RCIP TXIP SSPIP CCP1IP TMR2IP TMR1IP PORTE RDPU(3) - - - RE3(1,2) RE2(3> RE1(3> RE0(3> <1) Применяется, только если отключен вывод общего сброса MCLR (2) НЕЗ доступен как разряд PORTE в 28- и 40/44-выводных корпусах. Все остальные 8ряды доступны для порта PORTE только в 40/44-выводных корпусах. 3> Эти регистры и/или разряды недоступны в 28-выводных корпусах. Ведущий синхронный последовательный порт (MSSP) Модуль ведущего синхронного последовательного порта MSSP является по- следовательным интерфейсом, применяемым для обмена данными с другими устройствами. Это могут быть сдвиговые регистры, память EEPROM с последо- вательным доступом, дисплейные модули, АЦП и т.д. Модуль может работать в одном из двух режимов: • Последовательный периферийный интерфейс (SPI). • Поддержка 12С: - режим ведущего; - режим ведомого (с общей системой адресации); - режим нескольких ведущих (Multi-Master mode). Управляющие регистры Модуль MSSP имеет три ассоциированных регистра: регистр статуса SSPSTAT и два управляющих регистра SSPCON1 и SSPCON2. Кроме этого, в определенных режимах используются регистр последовательной переда- чи/приема SSPBUF, а также сдвиговый регистр SSPSR. Назначение регистров и их конфигурирующих разрядов зависит оттого, в каком режиме работает модуль. Работа в режиме SPI В режиме SPI можно синхронно передавать и принимать по 8 бит данных. Для обмена данными обычно задействуются три вывода: . Последовательные данные, выход (SDO) - RC7/RX/DT/SDO. . Последовательные данные, вход (SDI) - RB0/AN12/INT0/FLT0/SDI/SDA. . Последовательные такты (SCK) - RB1/AN10/1NT1/SCK/SCL. В режиме ведомого может использоваться четвертый вывод: . Выбор ведомого (SS) - RA5/AN4/SS/HLVDIN/C2OUT. Структурная схема модуля MSSP в режиме SPI показана на рис. 2.19. При ра- боте модуля в этом режиме используются регистры SSPCON1, SSPSTAT, SSPBUF и SSPSR. Управляющий регистр SSPCON1 доступен для чтения и запи- си; младшие шесть разрядов регистра SSPSTAT только читаются, два старших доступны для чтения и записи. 241
Гпава 2 Внутренняя шина данных Примечание: показаны только те функции выводов, которые связаны с работой SPI Рис. 2.19. Блок-схема модуля MSSP в режиме SPI Сдвиговый регистр SSPSR применяется для сдвига данных на выход или приема с входа. Он не доступен для прямого чтения или записи. SSPBUF - это буферный регистр, в который записывают байты данных для передачи или счи- тывают принятые байты. Регистр SSPSTATв режиме SPI bit7 SMP бит выборки режим SPI ведущий 1 - выборка входных данных в конце длительности выходных данных О = выборка входных данных в середина длительности выходных данных 242
Функции обмена данными семейства PIC18F2455/2550/4455/4550 режим SPI ведомый в этом режиме бит SMP должен быть сброшен. bit6 СКЕ бит выбора тактирования SPI 1 = передача происходит по переходу от активного состояния к ожиданию О = передача происходит по переходу от ожидания к активному состоянию Полярность тактовых состояний определяется битом СКР (SSPCON1<4>) bit5 D/А бит данных/адреса Используется только в режиме 12С bit4 Р стоп-бит Используется только в режиме 12С. Этот бит сбрасывается, когда модуль MSSP отключен и бит SSPEN сброшен. bit3 S старт-бит Используется только в режиме 12С bit2 R/W бит чтение/запись Используется только в режиме 12С bitl UA бит обновления адреса Используется только в режиме 12С bitO BF бит состояния переполнения буфера (только в режиме приема) 1 = прием завершен, буфер SSPBUF заполнен О = прием не завершен, буфер SSPBUF пуст Регистр SSPCON1 в режиме SPI bit7 WCOL бит обнаружения коллизии записи (только в режиме передачи) 1 = запись в регистр SSPBUF произошла во время передачи предыдущего слова. Бит должен быть сброшен программно. О = коллизии не было bite SSPOV индикатор переполнения при приеме 1 = Новый байт принят в то время как SSPBUF хранит предыдущее значение. В случае переполнения данные из SSPSR теряются. Переполнение возможно только в режиме ведомого. Пользователь должен читать буфер SSPBUF даже если данные только передаются, во избежание уста- новки бита признака переполнения (он должен быть сброшен программно). О = Переполнения не было. Примечание.'в режиме ведущего бит переполнения не устанавли- вается, так как каждый новый прием и передача начинаются с обраще- ния к буферу. bit5 SSPEN бит включения синхронного последовательного порта 1 = включает порт и настраивает выводы SCK, SDO, SDI и SS как вы- воды MSSP О - отключает порт и настраивает эти выводы, как линии порта I/O 243
Гпава 2 Примечание: при включении MSSP выводы должны быть правильно настроены на ввод или вывод. bit4 СКР бит выбора полярности тактового импульса 1 - состоянию ожидания соответствует высокий уровень О = состоянию ожидания соответствует низкий уровень bit3-0 SSPM3:SSPM0 биты выбора режима модуля MSSP 0101 = SPl ведомый, такты - SCK, управление выводом SS отключено 0100 = SPI ведомый, такты - SCK, управление SS включено 0011 = SPI ведущий, такты - выход TMR2/2 0010 = SPI ведущий, такты - Fosc/64 0001 = SPI ведущий, такты - Fosc/16 0000 = SPI ведущий, такты - Fosc/4 Примечание: комбинации битов, не указанные здесь, либо не используются, либо используются только в режиме 12С. При инициализации режима SPI необходимо указать несколько параметров путем программирования разрядов SSPCON1<5:0> и SSPSTAT<7:6>. От этих разрядов зависят следующие параметры: . Режим ведущего (SCK как выход тактовых импульсов). • Режим ведомого (SCK как вход тактовых импульсов). • Полярность тактовых импульсов. • Фаза выборки входных данных (середина или конец выходного интервала). . Фронт тактового импульса (нарастание или спад SCK). • Частота тактирования (только в режиме ведущего). • Поддержка выбора ведомого (только в режиме ведомого). Передача и прием данных осуществляется путем сдвига данных в регистре SSPSR, начиная со старшего разряда. Как только восемь бит сигнала приняты, они переписываются в регистр SSPBUF, выставляются бит обнаружения полного буфера BF (SSPSTAT<0>) и флаг прерывания SSPIF. Двойная буферизация при- нимаемых данных позволяет считывать принятый байт одновременно с получе- нием следующего байта. Любая попытка записи в регистр буфера SSPBUF во время приема/передачи байта игнорируется и выставляется бит коллизии WCOL (SSPCON1<7>). Программа пользователя обязательно должна сбросить этот бит, иначе он может быть обнаружен при следующей записи в SSPBUF, даже если запись пройдет успешно. Если программа пользователя рассчитывает получить валидные данные, то буфер SSPBUF должен быть прочитан перед тем, как в него будет перенесен следующий принятый байт. Бит BF (SSPSTAT<0>) сигнализирует о том, что бу- фер содержит полностью принятый байт. При чтении буфера этот бит сбрасыва- ется. Разумеется, если SPI используется только для передачи, сказанное относи- тельно приема не имеет значения. Как правило, прерывание от модуля MSSP используется для определения факта завершения приема/передачи байта. Соответственно, при обработке этого прерывания должен быть либо прочитан из буфера принятый байт, либо записан в буфер следующий байт для передачи. Если по каким-либо причинам прерывание не может быть использовано, мож- но программно опрашивать бит состояния во избежание коллизии при записи в буфер. Приведенный ниже пример демонстрирует загрузку буфера для передачи. 244
Функции обмена данными семейства PIC18F2455/2550/4455/4550 LOOP BTFSS SSPSTAT, BF BRA LOOP MOVF SSPBUF, W MOVWF RXDATA MOVF TXDATA, W MOVWF SSPBUF данные приняты (передача завершена)? ;нет ; W - содержимое SSPBUF ^охранение принятых данных в ОЗУ ;= содержимое TXDATA ;новые данные для передачи Включение SPI Для включения последовательного порта необходимо установить бит SSPEN (SSPCON1<5>). Для сброса или перенастройки SPI следует сбросить бит SSPEN, при необходимости перенастроить регистр SSPCON и установить бит SSPEN. При этом выводы SDI, SDO, SCK и SS получают функциональность последова- тельного порта, но это не отменяет необходимость настроить для некоторых вы- водов направление передачи данных (регистр TRIS): SDI автоматически управляется модулем SPL . Для SDO бит TRISC<7> должен быть сброшен. . Для SCK в режиме ведущего бит TRISB<1 > должен быть сброшен. • Для SCK в режиме ведомого бит TRISB<1> должен быть установлен. . Для SS бит TRISA<5> должен быть установлен. Любая невостребованная функция порта может быть аннулирована перепро- граммированием соответствующего бита TRIS в противоположное значение. Типовое подключение На рис. 2.20 показано типовое соединение между двумя микроконтроллерами. Ведущий микроконтроллер (устройство 1) инициирует обмен данными передачей сигнала SCK. Данные сдвигаются в обоих сдвиговых регистрах по заданному для них фронту и защелкиваются по противоположному фронту. Оба контроллера должны быть настроены на одинаковую полярность тактов (СКР), благодаря че- му оба они будут передавать и принимать данные одновременно. Будут ли дан- ные полезными или «пустыми», зависит от пользовательского приложения. Воз- можны три сценария обмена данными: • Ведущий передает данные - ведомый передает «пустышку». . Ведущий передает данные - ведомый передает данные. . Ведущий передает «пустышку» - ведомый передает данные. Режим ведущего Рассмотрим работу модуля MSSP, когда наш микроконтроллер является ве- дущим. В этом случае он может инициировать обмен данными в любой момент, поскольку управляет тактированием на выводе SCK. Данные передаются ведомому устройству, как только они записаны в буфер SSPBUF. Если задачей SPI является только прием данных, то выход SDO дол- жен быть отключен путем установки TRISC<7> (настройка цифровой линии на ввод). Данные, поступающие на вход SDI, будут продолжать сдвигаться с заданной частотой. Каждый полный принятый байт будет перегружаться в буфер с уста- новкой флага прерывания и бита статуса. 245
Гпава 2 Рис. 2.20. Типовая схема соединения двух микроконтроллеров Полярность тактов выбирается при помощи разряда СКР (CCPCON1<4>). За- тем происходит обмен данными, как показано на рис. 2.21, 2.23, 2.24. Старший разряд передается первым. В режиме ведущего скорость обмена задается про- граммно, одним из следующих значений: * Fosc/4 (или TCY). • Fosc/16 (или 4Tcy). • Fqsc/64 (или 16TCY). . Выход Timer212. Следовательно, максимальная скорость передачи при тактовой частоте 40 МГц составляет 10 Мб/с. На рис. 2.21 изображены диаграммы сигналов в режиме ведущего. Когда бит СКЕ установлен, данные SDO являются валидными до прихода фронта импуль- са на SCK. Изменение входной выборки основано на состоянии бита SMP. Пока- зано, когда происходит перегрузка в SSPBUF принятого значения. Режим ведомого В режиме ведомого данные передаются и принимаются по тактовым импуль- сам, поступающим извне на вывод SCK. После захвата последнего бита уста- навливается флаг прерывания SSPIF. Логические уровни, а также длительность тактовых импульсов должны соответствовать требованиям спецификации произ- водителя микросхемы. Диаграммы синхронизации ведомого устройства приведе- ны на рис. 2.22. Перед тем, как модуль будет включен в режиме ведомого SPI, на линии такти- рования должен присутствовать правильный уровень «ожидание». Чтобы удо- стовериться в этом, можно программно прочитать уровень на выводе SCK и сравнить его со значением уровня «ожидание» в разряде СКР (SSPCON1<4>). Находясь в режиме Sleep, ведомый микроконтроллер может принимать и пе- редавать данные. Когда прием полного байта завершен, устройство пробуждает- ся из состояния Sleep. 246
Функции обмена данными семейства PIC18F2455/2550/4455/4550 Рис. 2.21. Диаграммы протокола SPI (режим ведущего) Рис. 2.22. Диаграммы синхронизации ведомого устройства 247
Глава 2 SDO SSPSRв SSPBUF SCK (CKP = о CKE = Э) След, цикл Q4 после Q2i- SDI (SMP = 0) SCK (CKP=1 CKE = o) Запись в SSPBUF Входная выборка (SMP = 0) SSPIF флаг прерывания Рис. 2.23. Диаграммы протокола SPI (режим ведомого, СКЕ = 0) SS \ Обязательно SCK (СКР = о СКЕ = 1)" SCK (СКР = 1 СКЕ = 1) Запись в SSPBUF-^" SDI — (SMP = о) Входная выборка (SMP = 0) ’ SSPIF ____ флаг прерывания SSPSR в SSPBUF____ Рис. 2.24. Диаграммы протокола SPI (режим ведомого, СКЕ = 1) Синхронизация ведомого устройства Наличие вывода SS позволяет синхронизировать ведомые устройства. Для этого необходимо включить управление по SS (SSPCON1<3:0> = 04h). Если на выводе SS присутствует низкий уровень, разрешаются передача и прием, и на вывод SDO поступают данные. 248
Функции обмена данными семейства PIC18F2455/2550/4455/4550 Когда уровень на выводе SS становится высоким, управление выводом SDO отключается, даже если это произошло на середине передаваемого байта, и вы- вод переходит в высокоимпедансное состояние. При необходимости к этому вы- воду может быть подключен внешний нагрузочный резистор, соединенный с ли- нией питания или общим проводом. Когда модуль SPI находится в режиме ведомого и управление по SS включе- но, модуль будет сброшен, если вывод SS подключить к VDD. Если SPI используется в режиме ведомого с установленным битом СКЕ, то управление по выводу SS должно быть включено. Когда сбрасывается модуль SPI, счетчик битов устанавливается в «О». Это может быть проделано как подачей высокого уровня на вывод SS, так и обнуле- нием бита SSPEN. Для эмуляции связи по двум проводам вывод SDO может быть соединен с выво- дом SDI. Когда модуль SPI должен работать в качестве приемника, вывод SDO сле- дует сконфигурировать на ввод. Это отключает передачу через SDO. Вывод SDI может всегда оставаться входом, поскольку не может вызвать конфликт шины. Работа в энергосберегающем режиме В режиме ведущего модуль SPI может работать с разной скоростью; когда микроконтроллер переходит в режим Sleep, тактирование прекращается. Таблица 2.8 Регистры, ассоциированные с работой в режиме SPI Регистр Bit 7 Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 BitO INTCON GIE/ GIEH РЕ IE/ GIEL TMROIE INTOIE RBIE TMROIF INTOIF RBIF PIR1 SPPIF(1) ADIF 1 RCIF TXIF SSPIF CCP1IF TMR2IF TMR1IF PIE1 SPPIE(1) ADIE RCIE TXIE SSPIE CCP1IE TMR2IE TMR1IE IPR1 SPPIP(1) ADIP RCIP TXIP SSPIP CCP1IP TMR2IP TMR1IP TRISA - TRISA6(2) TRISA5 TRISA4 TRISA3 TRISA2 TRISA1 TRISAO TRISB TRISB7 TRISB6 TRISB5 TRISB4 TRISB3 TRISB2 TRISB1 TRISBO TRISC TRISC7 TRISC6 - - - TRISC2 TRISC1 TRISCO SSPBUF Регистр приема/передачи синхронного последовательного порта SSPCON1 WCOL SSPOV SSPEN CKP SSPM3 SSPM2 SSPM1 SSPMO SSPSTAT SMP CKE D/A P s R/W UA BF (1> Бит недоступен в 28-выводных устройствах. (2> RA6 настраивается, как вывод порта в зависимости от различных режимов первич- ного генератора. 249
Гпава 2 В большинстве энергосберегающих режимов тактовые импульсы подаются на периферию. Они могут поступать от первичного генератора, вторичного генера- тора {генератор модуля Timerl с частотой 32768 Гц) или INTOSC. Как правило, не имеет особого значения, с какой частотой ведущий микрокон- троллер тактирует передачу данных. Важно лишь, чтобы скорость передачи со- ответствовала требованиям системы. Если включено прерывание от MSSP, оно может пробудить микроконтроллер из режима Sleep либо из режимов Idle, когда ведущий закончит передавать данные. Если выход из Sleep не предусмотрен, прерывание от MSSP следует запретить. Выход из режима Sleep зависит от того, ведущим или ведомым является уст- ройство. В режиме Sleep тактирование модуля прекращается, поэтому в ведущем устройстве прием/передача останавливается и не меняет состояние до пробуж- дения. Когда устройство возвращается в режим Run, модуль продолжает прием и передачу данных. Если устройство является ведомым, то оно тактируется извне в любом энер- госберегающем режиме и продолжает передавать/принимать данные через свой сдвиговый регистр. После завершения приема полного байта выставляется флаг прерывания MSSP. Работа в режиме 12С Модуль MSSP, работающий в режиме 12С, полностью реализует все функции ве- дущего и ведомого и обеспечивает генерацию прерываний по стартовым и стоповым битам для обнаружения свободной шины (функция «multi-master»). Поддерживается 7- и 10-разрядная адресация. Для обмена данными используются два вывода: . последовательные такты (SCL) - RB1/AN10/INT1/SCK/SCL; . последовательные данные (SDA) - RB0/AN12/INT0/FLT0/SDI/SDA. Пользователь должен правильно настроить направление передачи данных через эти выводы при помощи разрядов TRISB<1:0>. Используемые регистры Модуль MSSP (рис. 2.25) содержит шесть регистров, которые используются в ре- жиме 12С (см. табл. 2.10). • Управляющий регистр 1 (SSPCON1). • Управляющий регистр 2 (SSPCON2). • Регистр статуса (SSPSTAT). • Регистр буфера (SSPBUF). . Сдвиговый регистр (SSPSR). • Регистр адреса (SSPADD). Назначение регистров SSPBUF и SSPSR аналогично описанному в предыду- щем разделе. Во время приема данных эти регистры образуют приемник с двой- ной буферизацией. При передаче двойная буферизация не применяется. Запись в регистр SSPBUF приводит к одновременной записи в регистр SSPSR, который недоступен для прямого обращения. Регистр SSPADD хранит адрес устройства в системе, если устройство скон- фигурировано в качестве ведомого. Если устройство настроено в качестве веду- 250
Функции обмена данными семейства PIC18F2455/2550/4455/4550 щего, то младшие семь разрядов этого регистра хранят константу скорости для генератора тактов передачи. Регистры SSPCON1, SSPCON2 и SSPSTAT являются регистрами управления и статуса. Первые два регистра доступны для чтения и записи. Младшие шесть разрядов регистра SSPSTAT доступны только для чтения, два старших допуска- ют чтение и запись. Регистр SSPSTATв режиме 12С bit? SMP управляющий бит скорости 1 = управление скоростью отключено для режима стандартной скоро- сти (100 кГц и 1 МГц) 0 = управление скоростью включено для высокоскоростного режима (400 кГц) bit6 СКЕ бит выбора совместимости с интерфейсом SMBus 1 = включены специальные входы SMBus 0 = отключены специальные входы SMBus bit5 D/А бит Data/Address В режиме ведущего зарезервирован В режиме ведомого 1 = показывает, что последний переданный/принятый байт был данными 0 = показывает, что последний переданный/принятый байт был адресом Рис. 2.25. Структурная схема модуля MSSP в режиме 12С 251
Гпава 2 bit4 Р стоп-бит 1 = показывает, что последним был зафиксирован стоп-бит О = стоп-бит не был зафиксирован последним Этот бит сбрасывается по общему сбросу и при очистке SSPEN bit3 S старт-бит 1 = показывает, что последним был зафиксирован старт-бит О = старт-бит не был зафиксирован последним Этот бит сбрасывается по общему сбросу и при очистке SSPEN bit2 R/W бит информации о чтении/записи В режиме ведомого 1 = чтение О =запись Этот бит хранит информацию о чтении/записи в течение равенства ад- ресов. Бит является валидным, только с момента совпадения адресов и до следующего бита Start, Stop или не являющегося АСК. В режиме ведущего 1 = идет процесс передачи данных О = передачи нет Применение логического ИЛИ к этому биту совместно с SEN, RSEN, PEN, RCEN или ACKEN показывает, находится ли модуль MSSP в состоянии Idle (ожидание). bill UА бит обновления адреса (только режим 10-битного ведомого) 1 = показывает, что пользователь должен обновить адрес в регистре SSPADD О = нет необходимости в обновлении адреса bitO BF бит заполнения буфера Во время передачи данных 1 = прием завершен, регистр SSPBUF содержит новые данные О = прием не завершен, регистр SSPBUF пуст Во время приема данных 1 = передача данных идет (не включает АСК и стоп-бит), SSPBUF полон О = передача данных завершена (не включает АСК и стоп-бит), SSPBUF пуст. Регистр SSPCON1 в режиме fC bit7 WCOL бит обнаружения коллизии записи Режим ведущего, передача 1 = запись в регистр SSPBUF произошла, когда состояние 12С не позволяло начать валидную передачу (следует сбросить программно) О - коллизии записи не было Режим ведомого, передача 1 = запись в регистр SSPBUF произошла во время передачи предыдущего 252
Функции обмена данными семейства PIC18F2455/2550/4455/4550 слова (следует сбросить программно) О = коллизии не было Во время приема (ведущий и ведомый) Значение бита не обслуживается bit6 SSPOV бит индикации переполнения при приеме Во время приема данных 1 = завершен прием очередного байта, тогда как SSPBUF содержит не прочитанное предыдущее значение (следует сбросить программно) О = переполнения не было Во время передачи (ведущий и ведомый) Значение бита не обслуживается bit5 SSPEN бит включения синхронного последовательного порта 1 - включает последовательный порт и настраивает выводы SDA и SCL как выводы последовательного порта О = отключает последовательный порт и настраивает выводы SDA и SCL как линии стандартного порта ввода/вывода bit4 СКР бит управления освобождением SCK В режиме ведомого 1 = отпускает SCK О = удерживает SCK низким для гарантированного установления данных В режиме ведущего Не используется bit3-0 SSPM3:SSPM0 биты выбора режима синхронного последовательного порта 1111 = 12С ведомый, 10-битный адрес, прерывания по Start и Stop раз- решены 1110 — 12С ведомый, 7-битный адрес, прерывания по Start и Stop раз- решены 1011 = 12С управляемый программно режим ведущего (ведомый в ожи- дании) 1000 = 12С ведущий, тактирование FOsc/4 • (SSPADD+1)) 0111 = l2C ведомый, 10-битный адрес 0110 = 12С ведомый, 7-битный адрес Не приведенные здесь сочетания либо зарезервированы, либо исполь- зуются только в режиме SPL Регистр SSPCON2 в режиме fc bit? GCEN бит разрешения обобщенного вызова (только режим ведомого) 1 = включено прерывание по приему обобщенного вызова (0000h) 0 = адрес обобщенного вызова отключен bit6 ACKSTAT бит статуса подтверждения (только мастер, передача) 1 = подтверждение от ведомого не получено 253
Гпава 2 О = подтверждение от ведомого получено bit5 ACKDT бит подтверждения данных (только мастер, прием) 1 = нет подтверждения О = подтверждение Это значение, которое будет передано, если пользователь инициирует последовательность подтверждения в конце приема. bit4 ACKEN бит разрешения последовательности подтверждения (только режим ведущего, прием)0* 1 = инициирует последовательность подтверждения на выводах SDA и SCL и передает бит ACKDT О = подтверждающая последовательность Idle bit3 RCEN разрешение приема (только режим ведущего)0* 1 = разрешает режим приема для I2C О - режим приема в ожидании bit2 PEN разрешение состояния Stop (только режим ведущего)0* 1 = инициирует состояние Stop на выводах SDA и SCL. Автоматически сбрасывается аппаратно. О = состояние Stop в ожидании bitl RSEN разрешение повторяемого состояния Start (только режим веду- щего)0* 1 = инициирует повторяемое состояние Start на выводах SDA и SCL- Автоматически сбрасывается аппаратно. bitO SEN бит включения состояния Start/удержание0* В режиме ведущего 1 = Инициирует состояние Start на выводах SDA и SDL. Автоматически сбрасывается аппаратно. О - состояние Start в ожидании В режиме ведомого 1 = удержание линии тактов включено как на прием, так и на передачу О = удержание линии тактов отключено Примечание: Если модуль 12С не находится в режиме ожидания, эти биты могут быть не установлены (не буферизуются) и буфер SSPBUF может быть не записан (или запись в SSPBUF отключена). При помощи регистра SSPCON1 можно выбрать один из следующих подре- жимов 12С: . 12С ведущий. . 12С ведомый (7-разрядный адрес). . 12С ведомый (10-разрядный адрес). . 12С ведомый, 7-разрядный адрес, включены прерывания по битам Start и Stop. . I2C ведомый, 10-разрядный адрес, включены прерывания по битам Start и Stop. I2C управляемый прошивкой ведущий, ведомый в состоянии ожидания. При включении в режим 12С установкой бита SSPEN, выводы SCL и SDA на- 254
Функции обмена данными семейства PIC18F2455/2550/4455/4550 страиваются на выход с открытым стоком, позволяя настроить эти выводы на вход при помощи соответствующих разрядов TRIS. Для уверенности в коррект- ной работе модуля эти выводы должны быть оснащены внешними нагрузоч- ными резисторами. Режим ведомого 12С В режиме ведомого выводы SCL и SDA следует настроить на вход, установив разряды TRISB<1:0>. Модуль MSSP может при необходимости проигнорировать настройку на вход и передать данные (ведомый во время передачи). В режиме ведомого всегда устанавливается флаг прерывания по совпадению внутреннего адреса с объявленным на шине. Кроме этого, пользователь может выбрать прерывание по битам Start и Stop. Когда адрес совпал или данные после совпадения адреса приняты, аппаратно генерируется импульс подтверждения АСК, и в регистр SSPBUF перегружается текущее значение регистра SSPSR. Импульс АСК не генерируется при любом сочетании следующих условий: • бит заполнения буфера BF был установлен до завершения приема посылки; • бит переполнения буфера SSPOV был установлен до завершения приема посылки. В этом случае значение из регистра SSPSR не перегружается в SSPBUF, но флаг прерывания SSPIF (PIR1 <3>) устанавливается. Бит BF сбрасывается путем чтения из регистра SSPBUF, тогда как SSPOV сбрасывается программно. Тактовые импульсы на входе SCL должны иметь длительность высокого и низ- кого уровня не меньшую, чем задано в таблице параметров микроконтроллера. Адресация ведомого Когда модуль включен, он ожидает сигнал Start. Вслед за этим сигналом сле- дуют восемь битов, сдвигаемых в регистр SSPSR. Выборка входящих битов про- исходит по нарастанию уровня на линии SCL. Содержимое регистра SSPSR<7:1> сравнивается с содержимым регистра SSPADD. Сравнение происходит по спаду уровня восьмого импульса на линии SCL Если адрес совпал и разряды BF и SSPOV сброшены, происходит следующее: . Значение регистра SSPSR перегружается в SSPBUF. . Устанавливается бит заполнения буфера BF. • Генерируется импульс АСК. • Устанавливается флаг прерывания SSPIF (PIR1<3>) по спаду девятого им- пульса на линии SCL. Прерывание генерируется, если оно разрешено. Если используется 10-разрядный адрес, его получение происходит несколько иначе. Пять старших значащих разрядов первого адресного байта указывают, является ли этот адрес 10-разрядным. Бит R/W (SSPSTAT<2>) должен задавать запись, поскольку ведомый будет принимать второй адресный байт. В случае 10-разрядного адреса первый адрес- ный байт должен иметь вид «11110 А9 А8 0», где «А9 А8» это два старших раз- ряда адреса. 255
Гпава 2 Последовательность событий для 10-разрядного адреса, где шаги 7-9 отно- сятся к ведомому передатчику, будет такой: • Прием первого (старшего) байта адреса. Биты SSPIF, BF и UA установлены. . Обновление регистра SSPADD вторым (младшим) байтом адреса. Сбрасы- вается бит UA и отпускается линия SCL. . Чтение регистра SSPBUF (сброс бита BF) и сброс флага SSPIF. . Прием второго байта адреса (биты SSPIF, BF и UA установлены). . Обновление регистра SSPADD первым (старшим) байтом адреса. Если есть совпадение, отпускается линия SCL, это приводит к сбросу бита UA. • Чтение регистра SSPBUF (сброс флага BF) и сброс флага SSPIF. • Прием состояния повторного старта. • Прием первого (старшего) байта адреса. Биты SSPIF и BF установлены. • Чтение регистра SSPBUF (сброс бита BF) и сброс флага SSPIF. Прием Если в адресной посылке бит R/W сброшен и адрес совпал, то сбрасывается бит R/W регистра SSPSTAT. Принятый адрес перегружается в SSPBUF и ведо- мый переводит линию SDA в низкий уровень, что означает передачу подтвер- ждения (АСК). В случае, если обнаружено переполнение буфера, как было опи- сано выше, то импульс АСК не передается. Прерывание от модуля MSSP генерируется при каждом приеме байта данных. Флаг-бит SSPIF следует сбрасывать программно. Регистр SSPSTAT использует- ся для определения статуса байта. Если разрешено удержание линии тактирования (SSPCON2<0> = 1), линия SCL будет удерживаться ведомым в низком уровне (затягивание такта) при каж- дом обмене данными. Линия должна быть освобождена установкой бита СКР (SSPCON1<4>). Передача Если во входящей адресной посылке бит НАЛ/ установлен и адрес совпал, то устанавливается бит R/W регистра SSPSTAT. Принятый адрес перегружается в SSPBUF. Девятым битом передается импульс АСК и линия SCL удерживается в низком уровне независимо от состояния разряда SEN (SSPCON2<0>). Благо- даря удержанию линии SCL ведомым, ведущее устройство не сможет выдать следующий тактовый импульс, пока ведомый не закончит готовить данные для передачи. Передаваемые данные должны быть записаны в регистр SSPBUF, что равно- значно записи в регистр SSPSR. Вывод SCK/SCL должен быть включен установ- кой бита СКР (SSPCON1<4>). Восемь битов данных сдвигаются в линию по спаду на входе SCL. Это гаран- тирует, что сигнал SDA будет валидным во время высокого уровня на линии SCL (рис. 2.26 - 2.29). Импульс подтверждения АСК от ведущего-приемника защелкивается по на- растанию девятого входного импульса на линии SCL. Если линия SDA остается в высоком уровне (нет импульса АСК), это означает, что обмен данными с веду- щим завершен. 256
передан СКР (СКР не сбрасывается в *0" если S EN = 0) Рис. 2-26. Прием данных ведомым, SEN=O, 7-разрядный адрес Функции обмена данными семейства PIC18F2455/2550/4455/4550 257
258 — СКР установлен программно СКР установлен программно Рис. 2-27. Передача данных от ведомого, 7-разрядный адрес
SCL удерживается низкой до обновления SPPADD SCL удерживается низкой до обновления SPPADD передан UA (SSPSTAT<1>) UA установлен, показывая что SSPADD нужно обновить Сброшен аппаратно, когда SSPADD обновлен младшим байтом адреса Сброшен аппаратно, когда SSPADD обновлен старшим байтом адреса UA установлен. показывая что SSPADD нужно обновить СКР (СКР не сбрасывается, когда SEN = 0) Рис. 2-28. Прием данных ведомым, SEN=0, 10-разрядный адрес Функции обмена данными семейства P1C18F2455/2550/4455/4550 259
260 Ведущий SCL удерживается низкой, пока не обновится SSPADD SCL удерживается низкой, пока не обновится SSPADD SCL удерживается низкой, пока СКР = ’1" прекращает обмен UА установлен, показывая, что - SSPADD должен быть обновлен — Сброшен аппаратно когда SSPADD обновлен старшим байтом адреса Сброшен аппаратно, когда SSPADD обновлен старшим байтом адреса Гпава 2 UAустановлен, показывая, что — SSPADD должен быть обновлен СКР (SSPCON1 Установлен программно Автоматически сброшен аппаратно, удерживая SCL = О Рис. 2.29. Передачаданных от ведомого, 10-разряный адрес
Функции обмена данными семейства PIC18F2455/2550/4455/4550 В этом случае когда импульс АСК захвачен ведомым, его логика сбрасывает- ся (сброс регистра SSPSTAT) и ведомый ожидает новый бит Start. Если линия SDA была в низком уровне (АСК), в регистр SSPBUF должны быть загружены следующие данные для передачи. И вновь вывод SCK/SCL должен быть включен установкой бита СКР (SSPCON1<4>). Как и в случае приема, флаг-бит прерывания от модуля MSSP устанавливает- ся при каждом обмене байтом данных, по спаду девятого импульса тактовой час- тоты. Флаг-бит должен быть сброшен программно. Регистр SSPSTAT использу- ется для определения статуса байта. Затягивание тактовых импульсов Режимы 7- и 10-битного ведомого поддерживают автоматическое затягивание тактовых импульсов в процессе передачи. Бит SEN (SSPCON2<0>) позволяет включить затягивание на время приема. Установка бита SEN приведет к тому, что вывод SCL будет принудительно удерживаться в низком уровне в конце каж- дой последовательности приема данных. В режиме 7-битного адреса ведомого (прием, SEN=1), по спаду девятого тактирующего импульса в конце последовательности АСК, если бит BF установ- лен, то бит СКР автоматически сбрасывается, принуждая выход SCL оставаться в состоянии низкого логического уровня. Пользователь должен вновь установить бит СКР в подпрограмме обработки прерывания, прежде чем разрешить продолжать прием. Благодаря удержанию линии тактов в низком уровне, пользователь получает время для обслуживания прерывания и чтения содержимого буфера SSPBUF прежде, чем ведущее уст- ройство инициирует новый цикл обмена данными. Это предотвращает перепол- нение буфера (см. рис. 2.31). Если пользователь прочитает содержимое SSPBUF до спада девятого тактового импульса, тем самым он сбросит бит BF, бит СКР не будет сброшен и затягивание такта не произойдет. Бит СКР должен быть установлен программно независимо от состояния бита BF. Пользователь должен аккуратно относиться к сбросу бита BF в подпрограмме обработки прерывания, предшествующей приему следующей последовательности, чтобы не допустить переполнение. В режиме 10-битного адреса ведомого (прием, SEN=1), в процессе прие- ма адреса затягивание тактов включается автоматически, но бит СКР не сбрасы- вается. В течение этого времени, если бит UA установлен после девятого такта, ини- циируется затягивание такта. Бит UA устанавливается после приема старшего байта 10-битного адреса и остается неизменным во время приема второго байта адреса; бит R/W сбрасывается. Отпускание линии тактирования происходит сра- зу после обновления регистра SSPADD. Затягивание такта происходит после приема каждой последовательности данных, как описано выше для случая 7-битного адреса. Если пользователь опрашивает бит UA и сбрасывает его путем обновления регистра SSPADD прежде, чем произойдет спад девятого импульса, и если поль- зователь перед этим не сбрасывает бит BF чтением регистра SSPBUF, то бит СКР не будет оставаться нулевым. Затягивание тактов, основанное на состоя- нии бита BF, происходит только при передаче данных, но не адреса. 261
Гпава 2 В режиме 7-битного адреса ведомого (передача) затягивание такта про- исходит при сбросе бита СКР после спада девятого тактового импульса, если бит BF сброшен. Состояние бита SEN при этом не имеет значения. Пользователь должен установить бит СКР в подпрограмме обработки прерывания прежде, чем разрешить следующую передачу. Благодаря затягиванию такта, пользователь имеет возможность выгрузить в буфер SSPBUF новое значение до того, как мастер инициирует новый обмен данными (см. рис. 2.27). Если пользователь загружает данные в SSPBUF, устанавливая бит BF до момента спада девятого импульса, то бит СКР не будет сброшен и затяги- вание такта не произойдет. Бит СКР может быть установлен программно независимо от состояния бита BF В режиме 10-битного адреса ведомого (передача) затягивание такта в те- чение первых двух адресных последовательностей управляется состоянием бита UA, аналогично описанному выше режиму приема с 10-битным адресом. По окончанию приема адреса модуль настраивается в режим передачи, и затягива- ние такта зависит от флага BF, аналогично режиму передачи при 7-битном адре- се (см. рис. 2.29). Синхронизация тактов и бит СКР Когда бит СКР сброшен, это,вынуждает линию SCL перейти в состояние логи- ческого ноля. Несмотря на это, установка бита СКР еще не означает обратный переход линии SCL в высокий уровень. Бит СКР не будет влиять на линию SCL до тех пор, пока внешнее ведущее устройство контролирует линию. Выход SCL будет оставаться низким не только до тех пор, пока бит SCK не будет установлен, но и пока остальные устройства на шине 12С не отпустят линию SCL. Это гарантирует, что запись в бит СКР не нарушит требования к минимальной длительности тактирующего импульса на линии SCL (рис. 2.30). О1 02 03 04 Q1 02 03 04 Q1 02 03 04 Q1 02 03 04 Q1 02 03 04 Q1 02 03 04 Q1 02 03 04 I I 1 1 1 * ' ZZ 1 ! 1 ' SDA I 1 J I DX I । 1 1 1 (С 1 X | DX-1 ! 1 ‘ 1 1 1 SCL . , - “Г "t । ! । । ; Г 5J 1 1 1 1 1 1 1 1 | | ' ' I \ 1 ь - b; ; ! Ведущий у СКР । 1 Л «забирает»линию IV -1 .... Т .1 (< 1 'j; ; 1 1 1 1 1 1 1 Н L Ведущий 1 | «отлускает»линию . Write ' ' SSPC0N11 — J । 1 М 1— ; Рис. 2.30. Диаграмма синхронизации тактов 262
Рис. 2.31. Режим ведомого, прием, SEN=1,7-битный адрес Функции обмена данными семейства PIC18F2455/2550/4455/4550 263
264 Линия остается е низком уровне, пока происходит обновление SPPADO Линия остается в низком уровне, пока происходит обновление SPPADD Пиния остается а нивхом уровне, пока СКР не установлен в “Г Линия не остаетсяв низком уровне так как АСК = 1 Получение второго байта адреса . Получение первого байта адреса R/W = о Получение данных Получение данных SSPIF (PIR1<3>; Сброшен программе Сброшен программно Сброшен программно BF (SSPSTAT<0>) содержимое SSPSR SSPOV (SSPCON1<6>) UA (SSPSTAT<1>) СКР Пустое" чтение SSPBUF для сброса флага BF СКР установлен в “Г программно Пустое' чтение SSPBUF для сброса флага BF SSPOV установлен, т.к. SSBUF остался заполнен АСК не передается. t_ Сброшен аппаратно когда SSPADD обновлен младшим ; байтом адреса после слада ! девятого тактового импульса Сброшен аппаратно когда ; SSPADD обновлен старшим : байтом адреса после спада ; девятого тактового импульса UA установлен, показывая, что SSRADD нуждается в обновлении t— Обновление SSPADD раньше спада девятого тактового импульса не повлияет на UA, и это бит останется установленным UA установлен, показывая. — что SSRADD нуждается в обновлении ‘ Сброшен программна Ведущий прекращает Гпаеа2 J Обновление SSPADD раньше L спада девятого тактового импульса не повлияет на UA. и это бит останется установленным Рис. 2.32. Режим ведомого, прием, SEN=1,10-битный адрес
Функции обмена данными семейства PIC18F2455/2550/4455/4550 GCEN (SSPCON2<7>) Рис. 2.33. Диаграмма общего вызова ведомого (7- и 10-битный адрес) Поддержка общего вызова Процедура адресации для шины 12С такова, что первый байт после команды Start обычно определяет, какое ведомое устройство будет адресовано ведущим. Исключение составляет общий вызов, при помощи которого можно обратиться ко всем устройствам. Когда использован общий вызов, то все устройства, теорети- чески, должны выдать в ответ подтверждение. Адрес общего вызова является одним из восьми адресов, зарезервированных в протоколе шины для специальных применений. Он состоит из одних нолей, включая R/W - 0. Адрес общего вызова распознается, когда установлен бит разрешения под- держки общего вызова GCEN (SSPCON2<7>). Вслед за обнаружением команды Start восемь разрядов сдвигаются в регистр SSPSR и полученный адрес сравни- вается со значением в регистре SSPADD. Также он сравнивается с фиксирован- ным адресом общего вызова. Если обнаружено совпадение принятого адреса с адресом общего вызова, то SSPSR переписывается в SSPBUF, устанавливается флаг BF (восьмой такт) и по спаду девятого такта (АСК) устанавливается флаг прерывания SSPIF. Во время обслуживания прерывания причина прерывания может быть обна- ружена путем проверки содержимого регистра SSPBUF. Значение регистра ука- зывает, является ли адрес специфическим для данного устройства, или это ад- рес общего вызова. В режиме 10-битной адресации регистр SPPADD необходимо обновить второй половиной адреса для проверки. Но если установлен бит GCEN и поступил адрес общего вызова, вторая половина адреса не требуется, бит UA не будет установлен и ведомый продолжит принимать данные после подтверждения (рис. 2.31 -2.33). Режим ведущего 12С Режим ведущего включается настройкой соответствующих разрядов SSPM в регистре SSPCON1 и установкой бита SSPEN. В режиме ведущего выводы SCL и SDA управляются аппаратно, схемой модуля MSSP. 265
Глава 2 Работа ведущего обеспечивается генерацией прерываний по состоянию Start и Stop. Биты Start (S) и Stop (Р) очищаются по сбросу или при выключении модуля. Управление шиной 12С может быть принято, если установлен бит Р или если шина в состоянии Idle (ожидание) при сброшенных битах S и Р. В режиме ведущего, управляемого прошивкой контроллера, код пользователя производит все операции, основываясь на состоянии битов Start и Stop. Когда режим ведущего включен, пользователь обладает следующими воз- можностями: . Установка состояния Start на линиях SDA и SCL. . Установка состояния «повторный старт» на линиях SDA и SCL. . Запись в регистр SSPBUF, инициирующая передачу данных/адреса. . Конфигурирование порта для приема данных. . Генерация состояния АСК (подтверждение) в конце принятого байта данных. . Генерация состояния Stop на линиях SDA и SCL. Модуль MSSP (рис.2.34), сконфигурированный в режим ведущего шины 12С, не позволяет создавать очередь событий. Проще говоря, пользователь не может инициировать последовательность Start и немедленно произвести запись в регистр SSPBUF до того, как последова- тельность Start не будет завершена. В таком случае запись в буфер не произой- дет, и будет установлен бит WCOL, показывающий, что запись в регистр SSPBUF не произошла. • Флаг прерывания SSPIF устанавливается по событиям: • Start. Рис. 2.34. Блок-схема MSSP 12С в режиме ведущего 266
Функции обмена данными семейства PIC18F2455/2550/4455/4550 . Stop. . Байт данных передан/принят. . Подтверждение передано. • Повторный старт. Ведущее устройство самостоятельно генерирует все последовательности так- товых импульсов и комбинации Start и Stop. Обмен завершается передачей ком- бинации Stop или «повторный старт»». Так как повторный старт инициирует сле- дующий последовательный обмен, шина 12С при этом не освобождается. В режиме ведущего-передатчика последовательные данные выводятся через линию SDA и стробируются по линии SCL. Первый переданный байт содержит адрес ведомого-приемника (семь разрядов) и бит R/W. В этом случае R/W = 0. Последовательные данные передаются блоками по восемь бит. После передачи каждого байта передатчик должен получить в ответ подтверждение принимающе- го устройства. Для обозначения моментов начала и окончания передачи приме- няются комбинации Start и Stop. В режиме ведущего-приемника первый переданный байт содержит адрес ве- домого устройства-передатчика, от которого запрашиваются данные (семь раз- рядов) и бит R/W = 1. После приема каждого байта передается сигнал подтвер- ждения АСК. Комбинации уровней Start и Stop отмечают начало и конец обмена. Тактовый генератор позволяет установить частоту тактирования линии SCL равной 100 кГц, 400 кГц или 1 МГц. Типичная последовательность действий при передаче выглядит так: Пользователь включает генерацию состояния Start, установив бит SEN (SSPCON2<0>). Флаг SSPIF установлен. Модуль MSSP ждет, пока будет полностью отработа- но состояние Start, прежде чем выполнить какую-либо операцию. Пользователь выгружает в SSPBUF адрес ведомого, которому будут переда- ны данные. Адрес сдвигается в линию SDA, пока не будут переданы все восемь разрядов. Модуль MSSP защелкивает бит АСК, переданный ведомым, и сохраняет его значение в регистре SSPCON2<6>. Модуль MSSP генерирует прерывание в конце девятого тактового импульса, устанавливая флаг SSPIF. Пользователь загружает в SSPBUF восемь бит данных. Данные сдвигаются в линию SDA, пока не будут переданы все восемь разрядов. Модуль MSSP защелкивает бит АСК, переданный ведомым, и сохраняет его значение в регистре SSPCON2<6>. Модуль MSSP генерирует прерывание в конце девятого тактового импульса, устанавливая флаг SSPIF. Пользователь включает генерацию состояния Stop, установив бит PEN (SSPCON2<2>). Как только отработка состояния Stop завершена, генерируется прерывание. Генератор-контроллер тактов SCL Генератор-контроллер тактовых импульсов (Baud Rate Generator, BRG) выра- батывает импульсы, тактирующие линию SCL и, таким образом, определяет ско- рость передачи данных по шине 12С (рис.2.35). Генератор представляет собой счетчик с обратным отсчетом, у которого длительность отсчета зависит от пред- варительно загруженного начального значения. 267
Глава 2 SSPM3:SSPM0 Fosc/4 Рис. 2.35. Структурная схема генератора-контроллера тактов В режиме ведущего происходит загрузка в счетчик младших семи разрядов из регистра SSPADD. Когда происходит запись в регистр SSPBUF, генератор авто- матически начинает отсчет. Отсчет идет до «О», затем останавливается до сле- дующей перезагрузки. Декремент происходит дважды за командный цикл (TCY), в тактах Q2 и Q4. В режиме ведущего перезагрузка происходит автоматически. Как только определенная операция завершена (т.е. передан последний бит данных и получено подтверждение АСК), отсчет автоматически прекращается и вывод SCL остается в его последнем состоянии. В табл. 2.9 приведены типовые значения скорости передачи данных в бодах в зависимости от загружаемого начального значения. Таблица 2.9 Типовые значения скорости передачи и BRG Fcy Fcy’2 Значение BRG Fscl (2 цикла BRG) 10 МГц 20 МГц 19h 400 кГц<1) 10 МГц 20 МГц 20h 312.5 кГц 10 МГц 20 МГц 3Fh 100 кГц 4 МГц 8 МГц OAh 400 кГц(1> 4 МГц 8 МГц ODh 308 кГц 4 МГц 8 МГц 28h 100 кГц 1 МГц 2 МГц 03h 333 кГц(1) 1 МГц 2 МГц OAh 100 кГц 1 МГц 2 МГц OOh 1 МГц(1) (1) Интерфейс 12С™ не соответствует спецификации 12С - 400 МГц (которая позволяет передавать данные с частотой тактов более 100 кГц) во всех деталях, но может быть ис- пользован с должной аккуратностью на больших частотах, если это требуется в приклад- ных целях. Разрешение конфликта тактирования Разрешение конфликта тактирования происходит, когда ведущий во время приема, передачи или состояния «повторный старт» отпускает линию SCL и она могла бы перейти в высокий уровень, если бы ее не удерживало ведомое устрой- ство. Когда линия SCL отпущена, но не перешла в высокий уровень, тактовый гене- 268
Функции обмена данными семейства PIC18F2455/2550/4455/4550 SDA DX У DX-1 Линия SCL отпущена, но ведомый удерживает SCL в низком уровне । SCL может перейти в высокий уровень ।---------1------—----г— Декремент BRG в циклах Q2 и Q4 ____I I 1 1 I 01 h д 00h (удержание) 03h 02h ' Обнаружен высокий уровень SCL, _ I загружено исходное значение и Загрузка Г~] счетчик генератора начал его 'L—1 BRG _______I I отсчитывать | Рис. 2.36. Диаграмма тактирования при разрешении конфликта линии ратор приостанавливает отсчет до тех пор, пока на линии SCL не будет заме- чен высокий уровень. Когда линия SCL все же переходит в высокий уровень, счетный регистр тактового генератора перезагружается значением SSPADD<6:0> и начинает отсчет. Это гарантирует, что время нахождения SCL в высоком уровне всегда будет равно, по меньшей мере, одному рабочему цик- лу тактового генератора, в случае если было удержание ее внешним устройст- вом в низком уровне (рис. 2.36). Отработка состояния Start Для того чтобы инициировать на шине состояние Start, пользователь должен установить бит SEN (SSPCON2<0>). Если уровни на линиях SDA и SCL зафикси- рованы высокими, тактовый генератор-контроллер загружает содержимое SSPADD<6:0> и начинает отсчет. Если линии SDA и SCL обе остаются в состоя- нии высокого уровня, когда счетчик генератора обнулился (TBRG), вывод SDA пе- реводится в низкий уровень. Поскольку SDA переходит в «О», когда SCL остается в состоянии «1», это означает состояние Start и приводит к установке бита S (SSPSTAT<3>). Вслед за этим генератор-контроллер перезагружается значением SSPADD<6:0> и продолжает отсчет. Когда вновь пройдет интервал времени TBRG, бит SEN автоматически сбрасывается аппаратно, тактовый генератор останав- ливается, оставляя линию SDA в низком уровне. Последовательность Start на этом считается отработанной (рис. 2.37). Если в начале последовательности Start окажется, что линии SDA и SCL уже находятся в низком уровне или в течение последовательности окажется, что ли- ния SCL перешла в низкий уровень раньше, чем SDA, это означает коллизию ши- ны; устанавливается флаг прерывания по событию коллизии BCLIF, последова- тельность Start прерывается, модуль сбрасывается и переходит в исходное со- стояние Idle (ожидание). Если пользователь пытается произвести запись в SSPBUF когда отрабатыва- ется последовательность Start, устанавливается флаг статуса WCOL и содержи- мое буфера не изменяется (запись не происходит). 269
Глава 2 Установлен бит SEN SDA = 1, SCL = 1 Установка бита S (SSPSTAT<3>) Аппаратно сбрасывается бит SEN, устанавливается бит SSPIF, последовательность Start завершена Рис. 2.37. Диаграмма отработки последовательности Start Поскольку очередь событий не поддерживается, возможность записи млад- ших пяти разрядов регистра SSPCON2 отключается на время отработки после- довательности Start. Отработка состояния повторного старта Последовательность повторного старта начинается, если бит RSEN (SSPCON2<1>) установлен в «1» и логика модуля 12С находится в состоянии ожидания. Вслед за установкой RSEN = 1, вывод SCL переводится в низкий уро- вень. Когда низкий логический уровень зафиксирован, в генератор-контроллер загружается константа из SSPADD<6:0> и начинается отсчет такта TBRG. Линия SDA отпущена и может перейти в высокий уровень. Если по истечении одного цикла TBRG на линии SDA отмечен высокий уровень, то линия SCL освобождается и тоже может перейти в высокий уровень (если ее не удержит другое устройство). Если линия SCL перешла в высокий уровень, генератор загружает счетчик и начи- нает отсчет. SDA и SCL должны оставаться в состоянии логической «1» на протя- жении одного такта. Вслед за этим вывод SDA переводится в низкий уровень на один такт, в то время как уровень SCL остается высоким. Затем бит RSEN (SSPCON2<1>) автоматически сбрасывается и генератор не загружается, оставляя вывод SDA в низком уровне. Как только обнаружена последовательность повторно- го старта, устанавливается бит S (SSPSTAT<3>). Флаг-бит SSPIF не будет уста- новлен, пока генератор-контроллер не отсчитает такт до конца (рис.2.38). Если бит RSEN установить во время выполнения любого процесса, то ничего не произойдет. Коллизия шины при повторном старте случается, если: • SDA в низком уровне в момент перехода SCL от низкого к высокому; • SCL переходит в низкий уровень прежде, чем SDA установлен низким. Это мо- жет означать, что другой ведущий пытается в этот момент передать по шине «1». Сразу после установки бита SSPIF пользователь может записать в SSPBUF 7-разрядный адрес (или первую часть 10-разрядного адреса). После получения под- тверждения может быть передан байт данных или вторая часть 10-разрядного адреса. Если пользователь пытается произвести запись в SSPBUF когда отрабатыва- ется последовательность повторного старта, устанавливается флаг статуса WCOL и содержимое буфера не изменяется (запись не происходит). 270
Функции обмена данными семейства PIC18F2455/2550/4455/4550 г——Остановлен бит S (SSPSTAT<3>) Запись в регистр SSPCON2, SDA=1, SCL не меняется SDA = 1, SCL = 1 Аппаратно сброшен бит RSEN, установлен флаг SSPIF, после- Start завершена h-TBRG-H*-TBRG“H*~TBRG “Н SDA. 1-й бит Запись в SSPBUF h-TBRG-H KTbrg-H Sr = Повторный старт Рис. 2.38. Диаграмма последовательности повторного старта Поскольку очередь событий не поддерживается, возможность записи млад- ших пяти разрядов регистра SSPCON2 отключается на время отработки после- довательности повторного старта. Передача в режиме ведущего 12С Передача байта данных или адреса осуществляется при записи значения в буферный регистр SSPBUF. Это действие приводит к установке флага заполне- ния буфера BF и позволяет генератору-контроллеру начать отсчет тактов пере- дачи. Каждый бит адреса или данных сдвигается через вывод SDA после спада на выводе SCL. Низкий уровень на линии SCL удерживается в течение одного такта TBrG’ Уровень на линии SDA должны быть валидным к моменту отпускания линии SCL в высокий уровень. Линия SCL удерживается в высоком уровне также один такт. В течение этого времени логический уровень на выводе SDA должен быть стабильным. После того, как восьмой бит сдвинут на выход (спад восьмого такта), флаг BF очищается и ведущий отпускает линию SDA. Это позволяет ведомому устройству по девятому такту выдать подтверждение АСК, если его адрес совпал с пере- данным или если байт данных был успешно принят ведомым. Значение АСК пе- реписывается в бит ACKDT (SSPCON2<6>) по спаду девятого такта. Нулевое значение ACKDT будет означать, что подтверждение получено, единица означа- ет отсутствие подтверждения от ведомого. После девятого такта устанавливается флаг SSPIF и приостанавливается так- товый генератор, оставляя SCL в низком уровне и SDA без изменений (рис. 2.39). Адрес передается аналогично данным. Сначала на выход сдвигаются семь бит адреса, затем бит команды R/W, говорящий ведомому о том, какую операцию хочет выполнить ведущий. По девятому такту ведущий читает состояние бита подтверждения от ведомого и переписывает его в бит ACKDT (SSPCON2<6>). Если этот бит сброшен, значит переданный адрес совпал с адресом ведомого. Устанавливается флаг прерывания SSPIF, очищается флаг BF, генератор приос- танавливается до следующей записи. Линия SCL удерживается в низком уровне, линия SDA освобождается и значение на ней может «плавать». 271
Гпава 2 Если пользователь пытается записать данные в SSPBUF когда передача не завершена (т.е. данные сдвигаются из регистра SSPSR на выход), то ус- танавливается флаг коллизии WOOL и запись в буфер не происходит. Флаг WOOL должен быть сброшен программно. Прием в режиме ведущего 1гС Переключение в режим приема производится установкой бита RCEN (SSPCON2<3>). В момент программирования бита RCEN модуль MSSP должен находиться в режиме ожидания, иначе бит будет игнорирован (рис.2.40). Генератор-контроллер начинает вырабатывать такты, и по каждому такту внешние данные сдвигаются в регистр SSPSR. После спада восьмого такта бит RCEN автоматически сбрасывается, содержимое SSPSR перегружается в SSPBUF, устанавливается флаг BF, устанавливается флаг прерывания SSPIF. Работа тактового генератора приостанавливается, линия SCL удерживается в низком уровне. Когда буфер SSPBUF читается со стороны процессора, флаг BF автоматически сбрасывается. Затем пользователь может передать бит подтвер- ждения, установив бит разрешения передачи подтверждения ACKEN (SSPCON2<4>). Если предыдущие данные не были прочитаны из буфера и, соответственно, бит BF не был сброшен, то после приема следующего байта выставляется флаг переполнения буфера SSPOV. Если пользователь пытается записать данные в SSPBUF когда прием не завершен (т.е. данные сдвигаются из линии в регистр SSPSR), то устанавли- вается флаг коллизии WOOL и запись в буфер не происходит. Флаг WOOL должен быть сброшен программно. Последовательность квитирования (АСК) Каждый обмен данными между ведущим и ведомым должен сопровождаться квитированием (подтверждением). Подтверждение может быть как положитель- ным (АСК - 0), так и отрицательным (АСК = 1). Квитирующая последователь- ность на шине 12С инициируется установкой бита ACKEN (SSPCON2<4>). Когда этот бит установлен, вывод SCL вытягивается в низкий уровень, и текущее зна- чение подтверждения выставляется на выводе SDA. Решение о том, какое под- тверждение будет передано, принимает пользователь. Если он желает передать подтверждение успешного обмена, то бит ACKDT следует сбросить. Если нет, то бит ACKDT следует установить в «1» до начала генерации последовательности квитирования. Затем тактовый генератор отсчитает длительность одного такта и вывод SCL будет отпущен (перейдет в высокий уровень). Если уровень на линии SCL станет высоким, генератор отсчитает еще один такт, после чего линия SCL будет вновь переведена в низкий уровень. После этого бит ACKEN будет автоматически сброшен, генератор остановится, модуль MSSP перейдет в режим ожидания (рис. 2.41). Если пользователь пытается записать данные в SSPBUF когда генерация по- следовательности АСК не завершена, то устанавливается флаг коллизии WCOL и запись в буфер не происходит. Флаг WCOL должен быть сброшен программно. 272
273 Запись в SSPCON2<0> SEN = 1 Начало последовательности Start SEN = 0 Передача адреса ведомому R/W = О В SSPBUF записан 7-битный адрес, бит R/W началась передача SCL П SSPIF i ACKSTAT в SSPCON2 = 1 От ведомого, сбрасывает бит ACKSTAT (SSPCON2<6>) Передача данных или второй половины 10-битного адреса i {SCI удерживается низкой 1 пока CPU \ i обрабатывает преры в а н ие ACK = 0 BF (SSPSTAT<0>) Сброшен программно / { Сброшен программно в I подпрограмме обработки \ прерывания [ u " SSPBUF записан । SSPBUF записан SEN [ Г Сброшен программно PEN f* SEN сброшен аппаратно после начала последовательности START R/W Рис. 2.39. Ведущий в режиме передачи (7- или 10-битный адрес) Функции обмена данными семейства PIC18F2455/2550/4455/4550
274 Запись в SSPCON2<0> SEN = 1 запуска подтверждения SDA = ACKDT (SSPCON2<5>) = О Гпава 2 BF (SSPSTATO) А Последний бит сдвинут в SSPSR 1 и содержимое выгружено в SSPBUF SSPOV ACKEN О SSPOV установлен. т.к SSPBUF остался полным _____п_____________ Рис. 2.40. Ведущий в режиме приема, 7-битный адрес
Функции обмена данными семейства PIC18F2455/2550/4455/4550 SDA Начало квитирования, запись в SSPCON2 ACKEN = 1, ACKDT = С ।— ACKEN автоматически I сброшен SSPIF Сброшен программно Установлен концу квитирования Рис. 2.41. Диаграмма последовательности квитирования L Сброшен программно Формирование состояния Stop на шине fC Ведущий может сформировать на шине состояние Stop. Для этого пользова- тель должен установить бит PEN (SSPCON2<2>). В конце приема/передачи ли- ния SCL удерживается низкой после спада девятого импульса. Когда бит PEN установлен, ведущий переводит линию SDA в низкий уровень. Затем генератор- контроллер перезагружается и отсчитывает один такт. По истечении такта линия SCL переводится в высокий уровень, и, спустя еще один такт, линия SDA отпус- кается ведущим в высокий уровень. Когда на выводе SDA зафиксирован высокий уровень при высоком уровне на SCL, устанавливается флаг-бит Р (SSPSTAT<4>). Спустя один такт сбрасывается бит PEN и устанавливается флаг SSPIF (рис.2.42). Если пользователь пытается записать данные в SSPBUF когда генерация последовательности Stop не завершена, то устанавливается флаг коллизии WCOL и запись в буфер не происходит. Флаг WCOL должен быть сброшен про- граммно. SCI = 1 для Tbrg, следующего за тем, когда был зафиксирован SDA = 1. Р (SSPSTAT <4>) = 1 Запись в SSPCON2. установка PEN = 1 Спад девятого такта TBRG ’— SCL переходит в«1» после Tbrg SDA переходит в «О» до нарастания тактового импульса, что указывает на условие Stop Рис. 2.42. Диаграмма последовательности Stop Бит PEN (SSPCON2<2>) сброшен аппаратно, флаг SSPIF установлен 275
Гпава 2 Режим Multi-Master В режиме Multi-Master (несколько ведущих на одной шине) генерация преры- ваний по обнаружению на шине состояния Start или Stop позволяет определить, когда шина свободна. Биты Stop (Р) и Start (S) очищаются при сбросе микрокон- троллера или при отключении модуля MSSP. Управление шиной можно получить, если установлен бит Р (SSPSTAT<4>) или шина находится в состоянии ожида- ния, когда сброшены оба бита, S и Р. Если шина занята, то будет сгенерировано прерывание после прохождения комбинации Stop (когда прерывание разрешено). При работе в режиме Multi-Master линия SDA должна проверяться на предмет того, что уровень сигнала на ней не соответствует заданному выходному уровню. Проверка производится аппаратно и результат помещается в флаг-бит BCLIF, сигнализирующий о прерывании по событию коллизии шины. Режим Multi-Master реализуется при помощи арбитража шины. Когда ведущий выводит данные или адрес на вывод SDA, арбитраж выполняется, если ведущий подает на выход SDA «1», отпуская линию SDA и позволяя ей уйти в высокий уровень, тогда как другой ведущий в это время удерживает на линии SDA значе- ние «О». Когда линия SCL отпущена в высокий уровень, данные должны оставаться стабильными. Если ожидаемое значение на выводе SDA должно быть «1», но выборка уровня на выводе SDA дает «О», значит, присутствует коллизия шины. Ведущий выставляет флаг прерывания BCLIF и сбрасывает порт 12С в состояние ожидания (рис. 2.43). Если коллизия шины случилась во время передачи, то передача прерывается, флаг BF сбрасывается, линии SDA и SCL освобождаются и буфер SSPBUF ста- новится доступен для следующей записи. Если пользователь предусмотрел об- работку коллизии шины по прерыванию и шина 12С свободна, то он может про- должить обмен данными, передав комбинацию Start. Если коллизия шины происходит во время отработки комбинаций Start, Stop, АСК или повторного старта, то освобождаются линии SDA и SCL и сбрасывается соответствующий управляющий разряд регистра SSPCON2. Как и в предыдущем случае, пользователь может обработать событие коллизии шины и продолжить обмен, передав комбинацию Start при условии, что шина свободна. После возобновления обмена ведущий продолжит отслеживать состояние выводов SDA и SCL для обнаружения возможной коллизии. Данные изменились, пока SCL = О Линия SDA вытянута в "О" другим устройством Обнаружена коллизия шины SDA Выставлен флаг прерывания по коллизии шины BCLIF Рис. 2.43. Коллизия шины при передаче или квитировании 276
Функции обмена данными семейства PIC18F2455/2550/4455/4550 SDA = 0 прежде, чем установлен бит SEN. Установлен флаг BCLIF, биты S и SSPIF установлены, т к. SDA = О, SCL = 1. SCL SEN Установлен флаг BCLIF ------ BCLIF Сброшен программно SEN сброшен автоматически по причине коллизии шины MSSP сброшен в состояние ожидания. Установлен бит SEN, разрешен старт, если SDA - 1, SCL = 1 SSPIF Сброшен программно Рис. 2.44. Коллизия шины при отработке комбинации Start (только SDA) Запись в SSPBUF приведет к началу передачи данных с первого бита, независимо от того, в каком месте прервалась из-за коллизии шины предыдущая передача. Коллизия шины при передаче комбинации Start В процессе формирования на шине комбинации Start коллизия шины случает- ся, если: а) Логика модуля MSSP обнаруживает, что линия SDA или SCL остается в низком уровне, когда началась выдача комбинации Start (рис. 2.44). б) Логика модуля М88Робнаруживает, что SCL установлена в низкий уровень прежде, чем SDA (рис. 2.45). В процессе отработки комбинации Start отслеживается состояние обеих ли- ний. Если в начале комбинации обнаружено, что одна из линий находится в низ- ком уровне, происходит следующее: • комбинация Start прерывается; • устанавливается флаг BCLIF; • модуль MSSP сбрасывается в состояние ожидания. Комбинация Start начинается с того, что освобождаются линии SDA и SCL. Если никакое другое устройство не претендует на эти линии, уровень на них дол- жен стать высоким под влиянием внешних подтягивающих резисторов. Когда ло- гика модуля MSSP обнаруживает, что уровень SDA стал высоким, генератор- контроллер загружается и начинает отсчет. Если обнаруживается, что уровень SCL низкий в то время, как SDA высокий, это расценивается, как коллизия шины, 277
Гпава 2 SDA=O. SCL = 1 SDA SCL SEN BCLIF Установлен бит SEN, начало комбинации Start, если SDA = 1 и SCL = 1 | SCL = 0 до истечения цикла генератора. Это означает коллизию шины, SSPIF = 1. t____ SCL = 0 прежде, чем SDA = О Установлен флаг-бит BCLIF L Сброшен программно SSPIF ‘О’_________________________________________________________ Рис. 2.45. Коллизия шины при отработке комбинации Start (SCL = О) поскольку означает, что другой ведущий пытается передать по шине «1» в мо- мент отработки комбинации Start. Если во время отсчета генератора линия SDA переходит в низкий уровень, то генератор сбрасывается и линия захватывается раньше (рис. 2.46). Если же на линии SDA присутствует уровень «1», то она захватывается и переводится в низ- кий уровень после окончания отсчета генератора. Затем генератор перегружает- ся и отсчитывает еще один такт. Если во время этого такта на линии SCL будет обнаружен низкий уровень, то коллизия шины не возникает. Два ведущих на одной шине не могут начать выполнять комбинацию Start в абсолютно один и тот же момент. Следовательно, один ведущий захватит линию SDA раньше другого. Это явление не приводит к возникновению колли- зии шины, так как два ведущих должны иметь способность определять, кто передаст первый адрес вслед за комбинацией Start (выполнить арбитраж ши- ны). Если адрес одинаковый, то арбитраж продолжится в последовательно- сти данных, повторного старта или комбинации Stop. Применительно к повторному старту, коллизия шины случается, если: а) зафиксирован низкий уровень на линии SDA в то время, как SCL переходит из низкого уровня в высокий; б) SCL переходит в низкий уровень до того, как вывод SDA переведен в низ- кий уровень (другой ведущий пытается передать «1»). Когда линия SDA отпущена и может перейти в высокий уровень, генератор- контроллер загружается из SSPADD<6:0> и начинает обратный отсчет. Затем линия SCL освобождается. Когда она переходит в низкий уровень, проверяется уровень на линии SDA. Если уровень низкий, это означает коллизию шины (дру- гой ведущий пытается передать «О», рис. 2.47). Если уровень высокий, генератор перезагружается и продолжает отсчет. 278
Функции обмена данными семейства PIC18F2455/2550/4455/4550 SDA SCL SEN BCLIF S SSPIF SDA = 1, SCL = 1 I SSPIF = 1 Меньше, чем TBRG Линию держит другой ведущий. Захват SDA, сброс BRG. ‘0’ SCL отстается низкой после отсчета генератора Установка SEN, разрешение комбинации Start, если SDA= 1 и SCL= 1 SDA=0, SCL=1 Установлен SSPIF — 1_______ L Сброшен программно Рис. 2.46. Сброс генератора при арбитраже линии SDA в момент Start В случае, если линия SDA переходит из высокого уровня в низкий до того, как генератор закончил отсчет длительности такта, это не считается коллизией ши- ны, т.к. два ведущих не могут занять шину в абсолютно одинаковое время. Если SCL переходит из высокого уровня в низкий до окончания такта и линия SDA -----------------------_____________________________________ SCL значения SDA в момент перехода SCL б« 1». SDA = 0, установка флага BCLIF. освобождение линий SDAh SCL. RSEN BCLIF S t Сброшен программно SSPIF ______________________________________________________________________V Рис. 2.47. Коллизия шины при повторном старте (случай 1) 279
Гпава 2 I--------TBRG —* Р-----------------Tbrg ----------►! SDA ___________/ SCL / s' SCL = 0 раньше, чем SDA, .S установка BCLIF. Отпускание SDA и SCL. Прерывание сброшено программно RSEN I | S ______________________________________________________________________ SSPIF __________________________________________________________________ Рис. 2.48. Коллизия шины при повторном старте (случай 2) SDA еще не находится под управлением ведущего, это означает коллизию ши- ны. В таком случае другой ведущий пытается передать «1» во время отработки повторного старта (рис. 2.48). Если в конце такта обе линии имеют высокий уровень, вывод SDA переводит- ся в состояние логического «О», генератор перезагружается и продолжает отсчет. В конце отсчета, независимо от состояния внешней линии SCL, вывод SCL пере- водится в низкий уровень и комбинация повторного старта на этом завершается. При отработке комбинации Stop коллизия шины происходит, если: а) После того как линия SDA отпущена и может перейти в высокий уровень, логика модуля MSSP обнаруживает на ней низкий уровень после окончания от- счета генератора; б) После того, как линия SCL отпущена, на ней обнаружен низкий уровень до того, как SDA перейдет в высокий уровень. Комбинация Stop начинается с перевода SDA в низкий уровень. Когда логика мо- дуля определит логический «О» на линии SDA, линия SCL освобождается. Если оп- ределен высокий уровень (арбитраж тактов), генератор загружается и отсчитывает такт. По окончании такта проверяется линия SDA. Если на ней присутствует низкий уровень, произошла коллизия шины. Это значит, что другой ведущий передает в этот момент «О» (рис. 2.49). Если на выводе SCL отмечен низкий уровень прежде, чем линия SDA отпущена в высокий уровень, также присутствует «О» (рис. 2.50). Расширенный синхронный приемопередатчик (EUSART) Настройка и режимы Модуль EUSART является одним из двух модулей последовательного вво- да/вывода, доступных в рассматриваемой серии микроконтроллеров. Он извес- тен также под названием SCI (Serial Communication Interface, интерфейс после- довательного обмена). Модуль может быть настроен в полнодуплексный асин- хронный режим для обмена с внешними устройствами, такими, как персональный компьютер или терминал. Также его можно настроить в полудуплексный син- хронный режим для связи с АЦП, ЦАП, последовательными EEPROM и т.д. 280
Функции обмена данными семейства PIC18F2455/2550/4455/4550 | T8RG | Tbrg | Tbrg I SDA = 0 1 / после tbrg. SDA \ / флаг BCLIF. 1 Линия SDA переведена в низкий уровень SCL PEN I L BCLIF 1 Р ‘o' SSPIF Т)' Рис. 2.49. Коллизия шины при комбинации Stop (случай 1) Таблица 2.10 Регистры, ассоциированные с работой шины fC Регистр Bit 7 Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit -I BitO INTCON GIE/GIEH PEIE/GIEL TMROIE INTOIE RBIE TMROIF INTOIF RBIF PIR1 SPPIF(1) ADIF RCIF TXIF SSPIF CCP1IF TMR2IF TMR1IF PIE1 SPPIE(1> ADIE RCIE TXIE SSPIE CCP1IE TMR2IE TMR1IE IPR1 Sppip(’) ADIP RCIP TXiP SSPIP CCP1IP TMR2IP TMR1IP PIR2 OSCFIF CMIF USBIF EEIF BCLIF HLVDIF TMR3IF CCP2IF PIE2 OSCFIE CM1E USBIE EEIE BCL1E HLVDIE TMR3IE CCP2IE IPR2 OSCFIP CMIP USBIP EEIP BCLIP HLVDIP TMR3IP CCP2IP TRISC TRISC7 TRISC6 - - - TRISC2 TRISC1 TRISCO TRISD(1) TRISD7 TRISD6 TRISD5 TRISD4 TRISD3 TRISD2 TRISD1 TRI SDO SSPBUF Регистр буфера приема/передачи SSPADD Регистр адреса устройства в режиме ведомого, константа генератора в режиме ведущего 12С TMR2 Регистр Timer2 PR2 Регистр периода таймера Timer2 SSPCON1 WCOL SSPOV SSPEN CKP SSPM3 SSPM2 SSPM1 SSPMO SSPCON2 GCEN ACKSTAT ACKDT ACKEN RCEN PEN RSEN SEN SSPSTAT SMP CKE D/A P S R/W UA BF (1)Эти регистры или разряды недоступны в 28-выводных корпусах. 281
Глава 2 SDA SCL PEN BCLIF P Задание SDA = 0 SCL = 0 прежде, чем SDA = 1. Установка флага BCLIF. SSPIF ___________________________________________________________________________ Рис. 2.50. Коллизия шины при комбинации Stop (случай 2) Расширенный модуль EUSART обладает дополнительными опциями, вклю- чающими автоматическое определение скорости обмена (Automatic Baud Rate Detection, ABD) и калибровку, автоматическое пробуждение по приему синхротак- та и передачу 12-битного символа Break. Эти опции особенно хорошо подходят при использовании в локальной шине системы (Local Interconnect Bus, LIN). EUSART можно настроить в один из следующих режимов: • Асинхронный (полный дуплекс) включая - автопробуждение по приему символа, - автокалибровка скорости, - передача 12-битного символа Break. • Синхронный ведущий (полудуплекс) с выбираемой полярностью такта. • Синхронный ведомый (полудуплекс) с выбираемой полярностью такта. Выводы модуля EUSART мультиплексированы с выводами порта PORTC. Для того чтобы настроить выводы RC6/TX/CK и RC7/RX/DT/SDO как выводы EUSART, необходимо: • установить бит SPEN (RCSTA<7>); • установить бит TRlSC<7>; • сбросить бит TRISC<6> для синхронного или асинхронного ведущего; или установить для синхронного ведомого. Логика модуля автоматически перенастраивает выводы с ввода на вывод когда необходимо. Для управления работой модуля используются три регистра (табл. 2.12). • Управление передачей и статус (TXSTA). • Управление приемом и статус (RCSTA). • Управление скоростью (BAUDCON). Регистр TXSTA bit7 CSRC бит выбора источника тактов Асинхронный режим не используется 282
Функции обмена данными семейства PIC18F2455/2550/4455/4550 Синхронный режим 1 = ведущий (такты генерируются генератором-контроллером) О = ведомый (такты поступают от внешнего источника) bit6 ТХ9 бит разрешения 9-битной передачи 1 = выбрана 9-битная передача О = выбрана 8-битная передача bit5 TXEN бит включения передачи 1 = передача включена О - передача выключена Примечание: SREN/CREN имеют приоритет перед TXEN в синхронном режиме, за исключением того, что SREN не действует в режиме синхронного ведомого. bit4 SYNC бит выбора режима EUSART 1 = синхронный режим 2 = асинхронный режим bit3 SENDB бит передачи символа останова Асинхронный режим 1 = передача символа Sync Break в следующей передаче (сбрасывается аппаратно по завершению передачи) О = передача символа Sync Break завершена Синхронный режим не используется bit2 BRGH бит выбора высокой скорости Асинхронный режим 1 = высокая скорость О = низкая скорость Синхронный режим Не используется bitl TRMT передача статуса регистра сдвига 1 = регистр TSR пуст О = регистр TSR заполнен bitO TX9D девятый бит передаваемых данных Это может быть бит четности или адреса/данных Регистр RCSTA bit7 SPEN бит включения последовательного порта 1 - последовательный порт включен (настраивает RX/DT и ТХ/СК как выводы последовательного порта). О = последовательный порт отключен ЬН6 RX9 включение 9-битного приема 283
Гпава 2 1 = выбран 9-битный прием О = выбран 8-битный прием bit5 SREN включение однократного приема Асинхронный режим Не поддерживается Синхронный ведущий 1 = включен однократный прием О = выключен однократный прием Бит сбрасывается после завершения приема Синхронный ведомый Не поддерживается bit4 CREN включение повторяющегося приема Асинхронный режим 1 = включение приемника О = отключение приемника Синхронный режим 1 - включает повторяющийся прием до тех пор, пока бит CREN не будет сброшен (CREN «перекрывает» SREN) О = отключает повторяющийся прием bit3 ADDEN включение обнаружения адреса Асинхронный 9-битный режим (RX9 - 1) 1 = включено обнаружение адреса, включено прерывание и загрузка буфера, когда RSR<8> = 1 О - отключено обнаружение адреса, все байты приняты и девятый бит может быть использован в качестве бита четности Асинхронный 8-битный режим (RX9 = 0) Не поддерживается bit2 FERR бит ошибки синхронизации кадра 1 = ошибка синхронизации (может быть обновлен чтением регистра RCREG и приемом следующего валидного байта) О - не было ошибки синхронизации bitl OERR ошибка переполнения 1 = ошибка переполнения (может быть очищен сбросом бита CREN) О = ошибки не было bitO RX9D девятый бит принятых данных Это может быть бит четности или адреса/данных Регистр BAUDCON bit7 ABDOVF бит статуса захвата автоподбора скорости 1 = в режиме автоподбора скорости произошло переключение генератора-контроллера (следует сбросить программно) О = переключение генератора не происходило 284
Функции обмена данными семейства PtC18F2455/2550/4455/4550 bit6 RCIDL бит статуса функции приема 1 = прием в ожидании О = прием активен bit5 Не используется, читается, как «О» bit4 SCKP бит выбора полярности синхротакта Асинхронный режим Не используется Синхронный режим 1 = состояние ожидания (СК) в высоком уровне О = состояние ожидания (СК) в низком уровне bit3 BRG16 бит включения 16-разрядного регистра генератора 1 = генератор на 16-разрядном регистре SPBRGH+SPBRG О = 8-разрядный генератор на основе SPBRG (SPBRGH игнорируется) bit2 Не используется, читается, как «О» bitl WUE включение возможности пробуждения Асинхронный режим 1 = EUSART продолжает отслеживать вывод RX, прерывание генерируется по спаду, бит сбрасывается по следующему нарастанию О = вывод RX не отслеживается, или бит сброшен по нарастанию строба Синхронный режим Не используется bitO ABDEN включение автоподбора скорости Асинхронный режим 1 = включено измерение скорости в следующем символе. Требует приема синхрополя (55h); сбрасывается аппаратно при завер- шении приема О = измерение скорости отключено или завершено Синхронный режим Не используется Генератор тактовых импульсов (BRG) Генератор тактовых импульсов (BRG) представляет собой специализирован- ный 8/16-разрядный генератор, подерживающий синхронный и асинхронный ре- жимы EUSART. По умолчанию BRG работает в 8-разрядном режиме. Установка бита BRG16 (BAUDCON<3>) включает 16-разрядный режим. Регистровая пара SPBRGH:SPBRG определяет период автономного таймера. Кроме того, в асинхронном режиме биты BRGH (TXSTA<2>) и BRG16 (BAUDCON<3>) задают скорость. В синхронном режиме бит BRGH игнорируется. В табл. 2.11 приве- дены формулы для расчета скорости при разных режимах EUSART, которые приме- нимы только для режима ведущего (встроенный генератор тактов). Зная необходимую скорость и Fosc, можно рассчитать ближайшее целое зна- чение регистров SPBRGH:SPBRG, используя формулы из табл. 2.11. Далее мож- но определить величину ошибки задания скорости, как показано ниже в примере. 285
Гпава 2 Таблица 2.11 Формулы для расчета скорости передачи Биты настройки Режим BRG/EUSART Формула расчета ско- рости SYNC BRG16 BRGH 0 0 0 8-бит/асинхронный Fosc/[64(n +1)] 0 0 1 8-бит/асинхронный Fosc / [16(п +1)] 0 1 0 16-бит/асинхронный 0 1 1 16-бит/асинхронный Fosc/[4(n + 1)] 1 0 X 8-бит/синхронный 1 1 X 16-бит/синхронный Обозначения: х - не поддерживается, п - значение регистров SPBRGH1SPBRG Пример расчета величины ошибки скорости обмена Fosc = 16МГц, желаемая скорость 9600 бод, асинхронный режим, BRG 8-разрядный. Скорость = Fosc/(64 [SPBRGHSPBRG] + 1) Находим значение SPBRGH:SPBRG X = ((Fosc / Скорость) /64)-1 = ((16000000/9600)/64 - 1) = [25.042] = 25 Расчетная скорость обмена = 16000000/(64(25+1)) - 9615 бод Ошибка = (9615 - 9600)/9600 = 0.16% Таблица 2.12 Регистры, ассоциированные с генератором тактовых импульсов Регистр Bit 7 Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 BitO TXSTA CSRC ТХ9 TXEN SYNC SENDB BRGH TRMT TX9D RCSTA SPEN RX9 SREN CREN ADDEN FERR OERR RX9D BAUD- CON ABDOVF RCIDL - SCKP BRG16 - WUE ABDEN SPBRGH Старший байт регистра тактового генератора EUSART SPBRG Младший байт регистра тактового генератора EUSART Скорости обмена при асинхронном режиме приведены в табл. 2.13 (А) - 2.13(Г). Автоопределение скорости Модуль EUSART поддерживает автоматическое определение и калибровку скоро- сти обмена. Эта опция доступна только в асинхронном режиме, и пока бит WUE = 0. Измерительная последовательность начинается всякий раз, когда принят бит Start и установлен бит ABDEN (рис. 2.51). Подсчет является самоусредняющимся. В режиме автоопределения такты реверсированы: в отличие от ситуации, ко- гда генератор тактов BRG стробирует вывод RX, в данном режиме сигнал с RX поступает на BRG. При этом генератор BRG используется в качестве счетчика- таймера для измерения периода следования битов во входном сигнале. 286
Функции обмена данными семейства PIC18F2455/2550/4455/4550 Примечание: Для автоподстройки необходимо, чтобы модуль EUSART был в асинхронном режиме и WUE к О Рис. 2.51. Автоматическое вычисление скорости обмена Как только бит ABDEN установлен, внутренняя логика сбрасывает BRG и мщет бит Start. Для автоопределения необходимо принять байт, содержащий значение 55h. Для измерения используются длительности как высокого, так и низкого уров- ня, что позволяет минимизировать влияние несимметричности входного сигнала. После прохождения бита Start счетчик начинает отсчет вверх, с момента первого нарастания на RX, используя выбранный ранее источник тактов. После восьмого бита на выводе RX или после пятого нарастающего фронта в регистровой паре SPBRG:SPBRGH остается правильное значение периода BRG. Как только обна- ружен пятый фронт, который соответствует биту Stop, бит ABDEN автоматически сбрасывается. Если происходит перенос в BRG (при переполнении из FFFFh в OOOOh), это событие фиксируется битом ABDOVF (BAUDCON<7>). Он устанавливается аппа- ратно при переносе в BRG, но может быть также установлен и сброшен про- граммно. Режим автоопределения остается активным после события переноса и бит ABDEN остается установленным (рис. 2.52). Во время калибровки периода регистры BRG тактируются с частотой 1/8 от предустановленной тактовой частоты. Учтите, что тактирование BRG конфи- гурируется при помощи битов BRG16 и BRGH. Независимо от состояния BRG16, регистры SPBRGH и SPBRG будут использоваться, как 16-разрядный счетчик. Это позволяет пользователю убедиться, проверив наличие 00h в SPBRGH, что в 8-битном режиме не было переноса. В табл. 2.14 приведены от- ношения тактовых частот для BRG. Когда отрабатывается последовательность ABD, контроллер состояния EUSART находится в состоянии «Ожидание». Прерывание RCIF устанавливается при обнаружении пятого нарастающего фронта на выводе RX. Для сброса пре- рывания необходимо прочитать RCREG. Содержимое регистра RCREG следует проигнорировать. Внимание! Если бит WUE будет установлен вместе с битом ABDEN, автооп- ределение скорости произойдет по байту, следующему за символом Break. От пользователя зависит, будет ли скорость входящих символов находиться внутри диапазона выбранных частот тактирования BRG. 287
Таблица 2.13(A) 288 Скорости обмена при асинхронном режиме (SINC = О, BRGH = О, BRG16 = 0) Ско- рость, кБод Fosc = 40 000МГц Fosc = 20 000МГц Fosc = 10 000МГц Fosc = 8 000МГц Реаль- ная ско- рость % ошиб- ки Значе- ние SPBRG (деся- тич.) Реаль- ная ско- рость % ошиб- ки Значе- ние SPBRG (деся- тич.) Реаль- ная ско- рость % ошиб- ки Значе- ние SPBRG (деся- тич.) Ре- альная ско- рость % ошиб- ки Значе- ние SPBRG (деся- тич.) 0,3 - - — - - - - - - - - - 1,2 - - - 1,221 1,73 255 1,202 0,16 129 1201 -0,16 103 2,4 2,441 1,73 255 2,404 0,16 129 2,404 0,16 64 2403 -0,16 51 9,6 9,615 0,16 64 9,766 1,73 31 9,766 1,73 15 9615 -0,16 12 19,2 19,531 1,73 31 19,531 1,73 15 19,531 1,73 7 - - - 57,6 56,818 -1,36 10 62,500 8,51 5 52,083 -9,58 2 - - - 115,2 125,000 8,51 4 104,167 -9,58 2 78,125 -32,18 1 - - - Ско- рость, кБод Fosc = 4 000МГц Fosc = 2 000МГц Fosc = 1 000МГц Реальная скорость % ошибки Значение SPBRG (десятич.) Реальная скорость % ошибки Значение SPBRG (десятич.) Реальная скорость % ошибки Значение SPBRG (десятич.) 0,3 0,300 0,16 207 300 -0,16 103 300 -0,16 51 1,2 1,202 0,16 51 1201 -0,16 25 1201 -0,16 12 2,4 2,404 0,16 25 2,403 -0,16 12 - - - 9,6 8,929 -6,99 6 - - - - - - 19,2 20,833 8,51 2 - - - - - - 57,6 62,500 8,51 0 - - - - - - 115,2 62,500 -45,75 0 - - - - - - Глава 2
289 Скорости обмена при асинхронном режиме (SINC ~ О, BRGH= 1, BRG16 = 0) Ско- рость, кБод Fosc = 40 000МГц Fosc = 20 000МГц Fosc = 10 000МГц Fosc = 8 000МГц Реаль- ная ско- рость % ошиб- ки Значе- ние SPBRG (деся- ТИЧ.) Реаль- ная ско- рость % ошиб- ки Значе- ние SPBRG (деся- тич.) Реаль- ная ско- рость % ошиб- ки Значе- ние SPBRG (деся- тич.) Реаль- ная ско- рость % ошиб- ки Значе- ние SPBRG (деся- тич.) 0,3 - - - - - - - - - - - 1,2 - - - - - - - - - - - - 2,4 - - - - - - 2,441 1,73 255 2403 -0,16 207 9,6 9,766 1,73 255 9,615 0,16 129 9,615 0,16 64 9615 -0,16 51 19,2 19,231 0,16 129 19,231 0,16 64 19,531 1,73 31 19230 -0,16 25 57,6 58,140 0,94 42 56,818 -1,36 21 56,818 -1,36 10 55555 3,55 8 115,2 113,636 -1,36 21 113,636 -1,36 10 125,000 8,51 4 - - - Ско- рость, кБод Fosc = 4 000МГц Fosc = 2 000МГц Fosc = 1 000МГц Реальная скорость % ошибки Значение SPBRG (десятич.) Реальная скорость % ошибки Значение SPBRG (десятич.) Реальная скорость % ошибки Значение SPBRG (десятич.) 0,3 - - - - - - 300 -0,16 207 1,2 1,202 0,16 207 1201 -0,16 103 1201 -0,16 51 2,4 2,404 0,16 103 2403 -0,16 51 2403 -0,16 25 9,6 9,615 0,16 25 9615 -0,16 12 - - - 19,2 19,231 0,16 12 - - - - - 57,6 62,500 8,51 3 - - - - - - 115,2 125,000 8,51 1 - - - - - Функции обмена данным~ се^е^ства PIC18F2455/2550/4455/4550
290 Таблица 2.13(B) Скорости обмена при асинхронном режиме (SINC = 0, BRGH = 0, BRG16 = 1) Ско- рость, кБод Fosc = 40 000МГц Fqsc = 20 000МГц Fosc = 10 000МГц Fosc = 8 000МГц Реаль- ная ско- рость % ошиб- ки Значе- ние SPBRG (деся- тин.) Реаль- ная ско- рость % ошиб- ки Значе- ние SPBRG (деся- тич.) Реаль- ная ско- рость % ошиб- ки Значе- ние SPBRG (деся- тич.) Реаль ная ско- рость % ошиб- ки Значе- ние SPBRG (деся- тич.) 0,3 0,300 0,00 8332 0,300 0,02 4165 0,300 0,02 2082 300 -0,04 1665 1,2 1,200 0,02 2082 1,200 -0,03 1041 1,200 -0,03 520 1201 -0,16 415 2,4 2,402 0,06 1040 2,399 -0,03 520 2,404 0,16 259 2403 -0,16 207 9,6 9,615 0,16 259 9,615 0,16 129 9,615 0,16 64 9615 -0,16 51 19,2 19,231 0,16 129 19,231 0,16 64 19,531 1,73 31 19230 -0,16 25 57,6 58,140 0,94 42 56,818 -1,36 21 56,818 -1,36 10 55555 3,55 8 115,2 113,636 -1,36 21 113,636 -1,36 10 125,000 8,51 4 - - - Ско- рость, кБод Fosc = 4 000МГц Fqsc = 2 000МГц Fosc = 1 000МГ ц Реальная скорость % ошибки Значение SPBRG (десятич.) Реальная скорость % ошибки Значение SPBRG (десятич.) Реальная скорость % ошибки Значение SPBRG (десятич.) 0,3 0,300 0,04 832 300 -0,16 415 300 -0,16 207 1,2 1,202 0,16 207 1201 -0,16 103 1201 -0,16 51 2,4 2,404 0,16 103 2403 -0,16 51 2403 -0,16 25 9,6 9,615 0,16 25 9615 -0,16 12 - -0,16 - 19,2 19,231 0,16 12 - - - - - - 57,6 62,500 8,51 3 - - - - - - 115,2 125,000 8,51 1 - - - - - - Глава 2
Таблица 2.13(Г) Скорости обмена при асинхронном режиме (S1NC = О, BRGH -1, BRG16 = 1) Ско- рость, кБод Fosc = 40 000МГц Fpsc = 20 000МГц Fosc = Ю 000МГц Fosc = 8 000МГц Реаль- ная ско- рость % ошиб- ки Значе- ние SPBRG (деся- тич.) Реаль- ная ско- рость % ошиб- ки Значе- ние SPBRG (деся- тич.) Реаль- ная ско- рость % ошиб- ки Значе- ние SPBRG , (деся- ; ТИЧ.) Реаль- ная ско- рость % ошиб- ки Значе- ние SPBRG (деся- тич.) 0,3 0,300 0,00 33332 0,300 0,00 16665 0,300 0,00 8,332 300 -0,01 6665 1,2 1,200 0,00 8332 1,200 0,02 4165 1,200 0,02 2082 1200 -0,04 1665 2,4 2,400 0,02 4165 2,400 0,02 2082 2,402 0,06 1040 2400 -0,04 832 9,6 9,606 0,06 1040 9,596 -0,03 520 9,615 0,16 259 9615 -0,16 207 19,2 19,193 -0,03 520 19,231 0,16 259 19,231 0,16 129 19230 -0,16 103 57,6 57,803 0,35 172 57,471 -0,22 86 58,140 0,94 42 57142 0,79 34 115,2 114,943 -0,22 86 116,279 0,94 42 113,636 -1,36 21 117,647 -2,12 16 Ско- рость, кБод Fos с = 4 000МГц Fosc = 2 000МГц Fosc = 1 000МГц Реальная скорость % ошибки Значение SPBRG (десятич.) Реальная скорость % ошибки Значение SPBRG (десятич.) Реальная скорость % ошибки Значение SPBRG (десятич.) 0,3 0,300 0,01 3332 300 -0,04 1665 300 -0,04 832 1,2 1,200 0,04 832 1201 -0,16 415 1201 -0,16 207 2,4 2,404 0,16 415 2403 -0,16 207 2403 -0,16 103 9,6 9,615 0,16 103 9615 -0,16 51 9615 -0,16 25 j 19,2 19,231 0,16 51 19230 -0,16 25 19230 -0,16 12 57,6 58,824 2,12 16 55555 3,55 8 - - - | 115,2 111,111 -3,55 8 - - - - - - Функции обмена данными семейства PIC18F2455/2550/4455/4550
Гпава 2 т«™в*= Бит ABDEN --------------------------------------ъ------------------_ Вывод RX ( Start / Bi?0~^ Бит ABDOVF_______________________________________/•. ___I ~ FFFFb 3*- втс Г^хь-'Т[ oim.- '" ГТТТТТТТ^ТТ~П I Рис. 2.52. Последовательность сигналов при переполнении BRG Некоторые комбинации частоты тактового генератора и скорости EUSART не- возможны по причине ошибок приема битов. Если используется режим автооп- ределения, то общее тактирование системы и скорость обмена должны быть приведены во взаимное соответствие. Таблица 2.14 Отношения частоты тактирования счетчика BRG BRG16 BRGH Тактовая частота BRG 0 0 Fosc/512 0 1 Fosc/128 1 0 Fosc/128 1 1 Fosc/32 Так как отсчет BRG на время автоопределения инвертирован, передатчик EUSART не может быть использован в это время для передачи. Это означает, что всегда, когда установлен бит ABDEN, запись в регистр TXREG недоступна. Пользователь должен быть уверен, что бит ABDEN не будет установлен во вре- мя отработки последовательности передачи, иначе это может привести к не- предсказуемому поведению EUSART. Асинхронный режим EUSART Асинхронный режим включается сбросом бита SYNC (TXSTA<4>). В этом ре- жиме EUSART использует стандарт NRZ (Non Return to Zero, без возврата к ну- лю). Формат NRZ содержит один бит Start, восемь или девять битов данных, один бит Stop. Чаще используются восемь бит данных. Узел BRG может использо- ваться для получения стандартных скоростей передачи на основе системного тактового генератора. EUSART начинает прием и передачу с младшего значащего бита. Передатчик и приемник функционально независимы, но всегда используют одинаковый фор- мат данных и скорость обмена. Генератор BRG выдает тактовые импульсы, кратные 16-ти или 64 сдвигам в регистре, в зависимости от битов BRGH и BRG16. Бит четности не поддерживается аппаратно, но может быть реализован про- граммно и вложен в девятый бит данных. При работе в асинхронном режиме модуль EUSART использует следующие компоненты: 292
Функции обмена данными семейства PIC18F2455/2550/4455/4550 • Генератор BRG. • Схему выборки. . Асинхронный передатчик. . Асинхронный приемник; . Автопробуждение по приему синхросимвола. • Передача 12-битного символа Break. . Автоопределение скорости. Асинхронный передатчик Структурная схема передатчика EUSART изображена на рис. 2.53. Основу пере- датчика составляет последовательный сдвиговый регистр TSR. Этот регистр получа- ет данные из буферного регистра передатчика TXREG, доступного для чтения и за- писи. Данные в буферный регистр записываются программно. Регистр TSR не загру- жается до тех пор, пока не будет передан бит Stop предыдущей загрузки. После пе- редачи бита Stop в TSR перегружается новое значение из TXREG (если оно имеет- ся). Соответствующие диаграммы приведены на рис. 2.54, 2.55. Как только данные из TXREG перенесены в TSR (что занимает один команд- ный цикл), регистр TXREG очищается и устанавливается флаг TXIF (PIR1<4>). Это прерывание может быть разрешено или запрещено при помощи бита TXIE (PIE1 <4>). Флаг TXIF не может быть сброшен программно. Он также не сбрасывается немедленно после загрузки TXREG, но становится валидным в командном цикле, следующем за циклом загрузки. Поэтому опрос бита TXIF сразу после загрузки значения в TXREG вернет неправильное значение. Другой бит, TRMT (TXSTA<1), показывает состояние регистра TSR. Этот бит доступен только для чтения и установлен в 1, когда регистр TSR пуст. С битом TRMT не связана логика прерывания, поэтому для определения состояния реги- стра TSR пользователь должен самостоятельно опрашивать состояние бита. Регистр TSR не отображается на пространство памяти данных и недос- тупен для пользователя. Флаг-бит TXIF установлен, когда установлен раз- решающий бит TXEN. Для задания режима асинхронной передачи необходимо; 293
Гпава 2 Рис. 2.54. Асинхронная передача Инициализировать регистровую пару SPBRGH:SPBRG значением, задающим подходящую скорость. Установите или сбросьте биты BRGH и BRG16 в соответ- ствии с требуемой скоростью. Включите асинхронный последовательный порт, сбросив бит SYNC и установив бит SPEN. Если требуется наличие прерывания, установите разрешающий бит TXIE. Если требуется 9-битная передача, установите бит ТХ9. Этот бит может быть использован, как разряд адреса или данных. Разрешите передачу, установив бит TXEN, что приведет также к установке би- та TXIF. Если выбран 9-битный режим, девятый разряд должен быть загружен в TX9D. Загрузите данные в регистр TXREG (старт передачи). Если используются прерывания, убедитесь, что биты GIE и PEIE в регистре INTCON установлены. Перечень регистров приведен в табл. 2.15. Слово 1 передача из регистра сдвига Бит TRMT Примечание: на этой диаграмме показаны две последовательных передачи Рис. 2.55. Асинхронная передача (каскадная) передача из регистра сдвига Таблица 2.15 Регистры, ассоциированные с асинхронной передачей Регистр Bit 7 Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 BitO INTCON GIE/GIEH PEIE/GIEL TMROIE INTOIE RBIE TMROIF INTOIF RBIF PIR1 SPPIF(1) ADIF RCIF TXIF SSPIF CCP1IF TMR2IF TMR1IF 294
Функции обмена данными семейства PIC18F2455/2550/4455/4550 Регистр Bit 7 Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 BitO PIE1 SPPIE(1) ADIE RCIE TXIE SSPIE CCP1IE TMR2IE TMR1IE IPR1 SPPIP(1) ADIP RCIP TXIP SSPIP CCP1IP TMR2IP TMR1IP RCSTA SPEN RX9 - SREN CREN ADDEN FERR OERR RX9D TXREG Регистр передачи EUSART TXSTA CSRC TX9 TXEN SYNC SENDB BRGH TRMT TX9D BAUDCON ABDOVF RCIDL - SCKP BRG16 - WUE ABDEN SPBRGH Старший байт тактового генератора EUSART SPBRG Младший байт тактового генератора EUSART (1) Эти биты в 28-выводных микросхемах зарезервированы, всегда оставляйте их сброшенными. Асинхронный приемник Блок-схема приемника показана на рис. 2.56, регистры перечислены в табл. 2.16. Внешние данные поступают на вывод RX и следуют на блок восстановле- ния данных. Этот блок представляет собой устройство сдвига, функционирующее с частотой, равной 16-кратному значению скорости в бодах, тогда как главный приемный сдвиговый регистр использует частоту следования в битах или FOsc- Этот режим, как правило, используется в системах с протоколом RS-232. Для задания режима асинхронного приема необходимо: Инициализировать регистровую пару SPBRGH:SPBRG значением, задающим Рис. 2.56. Блок-схема приемника EUSART 295
Гпава 2 подходящую скорость. Установите или сбросьте биты BRGH и BRG16 в соответ- ствии с требуемой скоростью. Включить асинхронный последовательный порт, сбросив бит SYNC и устано- вив бит SPEN. Если требуется наличие прерывания, установить разрешающий бит RC(E. Если требуется 9-битный прием, установите бит RX9. Разрешить прием, установив бит CREN. При завершении приема будет установлен флаг-бит RCIF, и, если бит RCIE установлен, будет сгенерировано прерывание. Прочитайте регистр RCSTA для получения девятого бита (если он использу- ется). Прочитайте принятые 8-битные данные в регистре RCREG (см. рис. 2.57). Если обнаружена ошибка, очистите уведомление о ней путем очистки бита CREN. Если вы используете прерывание, убедитесь, что биты GIE и PEIE ((NTCON<7:6>) установлены. Ус/ланоеление 9-битного режима с определением адреса Этот режим обычно используется в системах с протоколом RS-232. Для на- стройки режима необходимо проделать следующее: Инициализировать регистровую пару SPBRGH:SPBRG значением, задающим подходящую скорость. Установите или сбросьте биты BRGH и BRG16 в соответ- ствии с требуемой скоростью. Включить асинхронный последовательный порт, сбросив бит SYNC и устано- вив бит SPEN. Если требуется наличие прерывания, установить бит RCEN и выбрать нужный уровень приоритета при помощи бита RCIP. Установить бит RX9 для 9-битного приема. Установить бит ADDEN для включения обнаружения адреса. Разрешить прием, установив бит CREN. При завершении приема будет установлен бит RCIF. Запрос прерывания бу- дет сгенерирован, если установлены биты RCIE и GIE. Прочитайте регистр RCSTA для определения ошибки во время приема. RX (вывод) —\ S*a,rt \ bltX bitO/bitl) (~VP/bit7/8 / Stop bit <bit7/e/ Stop \ bit X ybit 7/8/ ' Stop bit Rev рег.рдвига _CC cc П cc Rev буфер этг J J 4 J J 11 Слово 1 Слово 2 T Чтение регистра cc, RCREG ( RCREG I CC, П П RCREG ..... TT F RCIF cc cc / (флаг прерывания} Sb )) J J '—-—- OERR cc CC cc i j j j j J J CREN -SS— CC SS — Примечание: эта диаграмма отображает поступление трех слов на вывод RX Буфер приема RCREG прочитан после того, как третье слово установило бит OERR (переполнение). Рис. 2.57. Асинхронный прием 296
Функции обмена данными семейства PIC18F2455/2550/4455/4550 Прочитайте RCREG для определения, было ли адресовано устройство. Если произошла какая-либо ошибка, сбросьте бит CREN. Если устройство было адресовано, сбросьте бит ADDEN для получения дос- тупа к данным в буфере приема и прерывания вычислительного ядра. Таблица 2.16 Регистры, ассоциированные с асинхронным приемом Регистр Bit 7 Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 BitO INTCON GIE/GIEH PEIE/GIEL TMROIE INTOIE RBIE TMROIF INTOIF RBIF PIR1 SPPIF(1) ADIF RCIF TXIF SSPIF CCP1IF TMR2IF TMR1IF PIE1 SPPIE(1} ADIE RCIE TXIE SSPIE CCP1IE TMR2IE TMR1IE IPR1 Spp|p(1> ADIP RCIP TXIP SSPIP CCP1IP TMR2IP TMR1IP RCSTA SPEN RX9 SREN CREN ADDEN FERR OERR RX9D RCREG Регистр приема EUSART TXSTA CSRC TX9 TXEN SYNC SENDB BRGH TRMT TX9D BAUD- CON ABDOVF RCIDL - SCKP BRG 16 - WUE ABDEN SPBRGH Старший байт тактового генератора EUSART SPBRG Младший байт тактового генератора EUSART (1) Эти биты в 28-выводных микросхемах зарезервированы, всегда оставляйте их сброшенными. Автопробуждение по сигналу линии RX/DT В режиме Sleep тактирование модуля EUSART прекращается. Поэтому такто- вый модуль неактивен и корректный прием байта невозможен. Опция автопробу- ждения позволяет контроллеру при работе в асинхронном режиме пробуждаться от активности на линии RX/DT. Автопробуждение включается установкой бита WUE (BAUDCON<1>). После установки этого бита обычный прием последовательности по линии RX/DT от- ключается, и модуль EUSART остается в режиме ожидания пробуждающего события независимо от режима ядра контроллера. Пробуждающее событие состоит в переходе с высокого уровня на низкий на линии RX/DT. Это сочета- ние совпадает с сигналом синхронного останова или пробуждающим сигналом протокола LIN. Вслед за пробуждением модуль генерирует прерывание RCIF. Прерывание генерируется синхронно с тактами Q в нормальном режиме (рис.2.58) или асин- хронно, если устройство находится в режиме Sleep (рис.2.59). Состояние преры- вания сбрасывается чтением регистра RCREG. Бит WUE автоматически сбрасывается при обнаружении перехода от низко- го уровня к высокому на линии RX вслед за событием пробуждения. С этого момента модуль EUSART находится в режиме ожидания и возвращается к обычной работе. 297
Гпава 2 0SC1 WUE RX/DT RCIF 0l|Ci2|Q3|G<0l|Q2|Q3|Q4;Ol|a2|a3|Q4'Ol|O2|Q3|O4;Ql|Q2|Q3|Q4:0l|Ci2|O3|Q4;l O1|O2|Q3!q4,G1|Q2]O3]O4iQi|Q2|Q3|Q4'( ;Oi!Ci2|Q3|Q4; Установлен Сброшен во время чтения RCREG —, Примечание EUSART остается в режиме ожидания, пока бит WUE = 1 Рис. 2.58. Диаграмма состояния бита WUE в обычном режиме Особые замечания по использованию режима автопробуждения Поскольку при автопробуждении модуль чувствителен к нарастающему фрон- ту на линии RX/DT, любое изменение состояния до бита Stop может быть вос- принято, как ложный конец символа и привести к ошибке данных или кадрирова- ния. Для правильной работы первый символ передачи должен содержать только «О». Это может быть 00h для устройств с протоколом RS-232 или OOOh для устройств с шиной LIN. Кроме того, необходимо учитывать время разгона кварцевого генератора, особенно в устройствах, использующих резонаторы с большим временем уста- новления (режимы XT или HS). Пробуждающая последовательность должна иметь достаточную длину и сопровождаться достаточным интервалом, чтобы хватило времени для разгона генератора и инициализации EUSART. Особые замечания по использованию бита WUE Тактирование событий WUE и RCIF может привести к некоторым недоразуме- ниям, если они используются для проверки валидности принятых данных. Как было отмечено, установка бита WUE переводит EUSART в режим ожидания. Со- бытие пробуждения порождает прерывание по приему путем установки бита RCIF. После этого бит WUE сбрасывается по обнаружению нарастающего фрон- та на RX/DT. Затем состояние прерывания сбрасывается чтением регистра RCREG. Обычно данные в RCREG являются «пустыми» и должны быть проигно- рированы. Тот факт, что бит WUE был сброшен (или остался установленным) и что флаг RCIF установлен, не должен использоваться в качестве показателя целостности данных в RCREG. Пользователю следует применять параллельный метод для проверки целостности принятых данных. OSC1 WUE RX/DT RCIF ;ai|Q2|a3|O4;Ql|Q2|Q3iQ4;Ql|Q2jQ3|Q4; Установлен пользователем ч Выполнена команда SLEEP |G2|Q3|Q4’,Ql|Q2|Q3]Q4;0l|O2lQ3|Q4;Ql|Q2[G3|Q4;Gl|Q2|Q3|Q4; Примечание 1 если событие пробуждения требует длительного разгона генератора, может произойти автосброс WUE. пока сигнал stposc остается активным Эта последовательность не зависит от наличия тактов Q/ Примечание 2. EUSART остается е режиме ожидания пока бит WUE = 1. Рис. 2.59. Диаграмма состояния бита WUE в режиме Sleep 298
Функции обмена данными семейства PIC18F2455/2550/4455/4550 Рис. 2.60. Диаграмма последовательности Break Для уверенности, что актуальные данные не утеряны, можно проверить бит RCIDL и удостовериться, что устройство не находится в процессе приема. Если прием данных не осуществлялся, бит WUE может быть установлен непосредст- венно перед переходом в режим Sleep. Последовательность Break Расширенный модуль EUSART способен передавать специальную последова- тельность Break, необходимую для нормальной работы по стандарту шины LIN. Последовательность Break состоит из бита Start, следующих за ним двенадцати битов «О» и завершающего бита Stop. Символ прерывания фрейма передается всякий раз, когда биты SENDB и TXEN (TXSTA<3> и TXSTA<5>) установлены, пока сдвиговый регистр передачи загружен данными. Помните, что значение данных, записанное в TXREG, игнорируется, и будут переданы только нулевые биты. Бит SENDB автоматически сбрасывается аппаратно после того, как передан соответствующий бит Stop. Это позволяет пользователю загружать стек переда- чи FIFO следующим значением, для передачи после символа Break. Обычно это символ Sync в спецификации LIN. Данные, записанные в TXREG для передачи в составе последовательности Break, будут проигнорированы. Запись в этот регистр используется только с це- лью инициализации правильной последовательности. Бит TRMT индицирует, что функция передачи активна или в состоянии ожида- ния, как это делается и при обычной передаче. На рис. 2.60 показана диаграмма последовательности Break. Последовательность передачи символов Break и Sync Приведенная далее последовательность реализует передачу заголовка кадра сообщения, образуемого символом Break и следующего за ним синхробайта авто- определения скорости. Эта последовательность типична для ведущего шины LIN. Конфигурируем EUSART в нужный режим. Устанавливаем биты TXEN и SENDB для задания символа Break. Загружаем в TXREG произвольные «ложные» данные для инициализации пе- редачи (данные игнорируются). 299
Глава 2 Записываем «55» в TXREG для загрузки символа Sync в буфер передачи. После того, как последовательность Break передана, бит SENDB сбрасывает- ся аппаратно. Символ Sync передается в ранее установленном режиме. После того, как TXREG опустел, что индицируется флагом TXIF, в него можно записать следующие данные. Прием символа Break Расширенный модуль EUSART может принимать символ Break двумя спосо- бами. Первый метод устанавливает скорость обмена 9/13 от типовой скорости. Это позволяет биту Stop оказаться в правильном положении при очередной вы- борке уровня (13 бит для Break против бита Start плюс восемь битов данных). Второй метод использует опцию автопробуждения, описанную в гл. 1. При включении этой опции EUSART производит выборку двух уровней на линии RX/DT, следующих после прерывания RCIF, и принимает байт данных, посту- пающий по следующему прерыванию. Имейте в виду, что в соответствии с логикой формирования символа Break, пользователь обычно должен включить опцию автоопределения скорости. Для обоих методов пользователь может установить бит ABD один раз при обнаруже- нии прерывания TXIF. Синхронный режим (ведущий) Режим синхронного ведущего задается установкой бита CSRC (TXSTA<7>). В этом режиме данные передаются полудуплексом (т.е. передача и прием не могут происходить одновременно). Синхронный режим включается установкой бита SYNC (TXSTA<4>). Кроме того, разрешающий бит SPEN (RCSTA<7>) также уста- навливается для конфигурирования выводов ТХ и RX как СК (такты) и DT (дан- ные) соответственно. Режим мастера означает, что процессор передает ведущие тактовые импуль- сы по линии СК. Полярность импульсов выбирается при помощи бита SCKP (BAUDCON<4>). Если этот бит установлен, линия СК в ожидании удерживает вы- сокий уровень, если сброшен - низкий. Эта опция позволяет поддерживать об- мен по стандарту Microwire. Передача в режиме синхронного ведущего Вновь обратимся к рис. 2.53, затем к рис. 2.61 и 2.62 Регистр TXREG загружа- ется программно. Регистр TSR не может быть загружен данными из TXREG до тех пор, пока не передан последний бит из предыдущей загрузки. Как только данные из регистра TXREG поступили в TSR (в течение одного такта Tcycle). он очищается и устанавливается флаг TXIF (PIR1 <4>). Прерывание может быть разрешено или запрещено при помощи бита TXIE (Р1Е1<4>). Флаг TXIF устанавливается независимо от состояния маскирующего бита TXIE и не может быть сброшен программно. Он сбрасывается только аппаратно, когда новые данные загружаются в регистр TXREG. Так же, как флаг TXIF показывает текущий статус регистра TXREG, другой флаг, TRMT (TXSTA<1>) показывает статус регистра TSR. Флаг TRMT также дос- тупен только для чтения и устанавливается, когда регистр TSR пуст. К этому флагу не привязано прерывание, поэтому пользователь должен опрашивать его 300
Функции обмена данными семейства PIC18F2455/2550/4455/4550 Qljo2ja3)04‘OljQ2)cj3|c>4!Ql)Q2]o3]a4'0l|02|D3|c>4<QljQ2|o3|04| |оз|О4 Ql|Q2|Q3]Q4!ci|a2|o3ploi|o2|33|a4.Ol|Q2|03[Q4|Ql|Q2|Q3|Q4lQljo2]o3|O4| Примечание: режим синхронного ведущего (SPBRG = 0). непрерывная передача двух 8-битных слов Рис. 2.61. Синхронная передача состояние самостоятельно. Регистр TSR не проецируется на память данных и поэтому недоступен для пользователя. Для настройки передачи в режиме синхронного ведущего необходимо: Инициализировать регистры SPBRGH’.SPBRG для задания нужной скорости. Также следует установить или сбросить бит BRG16 в соответствии с нужной ско- ростью. Разрешить работу в режиме синхронного ведущего, установив биты SYNC, SPEN и CSRC. Если требуется прерывание, установить бит TXIE. Если требуется 9-битная передача, установить бит ТХ9. Разрешить передачу установкой бита TXEN. Если разрешена 9-битная передача, девятый бит должен быть загружен в TX9D. Начать передачу загрузкой данных в регистр TXREG. Если используется прерывание, необходимо убедиться, что биты GIE и PEIE (INTCON<7:6>) установлены. Вывод RC7/RX/DT/SDO ")(" bitO bit 1 X bit 6 X bit 7 Рис. 2.62. Синхронная передача (с применением TXEN) 301
Гпаев 2 Таблица 2.17 Регистры, ассоциированные с синхронной передачей в режиме ведущего Регистр Bit 7 Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 BitO INTCON GIE/GIEH PEIE/GIEL TMROIE INTOIE RBIE TMROIF INTOIF RBIF PIR1 SPPIF(1) ADIF RCIF TXIF SSPIF CCP1IF TMR2IF TMR1IF PIE1 SPPIE(1) ADIE RCIE TXIE SSPIE CCP1IE TMR2IE TMR1IE IPR1 Sppip(’) ADIP RCIP TXIP SSPIP CCP1IP TMR2IP TMR1IP RCSTA SPEN RX9 SREN CREN ADDEN FERR OERR RX9D TXREG Регистр передачи EUSART TXSTA CSRC TX9 TXEN SYNC SENDS BRGH TRMT TX9D BAUDCON ABDOVF RCIDL - SCKP BRG16 - WUE ABDEN SPBRGH Старший байт тактового генератора EUSART SPBRG Младший байт тактового генератора EUSART (,) Эти биты в 28-выводных микросхемах зарезервированы, всегда оставляйте их сброшенными. Прием в режиме синхронного ведущего Как только выбран синхронный режим, прием включается одним из двух би- тов: разрешение одиночного приема SREN (RCSTA<5>) или разрешением не- прерывного приема CREN (RCSTA<4>). Данные захватываются на выводе RX по спаду тактового импульса (рис. 2.63). Если установлен бит SREN, принимается только одно слово. Если установлен бит CREN, то прием продолжается, пока бит не будет сброшен. Если установле- ны оба бита, то CREN имеет приоритет. Для настройки приема в режиме синхронного ведущего необходимо: 1. Инициализировать регистры SPBRGH:SPBRG для задания нужной скоро- сти. Также следует установить или сбросить бит BRG16 в соответствии с нужной скоростью. 2. Разрешить работу в режиме синхронного ведущего, установив биты SYNC, SPEN и CSRC. 3. Убедиться, что биты SREN и CREN сброшены. 4. Если требуется прерывание, установить бит RCIE. 5. Если требуется 9-разрядный прием, установить бит RX9. 6. Для одиночного приема установить бит SREN. Для последовательного приема установить бит CREN. 7. Флаг прерывания будет установлен после завершения приема. Если пре- рывание разрешено битом RCEI, то в этот момент оно будет сгенерировано. 8. Прочитать регистр RCSTA для получения 9-го бита (если он включен) и про- верить, не произошла ли ошибка при приеме. 9. Прочитать 8-битные данные из регистра RCREG. 10. Если произошла ошибка, сбросить бит CREN для очистки сообщения об ошибке. 302
Функции обмена данными семейства PIC18F2455/2550/4455/4550 a2ja3(a4|Ql[02|03jQ^0f|02jQ3[a4[Qlj02j03|Q4j0l[02|Q3|Q4|Ql|Q2|03[04|Ql|a2(03j04|0l|02j03[04|Ql|Q2[Q3|04|0lj02[Q3|Q4[0l|Q2|a3|Q4| Примечание: Показана диаграмма режима синхронного ведущего при SREN = 1 и BRGH = О Рис. 2.63. Синхронный прием (ведущий, SREN) 11. Если используются прерывания, убедитесь, что биты GIE и PEIE регистра INTCON установлены. Синхронный режим (ведомый) Модуль переводится в режим синхронного ведомого сбросом бита CSRC (TXSTA<7>). Этот режим отличается от приема в режиме ведущего тем, что сдвигающие импульсы поступают извне, на вывод СК, а не вырабатываются внутри. Это позволяет устройству передавать или принимать данные в любом режиме пониженного энергопотребления. Передача е режиме синхронного ведомого Работа в режиме синхронного ведущего и синхронного ведомого идентична, за исключением случая нахождения устройства в режиме Sleep. Если в регистр TXREG записаны два слова и затем исполнена команда SLEEP, то произойдет следующее: а) Первое слово переносится в регистр TSR и немедленно передается. б) Второе слово остается в регистре TXREG. в) Флаг-бит TXIF не устанавливается. г) Когда первое слово полностью передано вовне путем сдвига TSR, в регистр TSR передается второе слово. Теперь флаг-бит TXIF будет установлен. д) Если разрешающий бит TXIE установлен, то устройство выйдет из режима Sleep. Если глобально прерывания разрешены, то программа перейдет на вектор прерывания. Для настройки синхронной передачи в режиме ведомого необходимо: 1. Включить последовательный порт, установив биты SYNC и SPEN, и сбросив бит CSRC. 2. Сбросить биты CREN и SREN. 3. Если требуются прерывания, установить бит TXIE. 4. Если требуется 9-битная передача, установить бит ТХ9. 5. Разрешить передачу, установив бит TXEN. 303
Гпава 2 6. Если требуется 9-разрядная передача, загрузить 9-й бит в регистр TX9D. 7. Начать передачу, загрузив данные в регистр TXREG. 8. Если используются прерывания, убедитесь, что биты GIE и PEIE в регистре INTCON установлены. Перечень регистров указан в табл. 2.19. Прием в режиме синхронного ведомого Работа в режиме синхронного ведущего и синхронного ведомого идентична, за исключением случая нахождения устройства в режиме Sleep или Idle. Кроме того, бит SREN игнорируется в режиме ведомого. Таблица 2.19 Регистры ассоциированные с передачей в режиме синхронного ведомого Регистр Bit 7 Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 BitO INTCON GIE/GIEH PEIE/GIEL TMROIE INTOIE RBIE TMROIF INTOIF RBIF PIR1 SPPIF(1) ADIF RCIF TXIF SSPIF CCP1IF TMR2IF TMR1IF PIE1 SPPIE(1) ADIE RCIE TXIE SSPIE CCP1IE TMR2IE TMR1IE IPR1 Spp|p(1> ADIP RCIP TXIP SSPIP CCP1IP TMR2IP TMR1IP RCSTA SPEN RX9 SREN CREN ADDEN FERR OERR RX9D TXREG Регистр передачи EUSART TXSTA CSRC TX9 TXEN SYNC SENDB BRGH TRMT TX9D BAUDCON ABDOVF RCIDL - SCKP BRG16 - WUE ABDEN SPBRGH Старший байт тактового генератора EUSART SPBRG Младший байт тактового генератора EUSART <1) Эти биты в 28-выводных микросхемах зарезервированы, всегда оставляйте их сброшенными. Если прием разрешен установкой бита CREN до перехода в режим Idle или Sleep, то слово может быть принято в этих энергосберегающих режимах. Как только слово принято, регистр RSR передает данные в регистр RCREG. Если разрешающий бит RCIE установлен, генерируется прерывание, пробуждающее устройство из энергосберегающего режима. Если установлено глобальное раз- решение прерываний, программа переходит на вектор прерывания. Для настройки приема в режиме синхронного ведомого необходимо: 1. Включить последовательный порт, установив биты SYNC и SPEN, и сбросив бит CSRC. 2. Если требуется прерывание, установить разрешающий бит RCIE. 3. Если требуется 9-битный прием, установить бит RX9. 4. Для включения приема установить бит CREN. 5. После окончания приема будет установлен флаг-бит RCIF. Если установлен разрешающий бит RCIE, будет сгенерировано прерывание. 6. Прочитать регистр RCSTA для получения девятого бита (если требуется) и определить, произошла ли ошибка при приеме. 7. Прочитать 8-битные принятые данные из регистра RCREG. 8. Если произошла ошибка, сбросить уведомление очисткой бита CREN. 304
Функции обмена данными семейства PIC18F2455/2550/4455/4550 9. Если используются прерывания, убедитесь, что биты GIE и PEIE в регистре INTCON установлены. Перечень регистров приведен в табл. 2.20. Таблица 2.20 Регистры ассоциированные с приемом в режиме синхронного ведомого Регистр Bit? Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 BitO INTCON GIE/GIEH PEIE/GIEL TMROIE INTOIE RBIE TMROIF INTOIF RBIF PIR1 SPPIF(1) ADIF RCIF TXIF SSPIF CCP1IF TMR2IF TMR1IF PIE1 SPPIE(,) ADIE RCIE TXIE SSPIE CCP1IE TMR2IE TMR1IE IPR1 Spp|p<1) ADIP RCIP TXIP SSPIP CCP1IP TMR2IP TMR1IP RCSTA SPEN RX9 SREN CREN ADDEN FERR OERR RX9D RCREG Регистр приема EUSART TXSTA CSRC TX9 TXEN SYNC SENDB BRGH TRMT TX9D BAUDCON ABDOVF RCIDL - SCKP BRG16 - WUE ABDEN SPBRGH Старший байт тактового генератора EUSART SPBRG Младший байт тактового генератора EUSART Эти биты в 28-выводных микросхемах зарезервированы, всегда оставляйте их сброшенными. 305
Глава 3. Набор команд Микроконтроллеры PIC18F2455/2550/4455/4550 поддерживают как стандарт- ный набор из 75 команд ядра PIC18, так и дополнительный набор из восьми но- вых команд, для оптимизации кода, являющегося рекурсивным или использую- щего программный стек. Дополнительные команды будут рассмотрены в этой главе после стандартного набора. Стандартный набор команд Стандартный набор команд ядра PIC18 содержит ряд дополнений к предыду- щим наборам команд PICmicro, однако сохраняет возможность несложного пере- хода с этих предыдущих наборов. Большинство команд занимает одиночное 16-битное слово в памяти программ (односложные команды), но четыре команды требуют по два слова в памяти программ (двусложные команды). Каждая односложная команда делится на код операции, определяющий тип команды и один или более операндов, которые дополняют описание операции. Набор команд делится на четыре базовых категории: 1. Операции над байтами. 2. Операции над битами. 3. Операции с константами. 4. Управляющие операции. В табл. 3.1 перечислены команды всех типов. Большинство операций над байтами включают в себя три операнда: . Регистр - источник данных (обозначается 7’). . Приемник результата (обозначается'd'). . Адресуемая память (обозначается 'а'). Указатель на регистр-источник данных 7' показывает, какой регистр будет ис- пользован в команде, как источник данных. Источником может быть регистр об- щего назначения (ячейка памяти данных), специальный регистр или защелка порта ввода-вывода. Указатель на приемник результата'd1 определяет, куда бу- дет помещен результат операции. Если d = 0, результат помещается в регистр- аккумулятор WREG. Если d = 1, результат помещается в исходный регистр. Все операции над битами также имеют три операнда: • Регистр, подвергаемый воздействию (обозначается 7‘). • Номер бита в ячейке данных (обозначается ‘Ь'). • Адресуемая память (обозначается 'а'). Указатель 7' показывает на то, над каким регистром будет производиться опе- рация. Номер бита указывает на то, над каким разрядом регистра-источника бу- дет производиться операция. Нумерация начинается с «О». Результат всегда со- храняется только в исходном регистре. Операции с константами могут использовать некоторые операнды: • Значение константы для загрузки в регистр (обозначается 'к'). . Регистр-приемник для загрузки значения (обозначается '!'). 306
Набор команд • Операнд не требуется (обозначается Управляющие команды могут использовать некоторые операнды: • Адрес памяти программ (обозначается 'л') • Режим команд CALL или RETURN (обозначается 's') • Режим команд табличного чтения или табличной записи (обозначается 'т') • Операнд не требуется (обозначается Упомянутые выше четыре двусложные команды содержат необходимую ин- формацию в 32 разрядах. Четыре старших разряда второго слова всегда содер- жат комбинацию «1111». Если, вследствие какой-либо ошибки, второе слово ис- полняется как самостоятельная команда, то это будет «пустая» команда NOP. Двусложная команда выполняется за два командных цикла. Один командный цикл состоит из четырех периодов тактового генератора. Та- ким образом, при частоте тактового генератора 4 МГц время исполнения одной простой команды составляет 1 мкс. Если выполняется проверка условия и ре- зультат истинный, или счетчик программы меняется в результате исполнения команды, то команда выполняется за 2 мкс. Двусложная команда с переходом выполняется за 3 мкс. П еречень, приведенный в табл. 3.1, представляет собой список стандартных команд, распознаваемых ассемблером Microchip MPASM™. Таблица 3.1 Обозначения полей в описании команд Поле Описание а Бит доступа к RAM а = 0: Указатель адреса RAM в «Access RAM» (регистр BSR игнорируется) а = 1: Адрес RAM определен в регистре BSR bbb Номер бита внутри 8-разрядного регистра (от 0 до 7) BSR Регистр выбора банка. Применяется для выбора текущего банка ОЗУ С, DC, Z, ОУ, N Биты статуса ЦПУ: Перенос, Перенос десятичн., Ноль, Переполнение, Отрицательный d Бит выбора приемника результата d - 0: результат сохраняется в WREG d = 1: результат сохраняется в исходный регистр f dest Источник: либо WREG, либо другой доступный регистр f 8-разрядный адрес регистра (от 00h до FFh) или 2-битный указатель FSR (от Oh до 3h) fs 12-битный адрес ячейки (000h to FFFh). Это адрес источника fd 12-битный адрес ячейки (000h to FFFh). Это адрес приемника GIE Бит глобального разрешения прерываний k Литерал, константа или метка (8 бит, 12 бит или 20 бит) label Имя метки mm *+ Режим регистра TBLPTR для команд табличного чтения и записи. Используется только в командах табличного чтения и записи: Регистр не меняется Постинкремент регистра Постдекремент регистра Прединкремент регистра 307
Гпава 3 Поле Описание п Относительный адрес (двоичное дополнение) для команд относительно- го перехода или прямой адрес для команд Call/Branch и Return PC Программный счетчик PCL Младший байт программного счетчика PCH Старший байт программного счетчика PCLATH Защелка старшего байта программного счетчика PCLATU Защелка высшего байта программного счетчика PD Бит отключения Power-Down PRODH Старший байт результата умножения PRODL Младший байт результата умножения s Бит выбора режима быстрого Call/Return s = 0: не использовать фоновые регистры s = 1: некоторые регистры загружаются в/из фоновые регистры (быстрый режим) TBLPTR 21-битный табличный указатель (указывает на адрес в памяти программ) TABLAT 8-битная табличная защелка TO Бит тайм-аута. TOS Вершина стека u Не используется или не меняется WDT Сторожевой таймер WREG Рабочий регистр (аккумулятор) X Не поддерживается ('О' или '1'). Ассемблер сгенерирует код, где х = 0. Это рекомендованная форма для использования с программными инст- рументами Microchip zs 7-битное значение для косвенной адресации ячеек (источник) Zd 7-битное значение для косвенной адресации ячеек (приемник) (} Опциональный аргумент, может отсутствовать [text] Показывает индексированный адрес (text) Текстовое содержимое [expr] <n> Определяет бит п регистра, отмеченного указателем [ехрг] Передача значения < > Битовое поле регистра Символ математического включения italics Условие, определяемое пользователем 308
Набор команд Таблица 3.2 Набор команд PIC18XXXX Мнемоника и операнды Описание Циклы 16-битное слово команды Влияние на биты статуса Байтовые операции ADDWF f, d, а Сложить WREG и f 1 0010 01 da ffff ffff С, DC, Z, OV, N ADDWFC f, d, a Сложить WREG и f c учетом бита пере- носа 1 0010 00da ffff ffff C, DC, Z, OV, N ANDWF f, d, a Логическое И между WREG и f 1 0001 01 da ffff ffff Z,N CLRF f, a Обнуление f 1 0110 101a ffff ffff Z COMF f, d, a Дополнение f 1 0001 11 da ffff ffff Z, N CPFSEQ f, a Сравнение f с WREG, переход по = 1 (2 или 3) 0110 001 a ffff ffff Нет CPFSGT f, a Сравнение f с WREG, переход по > 1 (2 или 3) 0110 010a ffff ffff Нет CPFSLT f, a Сравнение f с WREG, переход по < 1 (2 или 3) 0110 000a ffff ffff Нет DECF f, d, a Декремент f 1 0000 01 da ffff ffff C, DC, Z, OV, N DECFSZ f, d, a Декремент f, пере- ход если 0 1 (2 или 3) 0010 11 da ffff ffff Нет DCFSNZ f, d, a Декремент f, пере- ход если не 0 1 (2 или 3) 0100 11 da ffff ffff Нет INCF f, d, a Инкремент f 1 0010 10da ffff ffff C, DC, Z, OV, N INCFSZf, d, a Инкремент f, пере- ход если 0 1 (2 или 3) 0011 11 da ffff ffff Нет INFSNZf, d, a Инкремент f, пере- ход если не 0 1 (2 или 3) 0100 10da ffff ffff Нет IORWF f, d, a Логическое ИЛИ между WREG и f 1 0001 OOda ffff ffff Z, N MOVF f, d, a Перенос f 1 0101 OOda ffff ffff Z, N MOVFF fs, fd Перенос fs (источ- ник) в 1м слове fd (приемник) во 2м слове 2 1100 ffff ffff ffff 1111 ffff ffff ffff Нет MOVWF f, a Перенос WREG в f 1 0110 111a ffff ffff Нет MULWF f, a Перемножение WREG с f 1 0000 001 a ffff ffff Нет NEGFf, a Инверсия f 1 0110 110a ffff ffff C, DC, Z, OV, N 309
Гпава 3 Мнемоника и операнды Описание Циклы 16-битное слово команды Влияние на биты статуса RLCF f, d, а Сдвиг f влево через перенос 1 0011 01 da ffff ffff С, Z, N RLNCF f, d, а Сдвиг f влево без переноса 1 0100 01 da ffff ffff Z, N RRCF f, d, a Сдвиг f вправо че- рез перенос 1 0011 OOda ffff ffff С, Z, N RRNCF f, d, a Сдвиг f вправо без переноса 1 0100 OOda ffff ffff Z, N SETF f, a Установить все биты f в 1 1 0110 100a ffff ffff Нет SUBFWB f, d, a Вычитание f из WREG с заёмом 1 0101 01 da ffff ffff С, DC, Z, OV, N SUBWF f, d, a Вычитание WREG из f 1 0101 11 da ffff ffff С, DC, Z, OV, N SUBWFB f, d, a Вычитание WREG из f с заёмом 1 0101 lOda ffff ffff С, DC, Z, OV, N SWAPF f, d, a Взаимозамена по- лубайтов в f 1 0011 lOda ffff ffff Нет TSTFSZ f, a Проверка f, переход, если 0 1 (2 или 3) 0110 011a ffff ffff Нет XORWF f, d, a Исключающее ИЛИ между WREG и f 1 0001 10da ffff ffff Z, N Битовые оперции BCF f, b, a Сброс бита в реги- стре f 1 1001 bbba ffff ffff Нет BSF f, b, a Установка бита в регистре f 1 1000 bbba ffff ffff Нет BTFSC f, b, a Проверка бита, пе- реход если 0 1 (2 или 3) 1011 bbba ffff ffff Нет BTFSS f, b, a Проверка бита, пе- реход если 1 1 (2 или 3) 1010 bbba ffff ffff Нет BTG f, d, a Переключение бита (инверсия) 1 0111 bbba ffff ffff Нет Управляющие операции ВС п Перейти, если пере- нос 1(2) 1110 0010 nnnn nnnn Нет BN n Перейти, если отри- цательное число 1(2) 1110 0110 nnnn nnnn Нет BNC n Перейти, если нет переноса 1(2) 1110 0011 nnnn nnnn Нет BNN n Перейти, если не отрицательное 1(2) 1110 0111 nnnn nnnn Нет 310
Набор команд Мнемоника и операнды Описание Циклы 16-битное слово команды Влияние на биты статуса BNOVn Перейти, если нет переполнения 1(2) 1110 0101 пппп пппп Нет BNZ п Перейти, если не ноль 1(2) 1110 0001 пппп пппп Нет BOV п Перейти, если есть переполнение 1(2) 1110 0100 пппп пппп Нет BRA п Перейти безусловно 2 1101 Оппп пппп пппп Нет BZ п Перейти, если ноль 1(2) 1110 0000 пппп пппп Нет CALL n, s Вызов подпрограм- мы 1-е слово 2 1110 110s kkkk kkkk Нет 2-е слово 1111 kkkk kkkk kkkk CLRWDT - Сброс сторожевого таймера 1 0000 0000 0000 0100 ТО, PD DAW - Десятичное вырав- нивание WREG 1 0000 0000 0000 0111 С GOTOn Переход на адрес п 1-е слово 2 1110 1111 kkkk kkkk Нет 2-е слово 1111 kkkk kkkk kkkk NOP - Пустая операция 1 0000 0000 0000 0000 Нет NOP - Пустая операция 1 1111 xxxx xxxx xxxx Нет POP - Сдвиг стека вверх 1 0000 0000 0000 0110 Нет PUSH Сдвиг стека вниз 1 0000 0000 0000 0101 Нет RCALL n Относительный вы- зов 2 1101 1nnn nnnn nnnn Нет RESET Программный сброс контроллера 1 0000 0000 1111 1111 Все RETFIE s Возврат из преры- вания 2 0000 0000 0001 000s GIE/GIEH, PEIE/GIEL RETLW k Возврат с констан- той в WREG 2 0000 1100 kkkk kkkk Нет RETURN s Возврат из подпро- граммы 2 0000 0000 0001 001s Нет SLEEP - Переход в режим Sleep 1 0000 0000 0000 0011 ТО, PD Операции с константами ADDLW k Сложение констан- ты и WREG 1 0000 1111 kkkk kkkk С, DC, Z, OV, N ANDLW k Логическое И кон- станты и WREG 1 0000 1011 kkkk kkkk Z, N IORLW k Логическое ИЛИ константы и WREG 1 0000 1001 kkkk kkkk Z, N 311
Гпава 3 Мнемоника и операнды Описание Циклы 16-битное слово команды Влияние на биты статуса LFSR f, к Запись константы (12 бит) 1-е слово в регистр f 2-е слово 2 1110 1110 OOff kkkk 1111 0000 kkkk kkkk Нет MOVLB к Запись константы в BSR<3:0> 1 0000 0001 0000 kkkk Нет MOVLW к Запись константы в WREG 1 0000 1110 kkkk kkkk Нет MULLW к Перемножение кон- станты и WREG 1 0000 1101 kkkk kkkk Нет RETLW к Возврат с констан- той в WREG 2 0000 1100 kkkk kkkk Нет SUBLW к Вычитание WREG из константы 1 0000 1000 kkkk kkkk С, DC, Z, OV, N XORLW к Исключающее ИЛИ между константой и WREG 1 0000 1 010 kkkk kkkk Z, N Обмен данными между памятью данных и программ TBLRD* Табличное чтение 2 0000 0000 0000 1000 Нет TBLRD4 Табличное чтение, постинкремент 0000 0000 0000 1 001 Нет TBLRD*- Табличное чтение, постдекремент 0000 0000 0000 1010 Нет TBLRD+* Табличное чтение, прединкремент 0000 0000 0000 1011 Нет TBLWT* Табличная запись 2 0000 0000 0000 1100 Нет TBLWT‘+ Табличная запись, постинкремент 0000 0000 0000 1101 Нет TBLWT*- Табличная запись, постдекремент 0000 0000 0000 1110 Нет TBLWT+* Табличная запись, прединкремент 0000 0000 0000 1111 Нет Описание стандартных команд ADDLW ADD Literal to W Синтаксис: ADDLW k Операнды: 0 < k < 255 Действие: Влияние: Кодировка: (W) + k -> W N, OV, C, DC, Z | 0000 | 1111 | kkkk | kkkk | Описание: Содержимое аккумулятора W складывается с константой к и результат помещается в аккумулятор. Слова: 312
Набор команд Циклы: По тактам: Q1 1 02 03 04 | Декодирование | Чтение к | Обработка | Запись в W | Пример: ADDLW 15h До исполнения команды W = 10h После исполнения команды W = 25h ADDWF ADD W to f Синтаксис: ADDWF f{,d,{a}} Операнды: 0 < f < 255 de [0,1] ae [0,1] Действие: (W) + (f) dest Влияние: N, OV, DC, Z Кодировка: I 0010 I Olda I ffff I ffff I Описание: Сложение W и f. Если d = 0, результат сохраняется в W. Если d = 1, результат сохраняется в регистре f (по умол- чанию). Если а = 0, выбран банк доступа. Если а = 1, используется BSR для выбора банка памяти (по умолчанию). Если а = 0 и включена поддержка расширенного набора команд, эта команда работает в режиме индексированного адресного смещения, где f 95 (5Fh). Слова: 1 Циклы: По тактам: 1 01 02 03 04 | Декодирование | Чтение f | Обработка | Сохранение | Пример: ADDWF REG, 0, 0 До исполнения команды W = 17h REG = 0C2h После исполнения команды W = 0D9h REG = 0C2h ADDWFC ADD W and Carry bit to f Синтаксис: ADDWFC f{,d{,a}} Операнды: 0 < f 5 255 de [0,1] ae [0,1] Действие: (W) + (f) + (C) -* dest Влияние: N, OV, C, DC, Z Кодировка: I 0010 I OOda I ffff I ffff [ 313
Гпава 3 Описание: Сложение W, значения флага переноса и регистра f. Если d = О, результат помещается в W. Если d = 1, результат помещается в регистр f. Если а ~ 0, выбран банк доступа. Если а = 1, используется BSR для выбора банка памяти (по умолчанию). Если а = О и включена поддержка расширенного набора команд, эта команда работает в режиме индексированного адресного смещения, где f < 95 (5Fh) Слова: Циклы: По тактам: 01 |~ Декодирование^ Пример: Q2 _____________ОЗ Чтение! | Обработка ADDWFC REG, 0, 1 До исполнения команды С = 1 REG - 02h W = 4Dh После исполнения команды С = 0 REG = 02h W = 50h Q4 Сохранение | ANDLW Синтаксис: Операнды: Действие: Влияние: Кодировка: Описание: Слова: Циклы: По тактам: ________QI________ | Декодирование ~[~ Пример: AND Literal with W ANDLW k 0 < k < 255 (W).AND.k —► W N, Z I 0000________________________________________ Функция логического И между W и константой к. Резуль- тат помещается в W. [ 1011 | kkkk | kkkk _______Q2 Чтение к ANDLW 05Fh До исполнения команды W = A3h После исполнения команды W = 03h Q3 Обработка Q4 Запись в W | ANDWF Синтаксис: Операнды: AND W with f ANDWF f{,d{,a}} 0 < f < 255 de [0,1] a e [0,1] 314
Набор команд Действие: Влияние: (W).AND.(f) dest N, Z Кодировка: | 0001 | Olda | ffff | ffff | Описание: Логическое И между содержимым аккумулятора и регист- ра f. Если d = 0, результат сохраняется в W. Если d = 1, результат сохраняется в регистре f (по умолчанию). Если а = 0, выбран банк доступа. Если а = 1, используется BSR для выбора банка памяти (по умолчанию). Если а = 0 и включена поддержка расширенного набора команд, эта команда работает в режиме индексированного адресного смещения, где f < 95 (5Fh). Слова: 1 Циклы: По тактам: 1 01 Q2 ОЗ Q4 | Декодирование | Чтение f | Обработка | Сохранение | Пример: ANDWF REG, 0, 0 До исполнения команды W = 17h REG = C2h После исполнения команды W = 02h REG = C2h ВС Branch if Carry Синтаксис: вс п Операнды: -128 п < 127 Действие: Если бит переноса «1», то (PC) + 2 + 2n - > PC Влияние: Нет___________________________________________ Кодировка: | 1110 | 0010 | nnnn | nnnn | Описание: Если бит переноса установлен в «1», то происходит пере- ход на другой адрес памяти программ. Двоично допол- ненное число «2п» прибавляется к значению программно- го счетчика PC. Поскольку к этому моменту PC уже захва- тил адрес следующей команды, то реальным адресом пе- рехода будет PC + 2 + 2п. В случае истинности условия команда выполняется за два цикла. Слова: 1 Циклы: 1 (2) По тактам: Если есть переход: Q1 Q2 03 04 Декодирование Чтение п Обработка Запись в PC Нет операции Нет операции Нет операции Нет операции Если нет перехода: ________Q1_______________Q2 ______________Q3 _______________Q4 | Декодирование | Чтение п | Обработка | Нет операции | 315
Глава 3 Пример: HERE ВС 5 До исполнения команды PC = (адрес HERE) После исполнения команды Если Carry = 1 PC = (адрес HERE) + 12 Если Carry = 0 PC = (адрес HERE) + 2 BCF Bit Clear f Синтаксис: BCF f,b{,a} Операнды: 0 < f < 255 0<b<7 ae [0,1] Действие: 0 f<b> Влияние: Нет Кодировка: I 1001 I bbba I ffff I ffff I Описание: Бит с номером b в регистре f обнуляется. Если a = 0, вы- бран банк доступа. Если а = 1, используется BSR для вы- бора банка памяти (по умолчанию). Если а = 0 и включена поддержка расширенного набора команд, эта команда ра- ботает в режиме индексированного адресного смещения, где f 5 95 (5Fh). Слова: 1 Циклы: По тактам: 1 01 Q2 Q3 Q4 | Декодирование | Чтение f | Обработка | Запись в f | Пример: BCF FLAG„REG, 7, 0 До исполнения команды FLAG.REG = C7h После исполнения команды FLAG_REG = 47h BN Branch if Negative Синтаксис: BN П Операнды: -1285 n< 127 Действие: Если бит N = 1, то (PC) + 2 + 2n —► PC Влияние: Кодировка: Нет | 1110 I ОНО [ nnnn j nnnn I Описание: Если флаг отрицательного значения N установлен в «1», то происходит переход на другой адрес памяти программ. Двоично дополненное число «2п» прибавляется к значе- нию программного счетчика PC. Поскольку к этому момен- ту PC уже захватил адрес следующей команды, то реаль- ным адресом перехода будет PC + 2 + 2п. В случае истин- ности условия команда выполняется за два цикла. 316
Набор команд Слова: Циклы: По тактам: 01 1 1 (2) Если есть переход 02 03 04 Декодирование Чтение п Обработка Запись в PC Нет операции Нет операции Нет операции Нет операции 01 Если нет перехода 02 03 04 | Декодирование Чтение п Обработка Нет операции | Пример: HERE BN Jump До исполнения команды PC = адрес (HERE) После исполнения команды Если N = 1 PC = адрес (Jump) Если N = О PC = адрес (HERE) + 2 BNC Branch if Not Carry Синтаксис: bnc n Операнды: -128 < n < 127 Действие: Если бит переноса «О», то (PC) + 2 + 2n PC Влияние: Нет__________________________________________ Кодировка: I 1110 | ООН I nnnn j nnnn I Описание: Если бит переноса сброшен в «О», то происходит переход на другой адрес памяти программ. Двоично дополненное число «2п» прибавляется к значению программного счет- чика PC. Поскольку к этому моменту PC уже захватил ад- рес следующей команды, то реальным адресом перехода будет PC + 2 + 2п. В случае истинности условия команда выполняется за два цикла. Слова: 1 Циклы: 1 (2) По тактам: Если есть переход: Q1 02 03 04 Декодирование Чтение п Обработка Запись в PC Нет операции Нет операции Нет операции Нет операции Если нет перехода: ________01________________02 ________03 __________04 | Декодирование | Чтение п | Обработка | Нет операции ~] Пример: HERE BNC Jump До исполнения команды PC = (адрес HERE) После исполнения команды Если Carry ~ О PC = адрес (Jump) 317
Глава 3 Если Carry = 1 PC = адрес (HERE) + 2 BNN Branch if Not Negative Синтаксис: bnn n Операнды: -128 n 5 127 Действие: Если бит N = 0, то (PC) + 2 + 2n PC Влияние: Нет________________________________________ __ КоДи po вка: {1110 | 0111 | nnnn | nnnn | Описание: Если флаг отрицательного значения N сброшен в «О», то происходит переход на другой адрес памяти программ. Двоично дополненное число «2п» прибавляется к значе- нию программного счетчика PC. Поскольку к этому момен- ту PC уже захватил адрес следующей команды, то реаль- ным адресом перехода будет PC + 2 + 2л. В случае истин- ности условия команда выполняется за два цикла. Слова: 1 Циклы: 1 (2) По тактам: Если есть переход Q1 Q2 Q3 Q4 Декодирование Чтение п Обработка Запись в PC Нет операции Нет операции Нет операции Нет операции Если нет перехода Q1 Q2 Q3 Q4 Декодирование Чтение п Обработка Нет операции Пример: HERE BNN Jump До исполнения команды PC = адрес (HERE) После исполнения команды Если N = 0 PC = адрес (Jump) Если N = 1 PC = адрес (HERE) + 2 BNOV Branch if Not Overflow Синтаксис: BNOV n Операнды: Действие: -128 <n < 127 Если бит OV = 0, то (PC) + 2 ь 2n —> PC Влияние: Кодировка: Описание: Нет ] 1110 | 0101 | nnnn | nnnn | Если флаг переполнения OV сброшен в «0», то происхо- дит переход на другой адрес памяти программ. Двоично дополненное число «2п» прибавляется к значению про- граммного счетчика PC. Поскольку к этому моменту PC уже захватил адрес следующей команды, то реальным адресом перехода будет PC + 2 + 2п. В случае истинности условия команда выполняется за два цикла. 318
Набор команд Слова: 1 Циклы: 1 (2) По тактам: Если есть переход Q1 02 03 04 Декодирование | Чтение п Обработка Запись в PC Нет операции | Нет операции Нет операции Нет операции 01 Если нет перехода 02 03 04 | Декодирование | Чтение п Обработка Нет операции | Пример: HERE BNOV Jump До исполнения команды PC = адрес (HERE) После исполнения команды Если OV = О PC - адрес (Jump) Если OV = 1 PC = адрес (HERE) + 2 BNZ Branch if Not Zero Синтаксис: Операнды: Действие: Влияние: Кодировка: Описание: BNZ п -128 <п < 127 Если бит Z = 0, то (PC) + 2 + 2п -> PC Нет ] 1110 | 0001 | пппп | пппп | Если флаг нулевого значения Z сброшен в «О», то проис- ходит переход на другой адрес памяти программ. Двоично дополненное число «2п» прибавляется к значению про- граммного счетчика PC. Поскольку к этому моменту PC уже захватил адрес следующей команды, то реальным адресом перехода будет PC + 2 + 2п. В случае истинности условия команда выполняется за два цикла. Слова: Циклы: По тактам: 01 1 1 (2) Если есть переход Q2 03 04 Декодирование Чтение п Обработка Запись в PC Нет операции Нет операции Нет операции Нет операции 01 Если нет перехода 02 03 04 Декодирование Чтение п | Обработка Нет операции | Пример: HERE BNZ Jump До исполнения команды PC = адрес (HERE) После исполнения команды Если Z = О 319
Глава 3 PC = адрес (Jump) Если Z = 1 PC = адрес (HERE) + 2 BRA Unconditional Branch Синтаксис: BRA n Операнды: Действие: -1024 <n< 1023 (PC) + 2 + 2n —► PC Влияние: Нет Кодировка: Описание: I 1101 | Onnn | nnnn | nnnn | Прибавляет двоично дополненное число 2п к программ- ному счетчику. Поскольку к этому моменту PC уже захва- тил адрес следующей команды, то реальным адресом пе- рехода будет PC + 2 + 2п. Команда всегда выполняется за два цикла. Слова: 1 Циклы: 2 По тактам: 01 Декодирование Нет операции Пример: 02 03 04 Чтение п Обработка Запись в PC Нет операции Нет операции Нет операции HERE BRA Jump До выполнения команды PC = адрес (HERE) После выполнения команды PC = адрес (Jump) BSF Bit Set f Синтаксис: BSF f,b{,a} Операнды: 0 < f < 255 0<b<7 ae [0,1] Действие: 1 — f<b> Влияние: Нет Кодировка: I 1000 I bbba I ffff j ffff I Описание: Бит с номером b в регистре f устанавливается в 1. Если а = 0, выбран банк доступа. Если а = 1, используется BSR для выбора банка памяти (по умолчанию). Если а = 0 и включена поддержка расширенного набора команд, эта команда работает в режиме индексированного адресного смещения, где f < 95 (5Fh). Слова: 1 Циклы: 1 По тактам: Q1 02 03 04 | Декодирование ( Чтение f | Обработка | Запись в f | 320
Набор команд Пример: BSF FLAF_REG, 7, 1 До выполнения команды FLAG_REG = OAh После выполнения команды FLAG_REG = 8Ah BTFSC Bit Test File, Skip if Clear Синтаксис: BTFSC f,b{,a] Операнды: 0 f 255 0<bs7 ае [0,1] Действие: Переход, если (f<b>) - О Влияние: Нет__________________________________________ Кодировка: | 1011 | bbba | ffff |~ fffF | Описание: Если бит b в регистре f равен нулю, то следующая коман- да не выполняется (пропуск команды). Предварительно захваченная команда игнорируется, и вместо нее выпол- няется NOP, образуя команду из двух циклов. Если бит b = 1, то выполняется следующая команда. Если а = 0, выбран банк доступа. Если а = 1, используется BSR для выбора банка памяти (по умолчанию). Если а = О и включена поддержка расширенного набора команд, эта команда работает в режиме индексированного адресного смещения, где f s 95 (5Fh). Слова: 1 Циклы: 1 (2) Примечание: 3 цикла, если выполняется пропуск команды, и эта команда из 2-х слов По тактам: ________01________________Q2_______________Q3________________Q4 | Декодирование | Чтение f | Обработка | Нет операции | Q1 Если пропуск Q2 Q3 Q4 | Нет операции I Нет операции I Нет операции | Нет операции | Q1 Если пропуск команды из 2-х слов Q2 Q3 Q4 Нет операции Нет операции | Нет операции i | Нет операции Нет операции Нет операции | Нет операции I 1 Нет операции Пример: HERE BTFSC FLAG, FALSE ... TRUE ... 1, 0 До выполнения команды PC = адрес (HERE) После выполнения команды Если FLAG<1> = О PC = адрес (TRUE) Если FLAG<1> = 1 PC = адрес (FALSE) 321
Гпава 3 BTFSS Bit Test File, Skip if Set Синтаксис: BTFSS f,b{,a} Операнды: 0 < f < 255 Действие: 0<b<7 ae [0,1] Переход, если (f<b>) = 1 Влияние: Нет Кодировка: I 1010 I bbba I ffff I ffff I Описание: Если бит b в регистре f равен 1, то следующая команда не Слова: выполняется (пропуск команды). Предварительно захва- ченная команда игнорируется, и вместо нее выполняется NOP, образуя команду из двух циклов. Если бит b = 0, то выполняется следующая команда. Если а = 0, выбран банк доступа. Если а = 1, используется BSR для выбора банка памяти (по умолчанию). Если а = 0 и включена поддержка расширенного набора команд, эта команда работает в режиме индексированного адресного смещения, где f £ 95 (5Fh). 1 Циклы: 1 (2) По тактам: Примечание: 3 цикла, если выполняется пропуск команды, и эта команда из 2-х слов _______01_______________Q2_______________Q3 ______________Q4 I Декодирование | Чтение! | Обработка | Нет операции | Q1 Если пропуск Q2 Q3 Q4 | Нет операции | Нет операции | Нет операции Нет операции | Q1 Если пропуск команды из 2-х слов Q2 Q3 Q4 Нет операции Нет операции Нет операции Нет операции Нет операции Нет операции Нет операции Нет операции Пример: HERE BTFSS FLAG, 1, 0 FALSE ... BTG Синтаксис: Операнды: TRUE ... До выполнения команды PC = адрес (HERE) После выполнения команды Если FLAG<1> = О PC = адрес (FALSE) Если FLAG<1> = 1 PC = адрес (TRUE) Bit Toggle f_____________ BTG f,b{ ,~a} 0 < f < 255 0<b<7 ae [0,1] (f<b>) -> f<b> Действие: 322
Набор команд Влияние: Нет Кодировка: | 0111 | bbba | ffff | ffff | Описание: Бит b в регистре f инвертируется. Если а = 0, выбран банк доступа. Если а = 1, используется BSR для выбора банка па- мяти (по умолчанию). Если а = 0 и включена поддержка рас- ширенного набора команд, эта команда работает в режиме индексированного адресного смещения, где f 95 (5Fh). Слова: 1 Циклы: По тактам: 1 Q1 Q2 Q3 Q4 | Декодирование | Чтение f | Обработка | Запись в f | Пример: BTG PORTC, 4, 0 До выполнения команды PORTC = 0111 0101 [75h] После выполнения команды PORTC = 0110 0101 [65h] BOV Branch if Overflow Синтаксис: bov n Операнды: -128 < n < 127 Действие: Если бит OV = 1, то (PC) + 2 + 2n -> PC Влияние: Нет__________________________________________ Кодировка: ) 1110 [ 0100 | nnnn | nnnn | Описание: Если флаг переполнения OV установлен в «1», то проис- ходит переход на другой адрес памяти программ. Двоично дополненное число «2п» прибавляется к значению про- граммного счетчика PC. Поскольку к этому моменту PC уже захватил адрес следующей команды, то реальным адресом перехода будет PC + 2 + 2 п. В случае истинно- сти условия команда выполняется за два цикла. Слова: 1 Циклы: 1 (2) По тактам: Если есть переход Q1 Q2 Q3 Q4 Декодирование Чтение п Обработка Запись в PC Нет операции Нет операции Нет операции Нет операции Если нет перехода ________Q1_______________Q2_______________Q3_________________Q4______ | Декодирование | Чтение п | Обработка | Нет операции | Пример: here BOV Jump До исполнения команды PC = адрес (HERE) После исполнения команды Если OV = 1 PC = адрес (Jump) 323
Гпава 3 Если 0V = О PC = адрес (HERE)+ 2 BZ Branch if Zero Синтаксис: BZ П Операнды: Действие: -128<п<127 Если бит Z - 1, то (PC) + 2 + 2n -> PC Влияние: Кодировка: Описание: Нет | 1110 | 0000 | nnnn | nnnn | Если флаг нулевого значения Z установлен в «1», то про- исходит переход на другой адрес памяти программ. Дво- ично дополненное число «2 л» прибавляется к значению программного счетчика PC. Поскольку к этому моменту PC уже захватил адрес следующей команды, то реальным адресом перехода будет PC + 2 + 2 п. В случае истинно- сти условия команда выполняется за два цикла. Слова: 1 Циклы: 1 (2) По тактам: Если есть переход Q1 Q2 Q3 Q4 Декодирование Чтение п Обработка Запись в PC Нет операции Нет операции Нет операции Нет операции Если нет перехода ________01_______________Q2 ______________Q3 _______________Q4 | Декодирование | Чтение л | Обработка | Нет операции | Пример: HERE BZ Jump До исполнения команды PC = адрес (HERE) После исполнения команды Если Z = 1 PC = адрес (Jump) Если Z = О PC - адрес (HERE) + 2 CALL Subroutine Call Синтаксис: CALL k{,s) Операнды: 0<k< 1048575 SG [0,1] Действие: (PC) +4 -> TOS k-> PC<20:1> если s = 1 (W) - WS (Status) -> STATUSS (BSR) -> BSRS Влияние: Нет 324
Набор команд Кодировка: 1110 110s k7kkk kkkk0 (2 слова) 1111 k19kkk kkkk kkkk8 Описание: Подпрограмма вызывается на непрерывном адресном поле 2 Мб. Адрес возврата (РС+4) помещается в стек. Ес- ли s - 1 регистры W, STATUS и BSR также помещаются в соответствующие фоновые регистры WS, STATUSS и BSRS. Если s = 0, то размещение не производится (по умолчанию). Затем 20-битное значение к загружается в РС<20:1>. Команда всегда выполняется за два цикла. Слова: 2 Циклы: 2 По тактам: Q1 Q2 Q3 Q4 Декодирование Чтение к<7:0> Загрузка PC Чтение k<19:8> в стек запись в PC Нет операции Нет операции Нет операции Нет операции Пример: HERE CALL THERE,1 До выполнения команды PC = адрес (HERE) После выполнения команды PC = адрес (THERE) TOS = адрес (HERE + 4) WS = W BSRS = BSR STATUSS = Status CLRF Clear f Синтаксис: CLRF f{,a} Операнды: 0 < f < 255 a e [0,1] Действие: OOOh — f 1 -*Z Влияние: Z ' Кодировка: I ОНО I 101a I ffff I ffff I Описание: Обнуляет содержимое регистра f. Если a - 0, выбран банк доступа. Если а = 1, используется BSR для выбора банка па- мяти (по умолчанию). Если а ~ 0 и включена поддержка рас- ширенного набора команд, эта команда работает в режиме индексированного адресного смещения, где f < 95 (5Fh). Слова: Циклы: 1 По тактам: Q1 Q2 Q3 Q4 | Декодирование | Чтение f | Обработка | Запись в f | Пример: CLRF FLAG„REG, 1 До выполнения команды FLAG_REG - 5Ah 325
Гпава 3 После выполнения команды FLAG_REG = 00h CLRWDT Clear Watchdog Timer Синтаксис: CLRWDT Операнды: Нет Действие: OOOh - > WDT OOOh —> постделитель WDT 1 - >TO 1 RD Влияние: TO, PD Кодировка: I 0000 I 0000 [ 0000 I 0100 I Описание: Обнуление сторожевого таймера. Также обнуляется по- стделитель WDT. Устанавливаются биты статуса ТО и PD. Слова: 1 Циклы: По тактам: 1 Q1 Q2 Q3 Q4 | Декодирование | Нет операции | Обработка | Нет операции | Пример: CLRWDT До выполнения команды Счетчик WDT = ? (произвольное значение) После выполнения команды Счетчик WDT = 00h Постделитель WDT = 0 10 = 1 PD = 1 COMF Complement f Синтаксис: COMF f{,d{,a}} Операнды: 0 < f < 255 de [0,1] a e [0,1] Действие: (7) —► dest Влияние: N,Z Кодировка: Описание: | 0001 I llda j ffff I ffff I Вычисляется дополняющее значение регистра f. Если d = 0, результат сохраняется в W. Если d = 1, результат сохраняется обратно в исходный регистр (по умолчанию). Если а = 0, выбран банк доступа. Если а= 1, используется BSR для выбора банка памяти (по умолчанию). Если а = 0 и включена поддержка расширенного набора команд, эта команда работает в режиме индексированного адресного смещения, где f < 95 (5Fh). Слова: 1 326
Набор команд Циклы: 1 По тактам: _______Q1 ______________Q2_______________Q3 ______________Q4 | Декодирование | Чтение! | Обработка | Запись в dest Пример: comf reg,О,О До выполнения команды REG = 13h После выполнения команды REG = 13h W = ECh CPFSEQ Compare f with W, Skip if f = W Синтаксис: CPFSEQ f{,a} Операнды: 0 < f< 255 Действие: ae [0,1] (f)-(W) Влияние: переход, если (!) = (W) (сравнение без учета знака!) Нет Кодировка: I ОНО ] DOla I ffff [ ffff I Описание: Сравнение содержимого регистра ! и аккумулятора W пу- тем вычитания без знака. Если (f) = (W), то предзахвачен- Слова: ная команда игнорируется, вместо нее выполняется пус- тая операция. Если а = 0, выбран банк доступа. Если а = 1, используется BSR для выбора банка памяти (по умолчанию). Если а = 0 и включена поддержка расширенного набора команд, эта команда работает в режиме индексированного адресного смещения, где f < 95 (5Fh). 1 Циклы: 1 (2) По тактам: Примечание: 3 цикла, если выполняется пропуск команды, и эта команда из 2-х слов _______QI_______________Q2 • Q3 _______________Q4 | Декодирование | Чтение! | Обработка | Нет операции | Q1 Если пропуск Q2 Q3 Q4 ] Нет операции | Нет операции Нет операции | Нет операции ] Q1 Если пропуск команды из 2-х слов Q2 Q3 Q4 Нет операции Нет операции Нет операции Нет операции Нет операции Нет операции Нет операции Нет операции Пример: HERE CPFSEQ REG,0 NEQUAL ... EQUAL ... 327
Гпава 3 До выполнения команды PC = адрес (HERE) W - ? (любое значение) REG = ? (любое значение) После выполнения команды Если REG = W PC = адрес (EQUAL) Если REG * W PC = адрес (NEQUAL) CPFSGT Compare f with W, Skip if f > W Синтаксис: CPFSGT f{,a} Операнды: 0 < f < 255 Действие: ae [0,1] (f)-(W) Влияние: переход, если (f) > (W) (сравнение без учета знака!) Нет Кодировка: [ QUO | QlOa j ffff | ffff | Описание: Сравнение содержимого регистра f и аккумулятора W пу- Слова: тем вычитания без знака. Если (f) > (W), то предзахвачен- ная команда игнорируется, вместо нее выполняется пус- тая операция. Если а = 0, выбран банк доступа. Если а = 1, используется BSR для выбора банка памяти (по умолчанию). Если а = 0 и включена поддержка расширенного набора команд, эта команда работает в режиме индексированного адресного смещения, где f < 95 (5Fh). 1 Циклы: 1 (2) По тактам: Q1 Примечание: 3 цикла, если выполняется пропуск команды, и эта команда из 2-х слов Q2 Q3 Q4 | Декодирование | Чтение f | Обработка | Нет операции | Q1 Если пропуск Q2 Q3 Q4 | Нет операции | Нет операции | Нет операции | Нет операции | Если пропуск команды из 2-х слов Q1________________Q2________________Q3________________Q4 Нет операции Нет операции Нет операции Нет операции Нет операции Нет операции Нет операции Нет операции Пример: HERE CPFSGT REG,О NGREATER ... GREATER ... До выполнения команды PC = адрес (HERE) W = ? (любое значение) 328
Набор команд REG = ? (любое значение) После выполнения команды Если REG > W PC = адрес (GREATER) Если REG < W PC = адрес (NGREATER) CPFSLT Compare f with W, Skip if f < W Синтаксис: CPFSLT f{,a} Операнды: 0 < f < 255 Действие: ae [0,1] (f)-(W) Влияние: переход, если (f) < (W) (сравнение без учета знака!) Нет Кодировка: I QUO j 000а I ffff I ffff I Описание: Сравнение содержимого регистра f и аккумулятора W пу- Слова: тем вычитания без знака. Если (f) < (W), то предзахвачен- ная команда игнорируется, вместо нее выполняется пус- тая операция. Если а = 0, выбран банк доступа. Если а - 1, используется BSR для выбора банка памяти (по умолчанию). Если а = 0 и включена поддержка расширенного набора команд, эта команда работает в режиме индексированного адресного смещения, где f < 95 (5Fh). 1 Циклы: 1 (2) По тактам: Q1 Примечание: 3 цикла, если выполняется пропуск команды, и эта команда из 2-х слов. Q2 Q3 Q4 | Декодирование | Чтение f | Обработка | Нет операции | Q1 Если пропуск Q2 Q3 Q4 | Нет операции Нет операции Нет операции | Нет операции | Q1 Если пропуск команды из 2-х слов Q2 Q3 Q4 Нет операции Нет операции Нет операции I Нет операции Нет операции Нет операции Нет операции | Нет операции Пример: here cpfslt reg, о NLESS ... LESS ... До выполнения команды PC - адрес (HERE) W = ? (любое значение) REG = ? (любое значение) После выполнения команды 329
Глава 3 Если REG < W PC = адрес (LESS) Если REG > W PC = адрес (NLESS) DAW Decimal Adjust W Синтаксис: DAW Операнды: Нет Действие: Если [W<3:0> > 9] или [DC - 1] то (W<3:0>) + 6 W<3:0>; иначе (W<3:0>) —> W<3:0> Если [W<7:4> + DC > 9] или [C = 1] to (W<7:4>) + 6 + DC W<7:4>; иначе (W<7:4>) + DC -> W<7:4> Влияние: C Кодировка: I 0000 I 0000 I 0000 I 0111 I Описание: Команда производит выравнивание восьмибитного значе- ния W, полученного от предыдущего сложения двух зна- чений (каждое в двоично-десятичном формате) и выдает корректное двоично-десятичное значение. Слова: Циклы: По тактам: Q1 Q2 Q3 Q4 | Декодирование | Чтение W | Обработка | Запись W | Пример 1: DAW До выполнения команды W = A5h С = 0 DC = 0 После выполнения команды W = 05h С = 1 DC = 0 Пример 2: DAW До выполнения команды W = CEh С = 0 DC = 0 После выполнения команды W = 34h С = 1 DC = 0 330
Набор команд DECF Decrement f Синтаксис: DECF f(,d{,a}} Операнды: 0 < f < 255 de [0,1] ae [0,1] Действие: (f) - 1 dest Влияние: C, DC, N, OV, Z Кодировка: I 0000 j Olda I ffff I ffff ] Описание: Декремент регистра f. Если d = 0, результат сохраняется в W. Если d = 1, результат сохраняется обратно в исходный регистр (по умолчанию). Если а = 0, выбран банк доступа. Если а = 1, используется BSR для выбора банка памяти (по умолчанию). Если а = 0 и включена поддержка расширенного набора команд, эта команда работает в режиме индексированного адресного смещения, где f £ 95 (5Fh). Слова: 1 Циклы: По тактам: 1 01 Q2 Q3 Q4 | Декодирование | Чтение f Обработка | Запись Пример: DECF CNT,1,0 До выполнения команды CNT = 01h Z = 0 После выполнения команды CNT = 00h Z = 1 DECFSZ Decrement f, Skip if 0 Синтаксис: DECFSZ f{,d{,a}) Операнды: 0 < f < 255 de [0,1] ae [0,1] Действие: (f) - 1 —► dest переход, если результат = 0 Влияние: Нет Кодировка: I 0010 I llda I ffff I ffff ] Описание: Декремент содержимого регистра f. Если d = 0, результат сохраняется в W. Если d = 1, результат сохраняется об- ратно в исходный регистр (по умолчанию). Если результат равен нулю, предзахваченная команда иг- норируется и выполняется пустая операция. Если а = 0, выбран банк доступа. Если а = 1, используется BSR для выбора банка памяти (по умолчанию). Если а = 0 и включена поддержка расширенного набора команд, эта команда работает в режиме индексированного адресного смещения, где f й 95 (5Fh). 331
Гпава 3 Слова: 1 Циклы: 1 (2) Примечание: 3 цикла, если выполняется пропуск команды, и эта команда из 2-х слов. По тактам: Q1 02 03 04 | Декодирование | Чтение f | Обработка | Нет операции | Если пропуск 01 02 03 04 | Нет операции | Нет операции I Нет операции | Нет операции | Если пропуск команды из 2-х слов 01 02 03 04 Нет операции Нет операции Нет операции Нет операции Нет операции Нет операции Нет операции Нет операции Пример: here decfsz cnt,i,i GOTO LOOP CONTINUE До выполнения команды PC = адрес (HERE) После выполнения команды CNT = CNT - 1 Если CNT = О PC = адрес (CONTINUE) Если CNT * О PC = адрес (HERE + 2) DCFSNZ Decrement f, Skip if not 0 Синтаксис: dcfsnz f{,d{,a}} Операнды: 0 < f < 255 de [0,1] a e [0,1] Действие: (f) - 1 —► dest переход, если результат * 0 Влияние: Нет _________________________________________ Кодировка: | 0100 | iida | ffff | ffff | Описание: Декремент содержимого регистра f. Если d = 0, результат сохраняется в W. Если d = 1, результат сохраняется об- ратно в исходный регистр (по умолчанию). Если результат НЕ равен нулю, предзахваченная команда игнорируется и выполняется пустая операция. Если а - 0, выбран банк доступа. Если а = 1, используется BSR для выбора банка памяти (по умолчанию). Если а = 0 и включена поддержка расширенного набора команд, эта команда работает в режиме индексированного адресного смещения, где f 95 (5Fh). Слова: 1 Циклы: 1 (2) Примечание: 3 цикла, если выполняется пропуск команды, и эта команда из 2-х слов 332
Набор команд По тактам: Q1 Q2 Q3 Q4 Декодирование Чтение f | Обработка Нет операции | Q1 Если пропуск Q2 Q3 Q4 | Нет операции | Нет операции | Нет операции Нет операции | Q1 Если пропуск команды из 2-х слов Q2 Q3 Q4 Нет операции Нет операции Нет операции Нет операции Нет операции Нет операции Нет операции Нет операции Пример: HERE DCFSNZ TEMP,1,0 ZERO ... NZERO ... До выполнения команды PC = адрес (HERE) TEMP = ? (произвольное значение) После выполнения команды TEMP = TEMP - 1 Если TEMP = О PC = адрес (ZERO) Если CNT # О PC = адрес (NZERO) GOTO Синтаксис: Операнды: Действие: Влияние: Кодировка: (2 слова) Описание: Unconditional Branch GOTO k 0<k < 1048575 k - -> PC<20:1> Нет_________________ 1110 1111 k7kkk 1 kkkk0 1111 | k19kkk kkkk । 1 kkkk8 Безусловный переход на любой адрес непрерывного ад- ресного пространства памяти программ 2 Мб. 20-битное значение к загружается в РС<20:1>. Команда всегда вы- полняется за два цикла. Слова: 2 Циклы: 2 По тактам: Q1 Q2 Q3 Q4 Декодирование Чтение к<7:0> Обработка Чтение к<19:8> Запись в PC Нет операции Нет операции Нет операции Нет операции Пример: GOTO THERE После исполнения команды PC = адрес (THERE) INCF Синтаксис: Операнды: Increment f INCF f{,d{a}} 0 < f < 255 333
Глава 3 Действие: Влияние: de [0,1] ае [0,1] (f) + 1 —> dest С, DC, N, OV, Z Кодировка: | 0010 I lOda I ffff I ffff 1 Описание: Инкремент содержимого регистра f. Если d = 0, результат сохраняется в W. Если d = 1, результат сохраняется об- ратно в исходный регистр (по умолчанию). Если а = 0, выбран банк доступа. Если а = 1, используется BSR для выбора банка памяти (по умолчанию). Если а = 0 и включена поддержка расширенного набора команд, эта команда работает в режиме индексированного адресного смещения, где f < 95 (5Fh). Слова: Циклы: По тактам: 1 1 Q1 Q2 Q3 Q4 | Декодирование Чтение f | Обработка | Запись в dest | Пример: INCF CNT,1,0 До выполнения команды CNT = FFh Z-0 С = ? DC = ? После выполнения команды CNT = 00h Z= 1 С = 1 DC- 1 INCFSZ Increment f, Skip if 0 Синтаксис: INCFSZ f{,d{,a}} Операнды: 0 < f < 255 de [0,1] a e [0,1] Действие: (f) + 1 - > dest переход, если результат = 0 Влияние: Нет Кодировка: | ООН I llda I ffff I ffff I Описание: Инкремент содержимого регистра f. Если d = 0, результат сохраняется в W. Если d = 1, результат сохраняется об- ратно в исходный регистр (по умолчанию). Если результат равен нулю, предзахваченная команда иг- норируется и выполняется пустая операция. Если а - 0, выбран банк доступа. Если а = 1, используется BSR для выбора банка памяти (по умолчанию). Если а = 0 и включена поддержка расширенного набора команд, эта команда работает в режиме индексированного адресного смещения, где f 95 (5Fti). 334
Набор команд Слова: Циклы: По тактам: Q1 1 1 (2) Примечание: 3 цикла, если выполняется пропуск команды, и эта команда из 2-х слов. Q2 Q3 04 Декодирование Чтение f Обработка | Нет операции Q1 Если пропуск Q2 03 04 J Нет операции | Нет операции Нет операции | Нет операции Q1 Если пропуск команды из 2-х слов 02 03 04 Нет операции Нет операции Нет операции Нет операции Нет операции Нет операции Нет операции Нет операции Пример: HERE INCFSZ CNT,1,1 NZERO ZERO ... До выполнения команды PC = адрес (HERE) После выполнения команды CNT = CNT + 1 Если CNT = О PC = адрес (ZERO) Если CNT # О PC = адрес (NZERO) INFSNZ Increment f, Skip if not 0 Синтаксис: INFSNZ Операнды: 0 £ f < 255 de [0,1] ae [0,1] Действие: (f) + 1 -> dest переход, если результат * 0 Влияние: Нет Кодировка: Описание: j 0100 j lOda I ffff I ffff I Инкремент содержимого регистра f. Если d - 0, результат сохраняется в W. Если d = 1, результат сохраняется об- ратно в исходный регистр (по умолчанию). Если результат НЕ равен нулю, предзахваченная команда игнорируется и выполняется пустая операция. Если а = 0, выбран банк доступа. Если а = 1, используется BSR для выбора банка памяти (по умолчанию). Если а = 0 и включена поддержка расширенного набора команд, эта команда работает в режиме индексированного адресного смещения, где f 95 (5Fh). Слова: Циклы: 1 (2) 335
Глава 3 Примечание: 3 цикла, если выполняется пропуск команды, и эта команда из 2-х слов. По тактам: Q1 Q2 03 Q4 | Декодирование | Чтение f J Обработка ( Нет операции | Если пропуск Q1 02 03 04 | Нет операции | Нет операции | Нет операции | Нет операции | Если пропуск команды из 2-х слов Q1________________Q2________________Q3________________04 Нет операции Нет операции Нет операции Нет операции Нет операции Нет операции Нет операции Нет операции Пример: here infsnz reg,1,0 ZERO NZERO ... До выполнения команды PC = адрес (HERE) После выполнения команды REG = REG + 1 Если REG * О PC - адрес (NZERO) Если CNT = О PC = адрес (ZERO) IORLW Inclusive OR Literal with W Синтаксис: iorlw k Операнды: 0 < k 255 Действие: (W).OR.k -> W Влияние: N, Z__________________________________________ Код И ров ка: I 0000 I 1001 I kkkk [ kkkk [ Описание: Операция логического ИЛИ между аккумулятором W и 8- битной константой к. Результат помещается в W. Слова: 1 Циклы: 1 По тактам: _______Q1_______________Q2 ______________ОЗ ______________Q4 | Декодирование | Чтение к | Обработка Запись в W | Пример: iorlw 3 5h До выполнения команды W = 9Ah После выполнения команды W = BFh I0RWF Inclusive OR with f Синтаксис: I0RWF f{,d{,a]} Операнды: 0 < f < 255 336
Набор команд de [0,1] а е [0,1] Действие: (W).OR.(f) dest Влияние: N, Z_______________________________________ Код и ров ка: | cool | ooda | ffff | ffff Описание: Операция логического ИЛИ между аккумулятором W и реги- стром f. Если d = 0, результат сохраняется в W. Если d = 1, результат сохраняется обратно в исходный регистр (по умолчанию). Если а = 0, выбран банк доступа. Если а = 1, используется BSR для выбора банка памяти (по умолчанию). Если а - О и включена поддержка расширенного набора команд, эта команда работает в режиме индексированного адресного смещения, где f < 95 (5Fh). Слова: 1 Циклы: 1 По тактам: ________Q1_______________Q2_______________Q3_________________Q4______ | Декодирование | Чтение f | Обработка | Запись в dest ~| Пример: IORWF RESULT,0,1 До выполнения команды RESULT = 13h W = 91h После выполнения команды RESULT= 13h W = 93h LFSR Load FSR Синтаксис: Операнды: Действие: Влияние: Кодировка: (2 слова) Описание: Словй: Циклы: По тактам: LFSR f, к 0<f <2 0 < к < 4095 к — FSRf Нет 1110 1110 OOff кцккк 1111 0000 к7ккк кккк0 12-битная константа к загружается в FSR (File Select Reg- ister), определяемый значением f. 2 2 Q1 02 03 04 Декодирование Чтение к<11:8> Обработка Запись к<11:8> в FSRfH Декодирование Чтение к<7:0> Обработка Запись к<7:0> в FSRfL Пример: LFSR 2,3ABh После выполнения команды 337
Гпава 3 FSR2H = 03h FSR2L = ABh MOVF Move f Синтаксис: MOVF f{,d{,a}} Операнды: 0 < f £ 255 de [0,1] ae [0,1] Действие: f —> dest Влияние: Кодировка: Описание: N,Z I 0101 I OOda I ffff I ffff I Содержимое регистра f перемещается в приемник, зави- сящий от значения d. Если d = 0, результат сохраняется в W. Если d = 1, результат сохраняется обратно в исходный регистр (по умолчанию). Положение f может быть любым в пределах 256-байтного банка. Если а = 0, выбран банк доступа. Если а = 1, используется BSR для выбора банка памяти (по умолчанию). Если а = 0 и включена поддержка расширенного набора команд, эта команда работает в режиме индексированного адресного смещения, где f < 95 (5Fh). Слова: 1 Циклы: 1 По тактам: Q1 Q2 ОЗ Q4 | Декодирование | Чтение f | Обработка | Запись в dest | Пример: MOVF REG,0,0 До выполнения команды REG = 22h W = FFh После выполнения команды REG = 22h W = 22h MOVFF Move f to f Синтаксис: movff fs,fD Операнды: 0 й fs < 4095 0 < fD < 4095 Действие: Влияние: (fs) —* fo Нет Кодировка: 1100 ffff ffff ffffs (2 слова) 1111 ffff ffff ffffD Описание: Содержимое регистра-источника fs перемещается в ре- гистр-приемник fD. Расположение обоих регистров может быть произвольным в пространстве от 000h до FFFh. Как источник, так и приемник может быть представлен регист- ром W (полезная особая ситуация, когда при перемеще- нии данных не меняются никакие флаг-биты). 338
Набор команд Команда может быть полезна для перемещения содер- жимого ячеек ОЗУ в регистры периферии, такие как буфер передачи или порт ввода/вывода. Команда не может обращаться к регистрам PCL, TOSU, TOSH или TOSL в качестве приемника. Слова: 2 Циклы: 2 По тактам: Q1 Q2 Q3 Q4 Декодирование Чтение источника Обработка Нет операции Декодирование Нет операции Нет операции Запись в приемник Пример: movff regi,reg2 До выполнения команды REG1 = 33h REG2- 11h После выполнения команды REG1 = 33h REG2 = 33h MOVLB Move Literal to Low Nibble in BSR Синтаксис: MOVLB к Операнды: 0 < к < 255 Действие: Влияние: Кодировка: Описание: k>BSR Нет I 0000 I 0001 ( kkkk | кккк | 8-битная константа к загружается в регистр выбора банка BSR. Значение разрядов BSR<7:4> всегда остается рав- ным 0, независимо от значения к<7:4>. Слова: 1 Циклы: 1 По тактам: Q1 Q2 Q3 Q4 Декодирование | Чтение к | Обработка | Запись в BSR Пример: MOVLB 5 До выполнения команды BSR = 02h После выполнения команды BSR = 05h MOVLW Синтаксис: Операнды: Действие: Move Literal to W MOVLW k 0 < k < 255 k^ W 339
Глава 3 Влияние: Нет Кодировка: | 0000 I 1110 I kkkk | kkkk | Описание: 8-битная константа записывается в W. Слова: 1 Циклы: По тактам: 1 Q1 Q2 ОЗ Q4 I Декодирование | Чтение к | Обработка | Запись в W | Пример: MOVLW 5Ah После выполнения команды W - 5Ah MOVWF Move W to f Синтаксис: MOVWF f{,a} Операнды: 0 < f < 255 ae [0,1] Действие: (W)—>f Влияние: Нет Кодировка: I ОНО I Illa j ffff [ ffff I Описание: Перенос данных из W в регистр f. Расположение f может быть любым в пределах 256-байтного банка. Если а = 0, выбран банк доступа. Если а = 1, используется BSR для выбора банка памяти (по умолчанию). Если а = 0 и включена поддержка расширенного набора команд, эта команда работает в режиме индексированного адресного смещения, где f < 95 (5Fh). Слова: Циклы: По тактам: 1 1 01 Q2 Q3 Q4 | Декодирование | Чтение f | Обработка | Запись f | Пример: MOVWF REG,0 До выполнения операции W = 4Fh REG = FFh После выполнения операции W - 4Fh REG = 4Fh MULLW Multiply Literal with W Синтаксис: MULLW k Операнды: 0 < k < 255 Действие: (W) x k — PRODH:PRODL Влияние: Нет Кодировка: j 0000 j 1101 I kkkk | kkkk | Описание: Беззнаковое перемножение содержимого W и константы k. 16-разрядный результат помещается в регистровую па- ру PRODH:PRODL. Содержимое W не изменяется. Ника- кие флаги статуса не меняются. При этой операции ни пе- 340
Набор команд ренос, ни переполнение невозможны. Нулевой результат возможен, но не детектируется. Слова: Циклы: По тактам: Q1 1 1 Q2 Q3 Q4 Декодирование Чтение к Обработка Запись пары PRODH:PRODL Пример: MULLW 0C4h До выполнения команды W - E2h PRODH = ? PRODL = ? После выполнения команды W = E2h PRODH = ADh PRODL = 08h MULWF Multiply W with f Синтаксис: mulwf f{,a} Операнды; 0 f < 255 a e [0,1] Действие: (W) x (f) -> PRODH:PRODL Влияние: Нет__________________________________________ Кодировка: | 0000 | 001а | ffff | ffff | Описание: Беззнаковое перемножение содержимого аккумулятора W и регистра f. 16-разрядный результат сохраняется в реги- стровой паре PRODH:PRODL. Содержимое W и f не изме- няется. Никакие флаги статуса не меняются. При этой операции ни перенос, ни переполнение невозможны. Ну- левой результат возможен, но не детектируется. Если а = 0, выбран банк доступа. Если а = 1, используется BSR для выбора банка памяти (по умолчанию). Если а = 0 и включена поддержка расширенного набора команд, эта команда работает в режиме индексированного адресного смещения, где f < 95 (5Fh). Слова: Циклы: По тактам: Q1 1 1 Q2 Q3 Q4 Декодирование Чтение f Обработка Запись пары PRODH:PRODL Пример: mulwf reg, 1 До выполнения команды W = C4h REG = B5h PRODH = ? 341
Гпава 3 PRODL = ? После выполнения команды W = C4h REG - B5h PRODH = 8Ah PRODL = 94h NEGF Negate f Синтаксис: NEGF f{,a} Операнды: 0 < f < 255 ae[0,1] Действие: (f) + 1-f Влияние: N, OV, C, DC, Z Кодировка: | QUO | 110a j ffff | ffff | Описание: Инверсия f с использованием двоичного дополнения. Ре- зультат помещается в 1. Если а = 0, выбран банк доступа. Если а = 1, используется BSR для выбора банка памяти (по умолчанию). Если а = 0 и включена поддержка расширенного набора команд, эта команда работает в режиме индексированного адресного смещения, где f < 95 (5Fh). Слова: 1 Циклы: По тактам: 1 Q1 Q2 Q3 Q4 | Декодирование | Чтение f | Обработка | Запись f | Пример: NEGF REG,1 До выполнения команды REG = 0011 1010 £3Ah] После выполнения команды REG = 1100 0110 [C6h] NOP No Operation Синтаксис: Операнды: Действие: Влияние: NOP Нет Нет Нет Кодировка: 0000 0000 0000 0000 (2 варианта) 1111 хххх хххх хххх Описание: Слова: Циклы: По тактам: Q1 Нет операции. 1 1 Q2 Q3 Q4 [ Декодирование | Нет операции | Нет операции | Нет операции | Пример: NOP 342
Набор команд POP Pop Top of Return Stack Синтаксис: POP Операнды: Нет Действие: (TOS) ->• bit bucket («мусорная корзинка» для битов) Влияние: Нет Кодировка: I 0000 0000 | 0000 I оно [ Описание: Значение TOS выталкивается из стека и теряется. На его место приходит предыдущее значение, которое было по- мещено в стек возврата. Эта команда способствует пра- вильному управлению стеком при организации программ- ного стека. Слова: 1 Циклы: По тактам: 1 Q1 Q2 Q3 Q4 | Декодирование | Нет операции | Сдвиг из TOS | Нет операции | Пример: POP GOTO NEW До выполнения команды TOS = 0031A2h Stack (1 уровень ниже) = 014332h После выполнения команды TOS = 014332h Stack = новое значение PC = новое значение PUSH Синтаксис: Push Top of Return Stack PUSH Операнды: Нет Действие: (РС+2) TOS Влияние: Кодировка: Нет I 0000 | 0000 -I 0000 | 0101 I Описание: Значение РС+2 помещается в вершину стека возврата. Предыдущее значение TOS смещается на один уровень ниже. Команда позволяет реализовать программный стек путем модификации TOS и затем сдвига значения в стек Слова: Циклы: По тактам: Q1 возврата. 1 1 Q2 Q3 Q4 Декодирование Запись РС+2 ! в стек возврата | Нет операции Нет операции Пример: push До выполнения команды TOS = 345Ah 343
Гпава3 PC = 0124h После выполнения команды PC = 0126h TOS = 0126h Stack (1 уровень ниже) = 345Ah RCALL Relative Call Синтаксис: rcall n Операнды: -1024 < n < 1023 Действие: (PC) + 2 -> TOS (PC) + 2 + 2n PC Влияние: Нет___________________________________________ Кодировка: I 1101 [ Innn I nnnn [ nnnn ( Описание: Вызов подпрограммы с переходом более чем на 1К от те- кущего положения. Сначала адрес возврата (PC + 2) по- мещается в стек. Затем двоично дополненное значение 2п прибавляется к программному счетчику. Поскольку к этому моменту PC содержит адрес следующей команды, новым адресом будет PC + 2 + 2п. Команда выполняется за два цикла. Слова: 1 Циклы: 2 По тактам: Q1 Q2 Q3 Q4 Декодирование Чтение п Загрузка PC в стек Обработка Запись в PC Нет операции Нет операции Нет операции Нет операции Пример: HERE RCALL Jump До выполнения команды PC = адрес (HERE) После выполнения команды PC = адрес (Jump) TOS = адрес (HERE + 2) RESET Reset Синтаксис: RESET Операнды: Нет Действие: Сброс всех регистров и флагов в состояние, соответст- вующее сбросу по MCLR. Влияние: Все флаги Кодировка: I 0000 | 0000 [ 1111 | 1111 I Описание: Команда позволяет программным методом выполнить сброс микроконтроллера, эквивалентный сбросу по MCLR. Слова: Циклы: 1 По тактам: 344
Набор команд Q1 Q2 Q3 Q4 | Декодирование | Начало сброса | Нет операции | Нет операции | Пример: RESET RETFIE____________Return from Interrupt_________________________________ Синтаксис: retfie {s} Операнды: s g [0,1] Действие: (TOS) PC 1 — GIE/GIEH или PEIE/GIEL если s- 1 (WS) W (STATUSS) Status (BSRS) -+ BSR PCLATU, PCLATH не изменяются Влияние: GIE/GIEH, PEIE/GIEL___________________________ Кодировка: f~ooo"o |~dooo | oooi |ooos | Описание: Возврат из прерывания. Стек сдвигается, и значение вершины стека (TOS) выгружается в счетчик команд. Пре- рывания разрешаются установкой бита глобального раз- решения прерываний с высоким или низким приоритетом. Если s = 1, содержимое фоновых регистров переносится в соответствующие рабочие регистры. По умолчанию s = 0. Слова: 1 Циклы: 2 По тактам: Q1 Q2 Q3 Q4 Декодирование Нет операции Нет операции Загрузка PC из стека, установка GIEH или GIEL Нет операции Нет операции Нет операции Нет операции Пример: retfie 1 После выполнения команды PC = TOS W = WS BSR = BSRS Status = STATUSS GIE/GIEH, PEIE/GIEL =1 RETLW Return Literal to W Синтаксис: retlw k Операнды: 0 < k 255 Действие: k -> W (TOS) -> PC PCLATU, PCLATH не изменяются Влияние: Нет Кодировка: j 0000 | 1100 | kkkk" ~ | kkkk | 345
Глава 3 Описание: В аккумулятор W загружается 8-битная константа к. В программный счетчик загружается адрес возврата. Зна- чение старшего регистра адреса PCLATH не изменяется. Команда часто применяется для табличной перекодировки. Слова: 1 Циклы: 2 По тактам: Q1 Q2 Q3 Q4 Декодирование Чтение к Обработка Загрузка PC из стека, запись W Нет операции Нет операции Нет операции Нет операции Пример: CALL TABLE ; И содержит таблицу ; значений, соответству- ; ющих смещению TABLE ADDWF PCL ; PC = PC + W RETLW kO ; начало таблицы RETLW kl RETLW kn ; конец таблицы До выполнения команды W = 07h После выполнения команды W = значение к, соответствующее заданному ранее сме- щению. RETURN Return from Subroutine Синтаксис: RETURN {s} Операнды: SE [0,1] Действие: (TOS) PC, если s = 1 (WS) - W (STATUSS) -» Status (BSRS) BSR PCLATU, PCLATH не изменяются Влияние: Нет Кодировка: Описание: I 0000 I 0000 I 0001 ) 001s [ Возврат из подпрограммы. Стек сдвигается, и значение вершины стека (TOS) выгружается в счетчик команд. Если s = 1, содержимое фоновых регистров переносится в со- ответствующие рабочие регистры. По умолчанию s = 0. Слова: 1 Циклы: 2 По тактам: 346
Набор команд Q1 Q2 Q3 Q4 Декодирование Нет операции Обработка Загрузка PC из стека Нет операции Нет операции Нет операции Нет операции Пример: return После выполнения команды PC = TOS RLCF Rotate Left f through Carry Синтаксис: RLCF f{,d{,a}} Операнды: 0 < f < 255 de [0,1] а е [0,1] Действие: (f<n>) —»dest<n+1> (f<7>) - C (C) -♦ dest<0> Влияние: C,N,Z Кодировка: I 0011 [ Olda [ ffff I ffff I Описание: Содержимое регистра f сдвигается на один бит влево че- рез флаг переноса. Если d = 0, результат сохраняется в W. Если d = 1, результат сохраняется обратно в исходный регистр (по умолчанию). Если а - 0, выбран банк доступа. Если а = 1, используется BSR для выбора банка памяти (по умолчанию). Если а = 0 и включена поддержка расширенного набора команд, эта команда работает в режиме индексированного адресного смещения, где f £ 95 (5Fh). Слова: 1 Циклы: По тактам: 1 Q1 Q2 Q3 Q4 | Декодирование | Чтение f | Обработка | Запись в dest | Пример: RLCF REG,0,0 До выполнения команды REG = 11100110 С = 0 После выполнения команды REG = 11100110 W = 1100 1100 С = 1 RLNCF Синтаксис: Операнды: Rotate Left f (No Carry) RLNCF f{,d{,a}} 0 < f < 255 de [0,1] ae [0,1] 347
Гпава 3 Действие: (f<n>) -> dest<n+1 > (f<7>) -> dest<0> Влияние: N,Z Кодировка: I 0100 I Olda I ffff I ffff I Описание: Содержимое регистра f сдвигается на один разряд влево. Если d = 0, результат сохраняется в W. Если d = 1, ре- зультат сохраняется обратно в исходный регистр (по умолчанию). Если а = 0, выбран банк доступа. Если а = 1, используется BSR для выбора банка памяти (по умолчанию). Если а = 0 и включена поддержка расширенного набора команд, эта команда работает в режиме индексированного адресного смещения, где f < 95 (5Fh). Слова: 1 Циклы: По тактам: 1 Q1 Q2 Q3 Q4 | Декодирование | Чтение f | Обработка | Запись в dest | Пример: RLNCF REG,1,0 До выполнения команды REG = 1010 1011 После выполнения команды REG = 0101 0111 RRCF Rotate Right f through Carry Синтаксис: RRCF f{,d{,a}} Операнды: 0 < f < 255 de [0,1] ac [0,1] Действие: (f<n>) dest<n-1> (f<0>) -> C (C) ->dest<7> Влияние: C, N, Z Кодировка: I 0011 ] OOda I ffff j ffff ~| Описание: Содержимое регистра f сдвигается на один бит вправо через флаг переноса. Если d = 0, результат сохраняется в W. Если d = 1, результат сохраняется обратно в исходный регистр (по умолчанию). Если а = 0, выбран банк доступа. Если а = 1, используется BSR для выбора банка памяти (по умолчанию). Если а = 0 и включена поддержка расширенного набора команд, эта команда работает в режиме индексированного адресного смещения, где f < 95 (5Fh). Слова: 1 Циклы: По тактам: 1 348
Набор команд Q1 Q2 ОЗ 04 | Декодирование | Чтение f Обработка | Запись в dest | Пример: RRCF REG,0,0 До выполнения команды REG = 1110 0110 С-0 После выполнения команды REG-11100110 W = 0111 0011 С = 0 RRNCF Rotate Right f (no Carry) Синтаксис: RRNCF f{,d{,a}} Операнды: 0 < f < 255 de [0,1] a g [0,1] Действие: (fcn>) dest<n-1> (f<0>) —> dest<7> Влияние: N,Z Кодировка: I 0100 I OOda j ffff I ffff { Описание: Содержимое регистра f сдвигается на один бит вправо. Если d = 0, результат сохраняется в W. Если d = 1, ре- зультат сохраняется обратно в исходный регистр (по умолчанию). Если а = 0, выбран банк доступа. Если а = 1, используется BSR для выбора банка памяти (по умолчанию). Если а = 0 и включена поддержка расширенного набора команд, эта команда работает в режиме индексированного адресного смещения, где f £ 95 (5Fh). Слова: 1 Циклы: 1 По тактам: Q1 Q2 Q3 Q4 | Декодирование | Чтение ! | Обработка | Запись в dest Пример: RRNCF REG,0,0 До выполнения команды REG = 1101 0111 После выполнения команды REG-11101011 SETF Setf Синтаксис: SETF f{,a} Операнды: 0< f < 255 ae [0,1] Действие: FFh —f Влияние: Нет 349
Гпава 3 Кодировка: | 0110 | 100а | ffff | ffff [ Описание: Содержимое указанного регистра устанавливается в FFh. Если а = 0, выбран банк доступа. Если а = 1, используется BSR для выбора банка памяти (по умолчанию). Если а = 0 и включена поддержка расширенного набора команд, эта команда работает в режиме индексированного адресного смещения, где f < 95 (5Fh). Слова: 1 Циклы: 1 По тактам: Q1 Q2 Q3_______________Q4 |"Декодирование | Чтение! | Обработка | Запись вf | Пример: SETF REG.1 До выполнения команды REG = 5Ah После выполнения команды REG = FFh SLEEP Enter Sleep mode Синтаксис: Операнды: Действие: SLEEP Нет OOh —> WDT 0 -♦ постделитель WDT 1 -^TO 0 —PD Влияние: IQ, PD t, Кодировка: Описание: |~ 0000 I 0000 I 0000 I 0011 I Сбрасывается бит PD (Power-Down). Устанавливается бит тайм-аута TO (Time-Out). Сторожевой таймер и его по- стделитель обнуляются. Процессор переходит в режим Sleep с остановом тактового генератора. Слова: 1 Циклы: 1 По тактам: Q1 Q2 Q3 Q4 | Декодирование | Нет операции | Обработка | Переход в Sleep | Пример: SLEEP SCIBFWB Subtract f from W with borrow Синтаксис: subfwb f{,d{,a}} Операнды: 0 £ f £ 255 de [0,1] ae [0,1] Действие: (W) - (f) - (C) —> dest Влияние: N, OV, C, DC, Z ________________ Кодировка: | 0Ю1 | Olda [ ffff | ffff ~| 350
Набор команд Описание: Вычитание значения регистра f и инвертированного зна- чения флага переноса С (заем) из аккумулятора W (метод двоичного дополнения). Если d = 0, результат сохраняет- ся в W. Если d = 1, результат сохраняется обратно в ис- ходный регистр (по умолчанию). Если а = 0, выбран банк доступа. Если а = 1, используется BSR для выбора банка памяти (по умолчанию). Если а = 0 и включена поддержка расширенного набора команд, эта команда работает в режиме индексированного адресного смещения, где f < 95 (5Fh). Слова: 1 Циклы: 1 По тактам: Q1 Q2 Q3 Q4 ! Декодирование | Чтение f | Обработка | Запись в dest | Пример 1 : SUBFWB REG,1,0 До выполнения команды REG = 3 W = 2 С = 1 После выполнения команды REG = FF W = 2 С = 0 Z = 0 N = 1 ; результат отрицательный Пример 2: SUBFWB REG,0,0 До выполнения команды REG = 2 W = 5 С = 1 После выполнения команды REG = 2 W = 3 С = 1 Z = 0 N = 0; результат положительный Пример 3: SUBFWB REG,1,0 До выполнения команды REG = 1 W =2 С = 0 После выполнения команды REG = 0 W = 2 С = 1 Z = 1 ; результат нулевой N = 0 351
Глава 3 SUBLW Subtract W from Literal Синтаксис: SUblw k Операнды: 0 < k < 255 Действие: k - (W) W Влияние: N, OV, C, DC, Z _______________ Кодировка: I 0000 [~1000 | kkkk~ I kkkk | Описание: Значение W вычитается из восьмибитной константы к. Результат помещается в W. Слова: 1 Циклы: 1 По тактам: ________Q1________________Q2 _____________Q3 _______________Q4 | Декодирование | Чтение к | Обработка | Запись в W ~| Пример1: SUblw 02h До выполнения команды W = 01h С = ? После выполнения команды W =01h С = 1 ; результат положительный Z = 0 N = 0 Пример 2: SUblw 02h До выполнения команды W = 02h С = ? После выполнения команды W = 00h С = 1 Z = 1 ; результат нулевой N = 0 Пример 3: SUblw 02h До выполнения команды W = 03h С = ? После выполнения команды W = FFh (двоичное дополнение) С = 0 z = o N = 1 ; результат отрицательный SUBWF Subtract W from f Синтаксис: SUBWF f{,d{,a}} Операнды: 0 < f < 255 de [0,1] ae [0,1] 352
Набор команд Действие: (f) - (W) -> dest Влияние: N, OV, С, DC, Z________________ Кодировка: | 0101 |~lida~ ~ |~ff~ff |~fJfF ~ | Описание: Вычитание W из регистра f (метод двоичного дополне- ния). Если d = 0, результат сохраняется в W. Если d = 1, результат сохраняется обратно в исходный регистр (по умолчанию). Если а = 0, выбран банк доступа. Если а = 1, используется BSR для выбора банка памяти (по умолчанию). Если а = 0 и включена поддержка расширенного набора команд, эта команда работает в режиме индексированного адресного смещения, где f 5 95 (5Fh). Слова: 1 Циклы: 1 По тактам: _______01_______________Q2_______________Q3 _____________Q4 | Декодирование | Чтениеf | Обработка | Запись в dest 1 Пример 1: SUBWF reg,1,О До выполнения команды REG-3 W = 2 С = ? После выполнения команды REG -1 W -2 С = 1 ; результат положительный Z = 0 N = 0 Пример2: subwf reg,о,о До выполнения команды REG = 2 W = 2 С = ? После выполнения команды REG = 2 W -0 С = 1 Z = 1 ; результат нулевой N = 0 Пример 3: subwf reg,1,0 До выполнения команды REG - 1 W -2 С = ? После выполнения команды REG = FFh (двоичное дополнение) W = 2 353
Глава 3 С = 0 Z = 0 N - 1 ; результат отрицательный SUBWFB Subtract W from f with Borrow Синтаксис: SUBWFB f{,d{, a)} Операнды: 0 < f< 255 de [0,1] ae [0,1] Действие: (f) - (W) - (C) -+ dest Влияние: N, OV, C, DC, Z Кодировка: | 0101 1 IQda I ffff I ffff I Описание: Вычитание значения W и флага переноса (заема) из реги- стра f (метод двоичного дополнения). Если d = 0, резуль- тат сохраняется в W. Если d = 1, результат сохраняется обратно в исходный регистр (по умолчанию). Если а - 0, выбран банк доступа. Если а = 1, используется BSR для выбора банка памяти (по умолчанию). Если а = 0 и включена поддержка расширенного набора команд, эта команда работает в режиме индексированного адресного смещения, где f < 95 (5Fh). Слова: 1 Циклы: По тактам: Q1 Q2 Q3 Q4 Декодирование | Чтение f | Обработка | Запись в dest Пример 1: SUBWFB REG,1,0 До выполнения команды REG = 19h (0001 1001) W = ODh (0000 1101) С = 1 После выполнения команды REG = 0Ch (0000 1011) W - ODh (0000 1101) С = 1 Z = 0 N = 0 ; результат положительный Пример 2: SUBWFB REG,0,0 До выполнения команды REG = 1Bh (0001 1011) W = 1Ah (0001 1010) С = 0 После выполнения команды REG = 1 Bh W = 00h C = 1 354
Набор команд Пример 3: Z - 1 ; результат нулевой N = 0 SUBWFB REG,1,0 До выполнения команды REG = 03h (0000 0011) W = OEh С = 1 После выполнения команды REG = F5h (1111 0100) - двоичное дополнение W -OEh С = 0 Z = 0 N = 1 ; результат отрицательный SWAPF Swap f Синтаксис: SWAPF f{,d{,a}} Операнды: 0 < f < 255 de [0,1] a g [0,1] Действие: (f<3:0>) —> dest<7:4> (f<7:4>) -> dest<3:0> Влияние: Нет Кодировка: I ООН I lOda I ffff ; ffff I Описание: Старший и младший полубайты в регистре f меняются местами. Если d = 0, результат сохраняется в W. Если d = 1, результат сохраняется обратно в исходный регистр (по умолчанию). Если а = 0, выбран банк доступа. Если а = 1, используется BSR для выбора банка памяти (по умолчанию). Если а = 0 и включена поддержка расширенного набора команд, эта команда работает в режиме индексированного адресного смещения, где f 2 95 (5Fh). Слова: 1 Циклы: По тактам: 1 Q1 Q2 Q3 Q4 [ Декодирование | Чтение f | Обработка | Запись в dest | Пример: SWAPF REG,1,0 До выполнения команды REG = 53h После выполнения команды REG = 35h Примечание: приведенное далее описание команд табличного чтения и таб- личной записи для наглядности условно сведено в две таблицы, TBLRD и TBLWT, хотя формально различные варианты синтаксиса считаются разны- ми командами. 355
Гпава 3 TBLRD Table Read Синтаксис: TBLRD) Операнды: Нет Действие: Если TBLRD* (ProgMem(TBLPTR)) -+ TABLAT; TBLPTR - не меняется; Если TBLRD*+ (ProgMem(TBLPTR)) -+ TABLAT; (TBLPTR) + 1 -> TBLPTR; Влияние: Если TBLPTR*- (ProgMem(TBLPTR)) -+ TABLAT; (TBLPTR) - 1 — TBLPTR; Если TBLRD+* (TBLPTR) + 1 TBLPTR; (ProgMem(TBLPTR)) -> TABLAT; Нет Кодировка: 0000 0000 0000 Юпп nn = 0 * nn - 1 * + nn = 2 *- nn - 3 +* Описание: Команда применяется для чтения содержимого памяти программ. Для обращения к памяти программ использует- ся табличный указатель TBLPTR. Табличный указатель имеет разрядность 21 бит и может указывать на каждый байт памяти программ в диапазоне адресов 2Мб. TBLPTRfO] = 0: младший значащий байт слова памяти программ. TBLPTR[1] = 1: старший значащий байт слова памяти про- грамм. Команда TBLRD может модифицировать указатель TBLPTR следующим образом: - без изменения - постинкремент - постдекремент - преинкремент Слова: 1 Циклы: 2 По тактам: ________01_______________Q2_______________03________________04________ Декодирование Нет операции Нет операции Нет операции Нет операции Нет операции (чтение памяти программ) Нет операции Нет операции (запись TABLAT) 356
Набор команд Пример 1: TBLRD *+ До выполнения команды TABLAT = 55h TBLPTR = 00A356h MEMORY(OOA356h) = 34h После выполнения команды TABLAT = 34h TBLPTR - 00A357h Пример 2: TBLRD +* До выполнения команды TABLAT = AAh TBLPTR = 01 A357h MEMORY(01A357h) = 12h MEMORY(01 A358h) = 34h После выполнения команды TABLAT = 34h TBLPTR = 01 A358h Table Write TBLWT Синтаксис: Операнды: Действие: TBLWT (*;*+;*-;+*) Нет Если TBLWT* (TABLAT) -+ Регистр временного хранения TBLPTR - не меняется; Если TBLWT4 (TABLAT) —> Регистр временного хранения (TBLPTR)+1 TBLPTR; Если TBLWT*- (TABLAT) Регистр временного хранения (TBLPTR) - 1 -+ TBLPTR; Влияние: Кодировка: Если TBLWT+* (TBLPTRJ+1 TBLPTR (TABLAT) Регистр временного хранения Нет ________________________________ 0000 0000 0000 linn nn = 0 * nn = 1 *+ nn = 2 *- nn = 3 +* Команда использует 3 младших разряда TBLPTR для оп- ределения, в какой из 8 временных регистров произво- дится запись. Регистры временного хранения используют- ся для записи в память программ. Описание: 357
Гпава 3 21-разрядный указатель TBLPTR адресует каждый байт памяти программ в диапазоне 2МЬ. Младший разряд TBLPTRfO] выбирает, к какому байту слова в памяти про- грамм производится обращение. TBLPTR[0] = 0 - Младший байт слова в памяти программ TBLPTR[0] = 1 - Старший байт слова в памяти программ. Команда может может модифицировать указатель TBLPTR следующим образом: - без изменения - постинкремент - постдекремент - преинкремент Слова: 1 Циклы: 2 По тактам: ________01_______________02_______________Q3________________04 Декодирование Нет операции Нет операции Нет операции Нет операции Нет операции (чтение TABLAT) Нет операции Нет операции (Запись в ре- гистр временно- го хранения) | Пример 1: tblwt * + До выполнения команды TABLAT - 55h TBLPTR = 00A356h Регистр временного хранения (00A356h) = FFh После выполнения команды (завершение табличной за- писи) TABLAT = 55h TBLPTR = 00A357h Регистр временного хранения (00A356h) = 55h Пример 2: tblwt +* До выполнения команды TABLAT = 34h TBLPTR = 01389Ah Регистр временного хранения (01389Ah) = FFh Регистр временного хранения (01389Bh) = FFh После выполнения команды (завершение табличной за- писи) TABLAT = 34h TBLPTR = 01389Bh Регистр временного хранения (01389Ah) = FFh Регистр временного хранения (01389Bh) = 34h TSTFSZ Test f, Skip if 0 Синтаксис: TSTFSZ f{,a} 358
Набор команд Операнды: 0 f 255 а е [0,1] Действие: переход через команду, если f = 0 Влияние: Нет Кодировка: j ОНО | Olla | ffff j ffff | Описание: Если f = 0, следующая команда, захваченная ранее, игно- рируется и вместо нее выполняется пустая операция. Если а = 0, выбран банк доступа. Если а = 1, используется BSR для выбора банка памяти (по умолчанию). Если а = 0 и включена поддержка расширенного набора команд, эта команда работает в режиме индексированного адресного смещения, где f < 95 (5Fh) Слова: 1 Циклы: 1(2) По тактам: Q1 Q2 ОЗ Q4 | Декодирование | Чтение! Обработка | Нет операции | Если переход Q1 Q2 Q3 Q4 | Нет операции I Нет операции Нет операции Нет операции [ Если переход и следующая команда из 2-х слов Q1 Q2 Q3 04 Нет операции Нет операции Нет операции Нет операции Нет операции Нет операции Нет операции Нет операции Пример: HERE TSTFSZ CNT,1 NZERO ZERO До выполнения команды PC = адрес (HERE) После выполнения команды Если CNT = 00h PC = адрес (ZERO) Если CNT * 00h PC = адрес (NZERO) XORLW Exclusive OR Literal with W Синтаксис: XORLW k Операнды: 0 < k < 255 Действие: (W).XOR.k—>W Влияние: Кодировка: N, Z _____ , I 0000 I 1010 I kkkk I kkkk ~| Описание: Операция «Исключающее ИЛИ» между W и константой к. Результат всегда помещается в W Слова: Циклы: По тактам: 359
Гпава 3 Q1 Q2 Q3 Q4 | Декодирование | Чтение к | Обработка | Запись в W | Пример: XORLW OAFh До выполнения команды W = B5h После выполнения команды W = 1 Ah XORWF Exclusive OR W with f Синтаксис: XORWF f',d{,a}} Операнды: 0 < f < 255 de [0,1] ае [0,1] Действие: (W).XOR.(f) dest Влияние: N, Z Кодировка: [ 0001 I lOda I ffff I ffff I Описание: Операция «Исключающее ИЛИ» между W и регистром f. Если d = 0, результат сохраняется в W. Если d - 1, ре- зультат сохраняется обратно в исходный регистр (по умолчанию). Если а = 0, выбран банк доступа. Если а = 1, используется BSR для выбора банка памяти (по умолчанию). Если а = 0 и включена поддержка расширенного набора команд, эта команда работает в режиме индексированного адресного смещения, где f < 95 (5Fh). Слова: Циклы: По тактам: 1 1 Q1 Q2 Q3 Q4 | Декодирование Чтение f | Обработка | Запись в dest | Пример: XORWF REG,1,0 До выполнения команды REG = AFh W = B5h После выполнения команды REG = 1Ah W = B5h Расширенный набор команд В дополнение к 75 стандартным командам PIC18, микроконтроллеры PIC18F2455/2550/4455/4550 имеют опциональное расширение функциональности ядра ЦПУ. Дополнительные опции состоят из восьми команд, дополняющих на- бор операций с косвенной и индексной адресацией и реализующих индексную литеральную относительную адресацию (Indexed Literal Offset Addressing) для большинства стандартных команд PIC18. По умолчанию дополнительный набор команд отключен. Для включения необ- ходимо установить бит конфигурации XINST. 360
Набор команд Все команды расширенного набора могут быть классифицированы, как литераль- ные операции, которые либо манипулируют регистрами-указателями FSR, либо ис- пользуют их для индексной адресации. Две команды, ADDFSR и SUBFSR, имеют до- полнительную специальную реализацию для использования FSR2. Эти версии (ADDULNK и SUBULNK) допускают автоматический возврат после выполнения. Команды расширенного набора разработаны специально для оптимизации повторно используемого кода (такого, как рекурсивный или использующий про- граммный стек), написанного на языках высокого уровня, особенно С. Кроме того, они позволяют пользователю, работающему с языками высокого уровня, более эффективно реализовать некоторые операции со структурами данных. А именно: • динамическое закрепление и освобождение программного стека при входе в подпрограмму и выходе из нее; • вызов указателя функции; • манипуляции с указателем программного стека; • манипуляции с переменными в программном стеке. Сводный перечень команд из расширенного набора приведен в табл. 3.3. Да- лее приводится их подробное описание. Расширение набора команд и режим индексной литеральной относитель- ной адресации были разработаны специально для оптимизации приложений, написанных на С. Вероятнее всего, пользователь не будет использовать эти команды непосредственно в ассемблере. По этой причине синтаксис команд приводится лишь для сведения пользователей, которые будут просматри- вать код, сгенерированный компилятором. Синтаксис расширенных команд В большинстве расширенных команд используется индексный аргумент, ис- пользующий один из регистров-указателей FSR, и некоторый сдвиг, определяю- щий источник или приемник. Когда аргумент для команды является частью ин- дексной адресации, он заключается в квадратные скобки «[]». Этого достаточно, чтобы указать, что аргумент используется, как индекс или смещение. Ассемблер MPASM будет генерировать ошибку, если определит, что индекс или сдвиг не заключен в квадратные скобки. Когда включен расширенный набор команд, квадратные скобки также исполь- зуются для выделения индексных аргументов в байтовых или битовых командах. Это дополняет остальные изменения их синтаксиса. И, наконец, следует отме- тить, что раньше квадратные скобки использовались для указания необяза- тельных аргументов в командах семейства PIC18 и более ранних. Теперь мы используем для необязательных аргументов фигурные скобки «{}». Таблица 3.3 Расширение набора команд PIC18 Мнемоника и операнды Описание Циклы 16-битное слово команды Влияние на биты статуса Байтовые операции ADDFSR f, k ADDULNK k Сложить константу и FSR Сложить константу и FSR и возврат 1 2 1110 1000 ffkk kkkk 1110 1000 Hkkkkkk Нет Нет 361
Гпава 3 Мнемоника и операнды Описание Циклы 16-битное слово команды Влияние на биты статуса CALLW Вызов подпрограммы, используя WREG 2 0000 0000 0001 0100 Нет MOVSF zs, fa Перенос содержимого zs (источник) в fd (приемник) 2 1110 1011 Ozzz zzzz 1111 ffff ffff ffff Нет MOVSS zs, fd Перенос содержимого zs (источник) в fd (приемник) 2 1110 1011 izzzzzzz 1111 xxxx xzzz zzzz Нет PUSHLk Сохранить константу в FSR2, декремент FSR2 1 1110 1010 kkkk kkkk Нет SUBFSRf, k Вычитание константы из FSR 1 1110 1001 ffkk kkkk Нет SUBULNK k Вычитание константы из FSR2 и возврат. 2 1110 1001 Hkkkkkk Нет Описание расширенного набора команд ADDFSR Add Literal to FSR Синтаксис: ADDFSR f,k Операнды: 0 < k < 63 f e [0,1,2] Действие: FSR(f) + k — FSR(f) Влияние: Нет Кодировка: Описание: I 1110 I 1000 [ ffkk I kkkk | 6-разрядная константа k прибавляется к содержимому FSR, который определен значением f. Слова: Циклы: По тактам: Q1 Q2 ОЗ Q4 | —Декодирование" | Чтение к | Обработка | Запись в FSR Пример: ADDFSR 2,23h До выполнения команды FSR2 = 03FFh После выполнения команды FSR2 = 0422h ADDULNK Add Literal to FSR2 and Return Синтаксис: ADDULNK k Операнды: Действие: 0 < k < 63 FSR2 + k -> FSR2 (TOS) -> PC Влияние: Нет Кодировка: I 1110 I 1000 I llkk I kkkk [ Описание: 6-разрядная константа k прибавляется к содержимому FSR2. Затем выполняется RETURN путем загрузки про- граммного счетчика из стека. 362
Набор команд Команда занимает два цикла; во втором цикле исполняет- ся NOP. Эта команда является специальным случаем предыдущей ADDFSR, где f - 3 (двоичное 11) и работает только с FSR2. Слова: 1 Циклы: 2 По тактам: Q1 Q2 Q3 Q4 Декодирование Чтение k Обработка Запись в FSR Нет операции Нет операции Нет операции Нет операции Пример: ADDULNK 23И До выполнения команды FSR2 = 03FFh PC = 0100h После выполнения команды FSR2 = 0422h PC = (TOS) CALLW Subroutine Call Using WREG Синтаксис: CALLW Операнды: Нет Действие: (PC + 2) - > TOS (W) PCL (PCLATH) -> PCH (PCLATU) PCU Влияние: Нет Кодировка: I 0000 I 0000 I 0001 ] 0100 { Описание: Прежде всего, адрес возврата записывается в стек. Да- лее, содержимое аккумулятора W записывается в PCL, существующее значение уничтожается. Содержимое PCLATH и PCLATU записывается в РСН и PCU соответ- ственно. Второй цикл исполняется, как NOP, пока захва- тывается следующая команда. В отличие от CALL, здесь нет возможности обновить W, Status или BSR. Слова: 1 Циклы: По тактам: 2 Q1 Q2 Q3 Q4 Декодирование Чтение WREG Сдвиг PC в стек Нет операции Нет операции Нет операции Нет операции Нет операции Пример: here callw До выполнения команды PC = address (HERE) PCLATH = 1 Oh PCLATU = OOh 363
Гпава 3 W = 06h После выполнения команды PC - 001006h TOS = address (HERE + 2) PCLATH = 10h PCLATU = OOh W = 06h MOVSF Синтаксис: Операнды: Действие: Влияние: Move Indexed to f MOVSF [zs],fd 0<zs^ 127 0 < fd < 4095 ((FSR2) + zs)-Hd Нет Кодировка: 1110 1011 Ozzz z zzzs 1111 ffff ffff ffffd Описание: Слова: Циклы: По тактам: Q1 Содержимое регистра-источника перемещается в регистр’ приемник f. Действительный адрес источника определя- ется 7-разрядной константой сдвига zs в первом слове команды относительно значения в FSR2. Адрес приемни- ка определяется 12-разрядной константой fd во втором слове команды. Оба адреса должны быть в пределах 4096 байт данных (000h - FFFh). Команда не может ис- пользовать регистры PCL, TOSU, TOSH или TOSL в каче- стве приемника. Если вычисленный адрес источника ука- зывает на косвенно адресуемый регистр, то возвращае- мым значением будет 00h. 2 2 Q2 ОЗ Q4 Декодирование Определение адреса источника Определение адреса источника Чтение регистра источника Декодирование Нет операции Нет «пустого» чтения Нет операции Запись в регистр f Пример: MOVSF [05h],REG2 До выполнения команды FSR2 = 80h Содержимое ячейки с адресом 85h = 33h REG2 = 11h После выполнения команды FSR2 = 80h Содержимое ячейки с адресом 85h = 33h REG2 = 33h 364
Набор команд MOVSS Move Indexed to Indexed Синтаксис: Операнды: Действие: Влияние: Кодировка; Описание: MOVSS [zs],[zd] 0< zs< 127 0<< 127 ((FSR2) + zs) - ((FSR2) + zd) Нет______________________ 1110 1011 Izzz zzzzs 1111 xxxx xzzz zzzzd Содержимое регистра-источника переносится в регистр- приемник. Адрес источника и приемника вычисляется на основе 7-разрядных значений сдвига zs и zd относительно значения в FSR2. Оба адреса должны быть в пределах 4096 байт данных (OOOh - FFFh). Команда не может использовать регистры PCL, TOSU, TOSH или TOSL в качестве приемника. Если вычисленный адрес источника указывает на косвенно ад- ресуемый регистр, то возвращаемым значением будет 00h. Если вычисленный адрес приемника указывает на косвенно адресуемый регистр, то команда выполняется, как NOP. 2 2 Q3 Q4 Q2 Слова: Циклы: По тактам: ________Q1 Декодирование Определение адреса источника Определение адреса источника Чтение регистра источника Декодирование Определение адреса приемника Определение адреса приемника Запись в регистр приемника Пример: MOVSS [05h],[06h] До выполнения команды FSR2 - 80h Содержимое ячейки с адресом 85h = 33h Содержимое ячейки с адресом 86h = 11h После выполнения команды FSR2 = 80h Содержимое ячейки с адресом 85h = 33h Содержимое ячейки с адресом 86h = 33h PUSHL Синтаксис: Операнды: Действие: Влияние: Store Literal at FSR2, Decrement FSR2 PUSH k 0 < k < 255 k — (FSR2) FSR2- 1 FSR2 Нет 365
Гпава 3 Кодировка: | 1111 | 1010 [ kkkk | kkkk | Описание: 8-разрядная константа записывается в ячейку памяти, на которую указывает FSR2. Значение FSR2 декрементиру- ется после операции. Команда позволяет пользователю поместить значение в программный стек. Слова: 1 Циклы: 1 По тактам: ________Q1_______________Q2_______________Q3_______________Q4_______ | Декодирование | Чтение к | Обработка | Запись в dest ~| Пример: pushl 08h До выполнения команды FSR2H:FSR2L = 01ECh Memory (01 ECh) = 00h После выполнения команды FSR2H:FSR2L = 01EBh Memory (01 ECh) = 08h SUBFSR Subtract Literal from FSR Синтаксис: SUBFSR f,k Операнды: 0 < k < 63 f e [0,1,2] Действие: FSRf - k — FSRf Влияние: Кодировка: Нет | 1110 I 1001 I ffkk I kkkk | Описание: 6-разрядная константа k вычитается из регистра- указателя FSR, номер которого определяется значением f. Слова: 1 Циклы: 1 По тактам: ________QI_______________Q2 ______________Q3 ______________Q4 | Декодирование | Чтение f | Обработка | Запись в dest | Пример: SUBFSR 2.23И До выполнения команды FSR2 = 03FFh После выполнения команды FSR2 = 03DCh SUBULNK Subtract Literal from FSR2 and Return Синтаксис: SUBLNK к Операнды: 0 < к < 63 Действие: FSR2 - к -> FSR2 (ТОЭ) PC Влияние: Кодировка: Нет j 1110 | 1001 [ 11кк | кккк | 366
Набор команд Описание: 6-разрядный литерал к вычитается из содержимого реги- стра FSR2. Затем выполняется RETURN путем загрузки в PC значения из TOS. Команда занимает два цикла, во время второго цикла выполняется NOP. Эта команда может рассматриваться, как специальный случай команды SUBFSR, где f = 3, и работает только с регистром-указателем FSR2. Слова: 1 Циклы: 2 По тактам: ________01________________Q2_______________Q3________________Q4________ Декодирование Чтение f Обработка Запись в dest Нет операции Нет операции Нет операции Нет операции Пример: subulnk 23h До выполнения команды FSR2 = 03FFh PC-0100h После выполнения команды FSR2 = 03DCh PC = (TOS) Байтовые и битовые команды в режиме индексного литерального смещения Внимание! Включение расширенного набора команд PIC18 может привести к тому, что ранее работавшее приложение может начать давать сбои или полностью перестать работать. В дополнение к восьми командам расширенного набора, включение расши- ренного режима также приводит к включению режима индексного литерально- го смещения. Это может повлиять на то, каким образом будут интерпрети- рованы некоторые стандартные команды. Пока расширенный режим отключен, адреса, встроенные в коды команд, об- рабатываются в качестве постоянных адресов памяти: либо как ячейки в банке быстрого доступа (а = 0), либо как регистры общего применения (а - 1). Когда включен расширенный набор и а = 0, то аргумент 5Fh или меньший интерпрети- руется, как сдвиг относительно указателя, находящегося в регистре FSR2. На практике это означает, что все команды, которые используют бит управления доступом к ОЗУ (Access RAM bit) как аргумент - такие, как байтовые и битовые команды, которых больше половины в стандартном наборе ядра Р1С18 - могут вести себя по-разному, когда включен расширенный режим. Причем, что особен- но неприятно, это поведение может быть непредсказуемым и зависеть от кон- кретной ситуации. Когда FSR2 = 00h, то значения требуемых адресов доступа проецируются на их реальные значения. Это явление может быть использовано при создании об- ратно совместимого кода. Если используется этот прием, может потребоваться сохранение значения FSR2 и последующее восстановление при переходе между кодом на С и ассемблерными подпрограммами, с целью сохранения указателя стека. Пользователь также должен постоянно-иметь в виду требования синтакси- 367
Глава 3 са для расширенного набора команд, который описан ниже. Несмотря на то, что режим индексного литерального смещения может быть очень полезен для построения динамического стека и манипуляций с указателем, он также может быть очень неудачным, если простые арифметические операции смещают указатель в некорректное значение. Пользователи, привычные к про- граммированию PIC18, должны постоянно иметь в виду, что если включен рас- ширенный режим, то значения адресов от 5Fh и меньше используются для ин- дексного литерального смещения. В приведенных далее по тексту примерах ти- пичных команд показано, как происходит их исполнение в расширенном режиме. Состояние операндов, показанное в этих примерах, применимо ко всем коман- дам данного типа. Синтаксис расширенного режима применительно к командам стандартного набора PIC18 Когда включен расширенный набор команд, аргумент регистра «Ь> стандарт- ного набора байтовых и битовых команд заменяется значением константы сме- щения (литерала) «к». Как уже было сказано, это происходит, если f < 5Fh. Когда используется значение смещения, оно должно быть заключено в квадратные скобки. Применение квадратных скобок сигнализирует компилятору, что значение следует понимать как индекс или смещение. Пропуск квадратных скобок или по- мещение в них значения, большего, чем 5Fh, приведет к генерации ошибки ас- семблера MPASM. Если аргумент индекса правильно помещен в квадратные скобки, то аргумент адреса ОЗУ никогда не задается, он автоматически приравнивается к «О». Это отличается от стандартной операции, когда значение «а» определяет базис ад- реса ячейки памяти. Объявление бита доступа к ОЗУ в расширенном режиме приведет к генерации ошибки ассемблера MPASM. Аргумент «б», указывающий на приемник результата, функционирует без из- менений. В последних версиях ассемблера MPASM поддержка расширенного режима должна быть включена в явном виде. Для этого достаточно использовать опцию командной строки «/у» или директиву РЕ в исходном листинге. Соображения относительно применения расширенного режима Следует иметь в виду, что расширение стандартного набора команд будет по- лезным далеко не для всех пользователей. В частности, пользователи, которые не пишут приложения, использующие программный стек, скорее всего, не заме- тят пользы от применения расширенного набора команд. Кроме того, режим индексного литерального смещения может вызвать сбой в работающих приложениях, написанных для ассемблера PIC18. Причиной этому может быть использование адресов регистров в банке доступа ниже 5Fh. По- скольку такой адрес трактуется, как литеральное смещение относительно FSR2 (когда расширенный режим включен), то приложение может попытаться осуще- ствить чтение или запись по ошибочному или несуществующему адресу. При портировании приложений на PIC18F2455/2550/4455/4550 очень важно оп- ределиться с типом кода. Большие приложения, особенно с рекурсивными обра- щениями и сложной структурой, которые написаны на С и требуют эффективной 368
Набор команд компиляции, будут иметь положительный эффект от применения расширенного набора команд. Простые «линейные» приложения, интенсивно использующие банк доступа, скорее всего не нуждаются в использовании расширенного набора. Примеры работы стандартных команд в режиме индексного литерального смещения ADDWF Add W to Indexed (Indexed Literal Offset mode) Синтаксис: ADDWF [k]{,d} Операнды: 0 < k £ 95 de [0,1] Действие: (W) + ((FSR2) + k) -> dest Влияние: N, OV, C, DC, Z Кодировка: I 0010 I OldO | kkkk | кккк I Описание: Содержимое аккумулятора прибавляется к содержимому регистра, на который указывает FSR2 со смещением на величину к. Если d = 0, результат сохраняется в W. Если d = 1, ре- зультат сохраняется обратно в исходный регистр (по умолчанию). Слова: Циклы: По тактам: 1 1 Q1 Q2 Q3 Q4 | Декодирование | Чтение к | Обработка | Запись в dest | Пример: ADDWF [OFST],0 До выполнения команды W = 17h OFST = 2Ch FSR2 = OAOOh Содержимое ячейки с адресом 0A2Ch = 20h После выполнения команды W = 37h Содержимое ячейки с адресом 0A2Ch = 20h BSF Bit Set indexed (Indexed Literal Offset mode) Синтаксис: BSF [k],b Операнды: 0 < к < 95 0< b < 7 Действие: 1 -> ((FSR2) + k)<b> 369
Гпава 3 Влияние: Нет Кодировка: I 1000 | bbbO kkkk kkkk | Описание: Устанавливается в «1» бит «Ь» регистра, на который ука- зывает FSR2 со смещением к. Слова: 1 Циклы: По тактам: 1 Q1 Q2 Q3 Q4 | Декодирование j Чтение! j Обработка | Запись! | Пример: BSF [FLAG^OFST],7 До выполнения команды FLAGJDFST = OAh FSR2 = OAOOh Содержимое ячейки с адресом OAOAh = 55h После выполнения команды Содержимое ячейки с адресом OAOAh = D5h SETF Set Indexed (Indexed Literal Offset mode) Синтаксис: SETF [k] Операнды: 0 2 k < 95 Действие: FFh -» ((FSR2) + k) Влияние: Нет Кодировка: | QUO | 1000 | kkkk | kkkk ~| Описание: Содержимое регистра, на который указывает FSR2 со смещением к, устанавливается равным FFh. Слова: 1 Циклы: По тактам: 1 01 Q2 Q3 Q4 | Декодирование | Чтение к j Обработка j Запись в регистр | Пример: SETF [OFST] До выполнения команды OFST = 2Ch FSR2 = OAOOh Содержимое ячейки с адресом 0A2Ch = 00h После выполнения команды Содержимое ячейки с адресом 0A2Ch = FFh 370
Набор команд Специальные соображения относительно применения инструментов MICROCHIP MPLAEf IDE Последние версии программных инструментов Misrochip были разработаны для полной поддержки расширенного набора команд микроконтроллеров PIC18F2455/2550/4455/4550. В набор инструментов входят: компилятор «MPLAB С18», ассемблер «MPASM» и рабочая среда разработки «MPLAB IDE». При выборе нужного кристалла, среда разработки автоматически устанавли- вает биты конфигурации контроллера в значение по умолчанию. Для бита XINST значением по умолчанию является «О», то есть расширенный набор команд и режим индексного литерального смещения отключены. Для правильного испол- нения кода программы, разработанного с применением расширенного режима, бит XINST должен быть установлен во время программирования. Для разработки программы, содержащей расширенные команды, пользователь должен включить поддержку этих команд и режима индексного литерального смеще- ния. Способ включения может меняться от версии к версии, а также при использова- нии инструментов программирования от сторонних разработчиков, поэтому подроб- ное руководство следует искать в документации среды разработки. 371
Глава 4. Некоторые аспекты практического применения Переход с интерфейса RS-232 на USB Порты последовательного интерфейса RS-232 продолжают широко использо- ваться во многих периферийных устройствах, таких, как промышленное оборудова- ние, медицинское оборудование, измерительная аппаратура и тому подобных, для обмена данными с внешним компьютером. Проблема в том, что современные ком- пьютеры обычно имеют не более одного стандартного разъема последовательного интерфейса RS-232 (многие ноутбуки не имеют вообще). С другой стороны, совре- менные компьютеры оснащены достаточным количеством разъемов шины USB, ко- торая допускает подключение большого числа разнообразных устройств. Возникает ситуация, когда имеющиеся программные оболочки могут быть успешно запущены на новом компьютере, но аппаратная возможность подключения отсутствует. Одним из способов снижения затрат на переход от RS-232 к USB является эмуля- ция соединения через RS-232 при реальном соединении через шину USB. При этом имеющееся ПО, установленное на персональном компьютере, «видит» устройство как подключенное к стандартному COM-порту. Для эмуляции используются стандарт- ные драйверы из комплекта Windows. Таким образом, можно, хотя бы на некоторое время, избежать радикальных изменений в программной оболочке, установленной на PC и ограничиться лишь совершенствованием периферийной части (рис. 4.1). Компания Microchip предлагает готовое решение в виде библиотечного кода для использования в прошивке устройства, использующего эмуляцию RS-232. Это программное решение обладает следующими свойствами: . Относительно небольшой объем, около 3 кБ. • Занимаемый объем памяти данных около 50 байт (кроме буфера данных). . Максимальная скорость обмена до 80 кБ. . Передача данных полностью контролируется через USB (XON/XOFF и аппа- ратный контроль в этой версии исключены). .Дополнительные драйверы не требуются. Все необходимые файлы, включая файлы «.inf» для Microsoft Windows ХР и Windows 2000, включены в набор. До перехода Рис. 4.1. Переход к эмуляции соединения RS-232 через USB: а - обычный способ соединения с использованием RS-232; б - использование RS-232 путем эмуляции при фактическом подключении через USB 372
Некоторые аспекты практического применения Все необходимые файлы можно скачать с сайтов www.microchip.сот или www.picman.ru. Как мы упоминали выше, приложение Windows воспринимает физическое со- единение по протоколу RS-232 как стандартный COM-порт и общается с устрой- ством, используя функции CreateFile, ReadFile и WriteFile. Микроконтроллер, имеющий встроенный модуль UART, обеспечивает аппаратный интерфейс для соединения по протоколу RS-232. При переходе на USB приложение Windows может воспринимать соединение через USB как виртуальный COM-порт при по- мощи двух стандартных драйверов Windows: usbser.sys и ccport.sys. С точки зре- ния приложения, нет никакой разницы между физическим и виртуальным портом, поэтому модификация имеющегося программного обеспечения не требуется. Обязательные изменения касаются только периферийной аппаратной части и прошивки контроллера. Для реализации аппаратной части потребуется микрокон- троллер со встроенной поддержкой USB. В качестве примера реализации рассмат- ривается использование микроконтроллеров PIC18F2455/2550/4455/4550. Модификация прошивки микроконтроллера сводится к небольшим изменениям, вызванным необходимостью вызова новых функций USB UART, предоставляемых в качестве базовых и написанных на Си. Поскольку протокол USB включает в себя все детали низкоуровневого соединения, применявшиеся ранее для RS-232 понятия ско- рости, бита четности и управления обменом становятся отвлеченными. Спецификация USB CDC Спецификация USB CDC (Communication Device Class) определяет различные модели соединений, включая эмуляцию последовательного интерфейса. Драй- вер Windows usbser.sys полностью соответствует этой спецификации. Следова- тельно, чтобы использовать этот драйвер, оконечное устройство также должно соответствовать спецификации. Спецификация CDC описывает абстрактную модель эмуляции последова- тельного канала через USB. В целом, для эмуляции требуется два различных интерфейса USB. Первый из них - интерфейс класса соединения, использующий одно прерывание типа IN от конечной точки. Этот интерфейс используется для оповещения USB-хоста о текущем состоянии соединения RS-232 от устройства, занятого в эмуляции. Второй интерфейс относится к классу данных и использует одну потоковую конечную точку типа IN и одну потоковую конечную точку типа OUT. Этот интер- фейс применяется для обмена необработанными данными, которые обычно пе- редаются через реальное соединение RS-232. Разработчику не следует беспокоиться о создании дескрипторов или написа- нии обработчиков запросов. Дескрипторы для эмулируемого устройства и все необходимые обработчики перечислены в таблице 4 спецификации CDC, кото- рая входит в состав ПО, предоставляемого компанией Microchip. На данный мо- мент Microchip предоставляет следующие готовые обработчики класс- специфичных запросов: . SEND, .ENCAPSULATED-COMMAND . GET_INCAPSULATED_COMMAND . SETJJNEJDODING . SET_CONTROL_LINE_STATE 373
Гпаеа 4 Рис. 4.2. Схема дескрипторов при эмуляции RS-232 в соответствии с CDC 374
Некоторые аспекты практического применения Дальнейшее расширение поддержки предполагается в следующих версиях фир- менного программного обеспечения. В данный момент прошивка, созданная на осно- ве предлагаемых решений, не возвращает уведомление RESPONSE_AVAILABLE, возвращая вместо этого стандартный ответ NAK (не готов). Диаграмма структуры дескрипторов для эмулируемого устройства показана на рис.4.2. Пример дескрипторов CDC можно также найти в § 5.3 спецификации. Функции USB UART Все упомянутые здесь обращения к функциям USB UART относятся к набору функций, предоставляемых драйвером прошивки оконечного устройства. Этот драйвер распространяется компанией Microchip, как часть набора базового про- граммного обеспечения для работы с USB. Функции, представленные в библио- теке, очень похожи по функциональности на аналогичные из библиотеки MPLAB С18 USART. Перечень специфических функций приведен в табл. 4.1. Выбор функции зависит от нескольких факторов: . Является ли строка данных строкой с завершающим нулем? . Известна ли длина строки? . Источник данных расположен в памяти программ или ОЗУ? Таблица 4.1 Сводная таблица Функций USB UART Функция Описание putrsUSBUSART Запись строки с завершающим нулем из памяти про- грамм в USB putsUSBUSART Запись строки с завершающим нулем из памяти данных в USB mUSBUSARTTxRom Запись строки известной длины из памяти программ в USB mUSBUSARTTxRam Запись строки известной длины из памяти данных в USB mUSBUSARTIsTxTrfReady Запрос: готов ли драйвер принять новую строку для за- писи в USB getsUSBUSART Чтение строки из USB mCDCGetRxLength Чтение длины последней строки, прочитанной из USB putrsUSBUSART Функция putrsUSBUSART записывает строку данных в USB, включая нулевой символ. Используйте эту версию для переноса текстовых строк или данных (в том числе данных, размещенных в памяти программ) в USB-xoct. Примечание: Механизм передачи от устройства к хосту (put) более гибок, чем от хоста к устройству (get). Он может обработать строку данных, имеющую длину больше, чем максимальный размер пакета IN конечной точки. Для передачи длинной строки данных при помощи нескольких USB транзакций используется «фоновый автомат». Сервис предоставляется функцией CDCTxService{). Синтаксис: void putrsUSBUSART(const rom char *data) 375
Гпаеа 4 Предварительные условия: Перед тем, как будет вызвана эта функция, mUSBUSARTisTxTrfReady() должна вернуть «1». Строка символов, на которую указывает параметр data, должна быть меньше или равна 255 байт, включая завершающий нулевой сим- вол. Вход: data - указатель на строку данных с завершающим нолем. Если завершаю- щий ноль не найден, на хост передаются только первые 255 байт. Выход: Нет. Влияние на другие функции: Нет. Пример: void exampl е_1 (void) { if(mUSBUSARTisTxTrfReady()) putrsUSBUSART(«Hello Worrld.»); }// end example_l rom char example_string[] = {«Microchip»}; void example_2(void) { if(mUSBUSARTisTxTrfReady()) putrsUSBUSART(example_string); }//end example_2 putsUSBUSART Функция putsUSBUSART записывает строку данных в USB, включая нулевой символ. Используйте эту версию для переноса данных из памяти данных в USB- хост. Примечание: Механизм передачи от устройства к хосту (put) более гибок, чем от хоста к устройству (get). Он может обработать строку данных, имеющую длину больше, чем максимальный размер пакета IN конечной точки. Для переда- чи длинной строки данных при помощи нескольких USB транзакций используется «фоновый автомат». Сервис предоставляется функцией CDCTxService (). Синтаксис: void putsUSBUSART(char *data) Предварительные условия: Перед тем, как будет вызвана эта функция, mUSBUSARTisTxTrfReady () должна вернуть «1». Строка символов, на которую указывает параметр data, должна быть меньше или равна 255 байт, включая завершающий нулевой сим- вол. Вход: data - указатель на строку данных с завершающим нолем. Если завершаю- щий ноль не найден, на хост передаются только первые 255 байт. Выход: Нет. 376
Некоторые аспекты практического применения Влияние на другие функции: Нет. Пример: char example_string[4]; void example_l(void) { example_string[0] = 'U1; example__string [ 1 ] = 'S'; example_string[2] - 'B'; example_string[3] = 0x00; if(mUSBUSARTIsTxTrfReady()) putsUSBUSART(example_string); }//end example mUSBUSARTTxRom Эта функция применяется для передачи данных, расположенных в памяти программ. Длина последовательности данных должна быть заранее известна в качестве входного параметра. Реакция этой функции не определена, если функ- ция mUSBUSARTIsTxTrfReady () возвращает «О». Примечание: Эта функция лишь определяет установки передачи. Собст- венно передача обслуживается функцией CDCTxService (). Синтаксис: void mUSBUSARTTxRom(rom byte *pData, byte len) Предварительные условия: Перед тем, как будет вызвана эта функция, mUSBUSARTIsTxTrfReady () должна вернуть «1». Количество передаваемых байтов должно быть меньше или равно 255. Вход: pData - указатель на начальную позицию данных. len - количество байтов, подлежащих передаче. Выход: Нет. Влияние на другие функции: Нет. Пример: rom char example_string[] = {0x31, 0x32, 0x33}; void example_l(void) { if(mUSBUSARTIsTxTrfReady() ) mUSBUSARTTxRom((rom byte*) example_string, 3); }// end example_l mUSBUSARTTxRam Эта функция применяется для передачи данных, расположенных в памяти данных. Длина последовательности данных должна быть заранее известна в ка- честве входного параметра. Реакция этой функции не определена, если функция mUSBUSARTIsTxTrfReady ( ) Возвращает «О». 377
Гпава 4 Примечание: Эта функция лишь определяет установки передачи. Собст- венно передача обслуживается функцией CDCTxService (). Синтаксис: void mUSBUSARTTxRam(byte *pData, byte len) Предварительные условия: Перед тем, как будет вызвана эта функция, muSBUSARTIsTxTrfReady () должна вернуть «1». Количество передаваемых байтов должно быть меньше или равно 255. Вход: pData - указатель на начальную позицию данных. len - количество байтов, подлежащих передаче. Выход: Нет. Влияние на другие функции: Нет. Пример: char example—string [3 ] ; void example—1(void) { example_string[0] = 'U'; example—stringll] = ’S’; example_string[2] - 1 B’ if(mUSBUSARTIsTxTrfReady()) mUSBUSARTTxRam((byte*) example—string, 3); }// end example_l mUSBUSARTIsTxTrfReady Эта функция используется для проверки, готов ли класс CDC передать дан- ные. Типичное применение выглядит так: if (mUSBUSARTIsTxTrfReady ()) Примечание: He вызывайте эту функцию в качестве блокирующей, на- пример while(’mUSBUSARTIsTxTrfReady()); Синтаксис: BOOL mUSBUSARTIsTxTrfReady(void) Предварительные условия: Нет. Вход: Нет. Выход: BOOL Если драйвер прошивки готов принять новые данные для записи в USB, то возвращается «1», иначе возвращается «О». Влияние на другие функции: Нет. Пример: void example—1 (void) { if(mUSBUSARTIsTxTrfReady()) putrsUSBUSART(«Microchip»); }//end example^1 378
Некоторые аспекты практического применения getsUSBUSAKT Функция копирует строку байтов, полученную через потоковую конечную точку типа OUT, в указанное пользователем место. Это не блокирующая функция. Она не ждет данные, если к моменту вызова они не готовы. Напротив, она возвраща- ет «О», чтобы уведомить вызывающую сторону о том, что данные не готовы. Примечание: Если реально полученное количество байтов больше, чем ожидалось (len), то лишь ожидаемое количество байтов будет скопировано в буфер. Если полученное количество байтов меньше, чем ожидалось, то в буфер будет скопировано полученное количество байтов. Синтаксис: byte getsUSBUSART(char ‘buffer, byte len) Предварительные условия: Значение входного аргумента, len, должно быть равно или меньше, чем мак- симальный объем буфера конечной точки, доступного для приема потока данных от USB-хоста к CDC классу. Этот максимальный размер буфера определяется, как CDC BULK OUT_ EP SIZE и находится в файле usbcfg.h. Значение CDC_BULK_OUT_EP_SIZE может быть равно 8, 16, 32 или 64 байтам. Входной аргумент buffer должен указывать на буферную область памяти, которая больше или равна величине, определенной параметром len. Вход: buffer - указатель на адрес начала буферной области, куда будут сохране- ны данные len - ожидаемое количество байтов Выход: byte - количество байтов, скопированных в буфер Влияние на другие функции: Глобальная переменная cdc_rx_len обновляется количеством байтов, ско- пированных в буфер. Когда вызвана функция getsUSBUSART, обновленное зна- чение cdc_rx_len может быть получено вызовом функции mCDCGetRxLength(). Пример: char input_buffer[64]; void example_l(void) { byte index, count, total_sum; if (getsUSBUSART(input_buffer, 8) { count - mCDCGetRxLength(); total_sum = O.- forf index = 0; indexecount; index++) total_sum + = input_buffer[index]; }//end if }//end example__l void example__2 (void) { if(getsUSBUSART(input_buffer, CDC_BULK_OUT_EP_SIZE) 379
Гпава 4 { //Тело программы, здесь что-либо выполняется... }//end if }//end example—2 mCDCGetRxLength Функция используется для запроса количества байтов, скопированных в бу- фер, как правило, после вызова функции getsusBUSART. Синтаксис: byte mCDCGetRxLength(void) Предварительные условия: Нет. Вход: Нет. Выход: byte - количество байтов, скопированных в буфер в ходе последнего вызова getsUSBUSART Влияние на другие функции: Нет. Пример: char input—buffer[64]; void example^.1 (void) { if(getsUSBUSART(input_buffer, 2) { //Что-либо выполняется при input—buffer[0] if(mCDCGetRxLength() - - 2) // Что-либо выполняется при input_buffer[1] }//end if }//end example—1 Замечания по использованию функций USB UART Функции USB UART очень легко интегрируются в любое USB приложение, но при разработке или модификации кода полезно иметь в виду несколько важных моментов: Код прошивки Microchip USB представляет собой общее многозадачное окру- жение. В коде пользователя не должны использоваться блокирующие функции. Поскольку задачи USB опрашиваются и обслуживаются в главном цикле про- граммы, любые блокирующие функции, зависящие от состояния USB, могут при- вести к «зависанию» программы. Вместо блокирующих функций используйте про- граммный автомат состояний. mUSBUSARTTxRom и mUSBUSARTTxRam предполагают наличие указателя типа rom byte* и byte* соответственно. Может потребоваться выбор типа. Фрагмент while ( !mUSBUSARTIsTxTrfReady( )) ; является блокирующей функцией. Никогда не используйте ее. putrsUSBUSART, putsUSBUSART, mUSBUSARTTxRom И mUSBUSARTTxRam не 380
Некоторые аспекты практического применения являются блокирующими функциями. Они не направляют данные в USB-хост не- медленно и не ждут завершение передачи. Все, что они делают, это настройка необходимых специальных регистров и автомата состояний для операции пере- дачи. Функцией, которая реально отправляет данные на хост, является CDCTxService (). Она отслеживает текущий статус автомата состояний и дро- бит длинные массивы данных на несколько пакетов USB. Функция вызывается единожды в каждом главном цикле программы, в сервисной подпрограмме usBtasks (). Диаграмма программного автомата состояний для CDCTxSer- vice () показана на рис.4.3. По этой причине перекрывающийся вызов функций не будет работать; каждый новый вызов будет перекрывать запрошенную тран- закцию. Правильным методом передачи следующих друг за другом строк являет- ся использование автомата состояний, как показано в Примере 1. Альтернативой автомату состояний может быть глобальный буфер обмена, как показано в При- мере 2. Обратите внимание на корректность используемых дескрипторов CDC класса. Объем конечной точки для каналов данных определяется при помощи CDC_BULK_OUT_EP_SIZE и CDC_BULK_IN_EP_SIZE, расположенных в файле заголовка usbcfg.h. Тип byte определен, как unsigned char в файле заголовка typedefs.h. Всегда проверяйте, готов ли драйвер прошивки передать следующие данные В USB-ХОСТ путем вызова mUSBUSARTIsTxTrfReady () . Пример 1. Использование вызова функций USB UART. Неправильный метод (перекрывающийся вызов) if(mUSBUSARTIsTxTrfReady()) { putrsUSBUSART(«Hello World»); putrsUSBUSART(«Hello Again»); }//end if Правильный метод (автомат состояний) byte state = 0; if (state = = 0) { if(mUSBUSARTIsTxTrfReady () ) { putrsUSBUSART(«Hello World»); state++; } } else if(state - = 1) { if(mUSBUSARTIsTxTrfReady()) { putrsUSBUSART(«Hello World»); state++; } } 381
Гпава 4 Пример 2. Альтернативный метод с использованием глобального буфера. char io_buffer[64]; // Main Program Loop while(1) { USBTasks(); if(mUSBUSARTisTxTrfReady()) { putsUSBUSART ( io_buf fer) ; SendToBuffer(«Hello World»); SendToBuffer(«Hello Again»); //Пользователь сам разрабатывает функцию //SendToBuffer(), которая «склеивает» разные строки //и передает их вместе. } }//end while Настройка проекта Вставьте tfinclude «system\usb\usb.h» в каждый файл, где используются функции CDC класса. При использовании функций CDC значение USB_USE_CDC должно быть оп- ределено в файле usbcfg.h. Файлы исходного текста и заголовка cdc. с и cdc .h должны быть добавлены в проект. Их можно найти в разделе «system\usb\class\cdc\». Рис. 4.3. Диаграмма автомата состояний 382
Некоторые аспекты практического применения Идентификаторы VID и PID Идентификатор производителя (VID, Vendor ID) и идентификатор продукта (PID, Product ID) важны, поскольку операционная система различает устройства USB и оп- ределяет, какой драйвер будет использован для конкретного устройства. Идентифи- катор VID представляет собой 16-разрядное число, согласованное с Форумом разра- ботчиков устройств USB (USB Implementers Forum, USB-IF). Это уникальное число должно быть присвоено любому производителю, который желает изготавливать и продавать USB устройства. Услуга присвоения номера является платной. VID можно приобрести непосредственно на форуме разработчиков. Более подробная информа- ция изложена по адресу: http://www.usb.org/developers/vendor. Каждому VID присвоено 65536 различных значений PID, представляющих со- бой 16-разрядное число. В наборе поставки программных шаблонов Microchip, значения VID и PID находятся в файле usbdsc.c. Обе переменные могут моди- фицированы в соответствии с потребностями разработчика. Драйверы для Microsoft Windows® 2000 и Windows® ХР В наборе Microsoft Windows отсутствует стандартный файл .inf для драйвера CDC. Тем не менее, сам драйвер присутствует в инсталляции. Таким образом, достаточно предоставить соответствующий файл .inf при первом подключении CDC устройства к компьютеру. Пример файла .inf распространяется в составе начального проекта CDC RS-232 и расположен в директории исходных кодов ...\fw\CDC\inf. Прежде, чем его ис- пользовать, необходимо модифицировать соответствующие значения VID и PID в дополнение к изменениям, сделанным в файле usbdsc.c. Соответствующие значения должны совпадать, иначе операционная система не сможет установить соответствие между подключенным устройством и драйвером. Значения VID и PID находятся в строке USB\VID_xxxx&PID_yyyy, где хххх это шестнадцатирич- ное значение VID, а уууу - шестнадцатиричное значение PID. Строка обычно яв- ляется частью текста, расположенного под заголовком [DeviceList]. При желании разработчик может изменить переменную, расположенную под заголовком [Strings]. Она содержит текст, который будет виден в менеджере уст- ройств системы Windows. Управление энергопотреблением в устройствах USB на основе PIC18 Поскольку большинство устройств на основе микроконтроллеров имеют ограни- ченные ресурсы питания, вопросу энергосбережения при разработке уделяется осо- бое внимание. Несмотря на то, что устройства USB могут питаться от шины, для них вопрос энергосбережения тоже важен, так как нагрузочная способность шины неве- лика. При превышении потребляемого тока хост автоматически отключает порт USB. Рассматриваемые в этом издании микроконтроллеры семейства PIC18 вы- полнены по фирменной технологии nanoWatt. Далее мы опишем, как использо- вать методы энергосбережения и распределения источников питания при раз- личных состояниях и событиях шины USB. Отдельно обратим внимание на ис- пользование расширенных возможностей PIC18 применительно к целям энерго- сбережения. Как было сказано в гл. 3, конечное устройство USB может получать питание от шины через кабель, либо от собственного источника (рис.4.4). 383
Гпава 4 /Источника \ питания J USB кабель Питание устройства от шины USB кабель Питание устройства от отдельного источника -<--► Связь ....* Питание Рис. 4.4. Основные варианты питания устройства USB Допускаются различные вариации способов питания. Так, устройство может питаться от хоста в рабочем режиме, но использовать встроенную батарею для хранения информации и дежурного/автономного режима при отключении от хос- та. Устройство, потребляющее большой ток, может всегда питаться от собствен- ного источника, независимо от подключения к хосту. В случае, если хост имеет ограничения по питанию (например, питается от батареи), устройство также мо- жет постоянно питаться от собственной батареи или иметь дополнительные ог- раничения по потреблению тока. В последнем случае вопрос энергосбережения стоит особенно остро. Спецификация питания устройств USB Шина USB переходит в состояние ожидания (Idle mode) если нет активности на дифференциальных линиях данных. Это равносильно отсутствию передачи данных. Если устройство подключено к шине USB и активность шины отсутствует (со- стояние Idle) в течение более 3 мс, то шина переходит в состояние останова (Suspend mode). В этом случае устройство обязано снизить потребление тока от шины не более, чем через 10 мс после прекращения активности шины. Т. е., уст- ройству отводится не более 7 мс на то, чтобы перейти в состояние пониженного энергопотребления Suspend mode с момента, когда распознано состояние Idle mode. Максимальный допустимый потребляемый ток в режиме Suspend зависит от выбранной конфигурации устройства. Этот вопрос будет рассмотрен в сле- дующем разделе. Останов шины возможен по двум причинам. Во-первых, хост может перейти в режим останова и вынудить остановиться подключенные к нему устройства. Во- вторых, хост может избирательно остановить устройство USB, если решит, что оно не активно. Это позволяет хосту продолжать работу с другими устройствами. Примером может служить «засыпание» компьютерной USB-мыши, если она не перемещается некоторое время. Хост переводит мышь в состояние пониженного потребления, если от нее достаточно долго не поступают сигналы о перемеще- нии. Особенно наглядно это заметно по угасанию светодиода оптической мыши. Устройство может уведомить хост о необходимости переустановить соедине- ние и начать передачу данных. Обычно такое случается в результате некоторого 384
Некоторые аспекты практического применения внешнего воздействия, например, нажатия на кнопку или перемещения мыши. Данное событие называется удаленным пробуждением. Устройство запрашивает хост о предоставлении сервиса, посылая сигнал возобновления (Resume). Под- держка удаленного пробуждения не является обязательной для USB устройства. Наличие поддержки удаленного пробуждения описывается в дескрипторе конфи- гурации. Прежде, чем остановить устройство, хост должен послать устройству команду активировать функцию удаленного пробуждения (если она есть). В про- тивном случае устройство может не выйти из режима останова, так как функция удаленного пробуждения по умолчанию всегда отключена. После того, как уст- ройство вышло из состояния останова и «разбудило» хост, он может отключить функцию удаленного пробуждения. Включение и отключение функции произво- дится через запросы SET_FEATURE и CLEAR_FEATURE. Повторная установка связи возможна в обоих направлениях. Хост также мо- жет «разбудить» устройство, послав ему сигнал возобновления Resume. Как пра- вило, это происходит по запросу какой-либо программы. Например, для открытия файла на USB-накопителе. Устройство выходит из режима Suspend при появлении активности шины. Диаграммы процессов вхождения в режим останова и выхода из него показаны на рис.4.5. На нем условно показаны следующие интервалы: Рис. 4.5. Диаграмма вхождения в режим останова и выхода из него t1: Шина 3 мс находится в состоянии готовности перед тем, как устройство пе- рейдет в состояние останова. t2: Устройству отводится до 1 мс отсутствия активности шины для того, что бы снизить энергопотребление. t3: Устройство с возможностью удаленного пробуждения может не посылать сигнал возобновления в первые 5мс неактивной шины. Это позволяет хабам пе- рейти в собственное состояние останова и приготовиться к распространению сигнала возобновления. t4: Устройство с возможностью удаленного пробуждения должно удерживать сигнал возобновления не менее 1 мс, но не более 15 мс. t5: Хост может сформировать сигнал возобновления в любой момент и дол- жен удерживать его не менее 20 мс. Выделение питания Устройство USB может потреблять от хоста максимум 500 мА. Если устройст- во заявлено, как мало потребляющее, ему разрешено потреблять ток не более 100 мА. Устройство, запрашивающее больший ток, считаются устройством с вы- 385
Гпава 4 соким потреблением. По умолчанию любое устройство после включения нахо- дится в режиме малого потребления и может перейти в режим высокого потреб- ления только под управлением программного обеспечения. Настроенное устрой- ство может иметь различные параметры потребления в зависимости от значений полей Self-Powered, Remote Wake-Up И bMaxPower В дескрипторе конфигу- рации. В табл. 4.2 показаны значения потребляемого тока в различных конфигу- рациях и состояниях. Таблица 4.2 Максимальный потребляемый ток в различных конфигурациях Настройка Максимальный ток Работа j Останов До настройки Параметры 100 мА | 500 мкА После настройки Независимое питание(1): - Self-Powered = 1 - Remote Wake-Up = 0 или 1 - bMaxPower 100 мА 100 мА 500 мкА Низкое потребление от шины: - Self-Powered = 0 - Remote Wake-Up = 0 или 1 - bMaxPower £ 100 мА 100 мА 500 мкА Высокое потребление от шины: - Self-Powered = 0 - Remote Wake-Up = 0 - bMaxPower > 100 мА 500 мА 500 мкА Высокое потребление, питание от шины и источник удаленного про- буждения: - Self-Powered = 0 - Remote Wake-Up = 1 - bMaxPower > 100 мА 500 мА 2,5 мА (1) Устройство с независимым питанием может потреблять от шины до ЮОмА для того, чтобы USB хост мог реализовать функциональность интерфейса, когда внешний источник отключен (или переведен в дежурный режим). Если устройство с высоким потреблением и питанием от шины поддерживает функцию удаленного пробуждения, то в состоянии останова оно потребляет больший ток, поскольку эта функция может требовать питание для мониторинга внешних воздействий. Кроме соответствия ограничениям потребляемого тока, все устройства USB должны быть способны предоставить информацию о конфигурации при напряжении до 4,40 В на конце соединительного кабеля. Устройство может быть рассчитано на диапазон питающих напряжений от 4,40 до 5,25 В. Но следует иметь в виду, что в кратковременных случаях напряжение на выходе может снижаться до 4,07 В. 386
Некоторые аспекты практического применения USB-интерфейс устройств с высоким потреблением и питанием как от шины, так и от независимого источника, должен продолжать работать, когда остальные функции отключены с целью энергосбережения. В случае, если питание от неза- висимого источника внезапно пропадает, устройство должно отключиться полно- стью или предельно минимизировать потребление, чтобы не допустить превы- шение допустимого потребляемого от хоста тока. Обработка прерываний USB Существует четыре основных сценария, когда осуществляются некоторые действия по энергосбережению: 1. Предусмотрено питание от шины, но к шине ничего не подключено. Оче- видно, что в этой ситуации потребитель энергии отсутствует. 2. Питание от шины, устройство подключено к шине. Питание устройства зависит от поведения хоста. Как только устройство получает от хоста сигнал останова, оно снижает потребление. Это может быть достигнуто отключением неиспользуемых функций, переводом вычислительного ядра на тактирование от медленного внутрен- него источника или переводом его в режим Sleep или Idle. Микроконтроллер должен сохранять валидные значения уровней на дифференциальных линиях USB в режиме Sleep, чтобы сохранить логическое подключение к шине USB. 3. Независимое питание, устройство не подключено к шине. В данном случае интерфейс USB бездействует, устройство может находиться в энергосберегаю- щем режиме, экономя энергию собственного источника. 4. Независимое питание, устройство подключено к шине. Интерфейс USB бу- дет активен, пока не перейдет в режим останова. Остальные функции могут быть независимо переведены в экономичный режим для сбережения энергии внешне- го источника. Процедуры энергосбережения управляются специальными регистрами, отно- сящимися к периферии. При обработке сигналов Suspend и Resume использует- ся восемь управляющих разрядов. Они перечислены в табл. 4.3. Подробное опи- сание назначения этих разрядов можно найти в предыдущих главах. Таблица 4.3 Управляющие разряды, применяемые при обработке сигналов Suspend и Resume шины USB Регистр Разряд Функция UIR (Прерывание USB) IDLEIF Флаг-бит прерывания по состоянию Idle > 3 мс ACTVIF Флаг-бит прерывания по наличию активности шины URSTIF Флаг-бит прерывания по сбросу USB UIE (Разрешение прерывания USB) IDLEIE Разрешение прерывания по состоянию Idle > 3 мс ACTVIE Разрешение прерывания по наличию активно- сти шины URSTIE Разрешение прерывания по сбросу USB UCON (Управление USB) RESUME Разрешение сигнала Resume SUSPND Бит останова USB 387
Гпаеа4 Разряды IDLEIF, ACTVIF и URSTIF являются источниками прерывания. Соот- ветственно, разряды 1DLE1E, ACTVIE и URST1E разрешают эти прерывания, если установлены в «1». После сброса шины прерывание по обнаружению состояния Idle должно быть разрешено и прерывание по обнаружению активности шины должно быть запрещено. Такая настройка подготавливает устройство к обнару- жению сигнала останова от хоста. Если разряд IDLEIF установлен, это означает, что состояние Idle присутствует на шине 3 мс или более, и модуль USB должен перейти в режим останова. На рис.4.6 показан типовой алгоритм обработки со- бытия IDLEIF. Когда интерфейс USB остановлен, сохраняет активность только прерывание по активности шины. Остальные прерывания USB не работают. Останов модуля USB сам по себе уменьшает потребление энергии: тактирование модуля отклю- чается, встроенный стабилизатор напряжения и трансивер переходят в режим низкого потребления. В режиме останова стабилизатор, трансивер, нагрузочный резистор 1.5 кОм и нагрузочный резистор 15 кОм потребляют примерно 340 мкА, тогда как спецификация допускает потребление до 500 мкА. Оставшиеся 160 мкА могут быть выделены для других функций, используемых при работе CPU от встроенного тактового генератора. Если используется внешний стабилизатор напряжения или внешний трансивер, необходимо удостовериться, что требова- ния к потребляемому току в режиме останова соблюдены. Устройство USB может быть выведено из состояния останова по команде хос- та. Сигнал возобновления работы приводит к установке флаг-бита ACTVIF. На рис. 4.7 показан типовой алгоритм обработки события ACTIF. В случае, когда хост передает остановленному устройству сигнал Reset, пер- вым устанавливается прерывание по активности шины, предоставляя возмож- ность программе сбросить бит SUSPND. Только после того, как сброшен бит SUSPND, может быть установлен флаг-бит URSTIF. Бит URSTIE должен быть всегда установлен в «1», чтобы хост мог сбросить устройство в любой момент. Различие между сигналами Resume и Reset заключается в состоянии диффе- ренциальных линий данных. Сигнал Reset переводит обе линии в низкий уро- вень, тогда как сигнал Resume переключает обе линии, переводя их в так назы- ваемое К-состояние. Более подробно этот момент описан в спецификации USB. Рис. 4.6. Типовой алгоритм обработки события IDLEIF 388
Некоторые аспекты практического применения Рис. 4.7. Типовой алгоритм обработки события ACTIF Подпрограммы энергосбережения Режим Sleep Перевод микроконтроллера в режим Sleep является наиболее распростра- ненным способом экономии энергии источника питания. В этом режиме останав- ливается тактовый генератор. Вычислительное ядро прекращает исполнение ко- манд, и микроконтроллер может быть выведен из режима Sleep только по преры- ванию, общему сбросу или переполнению сторожевого таймера. Прерывание по активности шины USB тоже может вывести микроконтроллер из режима Sleep, если установлен разряд USBIE. Это необходимо, так как все прерывания USB транслируются в одиночное прерывание USBIF. Если бит гло- бального разрешения прерываний GIE/PEJE сброшен, то после пробуждения микроконтроллер продолжит исполнять команды, начиная со следующей за ко- мандой SLEEP. Если прерывания разрешены, то CPU перейдет к обработке под- программы прерывания, а затем вернется к исполнению обычного кода. Вариант перехода в режим Sleep и выхода из него для случая, когда модуль USB отклю- чен или остановлен, показан на рис. 4.8. Режим Idle Другим методом энергосбережения является перевод микроконтроллера в режим Idle. Мы не имеем в виду режим Idle шины USB, напротив, речь идет о режиме Idle микроконтроллера. В этом режиме CPU не тактируется, но на пери- ферийные модули тактирование поступает. Режим может быть использован ана- логично режиму Sleep, когда модуль USB остановлен. 389
Глава 4 Рис. 4.8. Переход в режим Sleep при отключенном или остановленном модуле USB Преимущество режима Idle состоит в том, что периферийные модули продол- жают работать, если потребляемый ими суммарный ток укладывается в требова- ния к потреблению в режиме останова. Кроме того, режим Idle предпочтителен, если устройство не находится в состоянии останова USB. Рассмотрим полноскоростное приложение USB, которое работает с переда- чей про прерыванию и опрашивается каждые 2 мс. CPU может находиться в ре- жиме микроконтроллерного Idle большую часть времени и сохранять энергию, тогда как интерфейс USB остается активным. Для настройки флаг-бита TRNIF (UIR<3>) в качестве источника прерывания должны быть установлены два бита: TRNIE (UIE<3>) и USBIE (Р1Е2<5>). Для предотвращения пробуждения системы по прерыванию от стартового то- кена кадра (SOFIF) достаточно сбросить бит разрешения этого прерывания (SOFIE). На рис. 4.9 показана последовательность наиболее типичных событий при ис- пользовании режима микроконтроллера Idle, а на рис. 4.10 типовой процесс вхо- ждения в режим Idle и выхода из него. 390
Некоторые аспекты практического применения ---Прерывание по TRNIF (выход из состояния Idle) SOF IN/OUT ।---Возврат в состояние Idle I SOF 1 Idle Обработка 1 прерывания '-< — -...... -1 мс — Состояние Idle Состояние Idle----------—► • 1 мс Рис. 4.9. Типичная диаграмма процессов при использовании режима Idle Рис. 4.10. Диаграмма процесса обработки событий для режима Idle 391
Глава 4 Смена тактовой частоты Для снижения энергопотребления можно переключать микроконтроллер на тактирование от «медленного» источника. Это позволяет CPU продолжать ис- полнение программного кода в режиме останова USB, не превышая допустимый потребляемый ток. В качестве примера можно рассмотреть переключение с пер- вичного источника 48 МГц на встроенный генератор с частотой 31 кГц. Такое пе- реключение допустимо, так как в режиме останова модуль USB не нуждается в тактировании с высокой частотой. На рис. 4.11 схематически показан процесс смены тактовой частоты для целей энергосбережения, на рис. 4.12 показан про- цесс, модифицированный для обнаружения активности шины. При возникнове- нии активности шины необходимо выполнить действия по восстановлению ис- ходной частоты тактирования CPU. Применение ФАПЧ 96 МГц Тактовые импульсы с частотой 48 Мгц, необходимые для тактирования моду- ля USB могут быть получены как при помощи ФАПЧ 96 Мгц с последующим де- лением на два, так и напрямую от внешнего источника с частотой 48 МГц. Лабо- раторные измерения показывают, что модуль ФАПЧ при напряжении питания 5 В потребляет ток 2 мА. Очевидно, что ток потребления ФАПЧ существенно мень- ше, чем потребуется для внешнего источника. При использовании ФАПЧ можно получить значительную экономию энергии. Кроме того, для выработки импульсов с частотой 96 МГц нужны входные импульсы с частотой 4 МГц. Это значит, что вместо дорогого внешнего источника может быть использован дешевый распро- страненный кварц. Можно использовать кварцы с другой кратной частотой, лишь бы входной предделитель позволял сформировать частоту 4 МГц. Обнаружение подключения и отключения устройства Если USB устройство с независимым питанием не подключено к шине, то включение модуля USB с целью ожидания события сброса является неэффек- тивным, поскольку бесполезно расходуется дополнительная энергия питания. События подключения к шине и отключения от нее могут быть обнаружены не- сколькими способами. Один из методов заключается в использовании прерывания по изменению со- стояния порта ввода, линия которого подключается к разъему питания шины. По- сле включения собственного питания устройство может ожидать прерывание по изменению состояния порта, что будет означать подключение к шине. Когда ши- на подключена, включается модуль USB. На рис. 4.13 показан алгоритм этого процесса. Рассмотрим практический пример схемы, позволяющей использовать комби- нированное питание и обнаруживать подключение к шине и отключение от нее. Пока устройство не подключено к шине, оно питается от собственной батареи. При подключении к шине оно переходит на питание от шины, продляя срок служ- бы батареи. Предположим, что устройство потребляет ток не более 400 мА. Это стандарт- ное значение для устройства, изготовленного на основе микроконтроллера Micro- chip, и бывает превышено редко, только в случае использования внешних элемен- тов, потребляющих значительный ток (светодиодные индикаторы, подсветка и т.п.) 392
Некоторые аспекты практического применения Продолжение исполнения кода программы Рис. 4.11. Диаграмма смены источника тактирования Рис. 4.12. Диаграмма процесса смены источника тактирования при обнаружении активности шины 393
Гпава 4 Рис. 4.13. Алгоритм инициализации USB при ожидании подключения Далее, устройство может выполнять различные функции независимо от того, подключено оно к шине USB или нет. На выполнение этих функций мы зарезер- вируем дополнительно 100 мА. 394
Некоторые аспекты практического применения Рис. 4.14. Пример схемы с переключением источника питания Поскольку мы определили, что наше устройство потребляет ток величиной не более 500 мА, при подключении к шине оно может сообщить хосту о том, что яв- ляется устройством, питаемым исключительно от шины. Если бы устройство со- общило хосту, что имеет собственный источник питания, то, в соответствии со спецификацией, хост лимитировал бы потребляемый от шины ток значением 100 мА. Остальную энергию устройство должно было бы получать от маломощ- ной батарейки, что невыгодно. Показанная на рис. 4.14 схема выполняет функцию переключения источника питания. При переключении на питание от шины, устройство должно в начальный период, пока идет инициализация, потреблять не более 100 мА. Для этого все функции устройства должны быть временно отключены. В показанной схеме, при обнаружении питания на выводе шины (резистор R2, вывод I/O (Датчик шины)), микроконтроллер программно отключает все возможные функции и через вывод I/O (Управление) открывает транзистор Q1. Это приводит к подаче питания от шины USB и одновременно к закрыванию транзистора Q2 и отключению от бата- реи. Если вместо батареи используется аккумулятор, допускается добавление схемы подзарядки аккумулятора от шины. 395
Список литературы 1. Агуров П.В. Интерфейс USB. Практика использования и программирова- ния. - СПб.: БХВ-Петербург, 2005. 2. Axelson Jan. USB Complete (Second edition). - Lakeview Research, 2001. 3. Hyde John. USB Design by Example. A Practical Guide to Building I/O Devices. - Intel Press, 2001. 4. PIC18F2455/2550/4455/4550 Data Sheet [DS39632b]. - Microchip Technology Inc., 2004. 5. PIC16C745/765 Data Sheet [DS41124с]. - Microchip Technology Inc., 2000. 6. Power Management for PIC18 USB Microcontrollers with nanoWatt Technology [DS00950b]. - Microchip Technology lnc.f 2004. 7. Migrating Applications to USB from RS-232 UART with Minimal Impact of PC software [DS00956b], - Microchip Technology Inc., 2004. 8. Яценков B.C. Микроконтроллеры Microchip. Практическое руководство. - • 2-е изд. испр. и дополн. - М.: Горячая линия -Телеком, 2005. 396
Оглавление Введение.......................................................................3 Глава 1. Структура и базовые функции микроконтроллеров семейства PIC18F2455/2550/4455/4550......................................................6 Расположение и на141значение выводов................................................................6 Типы корпусов............................................................19 Источники тактовых импульсов.............................................22 Энергосберегающие режимы.................................................35 Сброс....................................................................44 Память...................................................................60 Структура памяти команд............................................60 Структура памяти данных............................................66 Регистр выбора банка...............................................67 Банк быстрого доступа..............................................67 Способы адресации (указания) данных................................79 FLASH память программ..............................................85 EEPROM память данных...............................................95 Аппаратный умножитель 8x8..........................................98 Прерывания...............................................................101 Порты ввода-вывода.......................................................112 Регистры PORTA, TRISA и LATA.......................................113 Регистры PORTB, TRISB и LATB.......................................116 Регистры PORTC, TRISC и LATC.......................................120 Регистры PORTD, TRISD и LATD.......................................123 Регистры PORTE, TRISE и LATE.......................................125 Модуль TIMERO............................................................127 Модуль TIMER1............................................................130 Модуль TIMER2............................................................136 Модуль TIMER3............................................................138 Модуль захвата/сравнения/ШИМ (ССР).......................................141 Расширенный модуль захвата/сравнения/ШИМ (ЕССР)..........................150 Модуль АЦП...............................................................166 Модуль компаратора.......................................................174 Модуль источника опорного напряжения компаратора......................180 Модуль обнаружения перепада питающего напряжения.........................183 Сторожевой таймер........................................................188 Функция ускоренного запуска..............................................189 Монитор тактовых импульсов...............................................190 Защита кода программы....................................................193 397
Регистры конфигурации микроконтроллера.............................196 Глава 2. Функции обмена данными семейства PIC18F2455/2550/4455/4550.......205 Универсальная последовательная шина USB............................205 Встроенная и внешняя периферия USB...........................209 Регистры состояния и управления USB..........................216 ОЗУ USB......................................................219 Дескрипторы буфера и таблица дескрипторов....................220 Буферизация передач типа Ping-Pong...........................225 Прерывания USB...............................................228 Режимы питания устройств USB.................................232 USB и потоковый порт SPP.....................................233 Потоковый параллельный порт (SPP)..................................235 Конфигурация SPP.............................................235 Настройка под управление от USB..............................237 Настройка под управление микроконтроллером...................238 Ведущий синхронный последовательный порт (MSSP)....................241 Работа в режиме SPI..........................................241 Режим ведущего...............................................245 Режим ведомого...............................................246 Работа в режиме 12С..........................................250 Режим ведомого 12С...........................................255 Режим ведущего 12С...........................................265 Режим Multi-Master...........................................276 Расширенный синхронный приемопередатчик (EUSART)...................280 Настройка и режимы...........................................280 Генератор тактовых импульсов (BRG)...........................285 Автоопределение скорости.....................................286 Асинхронный режим EUSART.....................................292 Синхронный режим (ведущий)...................................300 Синхронный режим (ведомый)...................................303 Глава 3. Набор команд.....................................................306 Стандартный набор команд...........................................306 Описание стандартных команд..................................312 Расширенный набор команд...........................................360 Описание расширенного набора команд..........................362 Глава 4. Некоторые аспекты практического применения.......................372 Переход с интерфейса RS-232 на USB.................................372 Спецификация USB CDC.........................................373 Функции USB UART.............................................375 Настройка проекта............................................382 Идентификаторы VID и PID.....................................383 Драйверы Microsoft Windows 2000 и Windows ХР.................383 Управление энергопотреблением в устройствах USB на основе PIC18....383 Спецификация питания устройств USB...........................384 398
Выделение питания......................................... 385 Обработка прерываний USB....................................387 Подпрограммы энергосбережения...............................389 Смена тактовой частоты......................................392 Применение ФАПЧ 96 МГц......................................392 Обнаружение подключения и отключения устройства.............392 Список литературы.........................................................396 399
Вышли В СВЕТ И ИМЕЮТСЯ в продаже: Микроконтроллеры Microchip® rfPIC™ со встроенным маломощным радиопередат- чиком / В. С. Яценков. - М.: Горячая линия- Телеком, 2006 . - 344 с. Рассмотрены микроконтроллеры rfPIC со встроенным миниатюрным радиопередатчиком и миниатюрные радио- приемные модули rfRXD, которые при совместном использо- вании позволяют создавать простые и недорогие устройства для беспроводного сбора и передачи данных и дистанцион- ного управления по радиоканалу. Приведены подробные описания микроконтроллеров rfPIC12C509, rfPlCl2F675 и приемников rfRXD0420(0920), примеры схем и программ, а также описание отладочного комплекта разработчика, вклю- чая чертежи печатных плат для самостоятельного изготов- ления. Для специалистов, разрабатывающих электронное обо- рудование на основе микроконтроллеров. Микропроцессорные системы бытовой тех- ники. Учебник для вузов / Б. П. Баев. - 2-е изд., ислр. и доп.-М.: Горячая линия-Телеком, 2005. -480 с.: ил. Излагаются основы микропроцессорной техники и раз- личные подходы к проектированию микропроцессорных устройств на базе микропроцессоров и микроконтроллеров серий К580, К1816, К1807 и PIC170752. предназначенных для контроля и управления технологическими процессами. Рассматриваются способы программирования и отладки программного обеспечения на языках различного уровня. Для студентов вузов сервисных специальностей, может быть полезна для специалистов, занимающихся разработкой микропроцессорных средств управления. Программирование на языке Ассемблера для микроконтроллеров семейства i8051 / Э. Каспер. - М.: Горячая линия-Телеком, 2004. - 191 с.: ил., ISBN 5-93517-104-Х. Изложены основы программирования на языке Ассемб- лера для популярного семейства микроконтроллеров i8051. Описаны особенности архитектуры микроконтроллеров семейства 18051. Приведены сведения о технологии разра- ботки программ, системе и форматах команд. Книга содер- жит информацию о программировании некоторых типов задач, в том числе задач цифровой фильтрации сигналов, а также несколько рекомендаций о стиле программирования для начинающих программистов. Для широкого круга специалистов, занимающихся разра- боткой промышленной и бытовой аппаратуры, радиолюби- телей, может быть полезна студентам и аспирантам. Современные семейства ПЛИС фирмы Xilinx. Справочное пособие / М. О. Кузелин, Д. А. Кнышев , В. Ю. Зотов . - М.: Горячая ли- ния -Телеком, 2004. - 440 с. Книга знакомит с номенклатурой продукции (микросхемы и средства проектирования), выпускаемой фирмой Xilinx® на современном этапе (на начало 2004 г.). Подробно рассмот- рены архитектура, особенности и характеристики програм- мируемых логических интегральных схем (ПЛИС) семейств CPLD и FPGA, рекомендуемых для применения в перспек- тивных разработках. Для каждой серии ПЛИС представлены таблицы значений основных временных, частотных и элек- трических параметров микросхем. Приведено описание методов разработки проектов и загрузки конфигурации в кристалл. Рассмотрены возможности применения перифе- рийного сканирования для контроля функционирования разработанных устройств. Предназначена для инженерно-технических работников, может быть полезна студентам и аспирантам. Современные микроконтроллеры и микро- процессоры Motorola: Справочник / И. И. Ша- гурин. - М.: Горячая линия-Телеком, 2004. - 952 с.: ил. Книга знакомит читателей с архитектурой, функциониро- ванием и областями применения большой номенклатуры современных микроконтроллеров и микропроцессоров, выпускаемых компанией Motorola (с апреля 2004 г. выпуск этих изделий производится компанией Freescale Semiconduc- tor). В книге рассмотрены восьмиразрядные микроконтрол- леры семейств 68НС05, 68НС08, 68НС11; шестнадцатираз- рядные микроконтроллеры семейств 68НС12, 68НС16; три- дцатедвухразредные микроконтроллеры и микропроцессоры семейств 683хх, 680x0; тридцатидвухразредные RISC- мик- ропроцессоры и RISC-микроконтроллеры семейств PowerPC (МРСбОх, МРС7ХХ, МРС5хх) и ColdFire (MCF5xxx); коммуни- кационные контроллеры МС68360, МС8302, МРС860, МРС823, МРС8260, широко используемые в современных системах телекоммуникации. Дан обзор программных и аппаратных средств для проектирования, программиро- вания и отладки систем на базе микропроцессоров и микро- контроллеров фирмы Motorola. Для широкого круга специалистов, интересую-щихся со- временной микропроцессорной техникой, разрабатывающих и применяющих различные веды систем и устройств на базе микропроцессоров и микроконтроллеров. Справки по телефону: (495) 737-39-27 www.techbook.ru Заказать книги наложенным платежом можно, выслав почтовую открыт- ку или письмо по адресу: 107113, Москва, а/я 10, «Dessy» или по элек- тронной почте: post@dessy.ru