Text
                    ИЗДАНИЕ
2 ИЗДАНИЕ
на языке
ЛД для AVRnPIC
I v-и микроконтроллеров

Программирование на языке С для AVR и PIC микроконтроллеров Издание 2-е, переработанное и дополненное Киев, “МК-Пресс” СПб, “КОРОНА-ВЕК" 2011
ББК 32.973-04 Ш83 УДК 004.312 Ш83 Программирование на языке С для AVR и PIC микроконтролле- ров. Изд. 2-е, переработанное и дополненное./ Сост. Ю.А. Шпак — К.: “МК-Пресс”, СПб.: “КОРОНА-ВЕК”, 2011. —544 с., ил. ISBN 978-5-7931-0842-3 (“КОРОНА-ВЕК”) ISBN 978-966-8806-67-4 (“МК-Пресс”) В книге рассмотрено программирование на языке С микроконтроллеров AVR с использованием компиляторов WinAVR и CodeVisionAVR, а также микрокон- троллеров PIC с использованием компиляторов CCS-PICC, mikroC и С30/32. Крат- ко рассмотрена архитектура и аппаратное обеспечение как традиционных вось- миразрядных микроконтроллеров AVR и PIC, так и новых семейств ATxmega, PIC24 и PIC32. Дано описание средств программной разработки, включая эмуля- цию программ с помощью AVR Studio и MPLAB. Кратко рассмотрен стандартный синтаксис языка С и директивы препроцессора, а также особенности программи- рования на этом языке для микроконтроллеров. Книга содержит программные примеры на С, а также — справочник с описанием системы ассемблерных команд микроконтроллеров AVR (включая ATxmega) и PIC (включая PIC24). ББК 32.973-04 Программирование на языке С для AVR и PIC микроконтроллеров Издание 2-е, переработанное и дополненное Подписано в печать 06.08.2010. Формат 70 х 100 1/16. Бумага газетная. Печать офсетная. Усл. печ. л. 44,1. Уч.-изд. л. 28,6. Тираж 1000 экз. Заказ 350 СПД Савченко Л.А., Украина, г.Киев, тел./ф.: (044) 362-04-38; e-mail: info@mk-press.com. Свидетельство о внесении субъекта издательского дела в Государственный реестр издателей, производителей и распространителей издательской продукции: серия ДК №51582 от 28.11.2003г. ISBN 978-5-7931-0842-3 (“КОРОНА-ВЕК”) ISBN 978-966-8806-67-4 (“МК-Пресс”) ©“МК-Пресс”, 2011
Краткое оглавление 3 Краткое оглавление Часть I. Архитектура микроконтроллеров AVR.......................15 Глава 1. Восьмиразрядные микроконтроллеры AVR....................16 Глава 2. Семейство AVR ATxmega...................................97 Часть II. Компиляторы и средства разработки для МИКРОКОНТРОЛЛЕРОВ AVR.......................................... 140 Глава 3. Компилятор WinAVR.................................... 141 Глава 4. Среда разработки AVR Studio............................146 Глава 5. Среда разработки CodeVisionAVR.........................158 Глава 6. Программаторы для микроконтроллеров AVR................175 Часть III. Архитектура микроконтроллеров PIC....................184 Глава 7. Восьмиразрядные микроконтроллеры PIC...................185 Глава 8. Семейство PIC18F.......................................219 Глава 9. Семейство PIC24........................................231 Глава 10. Семейство PIC32.......................................248 Часть IV. Компиляторы и средства разработки для микроконтроллеров PIC...........................................260 Глава 11. Компилятор CCS-PICC................................. 261 Глава 12. Эмуляция и отладка программ в среде MPLAB.............275 Глава 13. Компилятор mikroC.....................................282 Глава 14. Компиляторы СЗО и С32.................................294 Глава 15. Программаторы для микроконтроллеров PIC...............297 ЧАСТЬ V. ЯЗЫК С И ДИРЕКТИВЫ ПРЕПРОЦЕССОРА.......................302 Глава 16. Основы языка С........................................303 Глава 17. Функции и макросы языка С для различных компиляторов..361 Часть VI. Программные примеры для микроконтроллеров AVR............412 Глава 18. Примеры для компилятора WinAVR...........................413 Глава 19. Примеры для компилятора CodeVisionAVR....................430 Часть VII. Программные примеры для микроконтроллеров PIC...........435 Глава 20. Примеры для компилятора CCS-PICC......................436 Глава 21. Примеры для компилятора mikroC...........................446 Глава 22. Примеры для компилятора СЗО..............................453 Глава 23. Примеры для компилятора С32...........................470 Часть VIII. Приложения.............................................477 Приложение А. Таблица символов ASCII...............................478 Приложение Б. Преобразование из одной системы счисления в другую...479 Приложение В. Система команд микроконтроллеров AVR.................482 Приложение Г. Система команд микроконтроллеров PIC.................498 Приложение Д. Область ввода/вывода микроконтроллеров AVR ATxmega А.519
4 Содержание Предисловие ко 2чиу изданию.........................13 Введение............................................14 ЧАСТЬ I. АРХИТЕКТУРА МИКРОКОНТРОЛЛЕРОВ AVR 15 Глава 1. Восьмиразрядные микроконтроллеры AVR.......................16 Семейства восьмиразрядных микроконтроллеров AVR..................18 Отладочная плата.................................................19 Платы STK500 и STK600......................................... 19 Схема базового монтажа...........................................21 Структура микроконтроллеров AVR..................................22 Организация памяти.............................................22 Память SRAM.................................................23 Память программ.............................................33 Память данных типа EEPROM.................................. 34 Порты..........................................................36 Подтягивающее сопротивление.................................37 Регистры управления портом..................................39 Таймеры/счетчики...............................................39 T/C0........................................................40 T/C1........................................................41 T/C2....'...................................................47 Сторожевой таймер..............................................48 Обработка прерываний...........................................49 Управление прерываниями.....................................52 Сброс..........................................................54 “Спящие”режимы процессора......................................55 Последовательный ввод/вывод....................................56 Приемопередатчик UART.......................................57 Приемопередатчик USART......................................60 Синхронная передача данных по интерфейсу SPI................65 Работа приемопередатчика USART в режиме SPI.................69 Синхронная передача данных по интерфейсу I2C (TWI)..........70 Универсальный последовательный интерфейс US1................75 Модули последовательного ввода/вывода в семействах AT90S, ATtiny и ATmega....................................................79 Аналого-цифровое преобразование................................80 Встроенный аналоговый компаратор...............................86 Программирование памяти..........................................87 Разряды предохранения..........................................89 Параллельное программирование................................ 89 Переход в режим параллельного программирования..............91 Очистка кристалла...........................................91 Программирование и чтение памяти программ...................92 Программирование разрядов блокировки и предохранения........93 Последовательное программирование..............................93 Технология picoPower.............................................96
Содержание 5 Глава 2. Семейство AVR ATxmega....................................97 Обзор возможностей микроконтроллеров ATxmega а..................97 Организация памяти семейства ATxmega............................99 Область ввода/вывода семейства ATxmega......................100 Арбитраж шины данных........................................100 Память программ,............................................101 Контроллер прямого доступа к памяти............................102 Система обработки событий......................................109 Генерирование событий вручную...............................114 Фильтрация..................................................114 Квадратурный дешифратор.....................................115 Система синхронизации..........................................117 Выбор источника тактового сигнала системной синхронизации...120 Счетчики реального времени.....................................122 Счетчик RTC............................................... 123 Счетчик RTC32...............................................123 Модуль питания от батареи......................................123 Обработка прерываний...........................................124 Немаскируемые прерывания....................................125 Регистр управления контроллером прерываний..................125 Аналого-цифровое преобразование................................126 Конфигурирование АЦП........................................127 Выбор разрешения преобразования...........................127 Выбор очередности преобразований в каналах................127 Выбор режима измерения....................................127 Выбор опорного напряжения.................................129 Выбор коэффициента деления частоты тактирования...........130 Результаты измерения........................................130 Прерывание от АЦП...........................................130 ЦИФРО-АНАЛОГОВОЕ ПРЕОБРАЗОВАНИЕ............................... 131 Начало преобразования.......................................132 Ограничения на время преобразования.........................133 АНАЛОГОВЫЙ КОМПАРАТОР......................................... 134 Режимы работы компаратора...................................135 Средства шифрования............................................136 Модуль шифрования AES.......................................137 Модуль обмена данными по инфракрасному каналу..................138 ЧАСТЬ II. КОМПИЛЯТОРЫ И СРЕДСТВА РАЗРАБОТКИ ДЛЯ МИКРОКОНТРОЛЛЕРОВ AVR 140 Глава 3. Компилятор WinAVR................................141 Глава 4. Среда разработки AVR Studio......................146 Эмуляция................................................148 Окно Memory.............................................151 Окно Register............................................152 Окно Watch..............................................152 Отладка программы.......................................152
6 НАСТРОЙКА ПАРАМЕТРОВ ИМИТАТОРА...........................153 Создание проекта и компиляция программы..................153 Компиляция проекта.....................................156 Глава 5. Среда разработки CodeVisionAVR....................158 КОМПИЛЯЦИЯ И ПОСТРОЕНИЕ ПРОЕКТА..........................159 Создание проекта с помощью мастера CodeWizardAVR.........164 Сохранение и открытие проекта CodeWizardAVR............171 Создание новых файлов с исходным кодом...................172 Отладка программы........................................173 Использование терминала................................174 Глава 6. Программаторы для микроконтроллеров AVR...........175 Программные средства для программирования микроконтроллеров.179 Программирование устройства в среде A VR Studio 4......179 Программирование устройства в среде CodeVisionAVR......181 ЧАСТЬ III. АРХИТЕКТУРА МИКРОКОНТРОЛЛЕРОВ PIC 184 Гдава 7. Восьмиразрядные микроконтроллеры PIC.....................185 Общие аспекты архитектуры восьмиразрядных МИКРОКОНТРОЛЛЕРОВ PIC....................................... 186 Организация памяти...........................................186 Организация тактирования.....................................188 Порты........................................................190 Таймеры......................................................192 TMR0 и сторожевой таймер...................................192 TMR1.......................................................194 TMR2.......................................................195 Модуль ССР.................................................197 Обработка прерываний.........................................198 Микроконтроллеры серии Р1С17Сх.............................199 Микроконтроллеры серии Р1С18Сх.............................200 Сброс........................................................202 Последовательный обмен данными...............................202 Приемопередатчик USART.....................................203 Синхронная передача данных по интерфейсу SPI...............204 Синхронная передача данных по интерфейсу 12С...............206 Аналого-цифровое преобразование..............................207 Встроенный аналоговый компаратор...........................209 Семейство микроконтроллеров PIC16...............................210 Микроконтроллер 16F84A.......................................211 Регистр состояния.............................,............212 Организация памяти.........................................213 Слово конфигурации.........................................215 Память EEPROM..............................................215 Микроконтроллеры серии 12F50X...................................216
Содержание 7 Глава 8. Семейство PIC18F.........................................219 Организация памяти..............................................221 Конфигурационные регистры....................................222 Организация тактирования........................................225 Внутренний осциллятор........................................226 Переключение источника тактирования...................................................... 226 Таймеры.........................................................227 TMR0.........................................................227 TMR1.........................................................228 TMR3.........................................................228 АЦП:............................................................229 Обработка прерываний............................................229 Глава 9. Семейство PIC24..........................................231 Порты...........................................................234 Таймеры.........................................................236 Прерывания......................................................236 Вложение прерываний..........................................238 Системные прерывания.........................................239 Окно Program Space Visibility...................................239 Интерфейс SPI...................................................240 ПортРМР.........................................................241 АЦП.............................................................241 МОДУЛЬ CTMU.....................................................244 Измерение заряда конденсатора................................245 Измерение времени............................................245 Формирование импульсных последовательностей и задержек.......246 Глава 10. Семейство PIC32.........................................248 Порты...........................................................250 Таймеры.........................................................251 Системная шина..................................................251 Организация памяти..............................................252 Прерывания и исключения.........................................254 Система тактирования............................................258 Интерфейс SPI...................................................258 ПортРМР.........................................................258 АЦП.............................................................259 Модуль сравнения на выходе......................................259 ЧАСТЬ IV. КОМПИЛЯТОРЫ И СРЕДСТВА РАЗРАБОТКИ ДЛЯ МИКРОКОНТРОЛЛЕРОВ PIC 260 Глава 11. Компилятор CCS-PICC...............................261 Создание проектов CCS-PICC вручную........................261 Создание проектов CCS-PICC с помощью PIC wizard..........265 Создание проектов CCS-PICC с помощью PIC24 Wizard.........271 Открытие и добавление в проект файлов с исходным кодом....272 КОМПИЛЯЦИЯ ПРОЕКТА.......................................272
8 Меню Tools..............................................274 Глава 12. Эмуляция и отладка программ в среде MPLAB.......275 Рабочая область и проект MPLAB..........................276 Компиляция под управлением MPLAB........................277 Настройка режима отладки/эмуляции.......................277 Работа в режиме отладки/эмуляции........................279 ОКНА ОТЛАДЧИКА........................................ 280 Глава 13. Компилятор mikroC............................. 282 Создание проекта mikroC.................................283 Компиляция проекта......................................285 Добавление в проект файлов с исходным кодом.............287 Эмуляция выполнения программы...........................288 вспомогательные инструменты среды mikroC................290 Глава 14. Компиляторы СЗО и С32...........................294 Компилятор СЗО..........................................294 Компилятор С32..........................................296 Глава 15. Программаторы для микроконтроллеров PIC.........297 Программные средства для программирования микроконтроллеров.298 Программирование устройства в среде mikroC............300 ЧАСТЬ V. ЯЗЫК С И ДИРЕКТИВЫ ПРЕПРОЦЕССОРА 302 Глава 16. Основы языка С........................................303 Вводные понятия...............................................303 Структура программы на С......................................304 Типы данных, переменные, константы............................306 Правила преобразований из одной системы счисления в другую.308 Тип char...................................................309 Пользовательские типы......................................309 Переменные.................................................310 Область видимости переменных.............................310 Константы..................................................311 Перечислимые типы..........................................311 Приведение типов...........................................312 Оператор sizeof............................................312 Функции.......................................................312 Возвращаемые значения......................................313 Прототипы функций..........................................314 IGiaccbi памяти при объявлении локальных переменных........314 Рекурсия...................................................315 Структуры.....................................................316 Указатели и адреса переменных.................................318 Передача в функции параметров по ссылке....................318 Указатели на структуры.....................................319 МАССИВЫ И СТРОКИ..............................,...............320
Содержание 9 Строки.........................................................321 Многомерные массивы...................................>...... 321 Операторы ветвления...............................................321 Оператор if-else...............................................322 Условные выражения.............................................322 Оператор switch-case...........................................322 Циклические конструкции...........................................323 Конструкция while............................................ 323 Конструкция for.............................................. 324 Конструкция do-while...........................................324 Организация бесконечных циклов............................... 325 Операторы break и continue.....................................325 Стандартные функции ввода/вывода..................................325 Ввод/вывод символов с помощью функций getcharQ и putcharQ......326 Функции вывода строк puts 0 и printfO..........................327 Функции ввода строк gets 0 и scanfO.......................... 328 Директивы препроцессора...........................................329 Директива ^include.............................................329 Директива ^define..............................................329 Директивы условной компиляции............................,.....331 Директива tterror..............................................333 Директива ftpragma компилятора CodeVisionA VR..................333 Директивы, характерные для компилятора CCS-PICC................333 Директива #bit...............................................334 Директива #byte..............................................334 Директива #case..............................................334 Директива ^device............................................334 Директива #fiise.............................................335 Директива #locate............................................336 Директива #org...............................................336 Директива #opt...............................................337 Директива #priority..........................................337 Директива #reserve...........................................338 Директива #rdm...............................................338 Директива #type..............................................338 Директива #use delay........................................*338 Директива #use xxxio.........................................338 Директива #use i2c...........................................339 Директива #use rs232.........................................340 Директива #zero_ram..........................................341 Обработка прерываний..............................................341 Обработка прерываний в среде WinAVR............................341 Обработка прерываний в среде CodeVisionAVR.....................343 Обработка прерываний в среде CCS-PICC..........................343 Обработка прерываний в среде mikroC............................345 Обработка прерываний в среде С30............................... 345 Обработка прерываний в среде С32............................... 347 Исполнение ассемблерного кода.....................................353 Использование ассемблера в компиляторе WinAVR..................353
10 Ассемблерный код.............................................354 Входные и выходные операнды..................................355 Резервирование регистров.....................................356 Использование ассемблера в компиляторе CodeVisionAVR............358 Использование ассемблера в компиляторе CCS-PICC.................358 Использование ассемблера в компиляторе mikroC...................359 Использование ассемблера в компиляторах СЗО и С32...............360 Глава 17. Функции и макросы языка С для различных компиляторов. 361 Стандартные функции языка С.......................................361 Функции для работы со строками..................................363 Функции для работы с символами..................................365 Функции для работы со случайными числами........................367 Функции для работы с памятью....................................367 Функции и макросы компилятора WinAVR..............................368 Математические макросы и функции................................368 Функции для работы со строками..................................369 Функции для работы с символами..................................373 Макросы и функции для организации ввода/вывода..................373 Функции управления микроконтроллером............................378 Макросы для работы со сторожевым таймером.......................379 Функции для работы со случайными числами........................380 Функции для работы с памятью....................................380 Макросы для обработки прерываний................................381 Макросы и функции для работы с памятью EEPROM...................382 Функции и макросы компилятора CodeVisionAVR.......................383 Математические макросы и функции................................383 Функции для работы со строками................................................................. 384 Функции для работы с символами..................................387 Функции управления микроконтроллером............................387 Функции для организации ввода/вывода............................387 Функции для работы с памятью....................................388 Функции для работы с интерфейсом 12С............................389 Функции и макросы компилятора CCS-PICC............................389 Математические макросы..........................................389 Функции для работы со строками..................................390 Функции для организации ввода/вывода............................391 Функции управления микроконтроллерам............................394 Функции для работы с таймерами и модулем ССР....................396 Функции для работы с разрядами и памятью........................398 Функции для работы с памятью EEPROM.............................400 Функции для работы с интерфейсом SPI............................401 Функции для работы с интерфейсом PSP............................402 Функции для работы с интерфейсом fC........................... 402 Функции для работы с аналоговыми сигналами......................403 Функции компилятора mikroC........................................405 Математические функции..........................................405 Функции для работы со строками..................................405 Функции преобразований..........................................407 Функции управления микроконтроллером.......................... 407
Содержание 11 Функции для работы с периферийными устройствами.......408 Функции для работы с памятью EEPROM и Flash...........409 Функции для работы с интерфейсом 12С..................410 Функции для работы с интерфейсом SPI...................410 ЧАСТЬ VI. ПРОГРАММНЫЕ ПРИМЕРЫ ДЛЯ МИКРОКОНТРОЛЛЕРОВ AVR 412 Глава 18. Примеры для компилятора WinAVR.................413 Управление ЖК-дисплеем.................................413 GPS-навигатор..........................................418 Глава 19. Примеры для компилятора CodeVisionAVR..........430 Управление аналого-цифровым преобразованием............430 Измерение температуры..................................433 ЧАСТЬ VII. ПРОГРАММНЫЕ ПРИМЕРЫ ДЛЯ МИКРОКОНТРОЛЛЕРОВ PIC 435 Глава 20. Примеры для компилятора CCS-PICC.................436 Отображение состояния выводов порта.................... 436 Управление частотой мерцания светодиодов с помощью различных ТАЙМЕРОВ.................................................437 Управление светофорами на перекрестке....................438 Обмен данными в режиме PSP...............................442 Контроль предельной скорости вращения двигателя..........444 Глава 21. Примеры для компилятора mikroC...................446 Игральные “кости”........................................446 Вольтметр с ЖК-дисплеем..................................448 Калькулятор............................................ 450 Глава 22. Примеры для компилятора СЗО......................453 Использование порта РМР..................................453 Небольшая библиотека функций для доступа к ЖК-модулю...453 Расширенное управление ЖК-дисплеем.....................456 Работа с АЦП.............................................460 Считывание уровня напряжения с потенциометра...........461 Измерение температуры..................................465 Глава 23. Примеры для компилятора С32......................470 Работа с интерфейсом SPI.................................470 Работа с модулем UART....................................473 ЧАСТЬ VIII. ПРИЛОЖЕНИЯ 477 Приложение А. Таблица символов ASCH......................478 Приложение б. Преобразование из одной системы счисления в другую.................................................479
12 Приложение В. Система команд микроконтроллеров AVR..........482 Наличие команд в различных микроконтроллерах AVR..........495 Команды по категориям................................... 497 Приложение Г. Система команд микроконтроллеров PIC..........Д98 Команды восьмиразрядных микроконтроллеров.................498 Команды по категория*!..................................509 Система команд микроконтроллеров' PIC24...................510 Приложение Д. Область ввода/вывода микроконтроллеров AVR ATxmega а...............................................519 Список литературы.........................................532 Содержимое прилагаемого к книге компакт-диска.............533
Предисловие ко 2-му изданию 13 Предисловие ко 2-му изданию Второе издание книги “Программирование на языке С для AVR и PIC микро- контроллеров”, по сравнению с первым, претерпело ряд существенных изменений и дополнений: • в описании восьмиразрядной архитектуры микроконтроллеров AVR и PIC были учтены особенности современных устройств от компаний Atmel и Microchip; • рассмотрено новое семейство микроконтроллеров AVR ATxmega; • кратко затронуты основные аспекты новых технологий PIC24 и PIC32; • кроме компилятора WinAVR, для микроконтроллеров AVR рассмотрена среда разработки CodeVisionAVR; • дано описание современной версии среды разработки CCS-PICC; • кроме компилятора CCS-PICC, для микроконтроллеров PIC рассмотрена среда разработки mikroC, а также — новые компиляторы СЗО и С32, рассчитанные на 16-разрядную технологию PIC24 и 32-разрядную PIC32, соответственно; • кратко затронуты разновидности программаторов для AVR и PIC; • перечислены основные библиотечные функции и макроопределения языка С компиляторов WinAVR, CodeVisionAVR, CCS-PICC и mikroC; • даны примеры программ для всех рассмотренных в книге компиляторов; • рассмотрена система команд микроконтроллеров ATxmega и PIC24. Следует отметить, что с учетом критических отзывов, высказанных читателями в отношении примеров программ, представленных в первом издании книги, соста- вители постарались использовать проекты из достоверных источников. Со списком литературы, использованной в процессе работы над этим изданием, можно ознако- миться в конце книги. Кроме перечисленных первоисточников, в работе над мате- риалом также использовались официальные документы Atmel и Microchip.
14 Введение Однокристальные микроконтроллеры находят широкое применение в самых разнообразных сферах: от измерительных приборов, фотоаппаратов и видеокамер, принтеров, сканеров и копировальных аппаратов до изделий электронных развлече- ний и всевозможной домашней техники. Со времени появления первых микропроцессоров в 1970-х годах их сложность постоянно возрастала за счет появления новых аппаратных решений и добавления новых команд, предназначенных для решения новых задач. Так постепенно сложи- лась архитектура, получившая впоследствии название CISC (Complex Instruction Set Computers — компьютеры co сложным набором команд). В дальнейшем обозначи- лось и нашло активное развитие еще одно направление: архитектура RISC (Reduced Instruction Set Computers — компьютеры с сокращенным набором команд). Именно к этой архитектуре относятся микроконтроллеры AVR от компаний Atmel и PIC от компании Microchip, которым посвящена эта книга. На заре возникновения микропроцессоров разработка программного обеспече- ния происходила исключительно на том или ином языке ассемблера, ориентирован- ном на конкретное устройство. По сути, такие языки представляли собой символь- ные мнемоники соответствующих машинных кодов, а перевод мнемоники в машин- ный код выполнялся транслятором. Однако главный недостаток ассемблерных язы- ков заключается в том, что каждый из них привязан к конкретному типу устройств и логике его работы. Кроме того, ассемблер сложен в освоении, что требует доста- точно больших усилий для его изучения, которые, к тому же, оказываются потра- ченными впустую, если впоследствии потребуется перейти на использование мик- роконтроллеров других производителей. Язык С, являясь языком высокого уровня, лишен подобных недостатков и мо- жет использоваться для программирования любого микропроцессора, для которого есть компилятор с языка С. В языке С все низкоуровневые операции, выполняемые компьютерами, представлены в виде абстрактных конструкций, позволяющих раз- работчикам сосредоточиться на программировании одной лишь логики, не заботясь о машинном коде. Изучив язык С, можно легко переходить от одного семейства микроконтроллеров к другому, тратя гораздо меньше времени на разработку. В этой книге рассмотрены основы программирования на языке С микрокон- троллеров AVR с использованием компиляторов WinAVR и CodeVisionAVR, а так- же микроконтроллеров PIC с использованием компиляторов CCS-PICC, C3O/32 и mikroC. Надеемся, представленные здесь программные проекты помогут читателю быстро и легко освоить азы программирование микроконтроллеров для конкретных областей применения. Желаем успехов в освоении вселенной под названием “Программирование мик- роконтроллеров”. Надеемся, эта книга станет хорошим подспорьем в преодолении нелегкого пути проб и ошибок. Через тернии к звездам...
ЧАСТЬ I Архитектура микроконтроллеров AVR
Глава 1 Восьмиразрядные микроконтроллеры AVR Все восьмиразрядные микроконтроллеры AVR спроектированы для работы в составе очень производительной, маломощной архитектуры RISC. Микропроцес- соры первого поколения обладали жестко “прошитой” логикой декодирования ко- манд. В то время технология создания запоминающих устройств сильно “хромала” по сравнению с технологией изготовления процессоров, т.е. более скоростным про- цессорам приходилось долго ожидать считывания следующей команды для декоди- рования из медленнодействующего запоминающего устройства. Поэтому, с целью эффективного использования этого периода ожидания, возникла идея заполнить время до поступления следующей команды. В результате возникли команды, которые выполняли последовательно несколь- ко внутрипроцессорных операций до тех пор, пока не поступала следующая внеш- няя команда. Так появились процессоры CISC (Complex Instruction Set Computer — компьютер co сложным набором команд). Типичными представителями этой архи- тектуры процессоров являются семейства 80x86 и процессор Pentium компании Intel или семейства 680x0 компании Motorola. Практически все процессоры CISC работают по принципу микропрограммиро- вания, т.е. каждая машинная команда последовательно обрабатывается микропро- граммой, которая выполняется внутри кристалла процессора. Однако, если'взгля- нуть на существующие программы через призму статистики, то обнаружится, что из большого набора команд процессоров CISC (у некоторых типов — свыше 300) ис- пользуется только небольшая, постоянно повторяющаяся часть в размере около 20 процентов. В дополнение к этому, комплексную программу можно зачастую заме- нить несколькими эффективными командами, которые в состоянии справиться с поставленной задачей быстрее. Со временем изготовителям модулей памяти удалось резко-сократить время доступа, в результате чего в середине 1980-х годов произошел возврат “к истокам”, и была разработана архитектура RISC. Возникли компьютеры с сокращенным набо- ром команд, у которых команды, как и в процессорах первых поколений, снова де- кодировались посредством “жесткой прошивки”. Перечислим характерные особенности архитектуры RISC: • как следует из самого названия, самой примечательной особенностью является ограниченное количество эффективных команд; • отсутствие классического накапливающего сумматора в пользу большего числа равноправных рабочих регистров; • организация диапазонов памяти по Гарвардской модели; • единый интерфейс с запоминающими устройствами за счет исключительного применения команд вида “Загрузка/Сохранение”;
17 • обработка почти всех команд в течение единственного машинного такта; • оптимизация аппаратного обеспечения и набора команд с целью применения программирования на языках высокого уровня. Поначалу использование архитектуры RISC было ограничено мощными ком- пьютерами, выступающими в роли рабочих станций, однако вскоре были открыты преимущества этой архитектуры для однокристальных микроконтроллеров, что до- казывают устройства AVR компании Atmel. Представители семейства AVR обладают ограниченным набором высокоэффек- тивных команд (от 89 до 135, в зависимости от модели). Благодаря особой архитек- туре микропроцессоров AVR, исключен ярко выраженный недостаток обычных процессоров, у которых все арифметические и логические операции выполняются исключительно в так называемом накапливающем сумматоре. Вследствие этого, как правило, после завершения собственно вычислительных операций требуются опе- рации обращения к вспомогательным регистрам или промежуточным запоминаю- щим устройствам. У микроконтроллеров AVR этот недостаток отсутствует, по- скольку в вычислениях, кроме накапливающего сумматора, задействованы 32 рав- ноправных рабочих регистра, напрямую связанных с арифметико-логическим уст- ройством (АЛУ). Микроконтроллеры AVR работают по Гарвардской архитектуре, что подразу- мевает разделение памяти для программ и данных. Они используют одноступенча- тую конвейерную обработку. Это означает, что во время выполнения команды вы- полняется загрузка следующей команды из памяти программ (рис. 1.1). Благодаря этому, достигается возможность выполнения команды в течение одного тактового цикла. Рис. 1.1. Конвейерная обработка при выборке и выполнении команды в 8-разрядных микроконтроллерах AVR Первая команда программы выполняется на один тактовый цикл дольше, чем та же команда в другом месте программы, поскольку в этом случае выборка не может быть осуществлена параллельно с выполнением предыдущей команды. В микроконтроллерах AVR используются несколько команд загрузки/сохране- ния, с помощью которых к переменным и константам можно обратиться в различ- ных режимах адресации. У большинства обычных процессоров и контроллеров такт, сгенерированный кварцевым осциллятором, делится на заранее заданный коэффициент для получения собственно системного такта. Так, например, в контроллере 8051, работающем с частотой кварца 12 МГц, при внутреннем коэффициенте деления минимальное
18 Глава 1. Восьмиразрядные микроконтроллеры AVR время выполнения команд составляет всего лишь одну секунду, причем “минималь- ное время” в данном случае подразумевает, что для выполнения некоторого количе- ства команд потребуется больше времени. Однако в случае с микроконтроллерами AVR такого не происходит. В них действительно почти все команды выполняются в течение одного периода частоты кварцевого генератора, что, например, при мак- симально допустимой частоте 12 МГц означает всего лишь 83,33 нс. Другими сло- вами, достигается быстродействие до 12 MIPS (Million Instructions Per Second), т.е. 12 миллионов выполненных команд в течение одной секунды! И, за немногими исключениями, микроконтроллеры AVR действительно обрабатывают любую ко- манду в течение единственного системного такта. После того как в однокристальных микроконтроллерах для выполнения про- грамм все больше начали использоваться языки высокого уровня (прежде всего, язык программирования С), архитектура AVR была оптимизирована для эффектив- ного взаимодействия аппаратного и программного обеспечения, написанного на языках высокого уровня. К примеру, микроконтроллеры AVR специально для рабо- ты с указателями предоставляют в распоряжение программиста команды с функ- циями автоматического инкремента и декремента. Семейства восьмиразрядных микроконтроллеров AVR Компания Atmel предоставляет обширный набор восьмиразрядных микрокон- троллеров AVR, разбитых на несколько семейств в соответствии с их характеристи- ками и областью применения. Рассмотрим основные семейства: • AT90S — “классические” микроконтроллеры AVR, которые в данное время компанией Atmel для использования не рекомендуются, и заменимы другими, более современными устройствами: ► AT90S1200 и AT90S2313 — на ATtiny2313; ► AT90S2323 и AT90S2343 — на ATtiny25; ► AT90S4433 — на ATmega8; ► AT90S4414 и AT90S8515 — на ATmega8515; ► AT90S8535 — на ATmega8535; • ATtiny — привлекательные по цене микроконтроллеры с урезанным количест- вом каналов ввода-вывода и уменьшенной памятью, что позволяет снизить по- требление энергии и размеры корпуса; • ATmega — высокопроизводительные устройства с достаточным объемом памя- ти и набором каналов ввода-вывода, что позволяет применять йх в самых раз- нообразных сферах; • ATxmega — новое семейство микроконтроллеров AVR с расширенными ресур- сами и возможностями, наподобие контроллера прямого доступа к памяти, сис- темы обработки событий, высокоскоростных ЦАП и АЦП и др. Компания Atmel предоставляет и другие семейства микроконтроллеров AVR, ориентированные на какие-либо специфические задачи: применение в автомобилях, управление ЖК-дисплеями и осветительными приборами, организация подключе- ний по интерфейсу CAN и USB и др. Хотя все эти сферы, безусловно, интересны, рассмотрение подобных устройств выходит за тематические рамки данной главы, посвященной только общим архитектурным аспектам микроконтроллеров AVR. За дополнительной информации обращайтесь к специализированным изданиям или на Web-сайт компании Atmel (www. atmel. com).
Отладочная плата 19 В этой главе мы рассмотрим общие аспекты архитектуры семейств AT90S, АТ- tiny и AT mega, а в следующей — особенности нового семейства ATxmega микро- контроллеров AVR. Отладочная плата Сам по себе микроконтроллер ничего не может. Он требует определенной схе- мы базового монтажа, которая обычно состоит из кварцевого генератора и несколь- ких конденсаторов. Без этого микроконтроллер просто не начнет выполнять про- грамму, которую, впрочем, тоже необходимо каким-то образом в него записать. От- сюда возникает потребность в каком-либо программаторе — специальном адаптере для переноса исполняемого кода с компьютера в память микроконтроллера. Кроме того, если требуется использовать последовательный интерфейс, на арену выходит преобразователь логического уровня (например, МАХ232) и соответствующий разъем (например, RS232). Таким образом, у нас есть две возможности: • приобрести по отдельности все компоненты для базового монтажа и подключе- ния программатора и собрать все вручную; • обзавестись готовой отладочной платой, что гораздо проще. В типичную отладочную плату уже интегрирован интерфейс программирова- ния, несколько кнопок и светодиодов. Кроме того, такие платы зачастую реализуют какой-либо последовательный интерфейс. Платы STK500 и STK600 Компания Atmel предлагает хорошо продуманные, приемлемые по цене отла- дочные платы (например, STK500 и STK600) и множество дополнительных модулей расширения к ним. Так, плата STK500 (рис. 1.2) предоставляет: • разъемы для установки процессоров в корпусах DIP с числом выводов 8, 20, 28 и 40; • низковольтное программирование через интерфейс SPI (в том числе микрокон- троллеров, установленных во внешнем устройстве); • высоковольтное программирование (с доступом к любым разрядам конфигура- ции); • встроенный источник питания: вход — постоянное напряжение 10.. 15 В; 0,5 А; выход — устанавливается из среды программирования (по умолчанию — 5 В); • встроенный источник опорного напряжения; • тактовый генератор, частота которого устанавливается из среды программиро- вания (до 3,68 МГц) или внешним кварцевым резонатором; • формирователь сигналов интерфейса RS232; • восемь кнопок и светодиодов; • связь с ПК по интерфейсу RS232. Вместе с платой поставляются кабели для подключения. Все порты процессо- ров, кнопки и светодиоды выведены на разъемы и могут быть соединены в произ- вольном порядке. Плата STK500 поддерживает все микроконтроллеры AVR се-
20 Глава 1. Восьмиразрядные микроконтроллеры AVR мейств ATtiny и ATmega, кроме ATmega 103. Возможно программирование любых микроконтроллеров AVR, установленных во внешнем устройстве. Рис. 1.2. Отладочная плата STK500 Возможности новой отладочной платы STK.600 (рис. 1.3) гораздо шире: • стабилизированный источник питания с программно управляемым выходным напряжением; • преобразователи уровней сигналов RS232, LIN и CAN; • разъемы интерфейсов USB (Device), mini-USB (host), RS-232, CAN; • программно управляемый источник опорного напряжения; • восемь кнопок и светодиодов; • источник тактовых сигналов с регулируемой частотой до 32 МГц; • связь с ПК п<? интерфейсу USB. Рис. 1.3. Отладочная плата STK600 Вместе с платой поставляются кабели для подключения. Плата STK600 под- держивает все микроконтроллеры AVR семейств ATtiny, ATmega, ATxmega, а так- же — новые 32-разрядные устройства семейства AVR32 UC3 (в этой книге не рас- сматриваются). Существуют и другие отладочные платы для микроконтроллеров AVR (как от компании Atmel, так и от сторонних разработчиков), перечислять которые мы здесь не будем. Другими словами, предоставляем право выбора подходящего комплекта самому читателю.
Схема базового монтажа 21 Схема базового монтажа Любой микроконтроллер AVR должен быть включен в некоторую базовую схе- му, иначе он просто не будет работать. Пример такой схемы для устройства АТ- mega8 показан на рис. 1.4. Рис. 1.4. Схема базового монтажа для микроконтроллера АТтедав В данном случае используются следующие компоненты: • конденсатор С1 — 100 нФ; • конденсаторы С7 и С8 — по 22 пФ; • кварц на 3,686 МГц (или на 4, 8, 16 МГц). Микроконтроллер АТтеда8, как и все другие, по умолчанию сконфигурирован на работу от внутреннего тактового генератора, из-за чего внешний кварц он просто проигнорирует. Для переключения на внешнее тактирование необходимо установить соответствующие конфигу- рационные разряды предохранения (fuse bits), которые рассматривают позже в этой же главе. Питание микроконтроллера можно обеспечить напрямую от сети через стаби- лизирующий сетевой блок или (что более удобно и безопасно) — с помощью любо- го блока питания на 9.. 12 В. Для этого потребуется стабилизатор напряжения, кото- рый можно легко включить в базовую схему согласно рис. 1.5. сз С2 & OW - I £1 .. ей Рис. 1.5. Схема включения стабилизатора напряжения
22 Глава 1. Восьмиразрядные микроконтроллеры AVR В данном случае используются следующие компоненты: • IC1 —стабилизатор напряжения 5 В (7805); • электролитический конденсатор С1 — 10 мкФ (соблюдайте правильную поляр- ность!); • конденсаторы С2 и СЗ — на 100 нФ; • диод D1 — 1N4001. Этот стабилизатор преобразовывает входное напряжение в диапазоне 9.. 12 В в требуемое микроконтроллерам AVR напряжение питания 5 В. Кроме того, данная схема отчасти предохраняет устройство от возможных перенапряжений. Структура микроконтроллеров AVR В общем случае структура всех восьмиразрядных микроконтроллеров AVR со- ответствует схеме, показанной на рис. 1.6. Рис. 1.6. Обобщенная структура восьмиразрядных микроконтроллеров AVR Процессорное ядро включает в себя систему управления (счетчик команд и схема декодирования команд, извлекаемых из памяти программ) и операционное устройство, отвечающее за выполнение арифметических и логических операций. Операционное устройство, как правило, состоит из арифметико-логического уст- ройства (АЛУ), накапливающего сумматора и нескольких вспомогательных регист- ров. В классической программе почти половина всех команд — это команды пере- сылки для передачи данных от вспомогательных регистров к накапливающему сум- матору и обратно. В микроконтроллерах AVR накапливающий сумматор становится не столь критически важным, благодаря применению 32-х рабочих регистров, свя- занных с блоком АЛУ. В результате арифметические и логические операции могут быть выполнены в течение единственного такта. Операции АЛУ можно разделить на три основные категории: арифметические, логические и поразрядные. Каждой из этих категорий соответствуют мощные ко- манды. Новые микроконтроллеры AVR имеют также аппаратные умножители в ари- фметическом блоке АЛУ. Организация памяти В запоминающих устройствах, соответствующих классической концепции фон Неймана, данные и команды хранятся в одной памяти. В противоположность этому, память по Гарвардской архитектуре, используемой в восьмиразрядных микрокон- троллерах AVR, состоит из нескольких компонентов. В данном случае разделены память команд и память данных, т.е. обращение к командам осуществляется незави- симо от доступа к данным.
Структура микроконтроллеров AVR 23 В микроконтроллерах AVR отдельные сегменты памяти отличаются также и физической реализацией. • Внутренняя память для энергозависимых данных (т.е. данных, которые будут потеряны после отключения рабочего напряжения) представляет собой статиче- скую память RAM (SRAM). Ее преимущество заключается в том, что отпадает всякая необходимость во внутренней регенерации как в случае с некоторыми другими процессорами, которые используют динамическую память. По этой причине микроконтроллеры AVR могут работать с тактами вплоть до 0 Гц. В дополнение к этому, некоторые микроконтроллеры AVR для увеличения объ- ема обрабатываемых данных могут работать с подключаемой внешней памятью SRAM. Для этого, однако, приходится жертвовать выводами портов. • Для данных, которые должны сохраниться после отключения рабочего напря- жения, в распоряжении имеется память EEPROM (Electrically EPROM — элек- трически стираемое ППЗУ), данные в которую можно записывать непосредст- венно во время выполнения программы. Для области EEPROM также не обяза- тельно программирующее устройство. • Память программ реализована на основе программируемой и электрически сти- раемой Flash-технологии. Во всех восьмиразрядных микроконтроллерах AVR она — 16-разрядная (двухбайтная) и всегда встроена в кристалл. Расширение памяти программ с помощью блоков EPROM или Flash невозможно. Память SRAM Статическое ОЗУ (SRAM) микроконтроллеров AVR семейств AT90S, ATtiny и ATmega представляет собой блок со сквозной адресацией, состоящий из двух или трех (в зависимости от модели микроконтроллера) подобластей (рис. 1.7). Самый верхний адрес внутренней памяти SRAM, обозначенный на рис. 1.7 как “RamEnd”, зависит от построения ОЗУ соответствующего микроконтроллера. Размеры SRAM для различных восьмиразрядных микроконтроллеров AVR показаны в табл. 1.1. В ряде микроконтроллеров можно увеличивать пространство памяти SRAM пу- тем подключения внешних блоков вплоть до 64 Кбайт, однако для этого приходится пожертвовать выводами портов А и С, которые в таком случае применяются в каче- стве шин передачи данных и адресов. Таблица 1.1. Размеры памяти SRAM восьмиразрядных микроконтроллеров AVR Микроконтроллер Объем памяти SRAM, байт Адрес “RamEnd” AT90S1200 — $005F AT90S2313 128 $00DF AT90S2323 128 $00DF AT90S2343 128 $00DF AT90S4414 256 $015F AT90S4433 128 $00DF AT90S8515 512 $025F AT90S8535 512 $025F ATtiny 11 — $005F ATtiny 12 — $005F ATtiny 13А 64 $009F ATtiny 15L — $005F ATtiny2313 128 $00DF
Глава 1. Восьмиразрядные микроконтроллеры AVR Таблица 1.1. Продолжение Микроконтроллер Объем памяти SRAM, байт Адрес “RamEnd” ATtiny24 128 $00DF ATtiny25 128 $00DF ATtiny26 128 $00DF ATtiny261 128 $00DF ATtiny28L 128 $00DF ATtiny44A 256 $015F ATtiny45 256 $015F ATtiny461 256 $015F ATtiny48 256 , $015F ATtiny84 512 $025F ATtiny85 512 $025F ATtiny861 512 $025F ATtiny88 512 $025F ATmega128 4096 $105F ATmega1280 8192 $205F ATmega1281 8192 $205F ATmega1284P 16384 $405F ATmega16 1024 $045F. ATmega16A 1024 $045F ATmega162 1024 $045F ATmega164P 1024 $045F ATmega165P 1024 $045F ATmega168 1024 $045F ATmega168P 1024 $045F ATmega169 1024 $045F ATmega2560 8192 $205F ATmega2561 8192 $205F ATmega32A 2048 $085F ATmega324PA 2048 $085F ATmega325 2048 $085F ATmega325P 2048 $085F ATmega3250 2048 $085F ATniega3250P 2048 $085F ATmega328P 2048 $085F ATmega48PA 512 $025F ATmega64 4096 $105F ATmega640 8192 $205F ATmega644 4096 $105F ATmega644P 4096 $105F ATmega645 4096 $105F ATmega6450 4096 $105F ATmega8 1024 $045F ATmega8515 512 $025F ATmega8535 512 $025F ATmega88PA 1024 $045F
Структура микроконтроллеров AVR 25 (б ш 1 ш ш co о Ф $3F $ЗЕ $3D $ЗС $ЗВ SREG _______SEU________1 SPL t •> (зарезервировано) QI ms к 2 Адреса 0 SRAM $FFFF "т- Внешнее ОЗУ *)Т- — RamEnd+1 Ram End m о ₽• $04 $03 $02 $01 $00 (зарезервировано; (зарезервировано зарезервировано зарезервировано ^зарезервировано' Внутреннее ОЗУ *) $1F. $1Е $1D $1С $1В $1А $19 r 31 =£er Z старший.-) гЗО =Per Z младший r29 = Per.Y старший») г 28 =Per.Y младший») г 27 = Per X старший») г 26 =Per X младший») Per, вв/выв 63 Per. ввУвыв 62 Per, вв/выв. 61 Область ввода/вывода Per. вв./выв 1 Per. ввУвыв. 0 г 25 Ill $060 $05F $020 $01F $04 $03 $02 $01 $00 Область регистров Х4. £2 И Ы г 1 г0 1000 ф « о ф 7 1 *) В некоторых микроконтроллерах AVR отсутствует Рис. 1.7. Организация памяти SRAM микроконтроллеров AVR семейств AT90S, ATtiny и ATmega Регистровый файл Самая нижняя область памяти SRAM образует регистровый файл с 32 рабочими регистрами, которые все связаны с АЛУ и доступ к которым может быть выполнен в течение единственного такта системной синхронизации. Это означает, что за вре- мя такта в арифметико-логическое устройство вводятся два операнда из регистрово- го файла, выполняется операция, а результат запоминается в регистре назначения (рис. 3.3). Такт системной синхронизации ф Общее время выполнения команды Обращение АЛУ к регистру-операнду Выполнение операции АЛУ Сохранение результата в памяти Рис. 1.8. Диаграмма выполнения однотактной операции Хотя рабочие регистры с физической точки зрения не являются ячейками памя- ти, им, как показано на рис. 1.7, поставлены в соответствие 32 самых нижних адреса от $00 до $1F в памяти SRAM, поэтому их можно адресовать как обычные ячейки.
26 Глава 1. Восьмиразрядные микроконтроллеры AVR Регистры двойной длины X, Y и Z Шесть рабочих регистров от R26 до R31 могут применяться в качестве регист- ров двойной длины X, Y и Z шириной 16 бит с возможностью доступа к обеим по- ловинам (рис. 1.9). 15 0 Регистр X |7 0 |7 _0j 15 R27 ($1В) R26 ($1A) 0 Регистр Y lz_ 0|7 _oj 15 R29 ($1D) R28($1C) 0 Регистр Z U_ 0 |7 —ll R31 ($1F) R30 ($1E) Рис. 1.9. Структура регистров двойной длины X, Y и Z Благодаря специальным командам, их можно использовать в качестве указате- лей, что при косвенной адресации позволяет очень эффективно обращаться к ячейкам памяти SRAM. Дополнительно к этому, с помощью регистра Z из памяти программ можно извлекать восьмиразрядные константы. Область ввода/вывода семейств AT90S, ATmega и ATtiny В этой области памяти SRAM размещены все регистры для программирования, управления и сигнализации о всех периферийных функциях восьмиразрядных мик- роконтроллеров AVR. Типичный их набор для микроконтроллеров семейств AT90S, ATmega и ATtiny перечислен в табл. 1.2. В некоторых моделях часть указанных в табл. 1.2 регистров может отсутствовать или размещаться в области ввода/вывода по другим адресам. Кроме того, в современных микроконтроллерах область вво- да/вывода может превышать адрес $5F в пространстве SRAM. Например, в ATmega- 640 она завершается адресом 0x1 FF. В любом случае, всегда сверяйтесь с техниче- ским описанием конкретного микроконтроллера. Таблица 1.2. Область ввода/вывода восьмиразрядных микроконтроллеров AVR Адрес Название Функция $3F ($5F) SREG Регистр состояния $3E ($5E) SPH Указатель стека, старший байт $3D ($5D) SPL Указатель стека, младший байт $30 ($5C) OCRO Регистр сравнения на выходе таймера/счетчика Т/СО $3B ($5B) GIMSKnon GICR Общий регистр маски прерываний или общий регистр управле- ния прерываниями $3A ($5A) GIFR Общий регистр флагов прерываний $39 ($59) TIMSK Регистр маски прерываний таймера/счетчика $38 ($58) TIFR Регистр флагов прерываний от таймеров/счетчиков $37 ($57) SPMCR Регистр управления операциями начальной загрузки из памяти программ $36 ($56) TWCR Регистр управления двухпроводным интерфейсом l2C (TWI) $35 ($55) MCUCR Регистр общего управления микроконтроллером $34 ($54) MCUSR (MCUCSR) Регистр, содержащий информацию об источнике сброса микро- контроллера $33 ($53) TCCRO Регистр управления таймером/ счетчиком Т/СО $32 ($52) TCNTO Счетный регистр таймера/счетчика Т/СО (8 бит) $31 ($51) OSCCAt Регистр калибровки осциллятора $30 ($50) SFIOR Регистр специальных функций ввода-вывода $2F ($4F) TCCR1A Регистр управления А таймера/счетчика Т/С1
Структура микроконтроллеров AVR 27 Таблица 1.2. Продолжение Адрес Название Функция $2Е ($4Е) TCCR1B Регистр управления В таймера/счетчика Т/С1 $2D($4D) TCNT1H Счетный регистр Т/С1, старший байт $2С ($4С) TCNT1L Счетный регистр Т/С1, младший байт $2В($4В) OCR1AH Регистр сравнения А таймера/счетчика Т/С1, старший байт $2А ($4А) OCR1AL Регистр сравнения А таймера/счетчика Т/С1, младший байт $29 ($49) OCR1BH Регистр сравнения В таймера/счетчика Т/С1, старший байт $28 ($48) OCR1BL Регистр сравнения В таймера/счетчика Т/С1, младший байт $27 ($47) ICR1H Регистр захвата на входе таймера/счетчика Т/С1. младший байт $26 ($46) ICR1L Регистр захвата на входе таймера/счетчика Т/С1, старший байт $25 ($45) TCCR2 Регистр управления таймера/счетчика Т/С2 $24 ($44) TCNT2 Счетный регистр таймера/счетчика Т/С2 $23 ($43) OCR? Регистр сравнения на выходе таймера/счетчика Т/С2 $22 ($42) ASSR Регистр состояния асинхронного режима работы таймера/счет- чика Т/С2 $21 ($41) WDTCR Регистр управления сторожевым таймером $20 ($40) UBRRH или UCSRC Регистр скорости передачи данных через USART (старший байт) или регистр управления и состояния USART $1F($3F) EEARH Регистр адреса EEPROM, старший байт $1Е($ЗЕ) EEAR(L) Регистр адреса EEPROM, младший байт $1D($3D) EEDR Регистр данных EEPROM $1С ($ЗС) EECR Регистр управления EEPROM $1В($ЗВ) PORTA Регистр данных порта А $1А ($ЗА) DDRA Регистр направления передачи данных порта А $19 ($39) PINA Выводы порта А $18 ($38) PORTB Регистр данных порта В $17 ($37) DDRB Регистр направления передачи данных порта В $16 ($36) PINB Выводы порта В $15 ($35) PORTC Регистр данных порта С $14 ($34) DDRC Регистр направления передачи данных порта С $13 ($33) PINC Выводы порта С $12 ($32) PORTD Регистр данных порта D $11 ($31) DDRD Регистр направления передачи данных порта D $10 ($30) PIND Выводы порта D $0F ($2F) SPDR или USIDR Регистр ввода/вывода данных через интерфейс SPI или регистр данных универсального последовательного интерфейса $0Е ($2Е) SPSR или USISR Регистр состояния интерфейса SPI или регистр состояния уни- версального последовательного интерфейса $0D ($2D) SPCR или USICR Регистр управления интерфейсом SPI или регистр управления универсальным последовательным интерфейсом $0С ($2С) UDR Регистр данных UART $0В ($2В) USR или UCSRA Регистр состояния UART или регистр А управления и состояния USART 7 $0А ($2А) UCR или UCSRB Регистр управления UART или регистр В управления и состоя- ния USART $09 ($29) UBRR или UBRRL Регистр скорости передачи данных через UART или регистр ско- рости передачи данных через USART (младший байт) $08 ($28) ACSR Регистр управления и состояния аналогового компаратора $07 ($27) ADMUX Регистр выбора мультиплексора АЦП $06 ($26) ADCSR(A) Регистр (А) управления и состояния АЦП $05 ($25) ADCH Регистр данных АЦП, старший байт $04 ($24) ADCL Регистр данных АЦП, младший байт $03 ($23) TWDR Регистр данных интерфейса l2C (TWI)
28 Глава 1. Восьмиразрядные микроконтрЬллеры AVR Таблица 1.2. Окончание Адрес Название Функция $02 ($22) TWAR Регистр адреса (подчиненного устройства) для передачи данных по интерфейсу гС (TWI) $01 ($21) TWSR Регистр состояния интерфейса lzC (TWI) $00 ($20) TWBR Регистр скорости передачи данных по интерфейсу lzC (TWI) ПРИМЕЧАНИЕ Li 1»:» kt А .1к А >' 1 А. к. i »k A k k k kf a kkiikk' *» frrt kk tk if *k Art '«? k kVkkk; kkk'^kkkk kkk ?:.y. ik. .tk kk?:?kk k 1 kk?;?; ’Л ;k< Ячейкам в области ввода/вывода назначены адреса с $00 по $3F, которые должны приме- няться в случае использования специальных ассемблерных команд in, out, sbi, obi, sbis и sbiс. Если регистр ввода/вывода адресуется как ячейка в памяти SRAM в целом, то к адресу ввода/вывода необходимо добавить $20, Так, например, регистру состояния SREG соответствует адрес $3F внутри области ввода/вывода и адрес $5F относительно всей памя- ти SRAM. Как видим, к регистрам ввода/вывода относятся регистры разрешения/запрета отдельных прерываний, а также указатель стека, регистры состояния для указания результатов арифметических и логических операций, регистры управления работой многочисленных компонентов аппаратного обеспечения и периферии (порты, тай- мер, UART/USART, интерфейсы SPI и I2C (TWI), аналоговый компаратор, стороже- вой таймер, режимы пониженного энергопотребления), а также регистры для обра- щения к памяти EEPROM. Для доступа к регистрам ввода/вывода лучше всего использовать ассемблерные команды ввода/вывода микроконтроллеров AVR: in и out. Команда оис выдает один байт из одного из 32-х рабочих регистров в регистр ввода/вывода, а команда in считывает байт из одного регистра ввода/вывода в один из 32-х рабочих регист- ров. У регистров ввода/вывода в области с $00 по $1F ($20..$3F) отдельные разряды могут быть изменены напрямую с помощью ассемблерных команд sbi и cbi. Кро- ме того, содержимое отдельных разрядов этих регистров может быть напрямую оп- рошено с помощью ассемблерных команд sbis и sbiс (Система команд микрокон- троллеров AVR рассматривается в приложении В). Регистр состояния SREG Регистр состояния SREG содержит разряды условий (флаги) микроконтролле- ров AVR (рис. 1.10). Он располагается в области ввода/вывода по адресу $3F ($5F), доступен для чтения и записи и после подачи сигнала сброса инициализируется ну- лями. Разряд 76543210 $3F($5F) I i |t|h|s|v|n|z|c| Рис. 1.10. Регистр состояния SREG микроконтроллеров AVR В микроконтроллерах AVR для обозначения результата выполнения операций используются восемь различных разрядов условий. Все они могут быть проверены с помощью ассемблерных команд, определяющих последующий ход выполнения программы (например, brcs, brhc, brtc, brie и т.д.). При входе в подпрограмму обработки прерывания рекомендуется сохранить ре- гистр состояния и суова его восстановить при выходе для того, чтобы после возвра- та в прерванную программу работать с корректными битами условий. Значения отдельных разрядов условий (флагов) в микроконтроллерах AVR:
Структура микроконтроллеров AVR 29 • С —- указывает на переполнение (перенос) после выполнения арифметической или логической операции; • Z — всегда устанавливается в 1, если результат арифметической или логиче- ской операции равен нулю, и обнуляется, если результат операции не равен ну- лю; • N — указывает на отрицательный результат после выполнения арифметической или логической операции; • V — флаг переполнения при вычислениях в дополнительных кодах (арифмети- ка кодов с дополнением до двух); устанавливается в 1, если при выполнении соответствующей операции происходит переполнение, в противном случае — обнуляется; • S — связь флагов N и V с помощью операции “Исключающее ИЛИ”; флаг знака может применяться для определения фактического результата арифметической операции; • Н — указывает на переполнение в младшем полубайте (разряды 0...3 байта дан- ных); устанавливается в 1, когда происходит перенос из младшего полубайта в старший, в противном случае — обнуляется; • Т — флаг копирования, предназначенный для свободного использования про- граммистом (например, в качестве буфера); • I — общее разрешение прерываний. Если прерывания должны быть разрешены, то устанавливается в 1. Регистр управления микроконтроллером MCUCR Регистр MCUCR содержит разряды управления общими функциями микрокон- троллера. Наряду с разрешением доступа к внешней памяти SRAM, он также управ- ляет “спящим” режимом и характером срабатывания внешних прерываний. Регистр MCUCR находится в области ввода/вывода ро адресу $35 ($55). Он доступен для чтения и записи, а после подачи сигнала сброса инициализируется нулями. Набор, обозначение и последовательность разрядов в этом регистре может от- личаться в зависимости от модели микроконтроллера, поэтому рассмотрим их в общем виде. Точные обозначения уточняйте по техническому описанию устройст- ва. • SRE (External SRAM Enable) — если этот разряд установлен в 1, то разрешен доступ к внешней памяти SRAM (при наличии таковой); • SRW (External SRAM Wait State) — если этот разряд установлен в 1, то в после- довательность обращения к внешней памяти SRAM будет добавлено состояние ожидания продолжительностью один системный такт. Если разряд SRW содер- жит 0, то доступ к внешней памяти SRAM выполняется за два обычных такто- вых цикла. • SE (Sleep Enable) — этот разряд должен быть установлен в 1 для того, чтобы сделать эффективной ассемблерную команду sleep. Если он содержит 0, то по- сле выполнения команды sleep центральный процессор (ЦП) останется актив- ным. Во избежание непреднамеренного перевода процессора в ждущий режим или в режим пониженного энергопотребления непосредственно перед выполне- нием команды sleep рекомендуется установить разряд SE в 1. • SM (Sleep Mode) — выбор между различными состояниями пониженного энер- гопотребления.
30 Глава 1. Восьмиразрядные микроконтроллеры AVR • ISC11 и ISCIO (Interrupt Sense Control 1) — определяют способ активизации обработки внешнего прерывания 1, когда в регистре SREG установлен флаг 1, а в регистре GIMSK (GICR) — разряд INT1: по нарастающему или ниспадаю- щему фронту сигнала, или же по уровню лог. 0 на выводе INT1. Возможные комбинации ICS11 и ICS10 показаны в табл. 1.3. Если разряды ISC11 и ISC10 должны быть изменены, то вначале необходимо запретить прерывание 1, обну- лив разряд INT1 в регистре GIMSK (GICR). В противном случае непреднаме- • ренное изменение этих разрядов может привести к вызову внешнего прерыва- ния 1. Таблица 1.3. Выбор способа активизации прерывания INT1 ISC11 ISC10 Описание 0 0 Прерывание возникает по уровню лог. 0 на входе INT1 0 1 Эта комбинация в некоторых моделях микроконтроллеров AVR не исполь- зуется, в то время как в других означает прерывание по любому измене- нию логического уровня на входе INT1 1 0 Прерывание возникает по ниспадающему фронту сигнала на входе INT1 1 1 Прерывание возникает по нарастающему фронту сигнала на входе INT1 • ISC01 и ISCOO (Interrupt Sense Control 0) — устанавливают способ активизации внешнего прерывания 0, когда в регистре SREG будет установлен флаг I, а в ре- гистре GIMSK (GICR) — разряд INTO: по нарастающему или ниспадающему фронту сигнала, или же по уровню лог. 0 на выводе INTO. Возможные комбина- ции ICS01 и ICS00 показаны в табл. 1.4. Таблица 1.4. Выбор способа активизации прерывания INTO ISC01 ISC00 Описание 0 0 Прерывание возникает по уровню лог. 0 на входе INTO 0 1 Эта комбинация в некоторых моделях микроконтроллеров AVR не ис- пользуется, в то время как в других означает прерывание по любому из- менению логического уровня на входе INTO 1 0 Прерывание возникает по ниспадающему фронту сигнала на входе INTO 1 1. Прерывание возникает по нарастающему фронту сигнала на входе INTO Если разряды ISC01 и ISC00 должны быть изменены, то сначала необходимо запретить прерывание INTO, обнулив разряд INTO в регистре GIMSK (GICR). В противном случае непреднамеренное изменение этих разрядов может привести к вызову внешнего прерывания 0. Внутренняя память SRAM Данные и переменные, используемые в программах, как правило, хранятся во внутренней памяти SRAM микроконтроллеров AVR (т.е. в области с адресами выше $005F). К этим данным можно обращаться из программы прямо или косвенно. В памяти SRAM также размещается стек (если только он не реализован аппаратно). На рис. 1.11 символически показаны графики синхронизации при обращении к внутренней памяти SRAM. Внешняя память SRAM Если объема внутренней памяти SRAM недостаточно, то в некоторых микро- контроллерах AVR его можно увеличить до 64 Кбайт путем подключения внешних
Структура микроконтроллеров AVR 31 блоков памяти. Для этого в регистре MCUCR следует установить в 1 разряд SRE, в результате чего порты А и С будут выступать в качестве шины адреса и шины данных, а выводы 7 и 6 порта D — в качестве управляющих сигналов чтения /RD и, соответственно, записи /WR для внешней памяти SRAM (рис. 1.12), независимо от того, какие направления передачи данных установлены для этих портов в соответ- ствующих регистрах направления передачи данных. Такт системной синхронизации Ф Внутренняя шина адреса— Внутренняя шина данных Внутренний сигнал /RD Чтение из SRAM Т1 АО п <D£7 Запись в SRAM Т1 Т2 АО п DO 7 X Внутренний сигнал /WR Рис. 1.11. Синхронизация при обращении к внутренней памяти SRAM Рис. 1.12. Пример подключения внешнего блока памяти для расширения статической памяти SRAM до 32 Кбайт Дальнейшее обращение к внешней статической памяти может осуществляться с помощью тех же команд, что и при обращении к внутренней памяти. При обраще-
32 Глава 1. Восьмиразрядные микроконтроллеры AVR нии к адресам SRAM, которые находятся в области внутренней статической памяти, передача данных выполняется автоматически как во внутреннюю память SRAM, так и из нее, даже при установленном в 1 разряде SRE. В этом случае управляющие сигналы чтения /RD и записи ZWR остаются неактивными на протяжении всего цик- ла. Обращение к внешней памяти будет выполнено только тогда, когда адрес будет больше, чем “RarnEnd”, а также если в регистре управления MCUCR будет установ- лен в 1 разряд SRE. На тот случай, если используемые внешние блоки статической памяти окажутся недостаточно быстродействующими для циклов записи/чтения микроконтроллера AVR, установив разряд SRW (разряд 6) в регистре MCUCR, можно активизировать состояние ожидания. Благодаря введению этого дополнительного состояния дли- тельностью в один такт системной синхронизации, длина сигналов передачи данных и команд /RD и, соответственно, /WR увеличивается, чтобы предоставить достаточ- но времени для передачи данных блокам памяти, работающим медленнее. Благодаря чрезвычайно коротким маршрутам прохождения сигналов внутри кристалла, обращение к внутренней памяти RAM в значительной степени более свободно от сбоев, чем обращение к внешней памяти через шину. Если при этом принять во внимание, что из-за подсоединения внешнего запоминающего устройст- ва теряются 18 выводов, то следует тщательно взвешивать: действительно ли под- соединение внешней памяти — это наилучшее решение для данного случая приме- нения. Кроме того, многие современные восьмиразрядные микроконтроллеры пре- доставляют довольно большие объемы внутренней памяти SRAM, поэтому при не- хватке памяти в текущей модели, возможно, имеет смысл выбрать какую-либо дру- гую модель AVR. Стек Стек служит для хранения адресов возврата при вызове подпрограмм, а также для передачи параметров в подпрограммы. Кроме того, зачастую в стеке, как в буфере, временно хранятся переменные и промежуточные результаты. Реализация стека в разных моделях микроконтроллеров AVR может отличаться. Возможные ва- рианты: • стек размещается во внутренней или внешней памяти SRAM на выбор разра- ботчика; • стек всегда находится во внутренней памяти SRAM; • аппаратный стек (например, в микроконтроллере AT90S1200). В этом.случае он ограничен жестко заданным числом уровней. При выполнении ассемблерной команды г call или при поступлении запроса на прерывание все адреса, вве- денные в аппаратный стек, смещаются на один уровень вниз (адрес, помещен- ный до этого на уровень 2, теряется, а находящийся на уровне 1 перемещается на уровень 2; адрес, ранее записанный на уровне 0, будет перемещен на уровень 1). После этого соответствующий адрес возврата помещается на уровень 0 аппа- ратного стека. При выходе из обычной подпрограммы или подпрограммы обра- ботки прерывания адрес, находящийся на нулевом уровне, извлекается в счет- чик команд как адрес возврата, и все уровни аппаратного стека перемещаются на одну позицию вверх (уровень 1 — на уровень 0, уровень 2 — на уровень 1). Если глубина аппаратного стека составляет, например, три уровня, то при глу- бине вложения вызовов 4 (и более) подпрограмм необходимо соблюдать осторож-
Структура микроконтроллеров AVR 33 ность, поскольку в этом случае теряется адрес возврата, введенный в память пер- вым, вследствие чего возврат становится невозможным! Большинство восьмиразрядных микроконтроллеров AVR используют восьми- или 16-разрядный указатель стека, состоящий из одного регистра SP или двух вось- миразрядных регистров SPH и SPL. Их адреса в области ввода/вывода $ЗЕ ($5Е) и $3D ($5D). Указатель стека после подачи сигнала сброса обнуляется, и доступен для чтения и записи. Указатель стека позволяет обращаться к сегменту данных в области, зарезерви- рованной для стека, и должен быть инициализирован до начала выполнения про- граммы перед выполнением подпрограммы или разрешения прерывания, поскольку указатель стека после подачи сигнала сброса будет снова обнулен. В микроконтрол- лерах AVR стек заполняется “сверху вниз”, т.е. при выполнении ассемблерной ко- манды push соответствующий байт будет скопирован по адресу, на который в на- стоящее время ссылается указатель стека, после чего указатель стека уменьшается на 1 (декрементируется). Это целесообразно потому, что при инициализации до на- чала выполнения программы указатель стека позволяет ссылаться на ячейку памяти с наибольшим адресом. Когда байт с помощью ассемблерной команды pop извлекается из стека, то вна- чале указатель стека инкрементируется на 1, а затем байт, извлеченный по соответ- ствующему адресу, копируется в регистр назначения. При прерывании или вызове подпрограммы (команда call) в качестве адреса возврата в стек будет помещен адрес следующей команды из выполняемой про- граммы. Команда выхода из подпрограммы ret увеличивает указатель стека на 1, и соответствующий адрес будет скопирован в счетчик команд. Другими словами, после выполнения команды ret ход программы будет продолжен, начиная с коман- ды, следующей после call. Ассемблерная команда reti выполняет ту же функцию, что и команда ret, с тем отличием, что она применяется для возврата из подпрограммы обработки пре- рывания и дополнительно к этому устанавливает флаг I (разряд 7) в регистре со- стояния SREG для того, чтобы снова разрешить дальнейшие прерывания. Память программ Отличительной особенностью микроконтроллеров AVR является то, что у них в качестве памяти программ используется одна и та же память типа Flash, которая может свободно программироваться пользователем и опять вытираться электри- ческим способом. Объемы Flash-памяти в различных восьмиразрядных микрокон- троллерах AVR перечислены в табл. 1.5. Компания Atmel предоставляет в распоряжение пользователей очень эффектив- ную возможность как параллельного программирования, так и последовательного через интерфейс SPI с применением адаптеров-программаторов. Так, программа может быть “записана” во Flash-память и снова вытерта непосредственно в составе схемы, в которой работает микроконтроллер. Схема программирования уже интег- рирована в кристалл. Вспомогательное напряжение Vpp= +12 В необходимо только при программировании в параллельном режиме. Так или иначе, это напряжение ис- пользуется в большинстве электрических схем (например, для последовательного интерфейса). Как несложно заметить, первые цифры в маркировке микроконтроллеров обо- значают именно объем их памяти программ.
34 Глава 1. Восьмиразрядные микроконтроллеры AVR Таблица 1.5. Объемы Flash-памяти в восьмиразрядных микроконтроллерах AVR 1 Кбайт 2 Кбайт 4 Кбайт 8 Кбайт 16 Кбайт AT90S1200 ATtinyl 1 ATtiny 12 ATtinyl ЗА ATtinyl 5L AT90S2313 AT90S2323 AT90S2343 ATtiny2313 ATtiny24 ATtiny25 ATtiny26 ATtiny261 ATtiny28L AT90S4414 AT90S4433 ATtiny44A ATtiny45 ATtiny461 ATtiny48 ATmega48PA AT90S8515 AT90S8535 ATtiny 84 ATtiny85 ATtiny 861 ATtiny88 ATmega8 ATmega8515 ATmega8535 ATmega88PA ATmega16 ATmega16A ATmega162 ATmega164P . ATmega165P ATmega168 ATmega168P ATmega169 32 Кбайт 64 Кбайт 128 Кбайт 256 Кбайт ATmega32A ATmega324PA ATmega325 ATmega325P ATmega3250 ATmega3250P ATmega328P ATmega64 ATmega640 ATmega644 ATmega644P ATmega645 ATmega6450 ATmega128 ATmega1280 ATmega1281 ATmega1284P ATmega2560 ATmega2561 Память данных типа EEPROM Все восьмиразрядные микроконтроллеры AVR семейств AT90S, ATmega и ATtiny, кроме ATtiny28L, оснащены памятью типа EEPROM объемом от 64 до 4096 байт для хранения энергонезависимых данных и констант (табл. 1.6). Это очень удобно, например, при калибровке измерительных приборов, работающих под управлением микроконтроллеров AVR, у которых в памяти EEPROM в процес- се настройки сохраняются параметры корректировки. Благодаря этому, в боль- шинстве случаев полностью отпадает необходимость в настроечных потенциомет- рах и триммерах. Следует учитывать, что срок службы памяти EEPROM ограничен примерно 100 000 циклами записи/чтения, поэтому использовать ее как обычную память SRAM нельзя. По этой причине некоторые производители комбинируют память ти- па EEPROM с SRAM. При таком варианте содержимое памяти переносится при прекращении подачи рабочего напряжения в память EEPROM, благодаря чему при нормальных условиях эксплуатации достигают короткого цикла записи, не приво- дящего к износу. В микроконтроллерах AVR преобразователи напряжения, используемые для выработки напряжения программирования и питания таймера, определяющего дли- тельность программирования, интегрированы в кристалл. Кроме того, реализовано распознавание провалов напряжения для предотвращения записи при понижении рабочего напряжения ниже минимально допустимого значения. Благодаря этому, для программирования одного байта достаточно всего лишь записать в соответствующий регистр адрес и байт данных, а затем активизировать процесс записи с помощью регистра управления. Дальнейший процесс протекает автономно, без вмешательства пользователя: целевой байт вначале будет стерт (обнулен), а затем в него запишется новое значение. Этот процесс контролируется внутренне и его продолжительность, в зависимости от подведенного рабочего напряжения, со- ставляет 2,5-4 мс.
Структура микроконтроллеров AVR 35 Таблица 1.6. Объемы памяти EEPROM в восьмиразрядных микроконтроллерах AVR 64 байта 128 байт 256 байт 512 байт AT90S1200 ATtiny 11 ATtiny 12 ATtiny 13А ATtiny 15L ATtiny48 ATtiny88 AT90S2313 AT90S2323 AT90S2343 ATtiny2323 ATtiny24 ATtiny25 ATtiny26 ATtiny261 AT90S4414 AT90S4433 ATtiny44A ATtiny45 ATtiny461 ATmega48PA AT90S8515 AT90S8535 ATtiny84 ATtiny85 ATtiny861 ATmega16 ATmega16A ATmega162 ATmega164P ATmega165P ATmega168 ATmega168P ATmega169 ATmega8 ATmega8515 ATmega8535 ATmega88PA 1024 байт 2048 байт 4096 байт ATmega32A ATmega324PA ATmega325 ATmega325P ATmega3250 ATmega3250P ATmega328P ATmega64 ATmega644 ATmega644P ATmega645 ATmega6450 ATmega128 ATmega1280 ATmega1281 ATmega1284P ATmega2560 ATmega2561 ATmega640 Для программирования памяти EEPROM микроконтроллеров AVR нет необхо- димости применять внешний программатор, поскольку в каждую ячейку в данном случае можно записать значение непосредственно во время выполнения пользова- тельской программы. Для программирования используются три регистра памяти EEPROM, располо- женные в области ввода/вывода памяти SRAM (см. табл. 1.2): • восьмиразрядный регистр адреса EEAR или два регистра EEARH и EEARL; • восьмиразрядный регистр данных EEDR; • восьмиразрядный регистр управления EECR. В процессе записи в память EEPROM подлежащий программированию байт, адресуемый регистром EEAR, загружается в регистр EEDR. В процессе чтения из памяти EEPROM в регистр EEDR записывается содержимое ячейки EEPROM, адре- суемой регистром EEAR. Для управления процессом чтения используется разряд EERE (EEPROM Read Enable — разрешение чтения памяти EEPROM) управляющего регистра EECR. По- сле записи корректного адреса в регистр EEAR процесс чтения активизируют уста- новкой этого разряда в 1. Распознав 1 в разряде EERE, аппаратное обеспечение считает требуемый байт в регистр EEDR, после чего уже нет необходимости вновь опрашивать разряд EERE, поскольку считывание длится только один цикл системного такта.
36 Глава 1. Восьмиразрядные микроконтроллеры AVR После того как разряд EERE установлен в 1, центральный процессор будет задержан на два такта системной синхронизации прежде, чем будет выполнена следующая команда. Перед началом операции чтения программа пользователя должна постоянно оп- рашивать разряд EEWE (EEPROM Write Enable — разрешение записи в память EEPROM) регистра EECR в ожидании появления в нем 0. Если во время програм- мирования памяти EEPROM в соответствующий регистр ввода/вывода будут запи- саны новый адрес или данные, то еще продолжающийся процесс программирования будет прерван и результат будет неопределенным! Запись в память EEPROM восьмиразрядных микроконтроллеров AVR контро- лируется разрядом EEWE регистра EECR. Для записи байта в память EEPROM раз- ряд его необходимо установить в 1, если в регистре EEAR находятся корректный адрес памяти EEPROM, а в регистре EEDR — байт данных, подлежащий програм- мированию. Для предотвращения непреднамеренной записи в память EEPROM раз- ряд EEWE может быть установлен в 1 только в том случае, если установлен также и разряд EEMWE того же регистра EECR. Если во время обращения к памяти EEPROM на запись происходит системный сброс, то ре- зультат будет неопределенный, поскольку регистр адреса EEAR будет обнулен. По этой при- чине могут содержаться ошибочные данные по адресу, подлежащему программированию, или в байте с адресом 0 памяти EEPROM! Для программирования памяти EEPROM должны быть выполнены следующие действия. 1. Дождаться окончания процесса программирования памяти EEPROM (если он активен), т.е. пока разряд EEWE не возвратится в состояние 0. 2. Записать новый адрес в регистр EEAR. 3. Записать требуемый байт данных в регистр EEDR. 4. Установить разряд EEMWE в 1. 5. На протяжении следующих четырех периодов системного такта после установ- ки разряда EEMWE должна быть записана лог. 1 в разряд EEWE. Тем самым будет запущен процесс программирования. По окончанию цикла программирования (типичная продолжительность — 2,5 мс при рабочем напряжении Vcc = 5 В и 4 мс при Vcc = 2,7 В), разряд EEWE ап- паратно автоматически обнуляется. Программа пользователя должна непрерывно опрашивать этот разряд, ожидая появления 0, прежде чем приступить к программи- рованию следующего байта. После установки разряда EEWE в 1 центральный процессор будет задержан на два такта системной синхронизации, после чего он может выполнять следующую команду. Порты Порт — это группа линий передачи данных (от трех до восьми), обозначенная буквой латинского алфавита (А, В, С ...). Набор и разрядность портов отличается
Структура микроконтроллеров AVR 37 в зависимости от микроконтроллера. Распределение портов для некоторых моделей AVR представлено в табл. 1.7. Таблица 1.7. Порты в некоторых восьмиразрядных микроконтроллерах AVR Микроконтроллер ПортА Порт В Порт С ПортО Порт Е Порт F Портб AT90S1200 — 8 бит — 7 бит — — — AT90S2313 — 8 бит — 7 бит — — — AT90S2323 — 3 бита — — — — — AT90S2343 — 5 бит — — — — — AT90S4414 8 бит 8 бит 8 бит 8 бит — — — AT90S4433 — 6 бит 6 бит 8 бит — — — AT90S8515 8 бит 8 бит 8 бит 8 бит — — — AT90S8535 8 бит 8 бит 8 бит 8 бит — — — ATtiny 11 — 6 бит — — — — — ATtiny 12 — 6 бит — — — — — ATtiny 15L — 6 бит — — — — — ATtiny24 8 бит 4 бита — — — — — ATtiny26 8 бит 8 бит — — — — — ' ATtiny28 4 бита 8 бит — 8 бит — — — ATmega128 8 бит 8 бит 8 бит 8 бит 8 бит 8 бит 5 бит ATmega16 8 бит 8 бит 8 бит 8 бит — — — ATmega32 8 бит 8 бит 8 бит 8 бит — — — ATmega64 8 бит 8 бит 8 бит 8 бит 8 бит 8 бит 5 бит ATmega8 — 8 бит 7 бит 8 бит — — — Передача по линиям данных допускается в двух направлениях: на ввод и на вы- вод. При этом следует помнить об одной особенности портов микроконтролдеров AVR: перед тем как выполнить запись или чтение по линии, необходимо задать на- правление передачи. Для этой цели с каждым портом сопоставляется особый ре- гистр, разряды которого задают направление передачи по соответствукццим выво- дам. Обозначение таких регистров начинается с аббревиатуры DDR (Data Direction Register). Значению 0 в разряде регистра DDR соответствует работа вывода как входа, а значению 1 — как выхода. Предположим, регистр DDRA содержит двоичное зна- чение 11110000 (шестнадцатеричное F0). Это означает, что младшие четыре вывода порта A (PA0..PA3) работают как входы, а старшие (РА4..РА7) — как выходы. Подтягивающее сопротивление Что происходит фактически, когда в какую-то линию данных выдается значе- ние 0 или 1? Или какое состояние будет распознавать микроконтроллер на входе, если линия “висит в воздухе” (т.е. не подключена к “земле”, и на нее не подается напряжение)? Ответ на эти дает подтягивающее сопротивление, назначение которо- го — поддерживать на выводе напряжение 0 В (“земля”) или 5 В (или около того). К счастью, микроконтроллеры AVR оснащены так называемыми внутренними под- тягивающими резисторами. Таким образом, если в схеме присутствует кнопка, для считывания ее состояния требуется подтягивающее сопротивление (рис. 1.13). Когда кнопка нажата, состояние однозначно определено: это — 0 В, т.е. мы по- лучаем на входе значение 0. Но что происходит, когда кнопка не нажата? В этом случае (если активен внутренний.подтягивающий резистор) на вход подается на-
38 Глава 1. Восьмиразрядные микроконтроллеры AVR пряжение 5 В, что соответствует состоянию лог. 1. Если бы не подтягивающее со- противление, то состояние входа оказалось бы совершенно неопределенным. Внутренний подтягивающий резистор Внешний подтягивающий резистор Рис. 1.13. Применение подтягивающего сопротивления Каким же образом микроконтроллер распознает необходимость активизации внутреннего подтягивающего резистора? Для этого с помощью регистра DDRx не- обходимо переключить порт на ввод данных. Затем в регистр порта (например, PORTB) записывается битовая маска, в которой единицам соответствуют выводы с активными подтягивающими резисторами. Естественно, все это имеет смысл только в том случае, если порт сконфигурирован на прием данных. Если к порту необходимо подключить светодиод, существует два варианта. Со- гласно первой схеме (рис. 1.14, слева), при выводе в линию лог. О, на выводе уста- навливается напряжение О В (“земля”), ток течет от точки высокого потенциала (ра- бочее напряжение) через резистор, и светодиод светится. Если в линию выдается лог. 1, то выход находится в высокоомном состоянии, и ток не протекает, т.е. свето- диод не светится. Новичков это иногда путает, поскольку кажется нелогичным, что О включает, а 1 выключает светодиод, тем не менее к такому подходу необходимо Рис. 1.14. Два варианта подключения светодиода На отладочной плате STK500
Структура микроконтроллеров AVR 39 В случае использования отладочной платы, наподобие STK.500, светодиоды можно подключить к непосредственно к выводам микроконтроллера через сопро- тивление (рис. 1.14, справа). Таким образом, светодиод соединен не только с напря- жением Vcc, как в рассмотренном ранее варианте, но и с “землей”. В результате ток течет от микроконтроллера. Следует также отметить, что большинство выводов портов, кроме собственно ввода-вывода данных, выполняют и другие, альтернативные функции, указываемые на схемах в круглых скобках. Так, например, у микроконтроллера ATmega8 вывод PD0 — это не только линия 0 порта D, но и линия приема бита при последователь- ном обмене данными. Различные альтернативные функции портов будут рассмотре- ны далее по мере изучения периферийных устройств микроконтроллеров AVR. Регистры управления портом Выше мы уже упоминали регистры DDRx и PORTx, участвующие в конфигури- ровании портов. Каждому порту поставлен в соответствие еще один регистр: PINx. Рассмотрим подробнее назначение каждого из этих регистров. • Регистр направления передачи данных DDRx (DDRA, DDRB и т.д.) определяет назначение выводов порта: входы или выходы. Если разряд “п” в регистре DDRx содержит 0, то соответствующий вывод сконфигурирован как вход. Если при этом в соответствующем разряде регистра PORTx находится 1, то к выводу подключается подтягивающее сопротивление. Если разряд “п” в регистре DDRXn содержит 1, то соответствующий вывод сконфигурирован как выход. • Если вывод выполняет роль выхода, то в соответствующий разряд регистра PORTx записывается выводимое битовое значение. • Логический уровень на выводах в режиме входа можно считать по адресу реги- стра PINx. Регистры DDRx и PORTx доступны как для записи, так и для чтения, а регистр PINx — только для чтения. Таймеры/счет чики Таймеры/счетчики — это, наверное, наиболее часто используемые модули мик- роконтроллеров. С их помощью можно измерять промежутки времени и частоту, определять ширину импульсов, вычислять скорость и т.д. Хотя они и используются для измерения времени, на самом деле речь идет об обычных двоичных счетчиках. В семействах AT90S, ATtiny и ATmega микроконтроллеров AVR используются восьми- и 16-разрядные таймеры/счетчики. Разрядность определяет момент пере- полнения счетчика (возврат в нулевое состояние). Так, для восьмиразрядного счет- чика переполнение наступает, когда счет достигает 255, а*для 16-разрядного — 65535. Количество таймеров/счетчиков и их разрядность в микроконтроллерах отлича- ется в зависимости от модели, и потому в данном подразделе будут рассмотрены только общие вопросы, имеющие отношение^ использованию таймеров/счетчиков. Если таймер/счетчик функционирует в качестве счетчика, то он подсчитывает число импульсов, поступающих на определенный вход микроконтроллера. В этом случае соответствующий вывод должен быть сконфигурирован в инициализацион- ной части программы как вход. В случае использования в качестве таймера частота тактирования таймера/счет- чика является производной величиной от такта системной синхронизации внутрен-
40 Глава 1. Восьмиразрядные микроконтроллеры AVR него кварцевого осциллятора. При этом таймеры/счетчики используют в качестве тактового сигнала разделенный такт системной синхронизации. Коэффициент деле- ния предварительного делителя частоты может настраиваться индивидуально для каждого из таймеров с помощью мультиплексора, управляемого разрядами из реги- стра управления таймера/счетчика. В микроконтроллерах AVR используются следующие таймеры/счетчики: • восьми- или 16-разрядный Т/СО; • 16-разрядный Т/С 1; • восьми-или 16-разрядный Т/С2; • 16-разрядные Т/СЗ, Т/С4 и Т/С5. Регистры управления в этом случае называются TCCRO, TCCR2 и т.д. (распо- ложены в области ввода/вывода), а режим работы и коэффициент деления частоты осциллятора определяется с помощью разрядов CSx2, CSxl и CSxO этих регистров. К примеру, для таймеров/счетчиков Т/СО и Т/Cl выбор режима и входного такта можно определить с помощью комбинаций разрядов, представленных в табл. 1.8. Таблица 1.8. Выбор режима и входного такта для Т/СО и Т/С1 микроконтроллеров AVR CSx2 CSx1 CSxO Описание 0 0 0 Останов 0 0 1 Режим “Таймер”, такт = такт системной синхронизации 0 1 0 Режим “Таймер”, такт = такт системной синхронизации / 8 0 1 1 Режим “Таймер”, такт = такт системной синхронизации / 64 1 0 0 Режим “Таймер”, такт = такт системной синхронизации / 256 1 0 1 Режим “Таймер”, такт = такт системной синхронизации /1024 1 1 0 Режим “Счетчик”, такт — внешний на входе ТО (Т1), активный фронт сигнала — ниспадающий 1 1 1 Режим “Счетчик”, такт — внешний на входе ТО (Т1), активный фронт сигнала — нарастающий Для Т/С2, Т/СЗ, Т/С4 и Т/С5 комбинации разрядов CS22, CS21 и CS20 могут иметь разное значение для различных моделей микроконтроллеров. Так, например, для восьмиразрядного таймера Т/С2 микроконтроллера ATmega640, разряды CS20- CS22 управляющего регистра TCCR2B, определяют режимы деления, перечислен- ные в табл. 1.9, в то время как для Т/СЗ, Т/С4 и Т/С5 они соответствуют табл. 1.8. Таблица 1.9. Выбор режима и входного такта для Т/С2 микроконтроллера АТтеда640 CS22 CS21 CS20 Описание 0 0 0 Останов 0 0 1 Такт = такт системной синхронизации 0 1 0 Такт = такт системной синхронизации / 8 0 1 1 Такт = такт системной синхронизации / 32 1 0 0 Такт = такт системной синхронизации / 64 1 0 1 Такт = такт системной синхронизации /128 1 1 0 Такт = такт системной синхронизации / 256 1 1 1 Такт = такт системной синхронизации /1024 Т/СО Схема работы таймера/счетчика Т/СО, представлена на рис. 1. 15.
Структура микроконтроллеров AVR 41 Как только с помощью разрядов CSOO, CS01 и CS02 регистра управления TCCR0 для делителя частоты будет установлена комбинация, отличная от ООО, тай- мер/счетчик Т/СО по каждому импульсу, поступающему на тактовый вход, начинает увеличивать на единицу содержимое регистра TCNT0. Когда состояние счетчика в регистре TCNT0 изменяется с $FF на $00, в регистре TIFR устанавливается флаг переполнения TOVO. ПРИМЕЧАНИЕ Кроме разрядов CSOO, CS01 и CS02 регистра TCCR0 (разряды 0-2), никакие другие разряды этого регистра не используются. Таймер/счетчик Т/СО хорошо подходит для оценки временных интервалов. Для этого в ходе выполнения программы в регистр TCNT0 записывается исходное зна- чение. Затем может быть запущен Т/СО с требуемым входным тактом. Программа ожидает появления в регистре TIFR флага переполнения TOVO, указывающего на то, что требуемое время истекло. Предположим частота системной синхронизации составляет 4 МГц, а некоторое действие должно выполняться программой каждые 0,5 с. В этом случае можно вос- пользоваться делением частоты на 8, что соответствует частоте тактирования 500 кГц или 2 мкс. Таким образом, на подсчет 256 тактовых импульсов счетчику потребуется 512 мкс. Это значение должно быть кратно 500 мкс,* чтобы с помощью множителя 1000 в программе можно было реализовать требуемое действие в точности с периодом 500 мс. Для этого в счетчик перед началом каждого счета должно быть загружено значение 6, чтобы до переполнения выполнялся подсчет не 256, а только 250 тактовых импульсов. Т/С1 16-разрядный таймер/счетчик Т/Cl гораздо сложнее Т/СО (рис. 1.16). В допол- нение к счетному регистру и регистру управления, он содержит регистр захвата по входу (ICR1) и два 16-разрядных регистра сравнения на выходе (в некоторых моде- лях микроконтроллеров регистр сравнения В отсутствует).
42 Глава 1. Восьмиразрядные микроконтроллеры AVR Запрос на Запрос на Запрос на Запрос на прерывание при прерывание при прерывание при прерывание при переполнении Т/С1 совпадении с А совпадении с В захвате входа Рис. 1.16. Схема таймера/счетчика Т/С1 Рассмотрим назначение отдельных регистров: • TCNT1 — счетный регистр (содержимое счетчика); • TCCR1А — регистр управления для определения реакции выводов ОС 1 А/ ОС1В в случае совпадения состояния счетчика в регистре TCNT1 с регистрами сравнения OCR1A/OCR1B, а также для выбора режима широтно-импульсной модуляции; • TCCR1В — регистр управления для настройки делителя частоты, для разреше- ния подачи сигнала сброса для регистра TCNT1 и для управления захватом; • ICR1 — регистр захвата по входу (при появлении на выводе ICP фронта вход- ного сигнала, определенного как активный, текущее состояние счетчика будет перенесено в этот регистр);
Структура микроконтроллеров AVR 43 • OCR 1 A, OCR 1В — регистры сравнения; их содержимое постоянно сравнивает- ся с состоянием счетчика. В случае совпадения выполняются действия, опреде- ленные регистром TCCR1 А. Регистр управления TCCR1A (рис. 1.17) находится в области ввода/вывода по адресу $2F. 7 6 5 4 3 2 1 О СОМ1А1 СОМ 1 АО СОМ1В1 СОМ1В0 — PWM11 PWM10 Рис. 1.17. Регистр TCCR1A таймера/счетчика Т/С1 • ПРИМЕЧАНИЕ Структура рассмотренных здесь регистров в некоторых современных микроконтроллерах мо- жет отличаться. Так, например, для микроконтроллера ATmega640, задействованы разряды 2 и 3: СОМ1СО и СОМ1С1. Их функция аналогичная двум другим парам: СОМ1АО: СОМ1А1 и СОМ1ВО:СОМ1В1, — но для канала С модуля сравнения на выходе. Кроме того, разряды О и 1 в данной модели называются не PWM10 и PWM11, a WGM10 и WGM11. Разряды СОМ1А1/СОМ1 АО и СОМ1В1/СОМ1ВО определяют состояние вывода ОС1А/ОС1В при совпадении содержимого регистра сравнения A/В с содержимым счетчика. Возможные настройки для режима сравнения показаны в табл. 1.10. Таблица 1.10. Возможные варианты для работы в режиме сравнения СОМ 1x1 СОМ 1x0 Действия в случае совпадения 0 0 Выходное значение отсутствует 0 1 При совпадении ОС1х переключается в другое состояние 1 0 При совпадении на выходе ОС1х устанавливает лог. 0 1 1 При совпадении на выходе ОС1х устанавливает лог. 1 В случае активизации режима ШИМ, разряды 4-7 в регистре TCCR1A имеют значения, отличные от указанных в табл. 1.10. Когда регистр управления TCCR1A определяет работу в конфигурации широтно-импульсного модулятора, то Т/С 1 ра- ботает как суммирующий и вычитающий счетчик, осуществляя циклические пере- ходы от $0000 к максимальному значению ТОР, и затем снова возвращаясь к $0000. При запрограммированной разрешающей способности ШИМ в N разрядов значение ТОР рассчитывается как TOP = 2n-1. Частота 1шим, с которой повторяются циклы ШИМ, вычисляется по формуле: fpwM = fr/ci / (2N+I - 2), причем частота таймера/счетчика fr/ci выбирается с помощью разрядов CS10-CS12 регистра TCCR1B, а разрешающая способность N — с помощью разрядов PWM10 и PWM11 регистра TCCR1 А. Соответствующие взаимосвязи показаны в табл. 1.11. Таблица 1.11. Выбор режима ШИМ с помощью разрядов PWM11 и PWM10 PWM11 PWM10 Разрешающая способность | Значение ТОР | | Частота ШИМ 0 0 Режим ШИМ не активен 0 1 8 разрядов $00FF(255) fT/ci/510 1 0 9 разрядов $01FF (511) fT/c, /1022 1 1 10 разрядов $03FF (1023) fT/ci / 2046
44 Глава 1. Восьмиразрядные микроконтроллеры AVR Когда состояние счетчика в регистре TCNT1 совпадает со значением 10-ти младших разрядов регистра OCR1A/OCR1B, то, в зависимости от состояния разря- дов COMIА1/СОМ1 АО или СОМ1В1/СОМ1ВО регистра TCCR1A, вывод ОС1А/ ОС1В последующим тактовым импульсом устанавливается или сбрасывается. Со- ответствующие взаимосвязи показаны в табл. 1.12. Таблица 1.12. Возможности выбора для режима сравнения при работе ШИМ СОМ1х1 СОМ 1x0 Действие в случае совпадения 0 0 На выводе ОС1х нет никакого сигнала 0 1 На выводе ОС1х нет никакого сигнала 1 оа Неинвертирующий широтно-импульсный модулятор. В случае соответствия, при суммирующем подсчете на выводе ОС1х уста- навливается лог. 0, а при подсчете с вычитанием — лог. 1 1 1 Инвертирующий широтно-импульсный модулятор. В Случае соот- ветствия, при суммирующем подсчете на выводе ОС1х устанав- ливается лог. 1, а при подсчете с вычитанием — лог. 0 В случае неинвертирующего широтно-импульсного модулятора, коэффициент заполнения g прямоугольного сигнала на выводе с ШИМ соответствует значению n / (2N - 1), где п — значение в соответствующем регистре OCR, a N — разрешаю- щая способность ШИМ в разрядах (рис. 1.18). и ин :--- ------------- ------------ Uav Ul tH tL т Период T = tH+ tL Коэффициент заполнения g = tH / Т Среднее Uav = (Uh х tn + * k)/ T Рис. 1.18. Определение периода Т, коэффициента заполнения g и среднего арифметического UAv прямоугольных импульсов напряжения U Если регистр сравнения OCR1A/OCR1B содержит значение ТОР или 0, то на соответствующем выводе, в соответствии с правилами, показанными в табл. 1.13, постоянно поддерживаются уровень лог. О или лог. 1. Таблица 1.13. Вывод ШИМ для особых случаев OCR1x = ТОР или OCR1x = О СОМ 1x1 СОМ 1x0 OCR1x Вывод ОС1х 1 0 0 0 1 0 ТОР 1 1 1 0 1 1 1 ТОР 0 На рис. 1.19. на примере фиктивной трехразрядной ШИМ показано формирова- ние неинвертированного и инвертированного выходного ШИМ-сигнала на выходе ОС1В. На диаграмме А показан примерный вид ступенчатого сигнала, соответст- вующий состоянию счетчика TCNT1, на диаграмме В — неинвертированный, а на диаграмме С — инвертированный выходной сигнал. Продолжительность периода Tpwm в этом случае вычисляется в соответствии с рассмотренным выше уравнением TpwmI= Тт/ci * (2N+1 - 2). Таким образом, при N = 3 период ШИМ-сигнала состоит из 14 периодов тактового сигнала fr/ci на входе TCNT1.
Структура микроконтроллеров AVR 45 Состояние счетчика TCNT1 ШИМ-вывод ОС1В Высокий 1 СОШ ВО = О уровень Низкий____ _____ ________ уровень 0123456789 10 15 ."f"~l—г 20 t х f т/ci ШИМ-вывод ОС1В ( Высокий уровень с СОМ1ВО=1 уровень 012345678910 20 25 t х f т/d Рис. 1.19. Способ формирования неинвертированных и инвертированных выходных ШИМ-сигналов В данном примере регистр сравнения OCR1B содержит значение 5. В регистре TCNT1, учитывая тот факт, что его исходное значение равно 0, значение 5 появля- ется после пяти тактовых импульсов. На следующем тактовом импульсе, после рас- познания совпадения на выводе ОС1В устанавливается уровень лог. 0 (рис. 1.19, В). Регистр TCNT1 инкрементируется далее до тех пор, пока не будет достигнуто значение ТОР, которое при трехразрядной ШИМ составляет 7. Как только достиг- нуто значение ТОР, направление счета меняется на обратное, и регистр выполняет вычитание. После девятого тактового импульса, начиная от стартового значения 0, содержимое регистра TCNT1 опять совпадает с содержимым регистра OCR1B. На следующем тактовом импульсе на выходе ОС1В устанавливается уровень лог. 1. Регистр TCNT1 декрементируется далее до тех пор, пока опять не будет дос- тигнуто значение 0. Это происходит после в общей сложности четырнадцати тактр- вых импульсов, считая от начального значения 0. Таким образом завершается пери- од ШИМ-сигнала, направление счета вновь меняется на обратное, и регистр TCNT1 опять выполняет сложение. Как видно на рис. 1.19 (В), “высокая” составляющая выходного сигнала составляет 6 тактовых периодов, а “низкая” — 4. Таким образом, коэффициент заполнения g = 6/10 или g = 3/5. Аналогично, диаграмма С на рис. 1.19 показывает соотношения для инвертированного выходного ШИМ-сигнала. В режиме ШИМ устанавливается флаг переполнения TOV1, если счетчик при достижении состояния 0 меняет направление счета на обратное. Это прерывание по Т/С 1 при переполнении, как и при нормальной работе в режиме счетчика, вызыва- ется в том случае, если установлен флаг общего разрешения прерываний I в регист-
46 Глава 1. Восьмиразрядные микроконтроллеры AVR ре состояния SREG, а также флаг TOIE1 в регистре TIMSK.. В соответствии с этим, прерывания при совпадении регистров TCNT1 и OCR1A/OCR1B вызываются тогда, когда в регистре TIMSK установлен флаг общего разрешения прерываний и флаг OCIE1A/OCIE1B. В отношении таймера/счетчика Т/Cl осталось рассмотреть еще регистр управ- ления TCCR1B (адрес $2Е в области ввода/вывода, адрес $4Е в SRAM). Структура регистра TCCR1В показана на рис. 1.20. 7______6______5 4______3 2______1______0 ICNC1 ICES1 а — — СТС1 CS12 CS11 CS10 Рис. 1.20. Регистр TCCR1B таймера/счетчика Т/С1 HWHWWHK...................................................... '.... Структура регистра TCCR1B в современных микроконтроллерах AVR может отличаться от представленной на рис. 1.20. Так, например, для микроконтроллера ATmega640, задейство- ваны по-другому разряды 3 и 4: WGM12 и WGM13. Совместно с разрядами WGM10 и WGM11 регистра TCCR1А они задают режим работы таймера: обычный, СТС (Clear Timer on Compare Match — обнуление таймера при совпадении содержимого счетного регистра с содержимым регистра OCR1A или ICR1) или режим ШИМ (табл. 1.14). Как уже было сказано ранее, разряды 0-2 используются для выбора частоты тактирования Т/Cl (см. табл. 1.9). Если разряд СТС1 установлен в лог. 1, то Т/С1 возвращается в состояние $0000 по импульсу такта системной синхронизации, сле- дующего после совпадения содержимого счетчика и регистра сравнения А. При ра- боте в режиме ШИМ этот разряд на процесс работы никак не влияет. Разряд ICES1 определяет, каким образом должна осуществляться передача со- стояния счетчика в регистр захвата ICR1: по нарастающему (ICES 1=1) или по нис- падающему фронту (ICES 1=0), — а разряд ICNC1 — должно ли быть активизирова- но подавление помех (если ICNC 1 = 0, то подавление помех отключено). Для подав- ления кратковременных импульсов помех, которые могут привести к ошибочному запуску, входной сигнал зондируется на протяжении четырех периодов такта сис- темной синхронизации. Только после того как будут распознаны четыре последова- тельных низких или высоких уровня входного сигнала, что определяется разрядом ICES 1, при активном подавлении помех будет выполнена запись текущего состоя- ния счетчика в регистр ICR1. Таблица 1.14. Режимы работы таймера/счетчика Т/С1 микроконтроллера ATmega640 WGM13 WGM12 (СТС1) WGM11 (PWM11) WGM10 (PWM10) Режим Значение ТОР Обновление OCR1x 0 0 0 0 Обычный SFFFF Сразу же 0 0 0 1 ШИМ с корректной фазой, 8 разрядов SOOFF Достижение ТОР 0 0 1 0 ШИМ с корректной фазой, 9 разрядов $01FF Достижение ТОР 0 0 1 1 ШИМ с корректной фазой, 10 разрядов $03FF Достижение ТОР 0 1 0 0 СТС OCR1A Сразу же 0 1 0 1 ШИМ (только нарастаю- щий фронт), 8 разрядов $OOFF Достижение BOTTOM 0 1 1 0 ШИМ (только нарастаю- щий фронт), 9 разрядов $01 FF Достижение BOTTOM
Структура микроконтроллеров AVR 47 Таблица 1.14. Режимы работы таймера/счетчика Т/С1 микроконтроллера ATmega640 WGM13 WGM12 (СТС1) WGM11 (PWM11) WGM10 (PWM10) Режим Значение ТОР Обновление OCR1X 0 1 1 1 ШИМ (только нарастаю- щий фронт), 10 разрядов $03FF Достижение BOTTOM 1 0 0 0 ШИМ с корректной фазой и частотой ICR1 Достижение BOTTOM 1 0 0 1 ШИМ с корректной фазрй и частотой OCR1A Достижение BOTTOM 1 0 1 0 ШИМ с корректной фазой ICR1 Достижение ТОР 1 0 1 1 ШИМ с корректной фазой OCR1A Достижение ТОР 1 1 0 0 СТС ICR1 Сразу же 1 1 0 1 Зарезервирован 1 1 1 0 ШИМ (только нарастаю- щий фронт) ICR1 Достижение BOTTOM 1 1 1 1 ШИМ (только нарастаю- щий фронт) OCR1A Достижение BOTTOM Т/С2 Таймер/счетчик Т/С2 обычно имеет разрядность 8 бит и реализует функции сравнения на выходе и ШИМ, аналогичные Т/Cl. Основная особенность Т/С2 за- ключается в том, что в качестве источника тактовых импульсов он может использо-. вать генератор, независимый от системного. Для управления Т/С2 используются два регистра: ASSR (рис. 1.21) hTCCR2 (рис. 1.22). 7 6 5 4 3 2 1 О — — — — AS2 TCN2UB OCR2UB TCR2UB Рис. 1.21. Регистр ASSR таймера/счетчика Т/С2 Г 1РИМЕЧАНИЕ В некоторых современных микроконтроллерах AVR (например, ATmega640) регистр ASSR может быть связан с другим таймером/счетчиком (например, Т/СО). Соответственно, будут называться по-другому его разряды (например, ASO, TCNOUB, OCROUB и TCR0UB). Если установить в лог. 1 разряд AS2, то в качестве источника тактовых импуль- сов можно использовать внешний осциллятор. Оставшиеся три разряда (0-2) ис- пользуются в программах для проверки того, что данные не записываются в регист- ры Т/С2 в тот момент, когда они обновляются аппаратно. Такая проверка необхо- дима по той причине, что осциллятор Т/С2 работает асинхронно по отношению к системному осциллятору. 7 6 5 4 3 2 1_______0 — PWM2 СОМ21 СОМ20 СТС2 CS22 CS21 CS20 ) Рис. 1.22. Регистр TCCR2 таймера/счетчика Т/С2 Установка в лог. 1 разряда PWM2 переводит Т/С2 в режим ШИМ. Назначение разрядов СОМ21 и СОМ20 идентично назначению разрядов COMlxl и СОМ 1x0 таймера/счетчика Т/С1 — выбор режима сравнения на выходе.
48 Глава 1. Восьмиразрядные микроконтроллеры AVR Разряд СТС2 определяет, должен ли счетчик сбрасываться в нуль при совпаде- нии его содержимого с регистром сравнения. Разряды 0-2 определяют частоту так- тового сигнала, полученного с помощью предварительного делителя частоты такта системной синхронизации. Сторожевой таймер Сторожевой таймер (watchdog timer) — встроенный таймер, тактируемый внут- ренним RC-осциллятором, который автоматически сбрасывает микроконтроллер при переполнении своего счетного регистра. В частности, он используется для пре- дотвращения перехода микроконтроллера в режим бесконечного цикла, когда на не- го невозможно повлиять извне. Обобщенная структурная схема сторожевого тайме- ра показана на рис. 1.23. Рис. 1.23. Структурная схема сторожевого таймера Управление сторожевым таймером в различных моделях микроконтроллеров AVR может несколько отличаться. Так, для этого может использоваться регистр управления WDTCR или WDTCSR (рис. 1.24). 7______6 5 4 3 2 1 0 WDTCR WDTCSR — — — WDTOE WDE WDP2 WDP1 WDPO 7 6 5 4 3 2 1 0 WDIF WDIE WDP3 WDCE WDE WDP2 WDP1 WDPO Рис. 1.24. Регистры WDTCR и WDTCSR микроконтроллеров AVR Назначение отдельных разрядов регистров WDTCR и WDTCSR: • WDP0-WDP3 — выбор коэффициента деления частоты следования сигналов сброса (при этом период до наступления сброса зависит от рабочего напряже- ния процессора — табл. 1.15); • WDE — включение/отключение сторожевого таймера (1 — включен); • WDTOE (или WDCE) — если сторожевой таймер должен быть отключен, сле- дует установить этот разряд в лог. 1. После установки этого разряда он в течение четырех периодов такта системной синхронизации остается в состоя- нии лог. 1, а затем аппаратно сбрасывается в лог. 0. Программа пользователя имеет возможность отключить сторожевой таймер посредством записи лог. 0 в разряд WDE только во время этих четырех тактов системной синхронизации. В регистре WDTCSR разряд WDIF устанавливается в 1, когда истекает период до сброса. Это вызывает прерывание (см. следующий подраздел), после обработки которого разряд WDIF автоматически обнуляется аппаратно.
Структура микроконтроллеров AVR 49 Таблица 1.15. Назначение разрядов WDP0-WDP2 регистра WDTCR WDP3 WDP2 WDP1 WDPO Коэффициент де- ления Период до сброса (при Vcc = 5 В) 0 0 0 0 1 16 мс 0 0 0 1 2 32 мс 0 0 1 0 4 64 мс 0 0 1 1 8 128 мс 0 1 0 0 16 256 мс 0 1 0 1 32 512 мс 0 1 1 0 64 1 с 0 1 1 1 128 2,1 с 1 (b 0 0 256 4 с 1 0 ‘ 0 1 512 8с Если разряд WDIE установлен в 1, то установка в 1 разряда I в регистре SREG разрешает прерывание по переполнению сторожевого таймера. В комбинации с разрядом WDE он определяет режим работы сторожевого таймера (табл. 1.16). Таблица 1.16. Режимы работы сторожевого таймера WDE WDIE Режим Действие по истечении периода ожидания 0 0 Отключен — 0 1 Режим прерывания Прерывание 1 0 Режим системного сброса Сброс 1 1 Режим прерывания и сис- темного сброса Прерывание, а после его обработки — систем- ный сброс В системе команд AVR сторожевой таймер сбрасывается в исходное состояние по команде wdr. Обработка прерываний Прерывания — это вызовы определенных функций, генерируемые, главным об- разом, аппаратной частью микроконтроллера. В результате прерывания выполнение программы останавливается, и происходит переход к соответствующей подпро- грамме обработки прерывания. Прерывания бывают внутренними и внешними. Источниками внутреннего пре- рывания являются встроенные модули микроконтроллера (например, таймер/ счет- чик или сторожевой таймер). Внешние прерывания вызываются сбросом (сигнал на выводе RESET) или сигналами заданного уровня на выводах INT. Например, харак- тер сигналов на выводах INTx, вызывающих прерывание, определяется с помощью разрядов регистра управления MCUCR (в ряде старых моделей‘микроконтроллеров AVR) или EICRx (в новых моделях): ISCxO и ISCxl (табл. 1.17). Таблица 1.17. Выбор способа активизации прерывания по входу INTx ISCxl ISCxO Описание 0 0 Прерывание вызывается по уровню лог. 0 на входе INTx 0 1 Прерывание вызывает любым изменением уровня на входе INTx 1 0 Прерывание вызывается по ниспадающему фронту сигнала INTx 1 1 Прерывание вызывается по нарастающему фронту сигнала INTx
50 Глава 1. Восьмиразрядные микроконтроллеры AVR В микроконтроллерах AVR всем прерываниям, включая сброс, поставлен в соответствие собственный вектор прерывания — адрес в начальной области памя- ти программ, по которому компилятор размещает команду перехода к подпрограм- ме обработки прерывания. Перечень векторов прерывания в некоторых старых мо- делях микроконтроллеров AVR может соответствовать табл. 1.18. Таблица 1.18. Векторы прерываний в некоторых старых микроконтроллерах AVR Адрес в памя- ти программ Источник прерывания Описание $0000 RESET Сигнал сброса $0001 ’into Внешний запрос на прерывание по входу INTO $0002 INT1 Внешний запрос на прерывание по входу INT1 $0003 Т/С1 Захват по таймеру/счетчику Т/С1 $0004 Т/С1 Совпадение с регистром сравнения А таймера Т/С1 $0005 Т/С1 Совпадение с регистром сравнения В таймера Т/С1 $0006 Т/С1 Переполнение таймера/счетчика Т/С1 $0007 Т/СО Переполнение таймера/счетчика Т/СО $0008 SPI Завершение передачи данных по интерфейсу SPI $0009 UART Прием байта приемопередатчиком UART завершен $000А UART Регистр данных приемопередатчика UART пуст $000В UART Передача данных приемопередатчиком UART завершена $000С ANA_COMP Прерывание от аналогового компаратора Пример векторов прерывания для ряда новых моделей микроконтроллеров AVR показан в табл. 1.19. Таблица 1.19. Векторы прерываний в некоторых новых микроконтроллерах AVR Адрес в памя- ти программ Источник пре- рывания Описание $0000 RESET Сигнал сброса $0002 INTO Внешний запрос на прерывание по входу INTO $0004 INT1 Внешний запрос на прерывание по входу INT1 $0006 INT2 Внешний запрос на прерывание по входу INT2 $0008 INT3 Внешний запрос на прерывание по входу INT3 $000А INT4 Внешний запрос на прерывание по входу INT4 $000С INT5 Внешний запрос на прерывание по входу INT5 $000Е INT6 Внешний запрос на прерывание по входу INT6 $0010 INT7 Внешний запрос на прерывание по входу INT7 $0012 PCINTO Внешний запрос на прерывание по изменению уровня сигнала на входе INTO $0014 PCINT1 Внешний запрос на прерывание по изменению уровня сигнала на входе INT1 $0016 PCINT2 Внешний запрос на прерывание по изменению уровня сигнала на входе INT2 $0018 WDT Прерывание от сторожевого таймера $001А TIMER2_COMPA Совпадение с регистром сравнения А таймера Т/С2 $001С TIMER2_COMPB Совпадение с'регистром сравнения В таймера Т/С2 $001Е TIMER2_OVF Переполнение таймера Т/С2 $0020 TIMER1_CAPT Событие захвата таймера Т/С1
Структура микроконтроллеров AVR 51 Таблица 1.19. Окончание Адрес в памя- ти программ Источник пре- рывания Описание $0022 TIMER1_COMPA Совпадение с регистром сравнения А таймера Т/С1 $0024 TIMER1_COMPB Совпадение с регистром сравнения В таймера Т/С1 $0026 TIMER1_COMPC Совпадение с регистром сравнения С таймера Т/С1 $0028 TIMER1_OVF Переполнение таймера Т/С1 $002А TIMER0_COMPA Совпадение с регистром сравнения А таймера Т/СО $0020 TIMERO-COMPB Совпадение с регистром сравнения В таймера Т/СО $002Е TIMEROJDVF Переполнение таймера Т/СО $0030 SPI-STC Передача по интерфейсу SPI завершена $0032 USART0_RX Прием данных по LISART0 завершен $0034 USARTOJJDRE Регистр данных USART0 пуст $0036 USART0_TX Передача данных по LISART0 завершена $0038 ANALOG_COMP Прерывание от аналогового компаратора $003А ADC Завершено аналого-цифровое преобразование $003С EE_READY Память EEPROM готова $003Е TIMER3_CAPT Событие захвата таймера Т/СЗ $0040 TIMER3_COMPA Совпадение с регистром сравнения А таймера Т/СЗ $0042 TIMER3_COMPB Совпадение с регистром сравнения В таймера Т/СЗ $0044 TIMER3_COMPC Совпадение с регистром сравнения С таймера Т/СЗ $0046 TIMER3_OVF Переполнение таймера Т/СЗ $0048 USART1_RX Прием данных по USART1 завершен $004А USART1JJDRE Регистр данных USART 1 пуст $0040 USART1_TX Передача данных по USART1 завершена $004Е TWI Прерывание от интерфейса TWI (аналог 12С) $0050 SPM_READY Готовность к сохранению в памяти программ $0052 TIMER4_CAPT Событие захвата таймера Т/С4 $0054 TIMER4_COMPA Совпадение с регистром сравнения А таймера Т/С4 $0056 TIMER4_COMPB Совпадение с регистром сравнения В таймера Т/С4 $0058 TIMER4_COMPC Совпадение с регистром сравнения С таймера Т/С4 $005А TIMER4_OVF Переполнение таймера Т/С4 $0050 TIMER5_CAPT Событие захвата таймера Т/С5 $005Е TIMER5_COMPA Совпадение с регистром сравнения А таймера Т/С5 $0060 TIMER5_COMPB Совпадение с регистром сравнения В таймера Т/С5 $0062 TIMER5_COMPC Совпадение с регистром сравнения С таймера Т/С5 $0064 TIMER5_OVF Переполнение таймера Т/С5 $0066 USART2_RX Прием данных по USART2 завершен $0068 USART2JJDRE Регистр данных USART2 пуст $006А USART2_TX Передача данных по USART2 завершена $006С USART3_RX Прием данных по USART3 завершен $006Е USART3JJDRE Регистр данных USART3 пуст $0070 USART3_TX Передача данных по USART3 завершена В микроконтроллерах AVR все прерывания имеют одинаковый приоритет и в случае одновременного возникновения двух прерываний первым обрабатывается прерывание с меньшим номером вектора. Определять, какое именно прерывание требует обслуживания, задача программиста, и многие компиляторы с языка С
52 Глава 1. Восьмиразрядные микроконтроллеры AVR предоставляют для этой цели готовые функции, освобождающие от необходимости самому “вычислять” источник прерывания. В момент возникновения прерывания в стек помещается адрес возврата — ад- рес команды, которая должна быть выполнена первой после выхода из подпрограм- мы обработки прерывания. В результате выполнения последней ассемблерной ко- манды подпрограммы обработки прерывания (для микроконтроллеров AVR — это команда reti) адрес возврата извлекается из стека в счетчик команд, и выполнение программы продолжается. Управление прерываниями В микроконтроллерах AVR за управление прерываниями отвечают, главным образом, четыре вида регистров: • GIMSK (General Interrupt Mask Register) или EIMSK (External Interrupt Mask Register) — разрешение или запрет внешних прерываний по входу INTx; • G1FR (General Interrupt Flag Register) или EIFR (External Interrupt Flag Register) — регистр флагов внешних прерываний; • TIMSKx (Timer/Counter Interrupt Mask Register) -г- регистр маскирования пре- рываний от таймера/счетчика Т/Сх; • TEFRx (Timer/Counter Interrupt Flag Register) — регистр флагов прерываний от таймера/счетчика Т/Сх; • PCICR (Pin Change Interrupt Control Register) — регистр управления прерыва- ниями по изменению состояния входа; • PCIFR (Pin Change Interrupt Flag Register) — регистр флагов прерываний по из- менению состояния входа; • PCMSKx (Pin Change Mask Register) — регистр маскирования прерываний по изменению состояния входа. О состоянии прерывания сигнализирует соответствующий флаг, который уста- навливается или сбрасывается в регистре флагов. Даже если в регистре маски пре- рываний установлен соответствующий отдельный разряд разрешения прерывания, то прерывания могут активизироваться только тогда, когда в регистре состояния SREG установлен разряд общего разрешения прерываний I (разряд 7). Если это име- ет место, и наступает прерывание, то выполнение программы ответвляется по соот- ветствующему адресу (см. табл. 1.18 и табл. 1.19), и разряд общего разрешения пре- рываний I в регистре SREG сбрасывается в состояние лог. О, блокируя тем самым последующие прерывания. Если требуется прервать подпрограмму другим преры- ванием, то после входа в подпрограмму обработки прерывания программа пользо- вателя должна установить флаг I в лог. 1. Вместе с входом в подпрограмму обработки прерывания аппаратно сбрасывает- ся также и соответствующий флаг, вызвавший прерывание. Некоторые флаги пре- рываний могут быть сброшены самим пользователем посредством установки соот- ветствующего флага в лог. 1. Регистры GIMSK и EIMSK Регистры GIMSK (в старых моделях микроконтроллеров AVR) и EIMSK (в новых моделях) (рис. 1.25) используются для разрешения внешних прерываний.
Структура микроконтроллеров AVR 53 7 6 5 4 3 2 1 0 GIMSK INT1 INTO — — — — — — 7 6 5 4 3 2 1 0 EIMSK INT7 INT6 INT5 INT4 INT3 INT2 INT1 INTO Рис. 1.25. Структура регистров GIMSK и EIMSK микроконтроллеров AVR Если разряд INTx установлен в лог. 1, то внешнее прерывание по входу INTx будет разрешено до тех пор, пока установлен в лог. 1 разряд I в регистре состояния SREG. Регистры GIFR и EIFR Состояние внешнего прерывания определяется по регистру GIFR (в старых мо- делях микроконтроллеров AVR) или EIFR (в новых моделях) (рис. 1.26). 7 6 5 4 3 2 1 0 GIFR INTF1 INTFO — — — — — — 7 6 5 4 3 2 1 0 EIFR INTF7 INTF6 INTF5 INTF4 INTF3 INTF2 INTF1 INTFO Рис. 1.26. Структура регистров GIFR и EIFR микроконтроллеров AVR Флаг INTFx устанавливается в лог. 1, если возникает внешнее прерывание по сигналу на выводе INTx. При входе в подпрограмму обработки прерывания этот разряд переводится аппаратно в исходное состояние лог. 0. Регистры TIMSKx и TIFRx Регистр TIMSKx (его “классический” вариант показан рис. 1.27) используется для разрешения прерываний от таймера/счетчика Т/Сх. 7 6 5 4 3 2 1 О TOIE1 OCIE1A OCIE1B — TICIE1 — TOIEO — Рис. 1.27. Структура регистра TIMSK старых моделей микроконтроллеров AVR, когда один регистр управлял двумя таймерами/счетчиками Состояние прерываний, имеющих отношение к таймерам/счетчикам микрокон- i роллеров AVR, определяется по регистру TIFRx (его “классический” вариант пока- зан на рис. 1.29). 7 6 5 4 3 2 1 *0 TOV1 OCF1A OCF1B — ICF1 — TOVO — Рис. 1.28. Структура регистра TIFR микроконтроллеров AVR В новых микроконтроллерах AVR каждому таймеру/счетчику сопоставлен от- дельная пара регистров TIMSKx и TIFRx, суть разрядов в котором аналогична сути азрядов в традиционных регистрах TIMSK и TIFR: • когда разряд TOIEx и разряд I в регистре состояния SREG установлены в лог. I, то разрешено прерывание при переполнении Т/Сх; в случае переполнения в регистре TIFRx устанавливается флаг TOVx;
54 Глава 1. Восьмиразрядные микроконтроллеры AVR • если разряд OCIExA и разряд I в регистре состояния SREG установлены в лог. 1, то разрешено прерывание при совпадении содержимого регистра срав- нения А с текущим состоянием Т/Сх; в случае совпадения, в регистре TIFRx ус- танавливается флаг OCFxA; • если разряд OCIExB и разряд I в регистре состояния SREG установлены в лог. 1, то разрешено прерывание при совпадении содержимого регистра срав- нения В с текущим состоянием Т/Сх; в случае совпадения, в регистре TIFRx ус- танавливается флаг OCFxB; • если разряд OCIExC и разряд I в регистре состояния SREG установлены в лог. 1, то разрешено прерывание при совпадении содержимого регистра срав- нения С с текущим состоянием Т/Сх; в случае совпадения, в регистре TIFRx ус- танавливается флаг OCFxC; • если разряд (Т)1С1Е1 и разряд I в регистре состояния SREG установлены в лог. 1, то разрешается прерывание при выполнении условия захвата; когда возникает срабатывание по захвату, в регистре TIFRx устанавливается флаг ICFx; • если разряд TOIEx и разряд I в регистре состояния SREG установлены в лог. 1, то разрешается прерывание при переполнении таймера/счетчика Т/Сх. В таком случае, в регистре TIFRx устанавливается флаг TOVx. Установка в лог. 1 одного из фЛагов в регистре TIFRx приводит к переходу по соответствующему вектору прерывания. При входе в подпрограмму обработки пре- рывания, флаг в регистре TIFRx аппаратно сбрасывается в лог. 0. Регистры управления прерываниями по изменению состояния входа Если какой-либо из разрядов в регистре PCICR (РС1Е0:РС1Е2) установлен в лог. 1, и флаг I в регистре SREG также установлен в лог. 1, то разрешено соответ- ствующее прерывание по изменению состояния входов. Маскирование таких пре- рываний осуществляют с помощью регистров PCMSK. Когда возникает прерыва- ние, устанавливается соответствующий флаг в регистре PCIFR. Сброс Сброс — это, по сути, одна из форм прерываний, вызывающая перезапуск мик- роконтроллера (аппаратная инициализация всех регистров управления и перифе- рийных устройств и выполнение программы, начиная с адреса $0000). Вектор сбро- са всегда расположен самым первым. Возможны следующие основные варианты сброса: • сбро^ при включении питания (т.е. когда питающее напряжение падает ниже определенного, заданного уровня Урот); • внешний сброс (сигнал низкого уровня подается на вывод /RESET микрокон- троллера); • сброс по провалу напряжения, когда питающее напряжение падает ниже опре- деленного, заданного уровня УВог, при активном детекторе провалов (присутст- вует не во всех микроконтроллерах AVR); • сброс от сторожевого таймера (микроконтроллер сбрасывается по истечению времени, заданного сторожевым таймером, если этот таймер активен). В этой книге затрагивается только сброс от сторожевого таймера, поэтому рас- сматривать данный вопрос подобно мы не будем. Отметим только, что управление
Структура микроконтроллеров AVR 55 источниками сброса в современных микроконтроллерах AVR осуществляется с по- мощью регистра MCUSR (MCUCSR) (адрес $34 в области ввода/вывода или $54 в адресном пространстве SRAM). Флаги, содержащиеся в этом регистре, указывают на источник сброса. При этом следует помнить, что любой разряд регистра MCUSR, установленный в 1, автоматически не обнуляется. Таким образом, отслеживать со- стояние данного регистра — задача программиста. “Спящие”режимы процессора Микроконтроллер^ AVR допускают переход в “спящий” режим, когда проис- ходит временное отключение генератора тактовых импульсов. В таком режиме по- требление энергии сведено к минимуму, а выход из него осуществляется при полу- чении запроса на прерывание. Переход в “спящий” режим реализуется по ассемблерной команде sleep. При этом должен быть предварительно установлен в лог. 1 разряд SE регистра управле- ния MCUCR. или SMCR (в ряде новых микроконтроллеров AVR). Когда во время режима пониженного энергопотребления происходит прерыва- ние, центральный процессор выходит из “спящего” режима, выполняет подпро- грамму обработки прерывания и продолжает выполнение программы с команды, следующей после sleep. Если во время режима пониженного энергопотребления поступает сигнал сброса, то центральный процессор выходит из “спящего” режима и продолжает выполнение программы с команды, расположенной по адресу $000 в программной области. Для современных микроконтроллеров AVR может быть выбран один из двух “спящих” режимов: • Ждущий режим (Idle Mode). Работа процессора приостанавливается, но тайме- ры/счетчики, сторожевой таймер, система прерываний и тактирования, после- довательные интерфейсы, аналоговый компаратор и АЦП остаются активными. Благодаря этому, центральный процессор может быть возвращен в обычный режим работы с помощью соответствующего прерывания. • Режим пониженного энергопотребления (Power-down Mode). Системный ос- циллятор (а значит и весь микроконтроллер) находится в отключенном состоя- нии. В таком режиме с помощью внутреннего RC-генератора колебаний может включаться лишь сторожевой таймер cq своим собственным обеспечением так- товой частотой. Активный сторожевой таймер по истечении времени задержки опять переводит микроконтроллер в нормальное состояние. Если сторожевой таймер также отключен, то в нормальное состояние его может перевести только внешний сигнал сброса или внешнее прерывание. • Режим снижения шума для АЦП (ADC Noise Reduction Mode). В этом режиме процессор отключен, однако разрешено аналого-цифровое преобразование и внешние прерывания. Кроме того, продолжают работать таймеры/счетчики и сторожевой таймер. Это снижает уровень помех для АЦП, что позволяет полу- чить более точные результаты преобразования. Если АЦП включен, но преобра- зование начинается автоматически сразу же после перехода в данный “спящий” режим. Выход из него осуществляется по прерыванию при скончании аналого- цифрового преобразования или по любому другому разрешенному прерыванию. • Экономный режим (Power-save Mode). Идентичен режиму пониженного энер- гопотребления за тем исключением, что, кроме сторожевого, работает еще один из таймеров (например, Т/С2).
56 Глава 1. Восьмиразрядные микроконтроллеры AVR • Дежурный режим (Standby Mode). Доступен только в том случае, когда актив- но тактирование от внешнего кварца или резонатора. Этот режим аналогичен режиму пониженного энергопотребления за тем исключением, что продолжает работать осциллятор. Выход из режима ожидания происходит после шести так- товых циклов. • Расширенный дежурный режим (Extended Standby Mode). Аналогичен режи- му ожидания за тем исключением, что остается активным один из тайме- ров/счетчиков (например, Т/С2). В старых моделях микроконтроллеров AVR были доступны только два “спя- щих” режима: ждущий и пониженного энергопотребления. Выбор одного из них осуществлялся с помощью разряда SM регистра управления MCUCR. Если разряд SM установлен в лог. 1, то микроконтроллер переводится в режим пониженного энергопотребления последующей командой sleep, если же он был обнулен, то мик- роконтроллер переводится в ждущий режим в том случае, если ранее в регистре MCUCR был установлен разряд SE. В современных микроконтроллерах AVR для выбора “спящего” режима служит регистр управления SMCR (Sleep Mode Control Register), который, кроме SE, содер- жит разряды SM0:SM2 (табл. 1.20). Таблица 1.20. Выбор “спящего” режима с помощью разрядов SMx регистра SMCR SM2 SM1 SM0 Режим 0 0 0 Ждущий 0 0 1 Снижения шума для АЦП 0 1 0 Пониженного энергопотребления 0 1 1 Экономный 1 0 0 Зарезервировано 1 0 1 Зарезервировано 1 1 0 Дежурный 1 1 1 Расширенный дежурный Кроме того, в современных микроконтроллерах AVR используются регистры PRRx (Power Reduction Register), разряды которых позволяют отключать с целью снижения энергопотребления отдельные периферийные устройства (например, тай- меры/счетчики, АЦП или последовательные интерфейсы). При этом текущее состо- яние отключаемого устройства фиксируется, а связанные с ним регистры в области ввода/вывода блокируются от изменений. Для его возврата в рабочее состояние не- обходимо обнулить соответствующий разряд в регистре PRRx. Устройство сразу же возвратится в состояние до отключения. Последовательный ввод/вывод В отличие от параллельного обмена данными, в случае последовательного вво- да/вывода используется только одна информационная линия. При этом передача данных бывает асинхронной и синхронной. При синхронном последовательном вводе/выводе передача отдельных битов данных синхронизируется с помощью одновременно передаваемого тактового сиг- нала. Синхронная последовательная передача данных применяется, главным обра- зом, на уровне печатных плат, в том числе — для обмена данными между различ-
Структура микроконтроллеров AVR 57 ными интегрированными блоками в составе схемы микроконтроллера и различными периферийными схемами (например, для обработки видеосигнала). В противоположность этому, при асинхронной передаче данных передается не тактовый сигнал, а старт-бит и стоп-бит, определяющие начало и завершение пе- редачи слова данных (рис. 1.29). Рис. 1.29. Типичный формат асинхронной передачи данных (в данном примере — байта 10000010) Главной областью применения асинхронной передачи, как правило, является не обмен данными в составе схемы, а коммуникация между блоками, разделенными пространственно и обладающими признаками собственного интеллекта. В качестве примера можно назвать связь между персональным компьютером и принтером, мо- демом, программирующим устройством или регистратором данных. В микроконтроллерах AVR семейств AT90S, ATtiny и ATmega асинхронная пе- редача данных осуществляется с помощью приемопередатчика UART (или USART), а для синхронного ввода/вывода используется особый режим приемопередатчика USART, а также интерфейсы SPI и 12С (аналог — TWI). Кроме того, новые микро- контроллеры AVR семейства ATmega оснащаются универсальным последователь- ным интерфейсом USI, объединяющим в себе функции SPI и TWI. Рассмотрим пе- речисленные средства подробнее. Приемопередатчик UART В старых моделях микроконтроллеров AVR использовался приемопередатчик UART. Для его работы были выделены в общей сложности четыре регистра: • регистр управления UCR (адрес в области ввода/вывода — $0А, адрес SRAM — $2А) — предназначен для управления функциями приемопередатчика и для разрешения/запрета прерываний от UART (рис. 1.30); 7_____6 5 4_____3 2______1_____0 RXCIE TXCIE UDRIE RXEN TXEN CHR9 RXB8 ТХВ8 Рис. 1.30. Регистр управления UCR микроконтроллеров AVR • регистр состояния USR (адрес в области ввода/вывода — $0В, адрес SRAM — $2В)(рис. 1.31); 7______6 5 4______3 2______1______0 RXC ТХС UDRE FE OR — — — Рис. 1.31. Регистр состояния USR микроконтроллеров AVR • регистр данных UDR (адрес в области ввода/вывода — $0С, адрес SRAM — $2С) — физически состоит из двух регистров, обращение к которым осуществ-
58 Глава 1. Восьмиразрядные микроконтроллеры AVR ляется по одному и тому же адресу; один из них используется для передачи, а другой — для приема данных; • регистр UBRR (адрес в области ввода/вывода — $09, адрес SRAM — $29) — применяется для настройки требуемой скорости передачи данных с помощью встроенного контроллера, позволяющего устанавливать наиболее распростра- ненные скорости передачи по стандарту RS232C. Рассмотрим разряды регистра UCR. • Если разряд RXCIE и разряд общего разрешения прерываний I в регистре со- стояния SREG установлены в лог. 1, то разрешается прерывание по завершению приема через UART. • Если разряд TXCIE и разряд общего разрешения прерываний I в регистре со- стояния SREG устанбвлены в лог. 1, то разрешается прерывание по завершению передачи через UART. • Если разряд UDRIE и разряд общего разрешения прерываний I в регистре со- стояния SREG установлены в лог. 1, то разрешается прерывание по опустоше- нию регистра данных UART. • Если разряд RXEN установлен в лог. 1, то происходит разблокирование прием- ника, и вывод 0 порта D становится входом UART. Если разряд RXEN содержит лог. 0, то принимающий элемент приемопередатчика UART блокируется, и вывод 0 порта D может использоваться в качестве обычного входа/выхода. Если разряд RXEN содержит лог. 0, то флаги OR и FE регистра состояния USR не могут быть установлены. Если эти флаги все же установлены, то они с по- мощью RXEN не сбрасываются. • Если разряд TXEN установлен в лог. 1, то передатчик деблокируется, а вывод 1 порта D становится выходом UART. Если разряд TXEN содержит лог. 0, то пе- редающий элемент UART блокируется, и вывод 1 порта D может использовать- ся в качестве обычного входа/выхода. Если разряд TXEN во время процесса пе- редачи устанавливается в лог. 0, то передатчик не блокируется до тех пор, пока текущий символ в сдвиговом регистре, а также символ, возможно, ожидающий на передачу в регистре UDR не будут полностью переданы. • Если разряд CHR9 установлен в лог. 1, то слова данных, подлежащие переда- че/считыванию имеют длину 11 бит (9 разрядов данных плюс стартовый и стоп- бит). Девятый бит из разряда ТХВ8 при передаче попадает в UCR, а при прие- ме — в разряд RXB8 регистра UCR. Девятый бит может быть использован для размещения дополнительных информационных данных, например, в качестве бита четности или второго стоп-бита. Если разряд CHR9 установлен в лог. 0, то слова данных, подлежащие передаче/считыванию имеют длину 10 бит (8 разря- дов данных плюс стартовый и стоп-бит). Регистр состояния USR информирует программу пользователя о состоянии приемопередатчика UART. • Флаг RXC устанавливается в лог. 1, если принятое слово данных было перене- сено из сдвигового регистра в регистр UDR (без учета возможных ошибок кад- рирования, которые могли возникнуть во время передачи данных). После чте- ния регистра UDR флаг RXC автоматически сбрасывается в лог. 0. • Флаг ТХС будет установлен в лог. 1, если символ в сдвиговом регистре был пе- редан полностью (то есть, включая стоп-бит), и из регистра UDR не ожидается новый байт данных. Флаг очень полезен в полудуплексном режиме работы, ко-
Структура микроконтроллеров AVR 59 гда непосредственно после передачи необходимо переключиться в режим при- ема. При входе в подпрограмму обработки прерывания флаг завершения пере- дачи ТХС аппаратно сбрасывается в лог. 0. • Флаг UDRE устанавливается в лог. 1, если содержимое регистра UDR было пе- ренесено в сдвиговой регистр. С его помощью пользователь получает уведом- ление о том, что приемопередатчик готов к передаче нового байта. Соответст- вующая подпрограмма обработки прерывания выполняется до тех пор, пока ус- тановлен флаг UDRE. Флаг UDRE сбрасывается при записи байта данных в ре- гистр UDR. В случае сброса при включении питания флаг UDRE устанавлива- ется в лог. 1, чтобы показать, что приемопередатчик готов к передаче нового байта данных. • Флаг FE устанавливается в лог. 1 при обнаружении ошибки кадрирования. Это происходит,‘если при трех сканированиях стоп-бита был более одного раза об- наружен лог. 0, и тем самым стоп-бит был распознан как сигнал низкого уровня. Флаг FE сбрасывается, когда стоп-биту соответствует сигнал высокого уровня. Пользовательская программа должна постоянно проверять флаг FE перед чте- нием регистра UDR, чтобы можно было распознать потенциально некоррект- ный символ в регистре приема. • Флаг OR устанавливается в лог. 1, если один из символов, переданных в ре- гистр UDR из сдвигового регистра, не был прочитан перед следующим посту- пившим символом. Этот флаг обновляется после считывания действительного символа из регистра UDR, поэтому пользовательская программа должна всегда проверять флаг OR после чтения регистра UDR, чтобы распознать потерю одно- го поступившего символа. Флаг OR сбрасывается при переносе считанного символа в регистр UDR. Настройка скорости передачи данных через UART В приемопередатчик UART встроен специальный контроллер скорости переда- чи данных, представляющий собой делитель частоты для определения скорости пе- редачи данных на основании такта системной синхронизации. Скорость передачи может быть вычислена по следующему уравнению: fBaud = <I>/(16(UBRR+l)) где feaud — скорость передачи в бодах, Ф — такт системной синхронизации; UBRR— содержимое 8-разрядного регистра UBRR (0...255). Значения, записывае- мые в регистр UBRR для наиболее распространенных скоростей передачи данных, представлены в табл. 1.21. Все значения, для которых погрешность получается меньше 2%, в табл. 1.21 выделены полужирным шрифтом. Таблица 1.21. Значения регистра UBRR для наиболее распространенных скоростей пе- редачи данных и частоты работы кварцевого осциллятора Скорость передачи данных, бод 1,8432 МГц Погреш- ность t (%) 3,6864 МГц Погреш- ность (%) 4 МГц Погреш- ность (%) 1200 UBRR = 95 0,0 UBRR = 191 0,0 UBRR = 207 0,2 2400 UBRR = 47 0,0 UBRR = 95 0,0 UBRR = 103 0,2 4800 UBRR = 23 0,0 UBRR = 47 0,0 UBRR = 51 0,2 9600 UBRR = 11 0,0 UBRR = 23 0,0 UBRR = 25 0,2 14400 UBRR = 7 0,0 UBRR = 15 0,0 UBRR = 16 2,1
60 Глава 1. Восьмиразрядные микроконтроллеры AVR Таблица 1.21. Окончание Скорость передачи данных, бод 1,8432 МГц Погреш- ность (%) 3,6864 МГц Погреш- ность (%) 4 МГц Погреш- ность (%) 19200 UBRR = 5 0,0 UBRR = 11 0,0 UBRR = 12 0,2 2400 UBRR = 207 0,2 UBRR = 287 — UBRR = 312 — 4800 UBRR = 103 0,2 UBRR = 143 0,0 UBRR = 155 0,2 9600 UBRR = 51 0,2 UBRR = 71 0,0 UBRR = 77 0,2 14400 UBRR = 34 0,8 UBRR = 47 0,0 UBRR = 51 0,2 19200 UBRR =.25 0,2 UBRR = 35 0,0 UBRR = 38 0,2 Значения, выделенные курсивом, превышают 255, и потому не могут быть ус- тановлены в регистре UBRR, имеющем длину всего восемь разрядов. Если потребу- ется соответствующая скорость передачи данных, то необходимо переходить на бо- лее низкие частоты колебаний кварцевого осциллятора. Приемопередатчик USART В современных микроконтроллерах AVR вместо UART используются приемо- передатчики USART. Принципы их работы в общем случае сходны. Отличия за- ключаются, в основном, в структуре и названии управляющих регистров. Так, ре- гистр UBRR, задающий скорость обмена данными, теперь — 16-разрядный и фак- тически состоит из двух регистров: UBBRH и UBRRL. Это позволяет задать ско- рость передачи до 1 Мбод (см. табл. 1.22). Регистру USR теперь соответствует регистр управления и состояния А (UCSRA). Кроме рассмотренных выше разрядов, в нем также задействованы также разряды 0-2. • МРСМ (Multi-processor Communication Mode) — если этот разряд содержит 1, то все кадры, поступающие на приемник USART без информации об адресе, иг- норируются. В режиме вывода этот разряд нс используется. • U2X — установка этого разряда в 1 удваивает скорость передачи в асинхронном режиме (в синхронном режиме работы USART этот разряд должен содержать 0). Влияние значения U2X на скорость и погрешность передачи показано в табл. 1.22. Все значения UBRR, для которых погрешность получается меньше 2%, в табл. 1.22 выделены полужирным шрифтом. • UPE (USART Parity Error) — этот разряд устанавливается в 1, если активна про- верка четности, и символ, поступивший в буфер приемника, содержит ошибку четности. При записи в регистр UCSRA всегда обнуляйте этот разряд. Таблица 1.22. Значения регистра UBRR для наиболее распространенных скоростей пе- редачи данных через USART и частоты кварцевого осциллятора Частота, МГц Скорость, бод U2X = 0 U2X=1 UBRR Погрешность, % UBRR Погрешность, % 1 2400 25 0,2 51 0,2 4800 12 0,2 25 0,2 9600 6 -7 12 0,2 14400 3 8,5 8 -3,5 19200 2 8,5 6 -7 28800 1 8,5 3 8,5 38400 1 -18,6 2 8,5
Структура микроконтроллеров AVR 61 Таблица 1.22. Продолжение Частота, МГц Скорость, бод U2X = 0 U2X = 1 UBRR Погрешность, % UBRR Погрешность, % 1 57600 0 8,5 1 8,5 76800 — — 1 -18,6 115200 — — 0 8,5 1,8432 2400 47 0 95 0 4800 23 0 47 0 9600 11 0 23 0 14400 7 0 15 0 19200 5 0 11 0 28800 3 0 7 0 38400 2 0 5 0 57600 1 0 3 0 76800 1 -25 2 0 115200 0 0 1 0 230400 — — 0 0 2 2400 51 0,2 103 0,2 4800 25 0,2 51 0,2 9600 12 0,2 25 0,2 14400 8 -3,5 16 2,1 19200 6 -7 12 0,2 28800 3 8,5 8 -3,5 38400 2 8,5 6 -7 57600 1 ' 8,5 3 8,5 76800 1 -18,6 2 8,5 115200 0 8,5 1 8,5 250000 — — 0 0 3,6864 2400 95 0 191 0 4800 47 0 95 0 9600 23 0 47 0 14400 15 0 31 0 19200 11 0 23 0 28800 7 0 15 0 38400 5 0 11 0 57600 3 0 7 0 76800 2 0 5 0 115200 1 0 3 0 230400 0 0 1 0 250000 0 -7,8 1 -7,8 500000 — — 0 -7,8 4 2400 103 0,2 207 0,2 4800 51 0,2 103 0,2 9600 25 0,2 51 0,2 14400 16 2,1 34 -0,8 19200 12 0,2 25 0,2 28800 8 -3,5 16 2,1
62 Глава 1. Восьмиразрядные микроконтроллеры AVR Таблица 1.22. Продолжение Частота, МГц Скорость, бод U2X = 0 U2X = 1 UBRR Погрешность, % UBRR Погрешность, % 4 38400 6 -7 12 0,2 57600 3 8,5 8 -3,5 76800 2 8,5 6 -7 115200 1 8,5 3 8,5 230400 0 8,5 1 8,5 250000 0 0 1 0 500000 — — 0 0 7,3728 2400 191 0 383 0 4800 95 0 191 0 9600 47 0 95 . 0 14400 31 0 . 63 0 19200 23 0 47 0 28800 15 0 31 0 38400 11 0 23 0 57600 7 0 15 0 76800 5 0 11 0 115200 3 0 7 0 230400 1 0 3 0 250000 1 -7,8 3 -7,8 500000 0 -7,8 1 -7,8 1000000 — — 0 -7,8 8 2400 207 0,2 416 -0,1 4800 103 0,2 207 0,2 9600 51 0,2 103 0,2 14400 34 -0,8 68 0,6 19200 25 0,2 51 0,2 28800 16 2,1 34 -0,8 38400 12 0,2 25 0,2 57600 8 -3,5 16 2,1 76800 6 -7 12 0,2 115200 3 8,5 8 -3,5 230400 1 8,5 3 8,5 250000 1 .0 3 0 500000 0 0 1 0 1000000 — — 0 0 11,0592 2400 287 < 0 575 0 4800 143 0 287 0 9600 71 0 143 0 14400 47 0 95 0 19200 35 0 71 0 28800 23 0 47 0 38400 17 0 35 0 57600 11 0 23 0 76800 8 0 17 0
Структура микроконтроллеров AVR 63 Таблица 1.22. Продолжение Частота, МГц Скорость, бод U2X = 0 U2X = 1 UBRR Погрешность, % UBRR Погрешность, % 11,0592 115200 5 0 11 0 230400 2 0 5 0 250000 2 -7,8 5 -7,8 500000 — — 2 -7,8 14,7456 2400 383 0 767 0 4800 191 0 383 0 9600 95 0 191 0 14400 63 0 127 0 19200 47 0 95 0 28800 31 0 63 0 38400 23 0 47 0 57600 15 0 31 0 76800 11 0 23 0 115200 7 0 15 0 230400 3 0 7 0 250000 3 -7,8 6 5,3 500000 1 -7,8 3 -7,8 1000000 0 -7,8 1 -7,8 16 2400 416 -0,1 832 0 4800 207 0,2 416 -0,1 9600 103 0,2 207 0,2 14400 68 0,6 138 -0,1 19200 51 0,2 103 0,2 28800 34 -0,8 68 0,6 38400 25 0,2 51 0,2 57600 16 2,1 34 -0,8 76800 12 0,2 25 0,2 115200 8 -3,5 16 2,1 230400 3 8,5 8 -3,5 250000 3 0 7 0 500000 1 0 3 0 1000000 0 0 1 0 18,432 2400 479 0 959 0 4800 239 0 479 0 9600 119 0 239 0 14400 79 0 159 0 19200 59 0 119 0 28800 39 0 79 0 38400 29 0 59 0 57600 19 0 39 0 76800 14 0 29 0 115200 9 0 19 0 230400 4 0 9 0 250GO0 4 -7,8 8 2,4
64 Глава 1. Восьмиразрядные микроконтроллеры AVR Таблица 1.22. Окончание Частота, МГц Скорость, бод U2X = 0 U2X = 1 UBRR Погрешность, % UBRR Погрешность, % 18,432 500000 — — 4 -7,8 20 2400 520 0 1041 0 4800 259 0,2 520 0 9600 129 0,2 259 0,2 14400 86 -0,2 173 -0,2 19200 64 0,2 129 0,2 28800 42 0,9 86 -0,2 38400 32 -1,4 64 0,2 57600 21 -1,4 42 0,9 76800 15 1,7 32 -1,4 115200 10 -1,4 21 -1,4 230400 4 8,5 10 -1,4 250000 4 0 9 0 500000 — — 4 0 Регистру UCR в случае приемопередатчика USART соответствует регистр управления и состояния В (UCSRB). Его отличие заключается только в том, что разряд CHR9 был заменен разрядом UCSZ2, который совместно с разрядами UCSZ0 и UCSZ1 регистра UCSRC определяет количество бит в кадре данных (см. ниже). Для управления USART используется еще один регистр управления и состоя- ния: UCSRC (рис. 1.32). 7 6 5 4 3 2 1 О UMSEL1 UMSELO UPM1 UPM0 USBS UCSZ1 ucszo UCPOL Рис. 1.32. Регистр управления и состояния С приемопередатчика USART Рассмотрим разряды регистра UCSRC. • UCPOL (Clock Polarity) — задает соотношение между изменением данных на выходе или опросом данных на входе и тактом синхронизации ХСК (только в синхронном режиме передачи; в асинхронном режиме этот разряд должен со- держать 0) (табл. 1.23). Таблица 1.23. Значение разряда UCPOL регистра UCSRC UCPOL Изменение выводимых данных (на выходе TxD) Опрос принимаемых данных (на входе RxD) 0 Нарастающий фронт сигнала ХСК Ниспадающий фронт сигнала ХСК 1 Ниспадающий фронт сигнала ХСК Нарастающий фронт сигнала ХСК • UCSZ1:UCSZO (Character Size) — эти разряды в сочетании с разрядом UCSZ2 из регистра UCSRB задают количество бит данных в передаваемом кадре (табл. 1.24). • USBS (Stop Bit Select) — выбор количество стоп-битов, вставляемых в кадр пе- редатчиком (приемник значение этого разряда игнорирует): 0 — 1 бит; 1 — 2 бита. • UPM1:UPMO (Parity Mode) — активизация и конфигурирование контроля чет- ности (табл. 1.25).
Структура микроконтроллеров AVR 65 • UMSEL1 :UMSEL0 (USART Mode Select) — выбор режима работы USART (табл. 1.26). Таблица 1.24. Определение размера символа данных UCSZ2 UCSZ1 UCSZ0 Размер символа 0 0 0 5 бит 0 0 1 6 бит 0 1 0 7 бит 0 1 1 8 бит 1 0 0 Зарезервировано 1 0 1 Зарезервировано 1 1 0 Зарезервировано 1 1 1 9 бит Таблица 1.25. Управление контролем четности в USART UPM1 UPM0 Контроль четности 0 0 Отключен 0 1 Зарезервировано 1 0 Включен, проверка на четность 1 1 Включен, проверка на нечетность Таблица 1.26. Выбор режима работы USART UMSEL1 UMSEL0 Режим 0 0 Асинхронный USART 0 1 Синхронный USART 1 0 Зарезервировано 1 1 Ведущее устройство в режиме SPI (MSPIM) Следует отметить, что в ряде микроконтроллеров AVR реализовано более одно- го приемопередатчика USART. В таком случае управляющие регистры и их разряды содержат соответствующий номер (например, для USART 1 — UCSR1A, UCSR1B, UCSR1C, UBRR1H, UBRR1L и т.д.). Синхронная передача данных по интерфейсу SPI Интерфейс SPI (Serial Peripheral Interface) служит для обмена данными с пери- ферийными устройствами. В качестве таких устройств могут выступать простые сдвиговые регистры или буквенно-цифровые модули индикации, а также сложные микропроцессорные системы или системы регистрации данных. Многие компании- изготовители предлагают большой выбор устройств с интерфейсом SPI. В случае обмена данными по интерфейсу SPI микроконтроллер работает в режиме ведущего устройства (Master), взаимодействуя с одним или несколькими ведомыми блоками (Slave). Схема передачи данных по интерфейсу SPI микрокон- троллеров AVR показана на рис. 1.33 (MSB — старший разряд, a LSB — младший разряд передаваемого байта). Ведущее устройство берет на себя активную часть обмена данными, вызывая передачу и управляя процессом. Ведомое устройство не может само быть активным. Оно принимает и передает данные только тогда, когда происходит его активизация со стороны ведущего устройства по линии /SS. Ведущее устройство также генери- рует такт для передачи по выходной линии SCK. Для ведомого блока вывод SCK
66 Глава 1. Восьмиразрядные микроконтроллеры AVR является входом, через который он получает от Master-устройства тактирующие сигналы. Сдвиговой регистр MASTER Рис. 1.33. Схема передачи данных по интерфейсу SPI микроконтроллеров AVR/PIC Если ведомое устройство активизируется ведущим по линии /SS, то начинается обмен данными: Master записывает подлежащий передаче байт в свой сдвиговой ре- гистр данных (для микроконтроллеров AVR семейств AT90S, ATtiny и ATmega — ре- гистр SPDR). С помощью каждого выработанного тактового импульса Master пере- мещает один бит данных на выход MOSI, a Slave одновременно в обратном направле- нии передает один бит на вход MISO ведущего блока. Таким образом, в течение цик- ла SPI, состоящего из восьми тактовых импульсов, Master и Slave обмениваются бай- том данных. По окончании передачи данных в регистре состояния интерфейса SPI устанав- ливается флаг соответствующего запроса на прерывание. Этот флаг указывает на окончание передачи и вызывает запрос на прерывание после того как в регистре управления SPI будет установлен разряд разрешения на прерывание от интерфейса SPI. В режиме “Master” текущая передача данных может быть преждевременно за- вершена выдачей в линию /SS сигнала лог. 1. К интерфейсу SPI ведущего устройства можно подключать несколько ведомых устройств (пример для микроконтроллеров AVR — на рис. 1.34), однако активным будет только то из них, на вход /SS которого будет подан уровень лог. 0. Выходы MISO незадействованных ведомых блоков находятся в высокоомном состоянии и не влияют на процесс передачи данных. В примере на рис. 1.34 устройство G2, с точки зрения ведущего устройства, яв- ляется только блоком передачи (например, ЦАП с интерфейсом SP1), а устройство G3 — только блоком приема. В качестве линий SPI используются выводы порта В, например: • /SS — разряд 4 или 0 порта В; • MOSI — разряд 5 или 2 порта В; • MISO — разряд 6 или 3 порта В; • SCK — разряд 7 или 1 порта В. Распределение линий зависит от модели микроконтроллера AVR. Регистр управления SPCR интерфейса SPI в микроконтроллерах AVR показан на рис. 1.35. По окончании передачи данных через интерфейс SPI аппаратная часть устанав- ливает в регистре состояния SPCR разряд SPIF (флаг прерываний от интерфейса SPI). Этот флаг указывает на завершение передачи, и приводит к запросу на преры-
Структура микроконтроллеров AVR 67 вание как только в регистре управления SPCR будет установлен разряд SPIE, а в ре- гистре состояния SREG — флаг общего разрешения прерываний I. Рис. 1.34. Подключение нескольких ведомых устройств к одному ведущему по SPI 7 6 5 4 3 2 1 О SPIE SPE DORD MSTR CPOL СРНА SPR1 SPR0 Рис. 1.35. Регистр управления SPCR микроконтроллеров AVR Разряд SPE активизирует интерфейс SPI (лог. 1) или отключает его (лог. 0). По- сле поступления сигнала сброса этот разряд принимает значение лог. 0, и тем самым система SPI отключается. Если разряд DORD содержит лог. 0, то сначала будет передан старший разряд байта данных. При DORD = 1 первым передается младший разряд. Когда разряд MSTR содержит лог. 0, то система SPI определяется как ведомая (Slave), а при MSTR = 1 она будет определена как ведущая (Master). Когда линия /SS в режиме Master сконфигурирована как вход, то разряд MSTR при низком уров- не сигнала на выводе /SS сбрасывается в лог. 0, и тем самым интерфейс SPI опреде- ляется как Slave. В этом случае в регистре состояния устанавливается флаг SPIF. Когда разряд CPOL содержит лог. 0, то на выходе SCK в неактивном состоянии находится сигнал низкого уровня. Если CPOL = 1, то на SCK в неактивном состоя- нии находится сигнал высокого уровня. С помощью этого разряда, а также разряда СРНА (выбор фазы синхронизации) устанавливается один из четырех режимов пе- редачи данных по интерфейсу SPI (табл. 1.27). . Разряды SPR1 и SPR0 при работе интерфейса SPI в режиме Master служат для выбора тактовой частоты для линии SCK. Если система SPI сконфигурирована как Slave, то эти разряды не имеют никакого значения. Взаимосвязь между разрядами SPR1, SPR0 и частотой импульсов в линии SCK показана в табл. 1.28. В регистре состояния SPSR интерфейса SPI используются только разряды 6, 7 и 0 (в новых микроконтроллерах AVR). • Разряд 0 — SPI2X — когда он содержит 1, то в режиме Master удваивается ско- рость передачи. В режиме Slave частота тактирования приема не превышает 1/4 частоты системной синхронизации (см. табл. 1.28).
68 Глава 1. Восьмиразрядные микроконтроллеры AVR Таблица 1.27. Режимы передачи данных по интерфейсу SPI в микроконтроллерах AVR 0 0 Master переводит линию /SS в состояние лог. 0. Для соответствующего ве- домого блока передача начинается по ниспадающему фронту этого сигнала. Его выход MISO переходит из высокоомного в активное состояние, и старший разряд байта, находящегося в его регистре данных SPDR, появляется на вы- ходе MISO. Собственно передачу данных Master начинает записью подле- жащего передаче байта данных в свой регистр SPDR. Вслед за этим на вы- ходе MOSI ведущего блока появляется старший разряд. На протяжении пер- вой половины первого тактового импульса тактовая линия еще остается в сосуоянии покоя для того, чтобы обеспечить стабильную установку на со- ответствующем входе бита данных. По нарастающему фронту первого и ка- ждого последующего тактового импульса принимаются биты, расположен- ные на входах Master и Slave, а по ниспадающему фронту следующий бит сдвигается дальше. После восьмого тактового импульса передача данных завершена, флаги SPIF в регистрах состояния ведущего и ведомого блоков установлены, а содержимое сдвиговых регистров будут перенесено в соот- ветствующие приемные буферы. Выход MOSI ведущего блока возвращается в состояние покоя (лог. 1), а на выходе MISO ведомого блока, как правило, находится старший разряд байта, только что принятого ведущим блоком. Одновременно со сбросом линии /SS в исходное состояние (лог. 1) Master завершает передачу, Slave становится неактивным, а его выход*MISO пере- ходит в высокоомное состояние 0 1 Аналогично описанному выше случаю с той разницей, что состояние покоя тактовой линии здесь устанавливается при лог. 1, биты данных принимаются по первому и каждому последующему тактовому импульсу, а сдвиг осущест- вляется по нарастающему фронту сигнала 1 0 Для того чтобы при этом режиме начать передачу данных, Master, как и в первом случае, переводит линию /SS в состояние лог. 0. Блок Slave разбло- кирован, и его выход MISO переходит из высокоомного в активное состояние. Логический уровень на MISO для этого случая не определен, но, как правило, на MISO находится младший разряд байта, переданного во время предыду- щей передачи от Slave к Master. Собственно передачу данных Master в этом режиме начинает посредством записи байта данных, подлежащего передаче, в регистр SPDR. Для ведомого блока передача начинается по нарастающему фронту тактового сигнала. Старшие разряды подлежащих передаче байтов в ведущем и ведомом блоках с помощью нарастающего фронта первого так- тового импульса устанавливаются на выходе MOSI ведущего блока (выходе MISO ведомого блока). По ниспадающему фронту первого и каждого после- дующего тактового импульса они переносятся на входы Master и Slave, а по нарастающему фронту следующий разряд сдвигается. После восьмого так- тового импульса передача данных завершается, устанавливаются флаги SPIF в регистрах состояния интерфейсов Master и Slave, а содержимое их сдвиговых регистров переносится в соответствующие буферы приема. Вы- ход MOSI ведущего блока возвращается в состояние покоя (лог. 1), на выхо- де MISO ведомого блока остается младший разряд байта, только что пере- данного ведущему блоку. Одновременно с возвратом в исходное состояние линии /SS (лог. 1) Master завершает передачу в целом, Slave становится не- активным, а его выход MISO переходит в высокоомное состояние. 1 1 Аналогично описанному выше случаю с той разницей, что состоянием покоя тактовой линии здесь является лог. 1, а биты данных сдвигаются по ниспа- дающему фронту первого и каждого последующего такторого импульса, а принимаются по нарастающему фронту • Разряд 6 — флаг WCOL — устанавливается в том случае, когда во время пере- дачи данных через интерфейс SPI предпринимается попытка записи в регистр
Структура микроконтроллеров AVR 69 данных SPI, что приводит к разрушению только что переданного байта данных. По этой причине текущая передача данных доводится до завершения, а новый байт не записывается в сдвиговый регистр интерфейса SPI. Флаг WCOL должен быть сброшен пользователем вручную посредством считывания регистра состо- яния и последующего обращения к регистру данных интерфейса SPL • Разряд 7 — флаг SPIF — указывает на завершение передачи и вызывает запрос на прерывание, как только в регистре управления SPCR будет установлен раз- ряд SPIE, а в регистре состояния SREG — разряд I. Когда линия /SS в режиме Master сконфигурирована как вход, то при низком уровне сигнала на выводе линии /SS также будет установлен флаг SP1F. Флаг SPIF сбрасывается автома- тически аппаратной частью при выполнении подпрограммы обработки преры- вания от интерфейса SPI. Альтернативно, сброс может быть выполнен вручную посредством считывания регистра состояния SPSR и последующего обращения к регистру данных интерфейса SPL Таблица 1.28. Частота импульсов в линии SCK в зависимости от разрядов SPR1, SPR0 SPI2X SPR1 SPR0 Частота импульсов в линии SCK 0 0 0 Частота системной синхронизации / 4 0 0 1 Частота системной синхронизации /16 0 1 0 Частота системной синхронизации / 64 0 1 1 Частота системной синхронизации /128 1 0 0 Частота системной синхронизации / 2 1 0 1 Частота системной синхронизации / 8 1 1 0 Частота системной синхронизации / 32 1 1 1 Частота системной синхронизации / 64 Работа приемопередатчика USART в режиме SPI Приемопередатчик USART новых микроконтроллеров AVR можно перевести в режим Master для обмена данными по интерфейсу SPI (так называемый режим MSP1M). Для этого необходимо установить в 1 разряды UMSEL1 и UMSEL0 в реги- стре UCSRC (см. рис. 1.32). В таком режиме все ресурсы USART (сдвиговые реги- стры приемника и передатчика, а также генератор частоты передачи) берет под свой контроль схема управления ведущего устройства SPL Схема контроля четности, схема восстановления данных и такта, а также схемы управления приемом и передачей через USART отключаются. Тем не менее, в режиме SP1 продолжают работать схема прерывания. В режиме MSPIM действуют следующие соглашения: • в регистре управления UCSRA доступны только разряды 5-7: UDRE, ТСХ и RXC; • в регистре управления UCSRB доступны только разряды 5-7: TXEN, RXEN, UDRIE, TXCIE, RXCIE; • регистр управления UCSRC претерпевает следующие изменения: ► разряд О (UCPOL) выполняет функцию разряда CPOL регистра SPCR; ► разряд 1 (UCPHA) заменяет разряд UCSZ0 и выполняет функцию разряда СРНА регистра SPCR; ► разряд 2 (UDORD) заменяет разряд UCSZ1 и выполняет функцию разряда DORD регистра SPCR; ► разряды 3-5 не используются;
70 ГлаваJ. Восьмиразрядные микроконтроллеры AVR ► разряды 6 (UMSEL0) и 7 (UMSEL1) выполняют прежнюю функцию пере- ключения в другой режим работы USART; • разряды WCOL, SPI2X регистра SPSR недоступны; • SPI-выводу MOSI соответствует USART-вывод TxD; • SPI-выводу MISO соответствует USART-вывод RxD; • SPI-выводу SCK соответствует USART-вывод ХСК; • линия /SS не поддерживается; • поддерживается только внутреннее формирования тактовых импульсов, а зна- чит для правильной работы USART в режиме MSPIM вывод ХСК должен быть определен как выход (лог. 1 в соответствующем разряде регистра DDR должна быть установлена до активизации режима MSPIM). Формирование тактового сигнала в режиме MSPIM организовано идентично синхронному Master-режиму работы USART. Разряды UCPHA и UCPOL определяют четыре комбинации для фазы и поляр- ности сигнала ХСК по отношению к последовательно передаваемым данным (табл. 1.29). Соответствующие временные диаграммы показаны на рис. 1.36. Таблица 1.29. Значение разрядов UCPHA и UCPOL в режиме MSPIM UCPOL UCPHA Передний фронт сигнала ХСК Задний фронт сигнала SCK 0 0 Чтение (нарастающий фронт) Выдача (ниспадающий фронт) 0 1 Выдача (нарастающий фронт) Чтение (ниспадающий фронт) 1 0 Чтение (ниспадающий фронт) Выдача (нарастающий фронт) 1 1 Выдача (ниспадающий фронт) Чтение (нарастающий фронт) Синхронная передача данных по интерфейсу l2C (TWI) Интерфейс I2C (Inter-integrated Circuit), состоящий только из двух линий (SDA и SCL), предназначен для низкоскоростного последовательного обмена данными с периферийными устройствами, подсоединенных к одной общей шине (рис. 1.37). В современных микроконтроллерах AVR этот интерфейс называется иначе: TW1 (Two-Wire Interface — двухпроводной интерфейс).
Структура микроконтроллеров AVR 71 SDA (линия последовательной передачи данных) SCL (линия последовательной передачи тактовых импульсов) Рис. 1.37. Подключение устройств к шине l2C (TWI) Характеристики шины 12С: • работа только с двумя линиями, благодаря чему требуется меньше мест соеди- нения и минимизируются затраты на проводку; • зона действия — до 3 м; • возможность работать в режиме с одним ведущим блоком (Single-Master) или с несколькими ведущими блоками (Multi-Master). Линия SCL используется для передачи синхроимпульсов. Если данные не пере- даются, она содержит высокий уровень сигнала. Линия SDA используется для по- битной передачи данных. Если данные не передаются, то она имеет высокий потен- циал. Передаваемые данные действительны в фазе высокого уровня такта и могут менять свое состояние только в фазе низкого уровня. Каждый блок, подсоединенный к шине, во время передачи данных может быть или приемником или передатчиком, а также ведущим (Master) или ведомым (Slave). Ведущее устройство инициирует передачу данных. В частности, Master занимает шину тем, что генерирует стартовый сигнал на линии SCL и начинает обмен с ведо- мым устройством. До тех пор, пока на шине работает ведущее устройство, не может быть активным никакой другой Master-блок. Тактовый сигнал на линии SCL может быть сформирован только ведущим устройством. Ведомым является устройство, по адресу которого обращается ведущее устрой- ство с требованием передачи данных. Теоретически Master может одновременно снабжать одними и теми же данными несколько ведомых устройств. В роли веду- щего устройства в большинстве случаев выступает микропроцессор, оборудован- ный или специальной аппаратной частью с шиной типа 12С, или контроллером ши- ны, работающим под управлением специального программного обеспечения. Протокол шины 12С Для того чтобы несколько блоков могли обмениваться данными, необходим не- который протокол, который описывает процесс передачи данных по шине и в любой момент времени не допускает ошибочной интерпретации состояния шины. В случае шины с несколькими ведущими устройствами (что относится и к 12С) необходимо также установить, когда и какое ведущее устройство имеет право занимать шину. Эти условия регулируются протоколом шины (рис. 1.38).
72 Глава 1. Восьмиразрядные микроконтроллеры AVR S: Условие начала D: Бит данных (не может быть изменен, когда SCL = выс ур ) Р: Условие завершения А: Подтверждение (от приемника о получении байта) MSB: Старший значащий бит LSB: Младший значащий бит Рис. 1.38. Протокол передачи байта данных через шину 12С Работа шины и, следовательно, ее занятость, определяется условием начала пе- редачи — изменение ведущим устройством состояние линии SDA с высокого уров- ня на низкий. После наступления условия начала передачи шина будет занята веду- щим устройством, создавшим это условие, вследствие чего все другие ведущие уст- ройства будут заблокированы. Условие начала является однозначным состоянием на шине, потому что смена уровня сигнала на линии SDA, как правило, допускается только тогда, когда тактовая линия SCL находится в состоянии низкого уровня. Все устройства, подключенные к шине, должны распознать условие начала пе- редачи и переключаются на прием (ведомое устройство/приемник). Условие начала передачи также учитывается и другим ведущим устройством, которое со своей сто- роны имело намерение занять шину. В результате оно немедленно отзывает свое требование. Устройство, создавшее условие начала передачи, в данный момент вре- мени является для шины ведущим (Master), а все остальные устройства — потенци-. альными ведомыми (Slave). Ведущее устройство теперь отвечает за тактовый сигнал и становится передатчиком. После создания условия начала ведущее устройство начинает передачу данных. Оно переводит тактовую шину в состояние низкого уровня и теперь может занять линию передачи данных затребованным информационным разрядом (высокий или низкий уровень в линии SDA). Затем тактовая шина опять переводится в состояние высокого уровня. ’ИМЕЧАНИЕ WnwtWrwvrfm Изменение в линии SDA может происходить только в фазе низкого уровня сигнала в линии SCL. Во время фазы высокого уровня в линии SCL линия SDA должна быть стабильной. Передача данных, как правило, выполняется побайтно, при этом первым пере- дается старший разряд. После передачи полного байта данных, состоящей из восьми тактовых циклов, следует бит подтверждения от приемника. Бит подтверждения (квитирования) — это реакция приемника на принятый байт данных. Он является для передатчика признаком того, что приемник физически присутствует и “прослушивает” линию. Одновременно с этим бит подтверждения можно рассматривать как сигнал синхронизации. Бит подтверждения, как правило, генерируется приемником. Если ведущее уст- ройство принимает от ведомого устройства несколько байтов данных, то оно квити- рует каждый отдельный байт битом подтверждения, за исключением последнего. Такое отрицательное квитирование сообщает ведомому устройству, что передача данных завершена, и далее последует условие завершения или новое условие начала передачи.
Структура микроконтроллеров AVR 73 Для передачи бита подтверждения ведущее устройство генерирует на линии SCL дополнительный тактовый импульс (рис. 1.39). Приемник выдает сигнал поло- жительного квитирования, переводя линию SDA в состояние низкого уровня, или отрицательного квитирования, переводя линию SDA в состояние высокого уровня. SCL (от ведущего устройства) SDA - выход ведущего устройства SDA - выход ведомого устройства SDA (монтажное “И") Шина занята ----------------------- D: Бит данный (не может быть изменен, когда SCL = выс. ур.) А: Подтверждение (от приемника о получении байта) MSB: Старший значащий бит LSB: Младший значащий бит S: Условие начала Р: Условие завершения Рис. 1.39. Выработка бита квитирования приемником, работающим в режиме ведомого устройства Таким образом, для передачи одного байта данных, как правило, требуется де- вять тактовых циклов. После передачи одного байта данных и приема бита под- тверждения передача данных может быть сразу же продолжена. Если приемник реа- гирует на передачу байта данных отрицательным квитированием, то ведущее уст- ройство должно завершить передачу данных, опять освободив шину. Шина после окончания передачи данных, которая может состоять из любого количества байтов, опять освобождается ведущим устройством. Освобождение ши- ны осуществляется с помощью условия завершения — изменение в линии SDA уровня сигнала с низкого на высокий в то время, когда по тактовой шине SCL пере- дается сигнал высокого уровня. После создания условия завершения передачи шина освобождается. Условие завершения передачи также представляет собой однозначное состояние на шине. Все блоки и устройства распознают его и подготавливаются к появлению нового условия начала передачи. В том случае, если ведущее устройство из-за промежу- точной занятости шины отзывает свое требование занять шину, то оно может пред- принять новую попытку создать условие начала передачи и тем самым получить шину для своих нужд. Н. .... Полная передача данных через шину 12С, в принципе, состоит из условия начала передачи, одного или нескольких байтов данных (за которыми, соответственно, следует бит квитирова- ния), и условия завершения передачи.
74 Глава 1. Восьмиразрядные микроконтроллеры AVR Адресация ведомых устройств Выбор ведомого устройства, с которым хотело бы обмениваться данными ве- дущее устройство, осуществляется посредством первого байта, который всегда оп- ределяется как адрес ведомого устройства — первый байт последовательности дан- ных. Он однозначно сопоставлен определенному устройству, подключенному к ши- не, и имеет длину 7 бит (разряды от 1 до 7). Теоретически, таким образом можно адресовать до 128 ведомых устройств, однако по определению некоторые адреса ве- домых устройств имеют особое значение. Адрес ведомого устройства состоит из двух частей: постоянной и переменной (рис. 1.40). Разряд направления передачи данных I Постоянная часть j Переменная часть ; ! адреса ведомого ! адреса ведомого I < устройства | устройства * I I Бит7 Битб Бит5 Бит4 БитЗ Бит2 Бит1 БитО R/W Рис. 1.40. Формат адреса шины 12С Постоянная часть адреса описывает требования к определенным группам уст- ройств и определяется изготовителем. Его длина определена в результате практиче- ского опыта и в большинстве случаев составляет четыре бита. Он будет тем короче, чем больше однотипных устройств в схеме. Постоянная часть адреса жестко “про- шита” в интегральной схеме и не может быть изменена пользователем. Переменная часть адреса ведомого устройства служит для выбора определенно- го устройства из группы однотипных кристаллов, среди которых все имеют посто- янную часть адреса ведомого устройства. Благодаря этому, к шине могут быть под- соединены несколько однотипных интегральных схем. Переменная часть в боль- шинстве случаев определяется пользователем с помощью внешних схем (через до- полнительные выводы). С помощью разрядов 1-7 адреса ведомого устройства однозначно идентифици- руется требуемый ведомый блок. Разряд 0 задает направление передачи данных. Он определяет, должны ли быть приняты или переданы данные. Если разряд направле- ния передачи данных содержит лог. 1 (чтение), то ведущее устройство находится в режиме приемника, а ведомое — в режиме передатчика. Если разряд направления передачи данных содержит лог. 0 (запись), то ведущее устройство будет работать как передатчик, а ведомое — как приемник. Адрес ведомого устройства также подтверждается этим устройством с помощью бита квитирования. Если ведущее устройство после адресации получает отрицательное квитирование, то оно может заключить, что ведомое устройство или вообще отсутствует, или в настоящий момент с ним невозможно установить связь (например, оно занято обработкой заданий, критическими с точки зрения времени). Арбитраж шины при работе с несколькими ведущими устройствами В связи с тем, что шина 12С занимается асинхронно (т.е. не в точно установлен- ный момент времени), может возникнуть случай, когда два или несколько ведущих устройств в один и тот же момент времени создают условие начала передачи. Каж- дое ведущее устройство на основании сигнала обратной связи через входной каскад создает впечатление, что именно оно является единственным передатчиком в дан- ный момент времени. В связи с тем, что для тактового сигнала выполняется синхро-
Структура микроконтроллеров AVR 75 низация, то это “впечатление” остается до тех пор, пока все передатчики передают в точности одну и ту же битовую комбинацию. Разногласие возникает только тогда, когда ведущее устройство, ожидающее появления на шине сигнала высокого уров- ня, вместо него обнаруживает сигнал низкого уровня. С этого момента данное ве- дущее устройство отзывает свою передачу данных, а другое или все остальные ве- дущие устройства по прежнему работают с шиной, поскольку не замечают возник- шей проблемы. Таким образом ведущие устройства одно за другим освобождают шину до тех пор, пока наконец останется единственное ведущее устройство, кото- рое “выиграло” процесс арбитража. Из-за открытого коллектора арбитраж всегда выигрывает то ведущее устройст- во, которое последовательно передает больше сигналов низкого уровня (т.е. нуле- вые биты). В связи с тем, что первый подлежащий передаче байт данных — это ад- рес ведомого устройства, решение в процессе арбитража принимается еще при ад- ресации, если к ведомому устройству хотят обратиться несколько ведущих уст- ройств. Для этого случая обращецие для записи (бит направления передачи данных = 0) опять имеет приоритет перед обращением для чтения. Таким образом, наивыс- шим приоритетом обладает адрес 0 ведомого устройства при обращении для записи (0000 0000b); обозначаемый понятием “общий вызов”. Также может возникнуть особый случай, когда два ведущих устройства одно- временно адресуют одно и то же ведомое устройство, Передают ему те же самые данные и совместно генерируют условие завершения передачи. При этом ни одно ведущее устройство “не замечает” каких-либо действий другого ведущего устрой- ства. Если ведущее устройство проигрывает арбитраж еще при выдаче .адреса ведо- мого устройства, то оно немедленно переключается в режим работы ведомого при- емника и считывает дальше данные с шины. Благодаря этому, устройство в состоянии отреагировать в том же цикле, когда оставшееся на шине ведущее уст- ройство обращается по его адресу. Задача пользователя — выбрать действия, необходимые после проигрыша ар- битража. Обычно после разблокирования шины повторяется весь процесс передачи данных, начиная с первого условия начала передачи. Синхронизация шины 12С В связи d тем, что в случае 12С речь идет о синхронной шине, к ее синхрониза- ции не предъявляется каких-либо особых требований, кроме одного: не должны быть превышены минимальные значения времени THlgll = 4 мкс для сигнала высоко- го уровня и Tlow = 4,7 мкс для сигнала низкого уровня для тактирующих сигналов в линии SCL. Универсальный последовательный интерфейс USI Некоторые современные микроконтроллеры AVR оснащены новым универ- сальным последовательным интерфейсом USI, объединяющим в себе функции трех- и двухпроводных последовательных интерфейсов (т.е. SPI и I2C/TWI). Упрощенная структурная схема модуля USI показана на рис. 1.41. Восьмиразрядный сдвиговой регистр USIDR доступен напрямую через шину данных и содержит принимаемые и выводимые данные. Для него не предусмотрено буферизации, поэтому во избежание информационных потерь данные должны счи- тываться максимально быстро. Старший разряд регистра USIDR выдается на один из двух выводов (DO или SDA) в зависимости от конфигурации модуля USI. При- нимаемые данные всегда считываются на входе DI независимо от конфигурации.
76 Глава 1. Восьмиразрядные микроконтроллеры AVR Рис. 1.41. Структурная схема модуля USI Четырехразрядный счетчик доступен как на чтение, так и на запись и может формировать прерывание по переполнению. Сдвиговой регистр и счетчик тактиру- ются одним и тем же тактовым сигналом. Это позволяет подсчитывать'количество принятых или переданных бит и формировать запрос на прерывание по окончанию передачи. Тактовый сигнал может поступать со входа USCK, от модуля сравнения тайме- ра/счетчика Т/СО или формировать программно. При этом следует учитывать, что при выборе внешнего источника тактирования счетчик USI будет инкрементиро- ваться как по нарастающему, так и по ниспадающему фронту' тактового сигнала. В таком случае он будет подсчитывать количество фронтов, а не количество пере- данных бит. Схема управления тактированием двухпроводного режима может формировать запрос на прерывание при обнаружении на шине условия начала передачи. Кроме того, она формирует состояние ожидания, удерживая низкий уровень сигнала в ли- нии тактирования после обнаружения условия начала передачи или переполнения счетчика. Режимы работы модуля USI: • трехпроводной ввод/вывод — аналог интерфейса SPI за исключением примене- ния линии SS для выбора ведомого устройства (в случае необходимости эту функцию можно реализовать программно); в этом режиме используются выво- ды DI, DO и USCK; • двухпроводной ввод/вывод — аналог интерфейса 12С или TWI; в этом режиме используются выводы SCL и SDA; • когда модуль USI не задействован для последовательного ввода/вывода, его можно сконфигурировать для выполнения альтернативных фунций:
Структура микроконтроллеров AVR 77 ► полудуплексный асинхронный обмен данными — задействовав сдвиговой режим в режиме трехпроводного ввода/вывода, можно эффективно реализо- вать приемопередатчик UART; ► четырехразрядный счетчик — формирование прерываний по переполнению; ► 12-разрядный таймер/счетчик — получается путем объединения четырехраз- рядного счетчика модуля USI и восьмиразрядного Т/СО. Регистры управления модулем USI В работе модуля USI задействованы следующие регистры: • USIDR (USI Data Register) — регистр данных; • USISR (USI Status Register) — регистр состояния, содержащий флаги прерыва- ний и статуса линии, а также значение четырехразрядного счетчика (рис. 1.42); • USICR (USI Control Register) — регистр управления, содержащий разряды раз- решения прерываний, установки режима работы модуля USI и выбора источни- ка тактирования (рис. 1.43). 7 6 5 4 3 21 О USISIF USIOIF USIPF USIDC USIGNT3 USICNT2 USICNT1 USICNTO Рис. 1.42. Регистр USISR Рассмотрим назначение разрядов регистра USISR. • USICNT0:USICNT3 — текущее состояние четырехразрядного счетчика модуля USI. • USIDC (Data Output Collision) — этот разряд,принимает значение лог. 1, когда старший разряд сдвигового регистра не соответствует физическому состоянию вывода. Этот флаг используется только в режиме двухпроводного ввода/ вывода и полезен при реализации арбитража шины. • USIPF (Stop Condition Flag) — этот флаг устанавливается в 1 в режиме двух- проводного ввода/вывода в случае обнаружения условия завершения передачи. Это может пригодиться при реализации арбитража шины. • USIOIF (Counter Overflow Interrupt Flag) — флаг, который устанавливается при переполнении четырехразрядного счетчика модуля USI (т.е. при переходе зна- чения полубайта USICNT3:0 от 15 к 0). Если прй этом установлены в 1 разряды USIOIE в регистре USICR и I в регистре SREG, то возникнет прерывание (среди прочего, выводит процессор из “спящего” режима). Флаг сбрасывается про- граммным обнулением разряда USIOIF. • USISIF (Start Condition Interrupt Flag) — этот флаг устанавливается в 1 в режи- ме двухпроводного ввода/вывода в случае обнаружения условия начала переда- чи. Если выбран режим отключенного выхода или трехпроводного ввода/ выво- да, то этот флаг устанавливается при инкрементировании четырехразрядного счетчика модуля USL Если при этом установлены в 1 разряды USISIE в регист- ре USICR и I в регистре SREG, то возникнет прерывание (среди прочего, выво- дит процессор из “спящего” режима). Флаг сбрасывается программным обнуле- нием разряда USISIF. 7 6 5 4 3 2 1______0 USISIE USIOIE USIWM1 USIWMO USICS1 USICSO USICLK USITC - Рис. 1.43. Регистр USICR
78 Глава 1. Восьмиразрядные микроконтроллеры AVR Рассмотрим назначение разрядов регистра USICR. • USITC (Toggle Clock Port Pin) — запись лог. 1 в этот разряд переключает зна- чение на выводе USCK/SCL на противоположное. Этот процесс не зависит от состояния соответствующего регистра DDR, однако, если с вывода необходимо считать значение, то он должен быть определен как выход. Возможность пере- ключения состояния линии позволяет легко организовать формирование такто- вого сигнала при реализации ведущих устройств. Если модуль USI тактируется от внешнего источника (USICS1 = 1), и USICLK = 1, то запись лог. 1 в разряд USITC будет напрямую выдавать тактовый импульс на четырехразрядный счет- чик. Это позволяет своевременно обнаруживать завершение передачи данных в режиме ведущего устройства. • tfSICLK (Clock Strobe) — запись лог. 1 в этот разряд приводит к сдвигу содер- жимого сдвигового регистра и инкрементированию содержимого четырехраз- рядного счетчика USI. Если модуль USI тактируется от внешнего источника (USICS1 = 1), то запись лог. 1 в разряд USICLK приведет к назначению строба USITC в качестве источника тактового сигнала для счетчика USI. • USICS1:USICSO (Clock Source Select) — выбор источника тактирования для сдвигового регистра и четырехразрядного счетчика модуля USI (табл. 1.30). Ес- ли оба разряда содержат 0, появляется возможность организовать программное тактирование сдвигового регистра и счетчика путем записи лог. 1 в разряд USICLK. При выборе внешнего источника тактового сигнала (USICS1=1) раз- ряд USICLK перестает использоваться в качестве строба, а определяет внешнее или программное тактирование через разряд USITC. • USIWM1 :USIWM0 (Wire Mode) — выбор режима работу модуля USI (табл. 1.31). Таблица 1.30. Выбор источника тактирования для модуля USI USICS1 USICS0 USICLK Источник тактового сигнала для сдвигового регистра Источник тактового сигна- ла для 4-хразряд. счетчика 0 0 0 Нет тактирования 0 0 1 Программный строб (USICLK) 0 1 X Сигнал от модуля сравнения таймера/счетчика Т/СО 1 0 0 Внешний, положительный фронт Внешний, оба фронта 1 1 0 Внешний, отрицательный фронт Внешний, оба фронта 1 0 1 Внешний, положительный фронт Программный строб (USITC) 1 1 1 Внешний, отрицательный фронт Программный строб (USITC) Таблица 1.31. Выбор режима работы модуля USI USIWM1 USIWM0 Описание 0 0 Выходы и схемы задержки тактирования и обнаружения условия на- чала передачи отключены. Выводы порта работаю, как обычно 0 1 Режим трехпроводного ввода/вывода. Используются выводы DO, DI и USCK. Функция DO Перекрывает обычную функцию порта, однако соответствующий регистр DDR по-прежнему контролирует направ- ление передачи данных. Функции DI и USCK не влияют на нормаль- ную работу портов. В режиме ведущего устройства тактовые им- пульсы формируются программно путем переключения разряда в регистре PORTx, когда вывод сконфигурирован как выход. Для этого цели можно использовать разряд USITC регистра USICR.
Структура микроконтроллеров AVR 79 Таблица 1.31. Окончание USIWM1 USIWM0 Описание 1 0 Режим двухпроводного ввода/вывода. Используются выводы SDA (DI) и SCL (USCK). В линии SCL удерживается сигнал низкого уровня, если обнаружено условие начала передачи при активном выходе. Линия освобождается путем обнуления флага USISIF в регистре USISR. 1 1 Режим двухпроводного ввода/вывода. Используются выводы SDA (DI) и SCL (USCK). Этот режим аналогичен представленному выше за тем исключением, что в линии SCL сигнал низкого уровня удержи- вается также при переполнении счетчика до момента обнуления флага USIOIF в регистре USISR. • USIOIE (Counter Overflow Interrupt Enable) — разрешение прерывания по пере- полнению четырехразрядного счетчика модуля USI; • USISIE (Start Condition Interrupt Enable) — разрешение прерывания при обна- ружении условия начала передачи. Модули последовательного ввода/вывода в семействах AT90S, ATtiny и ATmega Наличие того или иного модуля последовательного ввода/вывода в микрокон- троллерах AVR семейств AT90S, ATtiny и ATmega демонстрирует табл. 1.32. Таблица 1.32. Модули последовательного ввода/вывода в семействах AT90S, ATtiny и ATmega Микроконтроллер UART USART SPI TWI USI AT90S1200 — — — — — AT90S2313 s Есть — — — — AT90S2323 — — — — — AT90S2343 — — — — — AT90S4414 Есть — Есть — — AT90S4433 Есть — Есть — — AT90S8515 Есть — Есть — — AT90S8535 Есть — Есть — — ATtiny! 1 — — — — — ATtiny 12 — — — — — ATtiny 13А — — — — — ATtiny 15L — — — — — ATtiny2313 — . 1 — — Есть ATtiny24 — — — — Есть ATtiny25 — — — — Есть ATtiny26 — — — — Есть ATtiny261 — — — — Есть ATtiny28L — — — — — ATtiny44A — — — — Есть ATtiny45 — — — — Есть ATtiny461 — — — — Есть ATtiny48 — — Есть Есть —
80 Глава 1. Восьмиразрядные микроконтроллеры AVR Таблица 1.32. Окончание Микроконтроллер UART USART SPI TWI USI ATtiny84 — — — — Есть ATtiny85 — — — — Есть ATtiny861 — — — — Есть ATtiny88 — — Есть Есть — ATmega 128 — 2 Есть Есть — ATmega1280 — 4 Есть Есть — ATmega1281 — 2 Есть Есть — ATmega1284P — 2 Есть Есть — ATmega16 — 1 Есть Есть — ATmega16A — 1 Есть Есть — ATmega162 — 2 Есть — — ATmega164P — 2 Есть Есть — ATmega165P — 1 Есть — Есть ATmega168 — 1 Есть Есть — ATmega168P — 1 Есть Есть — ATmega169 — 1 Есть — Есть ATmega2560 — 4 Есть Есть — ATmega2561 — 2. Есть Есть — ATmega32A — 1 Есть Есть — ATmega324PA — 2 Есть Есть — ATmega325 — 1 Есть — Есть ATmega325P — 1 Есть — Есть ATmega3250 — 1 Есть — Есть ATmega3250P — 1 Есть — Есть 4 ATmega328P — 1 Есть Есть — ATmega48PA — 1 Есть Есть — ATmega64 — 2 Есть Есть — ATmega640 — 4 Есть Есть — ATmega644 — 1 Есть Есть — ATmega644P — 2 Есть Есть — ATmega645 — 1 Есть — Есть ATmega6450 — 1 Есть — Есть ATmega8 — 1 Есть Есть — ATmega8515 — 1 Есть — — ATmega8535 — 1 Есть Есть — ATmega88PA — 1 Есть Есть — Аналого-цифровое преобразование Число в цифровой форме определяется на основании отношения входного на- пряжения к полному номиналу напряжения аналого-цифрового преобразователя (АЦП). Например, если на вход АЦП с номинальным напряжением 5 В подать на- пряжение 1 В, то на цифровом выходе появится число, соответствующее 1/5 = 0,2 разрешающей способности преобразователя. Так, если используется АЦП с разре- шением 8 бит, то максимальное возможное значение на его выходе 28- 1 = 255. Та-
Структура микроконтроллеров AVR 81 ким образом, напряжению 1 В на аналоговом входе соответствует 0,2 • 255 = 51 на цифровом выходе. Встроенные АЦП микроконтроллеров AVR семейств AT90S, ATtiny и ATmega имеют разрешение 10 бит и позволяют считывать напряжение на одном из четырех, шести, восьми, 11 или 16 аналоговых входов (зачастую совмещены с выводами пор- та А). Для управления режимом АЦП используются два регистра: регистр управления ADCSR (в новых моделях микроконтроллеров AVR используется два регистра: ADCSRA и ADCSRB) и регистр мультиплексирования ADMUX (определяет, какие из входов микроконтроллера являются аналоговыми). Поскольку в различных моделях микроконтроллеров AVR набор разрядов в регистре ADCSR(A) может отличаться, рассмотрим его обобщенно: • ADPS0-ADPS2 — выбор коэффициента деления тактовой частоты (табл. 1.33); чем выше частота работы АЦП (производная от частоты системной синхрони- зации), тем ниже эффективное разрешение, поэтому следует устанавливать ко- эффициент деления; • ADIE — разряд маскирования прерывания от АЦП (1 — по окончанию преоб- разования разрешено прерывание); • ADIF — флаг прерывания от АЦП (устанавливается аппаратно по окончанию цикла преобразования); Таблица 1.33. Выбор коэффициента деления частоты системной синхронизации для тактирования АЦП микроконтроллеров AVR 0 ' 0 0 ---- 2 / — — 0 0 1 2 0 1 0 4 0 1 1 8 1 0 0 16 1 0 1 32 1 1 0 64 1 1 1 128 • ADFR (в старых микроконтроллерах) — лог. 1 в этом разряде переводит АЦП в несинхронизированный режим работы — обычно АЦП работает в режиме прерывания, чтобы процессор каждый раз не ожидал завершения медленно про- текающего преобразования, однако в несинхронизированном режиме АЦП вы- полняет преобразование постоянно, как можно быстрее (на период такого пре- образования должны быть запрещены все прерывания); • ADATE (в новых микроконтроллерах) — лог. 1 в этом разряде активизирует режим начала преобразования по нарастающему фронту сигнала, определенно- го с помощью разрядов ADTS регистра управления ADCSRB); • ADSC — установка этого разряда в лог. 1 начинает преобразование; • ADEN — установка этого разряда в лог. 1 разрешает использование АЦП, а установка в лог. 0 — отключает АЦП; Регистр управления ADCSRB (присутствует не во всех микроконтроллерах AVR) содержит разряды ADTS0:ADTS2, определяющие источник сигнала, по кото- рому начинается преобразование, если в регистре ADCSRA установлен в 1 разряд ADATE (табл. 1.34). Кроме того, этот регистр может содержать дополнительные
82 Глава 1. Восьмиразрядные микроконтроллеры AVR разряды MUXn, позволяющие расширить количество аналоговых входов (основная часть таких разрядов содержится в регистре ADMUX). Таблица 1.34. Выбор сигнала, инициирующего преобразование ADTS2 ADTS1 ADTS0 Источник инициирующего сигнала 0 0 0 Автономный режйм 0 0 1 Аналоговый компаратор 0 1 0 Внешний запрос на прерывание 0 0 1 1 Модуль сравнения А таймера/счетчика Т/СО 1 0 . 0 Переполнение таймера/счетчика Т/СО 1 0 1 Модуль сравнения В таймера/счетчика Т/С1 1 1 0 Переполнение таймера/счетчика Т/С1 1 1 1 Событие захвата по входу таймера/счетчика Т/С1 Как уже упоминалось выше, регистр ADMUX содержит разряды MUXn, за- дающие аналоговый вход для АЦП. Количество таких разрядов в разных моделях микроконтроллеров AVR может отличаться. В общем случае с помощью трех раз- рядов MUX можно выбрать один из восьми аналоговых входных каналов. Дополни- тельные разряды MUX (от одного до трех, причем в новых микроконтроллерах они могут быть и во втором регистре управления ADCSRB) служат для выбора допол- нительных режимов считывания входных сигналов. Рассмотрим две таблицы. Табл. 1.35 иллюстрирует выбор аналогового канала для микроконтроллеров AT90S8535 (три разряда MUX в регистре ADMUX), ATmega8 и ATtiny88 (по четы- ре разряда MUX), а табл. 1.36 — для ATmega640 (пять разрядов MUX в регистре ADCSRA и один — в регистре ADCSRB). Таблица 1.35. Выбор аналоговых каналов в различных микроконтроллерах AVR АД058535]АТтеда8^ ATtiny88 михз MUX2 MUX1 михо Аналоговый вход 0 0 0 0 ADC0 0 0 0 1 ADC1 0 0 1 0 ADC2 0 0 1 1 ADC3 0 1 0 0 ADC4 0 1 0 1 ADC5 0 1 1 0 ADC6 0 1 1 1 ADC7 1 0 0 0 ADC8 (датчик температуры) 1 1 1 0 VBG (1,3 или 1,1 В) 1 1 1 1 0 В (GND) Таблица 1.36. Выбор аналоговых каналов в микроконтроллере АТтеда640 -------------------------------------------------------L________ MUX5 MUX4 михз MUX2 MUX1 михо Аналоговый вход Дифференциальный вход Усиле- ние Положи- тельный Отрица- тельный 0 0 0 0 0 0 ADC0 — 0 0 0 0 0 1 ADC1 0 0 0 0 1 0 ADC2 0 0 0 0 1 1 ADC3 0 0 0 1 0 0 ADC4
Структура микроконтроллеров AVR 83 Таблица 1.36. Продолжение MUX5 MUX4 михз MUX2 MUX1 михо Аналоговый вход Дифференциальный вход Усиле- ние Положи- тельный Отрица- тельный 0 0 0 1 0 1 ADC5 — 0 0 0 1 1 0 ADC6 0 0 0 1 1 1 ADC7 0 0 1 0 0 0 — ADC0 ADCO 10х 0 0 1 0 0 1 ADC1 ADCO 10х 0 0 1 0 1 0 ADC0 ADCO 200х 0 0 1 0 1 1 ADC1 ADCO 200х 0 0 1 1 0 0 ADC2 ADC2 10х 0 0 1 1 0 1 ADC3 ADC2 10х 0 0 1 1 1 0 ADC2 ADC2 200х 0 0 1 1 1 1 ADC3 ADC2 200х 0 1 0 0 0 0 ADC0 ADC1 1х 0 1 0 0 0 1 ADC1 ADC1 1х 0 1 0 0 1 0 ADC2 ADC1 1х 0 1 0 0 1 1 ADC3 ADC1 1х 0 1 0 1 0 0 ADC4 ADC1 1х _9__ 1 0 1 0 1 ADC5 ADC1 1х 0 1 0 1 1 0 ADC6 ADC1 1х j) 1 0 1 1 1 ADC7 ADC1 1х _0_ 1 1 0 0 0 ADC0 ADC2 1х 1 1 0 0 1 ADC1 ADC2 1х 0 1 1 0 1 0 ADC2 ADC2 1х _9___ 1 1 0 1 1 ADC3 ADC2 1х 0 1 1 1 0 0 ADC4 ADC2 1х 0 1 1 1 0 1 ADC5 ADC2 1х 0 1 1 1 1 0 1,1 B(Vbg) — 0 _ 1 1 1 1 1 0 В (GND) 1 0 0 0 0 0 ADC8 _1 0 0 0 0 1 ADC9 _1 0 0 0 1 0 ADC10 _1 0 0 0 1 1 ADC11 _1 0 0 1 0 0 ADC12 J 0 0 1 0 1 ADC13 J 0 0 1 1 0 ADC14 J 0 0 1 1 1 ADC15 _1 0 1 0 0 0 — ADC8 ADC8 10х _1 0 1 0 0 1 ADC9 ADC8 10х 1 0 1 0 1 0 ADC8 ADC8 200х J 0 1 0 1 1 ADC9 ADC8 200х 1 0 1 1 0 0 ADC10 ADC10 10х 1 0 1 1 0 1 ADC11 ADC 10 10х 1 0 1 1 1 0 ADC10 ADC10 200х
84 Глава 1. Восьмиразрядные микроконтроллеры AVR Таблица 1.36. Окончание MUX5 MUX4 михз MUX2 MUX1 михо Аналоговый вход Дифференциальный вход Усиле- ние Положи- тельный Отрица- тельный 1 0 1 1 1 1 ADC11 ADC10 200х 1 1 0 0 0 0 ADC8 ADC9 1х 1 1 0 0 0 1 ADC9 ADC9 1х 1 1 0 0 1 0 ADC10 ADC9 1х 1 1 о • 0 1 1 ADC11 ADC9 1х 1 1 0 1 0 0 ADC12 ADC9 1х 1 1 0 1 0 1 ADC13 ADC9 1х 1 1 0 1 1 0 ADC14 ADC9 1х 1 1 0 1 1 1 ADC15 ADC9 1х 1 . 1 1 0 0 0 ADC8 ADC10 1х 1 1 1 0 0 1 ADC9 ADC10 tx 1 1 1 0 1 0 ADC10 ADC10 1х 1 1 1 0 1 1 ADC11 ADC10 1х 1 1 1 1 0 0 ADC12 ADC10 1х 1 1 1 1 0 1 ADC13 ADC10 1х Как видим, возможности зависят от конкретной модели микроконтроллера. Кроме разрядов MUXn, регистр ADMUX содержит один или два разряда REFS, отвечающих за выбор опорного напряжения для АЦП. Например, их значение для микроконтроллеров ATmega8 и ATmega640 сведено в табл. 1.37. Таблица 1.37. Выбор опорного напряжения для АЦП REFS1 REFS0 Опорное напряжение 0 0 С вывода AREF, внутренне Vref отключено 0 1 С вывода AVcc с внешним конденсатором на выводе AREF 1 0 Внутренне 1,1 В с внешним конденсатором на AREF (ATmega640) 1 1 Внутренне 2,56 В с внешним конденсатором на выводе AREF В то же время в таком микроконтроллере, как ATtiny88, присутствует только один разряд REFS0: • 0 — внутреннее опорное напряжение 1,1В; • 1 — опорное напряжение берется с вывода AVcc- Еще один важный разряд в регистре ADMUX — это ADLAR. Он определяет размещение результата преобразования в регистровой паре ADCH:ADCL: • 0 — результат сохраняется в ADCL и двух младших разрядах ADCH; • 1 — результат сохраняется в ADCH и двух старших разрядах ADCL. Другими словами, разряд ADLAR задает “выравнивание” по правому или по левому краю 16-разрядной регистровой пары ADCH:ADCL. Итак, подведом краткий итог... в общем случае процесс аналого-цифрового преобразования в микроконтроллерах AVR семейств AT90S, ATtiny и ATmega про- текает следующим образом.
Структура микроконтроллеров AVR 85 1. Установить в лог. 1 разряды регистра ADMUX, соответствующие выбору анало- гового или дифференциального входа. 2. Установить разряды ADPS2:ADPS0 регистра ADCSR для выбора коэффициента деления частоты системной синхронизации. 3. Установить в лог. 1 разряд ADIE для разрешения режима прерывания. 4. Установить в лог. 1 разряд ADEN, чтобы разрешить использование АЦП. 5. Установить в лог. 1 разряд ADSC, чтобы начать преобразование. 6. Результат преобразования сохраняется в регистровой паре ADCL, ADCH с вы- равниванием, заданным разрядом ADLAR. Возможности аналого-цифрового преобразования для различных микрокон- троллеров AVR сведены в табл. 1.38. Таблица 1.38. Возможности АЦП для различных микроконтроллеров AVR Микроконтроллер Аналоговых каналов Каскад аналогового усиления AT90S 1200/2313/ 2323 / 2343 / 4414/8515 — — AT90S4433 6 — AT90S8535 8 — ATtiny 11 /12/2313/28L — — ATtiny13A 4 — ATtiny 15L 4 — ATtiny24 8 Есть ATtiny25 4 Есть ATtiny26 11 Есть ATtiny 261 11 Есть ATtiny 44 A 8 Есть ATtiny45 4 Есть I ATtiny461 11 Есть i ATtiny48 8 — Г ATtiny84 8 Есть I ATtiny85 4 Есть ' ATtiny861 11 Есть ATtiny88 8 — ATmega162/8515 — — ATmega128 J Есть ATmega1280 16 Есть ATmega1281 8 Есть . ATmega1284P 8 Есть ATmega16 8 Есть , ATmega16A 8 Есть ATmega164P 8 Есть ATmega165P 8 — ATmega 168 6 или 8 — ATmega168P 8 — ATmega 169 8 — ATmega2560 16 Есть ATmega2561 8 Есть
86 Глава 1. Восьмиразрядные микроконтроллеры AV Таблица 1.38. Возможности АЦП для различных микроконтроллеров AVR М и кроконтрол л ер Аналоговых каналов Каскад аналогового усиления АТтеда32А 8 Есть АТтеда324РА 8 Есть АТтеда325 8 — АТтеда325Р 8 — АТтеда3250 8 — АТтеда3250Р 8 / АТтеда328Р 8 — АТтеда*48РА. 8 — АТтеда64 8 Есть АТтеда640 16 Есть АТтеда644 8 Есть АТтеда644Р 8 Есть АТтеда645 8 Есть АТтеда6450 8 — АТтедав 6 или 8 — АТтеда8535 8 Есть АТтеда88РА 8 — Встроенный аналоговый компаратор Почти во всех микроконтроллерах AVR семейств AT90S, ATtiny и ATmega ис пользуется встроенный аналоговый компаратор напряжения, сравнивающий вход ное напряжение на двух входах. Как только напряжение на неинвентирующем вход станет больше, чем на инвентирующем, на выходе компаратора устанавливаете; лог. 1. Часто аналоговый компаратор используют для сравнения некоторого входы о го напряжения с опорным (рис. 1.44). Рис. 1.44. Принцип работы аналогового компаратора напряжений Для активизации компаратора требуется предварительно перевести соответст вующие выводы микроконтроллера в режим входов. Время срабатывания компара торов — небольшое, поэтому с их помощью можно быстро формировать ответны реакции на изменение соотношений входных напряжений.
Программирование памяти 87 Входы компаратора, совмещенные с какими-либо двумя портами ввода/вывода, называются AINO и AIN1, для управления его работой используется регистр ACSR (рис. 1.45). 7_______6_______5 4_______3_______2_______1_______О ACD ACBG АСО ACI ACIE ACIC ACIS1 ACIS0 Рис. 1.45. Регистр ACSR микроконтроллеров AVR Назначение разрядов регистра ACSR: • ACD — если установлен в лог. I, то питание аналогового компаратора отклю- чено; • ACBG (в старых микроконтроллерах отсутствует) — если установлен в лог. I, то на вход AINO аналогового компаратора подается фиксированное опорное на- пряжение, являющееся пороговым при обнаружении провалов напряжения; • АСО — напрямую связан с выходом аналогового компаратора; • ACI — флаг прерываний от аналогового компаратора — устанавливается в лог. 1, когда наступает событие, определенное разрядами ACIS1 и AC1S0; • ACIE — разряд разрешения прерывания от аналогового компаратора; • ACIC — разряд разрешения захвата на входе аналогового компаратора; для того чтобы можно было вызвать прерывание по захвату, оно должно быть разрешено разрядом TICIE1 в регистре T1MSK; • ACIS1, ACIS0 — устанавливают вид события на выходе аналогового компара- тора, которое должно вызвать прерывание его работы (табл. 1.39). Таблица 1.39. Вид событий для вызова прерывания от аналогового компаратора ACIS1 ACIS0 Вид прерывания аналогового компаратора 0 0 Прерывание при изменении состояния выхода (разряда АСО) 0 1 Не используется 1 0 Прерывание по ниспадающему фронту на выходе аналогового компаратора (напряжение на AIN1 больше, чем на AIN0) 1 1 Прерывание по нарастающему фронту на выходе аналогового компаратора (напряжение на AIN0 больше, чем на AIN1) Современные микроконтроллеры AVR предоставляют и другие возможности при работе с аналоговым компаратором, но их изучение выходит за тематические рамки данной книги. При желании читатель может ознакомиться с ними самостоя- тельно, обратившись к соответствующим техническим описаниям. Программирование памяти Микроконтроллеры AVR предоставляют в распоряжение пользователя байт с разрядами блокировки (рис. 1.46). При этом следует учитывать, что в некоторых моделях используются только первые два разряда этого байта: LB1 и LB2. 7 6 5 4 3 2 1 0 — — BLB12 BLB11 BLB02 BLB01 [ LB2 LB1 Рис. 1.46. Байт разрядов блокировки В незапрограммированном состоянии (состояние по умолчанию) они содержат лог. I. Программирование разрядов блокировки подразумевает запись в них лог. 0.
88 Глава 1. Восьмиразрядные микроконтроллеры AVR Полученные в результате такого программирования возможности блокировки ото- бражены в табл. 1.40-1.42. Разряды BLBxx и рассмотренные ниже разряды предохранения всегда необходимо програм- мировать раньше разрядов LBx. Таблица 1.40. Программирование разрядов блокировки LBx LB2 LB1 Тип блокировки 1 1 Блокировка памяти не используется 1 0 Отключено дальнейшее программирование памяти Flash и EEPROM в по- следовательном и параллельном режиме. Разряды предохранения в обоих режимах заблокированы 0 0 Отключено дальнейшее программирование и проверка памяти Flash и EE- PROM в последовательном и параллельном режиме. Разряды блокировки BLBxx и разряды предохранения в обоих режимах заблокированы Таблица 1.41. Программирование разрядов блокировки BLBOx BLB02 BLB01 Тип блокировки 1 1 Ограничения на доступ команд spm и (е)1рш к разделу приложения па- мяти программ 1 0 Команда spm не может выполнять запись в раздел приложения памяти программ 0 0 Команда spm не может выполнять запись в раздел приложения памяти программ, а команда (e)lpm, выполняемая из раздела загрузчика, не может выполнять чтение раздела приложения. Если в раздел загрузчи- ка помещены векторы прерываний, то при выполнении команд из раз- дела приложения прерывания будут недоступны 0 1 Команда (e)lpm, выполняемая из раздела загрузчика, не может выпол- нять чтение раздела приложения. Если в раздел загрузчика помещены векторы прерываний, то при выполнении команд из раздела приложе- ния прерывания будут недоступны Таблица 1.42. Программирование разрядов блокировки BLB1x BLB12 BLB11 Тип блокировки 1 1 Ограничения на доступ команд spm и (е)1рш к разделу загрузчика па- мяти программ 1 0 Команда spm не может выполнять запись в раздел загрузчика памяти программ 0 0 Команда spm не может выполнять запись в раздел загрузчика памяти программ, а команда (е)1рт, выполняемая из раздела приложения, не может выполнять чтение раздела загрузчика. Если в раздел приложе- ния помещены векторы прерываний, то при выполнении команд из раз- дела загрузчика прерывания будут недоступны 0 1 Команда (е)1рш, выполняемая из раздела приложения, не может вы- полнять чтение раздела загрузчика. Если в раздел приложения поме- щены векторы прерываний, то при выполнении команд из раздела за- грузчика прерывания будут недоступны О программировании и чтении разрядов блокировки речь пойдет позже.
Программирование памяти 89 Разряды предохранения Микроконтроллеры AVR предоставляют два или три байта с разрядами предо- хранения, структура которых зависит от конкретной модели. Мы рассмотрим при- мер для микроконтроллера ATmega8, содержащего два таких байта (табл. 1.43 и табл. 1.44). Запрограммированному состоянию разряда предохранения соответст- вует лог. О, а незапрограммированному — лог. 1. Таблица 1.43. Младший байт с разрядами предохранения микроконтроллера АТтеда8 Разряд № Описание Значение по умолчанию BODLEVEL 7 Уровень срабатывания для схемы обнаружения прова- лов напряжения 1 BODEN 6 Разрешение обнаружения провалов напряжения 1 SUT1 5 Выбор времени запуска: 00 — шесть циклов; 01 — шесть циклов плюс 4,1 мс; 10 — шесть циклов + 65 мс 1 SUT0 0 CKSEL3 3 Выбор источника тактирования микроконтроллера: 0000 — внешний источник; 0001-0100 — калиброванный внутренней RC-осцил- лятор: 0001 — 1 МГц; 0010 — 2 МГц; 0011—4 МГц; 0100 —8 МГц; 0101-1000 — внешний RC-осциллятор: 0101 — 0,1..0,9 МГц; 0110 — 0,9..3 МГц; 0111 — 3..8 МГц; 1000 — 8.. 12 МГц; 1001 — внешний низкочастотный кварцевый резонатор; 1010-1111 — внешний кварцевый/керамический резо- натор; 0 CKSEL2 2 0 CKSEL1 1 0 CKSEL0 0 1 Таблица 1.44. Старший байт с разрядами предохранения микроконтроллера АТтеда8 Разряд № Описание Значение по умолчанию RSTDISBL 7 Функция вывода РС6: ввод-вывод или сигнал сброса 1 WDTON 6 Постоянная активность сторожевого таймера 1 SPIEN 5 Разрешение последовательного программирования и загрузки данных 0 СКОРТ 4 Настройка осциллятора 1 EESAVE 3 Защита памяти EEPROM при подаче сигнала очистки кристалла 1 BOOTSZ1 2 Выбор размера загрузчика: 11 — 128 слов; 10 — 256 слов; 01 — 512 слов; 00 — 1024 слова 0 BOOTSZO 1 0 BOOTRST 0 Выбор вектора сброса 1 При переходе микроконтроллера в режим программирования значения предо- хранителей фиксируются, и до выхода из этого режима коррекция данных разрядов (за исключением EESAVE) не будет иметь эффекта. Параллельное программирование Типичная схема сигналов при параллельном программировании восьмиразряд- ных микроконтроллеров AVR показана на рис. 1.47.
90 Глава 1. Восьмиразрядные микроконтроллеры AVR Рис. 1.47. Типичная схема сигналов при параллельном программировании восьмиразрядных микроконтроллеров AVR Смысл представленных здесь сигналов: • RDY/BSY — 0 — устройство находится в процессе программирования; I — устройство готово для получения новой команды; • /ОЕ — разрешение вывода; • /WR — сигнал записи; • BS1 — выбор байта 1:0 — младший байт; 1 — старший байт; • ХА1, ХАО — операция по импульсу XTAL: ► 00 — загрузка адреса памяти Flash или EEPROM (старший или младший байт, в зависимости от состояния сигнала BS1); ► 01 — загрузка данных (старший или младший байт, в зависимости от состоя- ния сигнала BS1); ► 10 — загрузка команды; ► 11 — отсутствие операции; • PAGEL — загрузка страницы памяти; • BS2 — выбор байта 2: 0 — младший байт; 1 — старший байт; • DATA — двунаправленная шина данных (вывод при низком уровне сигнала /ОЕ). Рассмотрим возможные команды (в двоичном представлении): • 10000000 — очистка кристалла; • 01000000 — запись в разряды предохранения; • 00100000 — запись в разряды блокировки; • 00010000 — запись в память Flash; • 00010001 — запись в память EEPROM; • 00001000 — чтение байтов сигнатуры и калибровки осциллятора;
Программирование памяти 91 • 00000100 — чтение разрядов блокировки и предохранения; • 00000010 — чтение памяти Flash; • 00000011 — чтение памяти EEPROM. В качестве примера различные аспекты параллельного программирования па- мяти рассмотрим применительно к микроконтроллеру ATmega8. Переход в режим параллельного программирования Для перехода в режим параллельного программирования необходимо выпол- нить следующую последовательность действий. 1. Подать между выводами VCC и GND напряжение 4,5..5,5 В и выждать по мень- шей мере 100 мкс. 2. Установить на выводе /RESET низкий уровень сигнала и по меньшей мере шесть раз переключить состояние входа XTAL1. 3. Установить на выводах PAGEL, ХА1, ХАО и BS1 низкий уровень сигнала и вы- ждать по меньшей мере 100 нс. 4. Подать на вход /RESET напряжение 11,5..12,5 В. Учтите, что после этого любая активность на выводах PAGEL, ХА1, ХАО и BS1 в течение 100 нс приведет к сбою перехода в режим программирования. В том случае, если вывод /RESET был отключен с помощью предохранителя RSTDISBL или в качестве источника тактирования выбран внешний резонатор или RC-осциллятор (т.е. занят вывод XTAL1), представленная выше процедура станет невозможной. В таком случае необходимо выполнить следующую последователь- ность действий. I. Установить на выводах PAGEL, ХА1, ХАО и BS1 низкий уровень сигнала. 2. Подать между выводами VCC и GND напряжение 4,5..5,5 В и одновременно — 11,5.. 12,5 В на вход /RESET. 3. Выждать 100 нс. 4. Перепрограммировать предохранители: CKSEL[3:0] = 0000; RSTDISBL = О'. Ес- ли запрограммированы разряды блокировки, то перед коррекцией предохрани- телей может потребоваться выполнить команду очистки кристалла. 5. Выйти из режима программирования, выключив питание микроконтроллера, или подав низкий уровень сигнала на вход /RESET. 6. Перейти в режим программирования по описанной выше процедуре. Очистка кристалла Команда очистки кристалла стирает содержимое памяти Flash и EEPROM (если только не запрограммирован предохранитель EESAVE), а также — разряды блоки- ровки. Байты с разрядами предохранения остаются неизменными. Очистку кристал- ла необходимо выполнять перед каждым повторным программированием памяти Flash или EEPROM. Для выполнения этой команды служит следующая процедура. 1. ХА[1:0] = 10 (загрузка команды). 2. BS1=O. 3. Подать в шину данных байт 10000000 (команда очистки кристалла).
92 Глава 1. Восьмиразрядные микроконтроллеры AVR 4. Подать импульс на вход XTAL1 для загрузки команды. 5. Подать сигнал низкого уровня на вход /WR, чтобы начать выполнение команды. 6. Дождаться, пока на выходе RDY/BSY появится сигнал высокого уровня, сигна- лизирующий об окончании выполнения команды. Программирование и чтение памяти программ Память программ микроконтроллеров AVR имеет страничную организацию. Размер страницы отличается в зависимости от устройства. Так, например, у микро- контроллера ATmega8 он составляет 32 слова, а у ATmega640 — 128 слов. При про- граммировании Flash-памяти программа фиксируется в буфере страницы, а затем все ячейки буфера одновременно записываются на кристалл. Рассмотрим процедуру программирования Flash-памяти. 1. Загрузить команду “Запись в памяти Flash” (ХА[1:0] = 10; BS1 = 0; DATA = = 00010000; XTAL1 = 1). 2. Загрузить младший байт адреса (ХА[1:0] = 00; BS1 = 0; BS2 = 0; DATA = млад- ший байт адреса; XTAL1 = 1). 3. Загрузить младший байт данных (ХА[ 1:0] = 01; DATA = младший байт данных; XTAL1 = 1). 4. Загрузить старший байт данных (BS1 = 1; ХА[1:0] = 01; DATA = старший байт данных; XTAL1 = 1). 5. Зафиксировать данные (BS1 = 1; PAGEL = 1). 6. Повторить пункты 2-5, пока не будет заполнен весь буфер или не будут загру- жены все данные внутри страницы. 7. Загрузить старший байт адреса (ХА[1:0] = 00; BS 1 = 1; BS2 = 0; DATA = стар- ший байт адреса; XTAL1 = 1). 8. Если допускается моделью микроконтроллера, загрузить дополнительный байт адреса (ХА[1:0] = 00; BS 1 =0; BS2 = 1; DATA = дополнительный байт адреса; XTAL1 = 1). 9. Запрограммировать страницу (BS 1 = 0; BS2 = 0; /WR = 0). 10. Дождаться; пока на выходе RDY/BSY не появится сигнал высокого уровня. 11. Повторить пункты 2-10, пока не будет записана вся программа или не будет за- полнена вся память Flash. 12. Завершить процесс программирования (ХА[1:0] = 10; DATA = 00000000; XTAL1 = 1). Для чтения слова из памяти программ необходимо выполнить следующую по- следовательность действий. 1. Загрузить команду “00000010”. 2. Загрузить старший байт адреса. 3. Загрузить младший байт адреса. 4. Установить на входах /ОЕ и BS 1 низкий уровень сигнала. 5. Загрузить младший байт данных. 6. Установить на входе BS 1 высокий уровень сигнала. 7. Загрузить старший байт данных. 8. Установить на входе /ОЕ высокий уровень сигнала.
Программирование памяти 93 Программирование разрядов блокировки и предохранения Рассмотрим процедуру программирования разрядов блокировки. 1. Загрузить команду “00100000”. 2. Загрузить байт с программируемыми (т.е. содержащими лог. 0) разрядами. 3. Подать сигнал низкого уровня на вход /WR. 4. Дождаться появления на выходе RDY/BSY сигнала высокого уровня. Очистить разряды блокировки можно только по команде очистки кристалла. Теперь рассмотрим процедуру программирования предохранителей. I. Загрузить команду “00100000”. 2. Загрузить байт данных с разрядами предохранения (0 — программирование предохранителя; 1— стирание предохранителя). 3. Установить значения разрядов BS2 и BS1: 00 — первый байт предохранителей; 01 — второй байт; 10 — третий байт. 4. Подать сигнал низкого уровня на вход /WR. 5. Дождаться появления на выходе RDY/BSY сигнала высокого уровня. 6. Установить значения BS2 = 0 и BS1 =0. Процедуры чтения байтов с разрядами блокировки и предохранения идентичны. 1. Загрузить команду “00000100”. 2. Подать сигнал низкого уровня на вход /ОЕ. 3. Подать требуемую комбинацию сигналов на входы BS2 и BS 1: 00 — первый байт предохранителей; 11 — второй байт предохранителей; 10 — третий байт предохранителей (если существует); 01 — байт с разрядами блокировки. 4. Считать байт с шины данных. 5. Подать на вход /ОЕ сигнал высокого уровня. Последовательное программирование Как память Flash, так и EEPROM можно программировать в последовательном режиме. В таком случае используются только три линии: SCK (тактовый сигнал), MOSI или PDI (линия ввода бита данных) и MISO или PDO (линия вывода бита данных) (рис. 1.48). Если микроконтроллер тактируется от внутреннего осциллятора, то к выводу X7AL1 подклю- чать источник тактовых импульсов не нужно. Запись данных в устройство осуществляется по нарастающему, а чтение — по ниспадающему фронту сигнала на входе SCK. Команды, используемые при последовательном программировании микрокон- троллеров AVR, перечислены в табл. 1.45. В табл. 1.45 приняты следующие условные обозначения: а — старший разряд адреса; b — младший разряд адреса; Н — 0 — младший байт; 1 — старший байт; о — вывод данных; i — ввод данных; х — не имеет значения.
94 Глава 1. Восьмиразрядные микроконтроллеры AVR Таблица 1.45. Команды последовательного программирования Команда Формат команды Байт 1 Байт 2 БайтЗ Байт 4 Операция Разрешение про- граммирования 1010 1100 0101 0011 хххх хххх xxxxxxxx Разрешение программи- рования Очистка кристал- ла 1010 1100 100х хххх хххх хххх xxxxxxxx Очистка памяти Flash и EEPROM Чтение из памя- ти программ 0010 нооо 0000 аааа bbbb bbbb OOOO 0000 Чтение байта данных из памяти программ по ад- ресу а:Ь Загрузка на стра- ницу памяти про- грамм 0100 нооо 0000 хххх xxxb bbbb iiii iiii Запись байта данных на страницу памяти про- грамм по адресу Ь. Пер- вым загружается млад- ший байт Запись страницы памяти программ 0100 1100 0000 аааа bbbb хххх xxxxxxxx Запись страницы памяти программ по адресу а:Ь Чтение из памя- ти EEPROM 1010 0000 ООххххха bbbb bbbb OOOO OOOO Чтение данных из ячейки памяти EEPROM по ад- ресу а:Ь Запись в память EEPROM 1100 0000 ООхх ххха bbbb bbbb iiii iiii Запись данных в ячейку памяти EEPROM по ад- ресу а:Ь Чтение разрядов блокировки 0101 1000 0000 0000 xxxxxxxx OOOO OOOO Чтение байта с разряда- ми блокировки Запись разрядов блокировки 1010 1100 111X хххх xxxxxxxx iiii iiii Запись байта с разряда- ми блокировки Чтение байта сигнатуры 0011 0000 ООхх хххх xxxx xxbb OOOO OOOO Чтение байта сигнатуры по адресу Ь. Запись предо- хранителей 1010 1100 1010 0000 xxxxxxxx iiii iiii Запись первого байта предохранителей Запись старших предохраните- лей 1010 1100 1010 1000 xxxxxxxx iiii iiii Запись второго байта предохранителей Запись дополни- тельных предо- хранителей 1010 1100 1010 0100 xxxxxxxx iiii iiii Запись третьего байта предохранителей (если он доступен) Чтение предо- хранителей 0101 0000 0000 0000 xxxxxxxx OOOO OOOO Чтение первого байта предохранителей Чтение старших предохраните- лей 0101 1000 0000 1000 xxxx xxxx OOOO OOOO Чтение второго байта п редохранител ей Чтение дополни- тельных предо- хранителей 0101 0000 0000 1000 xxxxxxxx OOOO OOOO Чтение третьего байта предохранителей (если он доступен)
Программирование памяти 95 Рис. 1.48. Схема для последовательного программирования (микроконтроллер ATmega8) Рассмотрим процедуру последовательного программирования. 1. Установить низкий уровень сигнала на входах /RESET и SCK. В некоторых сис- темах программатор не может гарантировать, что при подаче питания на входе SCK будет удержан низкий уровень. В таком случае после установки SCK = О необходимо подать на вход /RESET сигнал высокого уровня на протяжении по меньшей мере двух тактовых циклов процессора. 2. Подать напряжение между выводами VCC и GND. 3. Выждать по меньшей мере 20 мс и разрешить последовательное программиро- вание, передав побитно на вход MOST (PDI) соответствующую команду (см. табл. 1.45). Передаваться должны все четыре байта команды. 4. Если линии передачи верно синхронизированы, то в момент передачи третьего байта команды на выходе MISO (PDO) должен быть выдан второй байт (т.е. $53). Если этого не произошло, то возникло нарушение синхронизации, и необходимо подать на вход /RESET сигнал низкого уровня и повторно пере- дать команду разрешения программирования. 5. Память Flash программируется постранично, поэтому вначале побайтно загру- жается страница (для каждого слова первым идет младший байт). 6. Загруженная страница сохраняется, а до записи следующей страницы необхо- димо выждать не менее 4,5 мс. 7. Память EEPROM программируется побайтно. При этом перед записью новых данных ячейка EEPROM автоматически очищается. До записи следующего бай- та необходимо выждать не менее 9 мс. 8. Содержимое любой ячейки памяти можно проверить с помощью соответст- вующей команды чтения, которая побитно.выдаст на выход MISO (PDO) инте- ресующий байт данных. 9. В завершение процесса программирования необходимо установить высокий уровень сигнала на входе /RESET. После этого можно отключить питание.
96 Глава 1. Восьмиразрядные микроконтроллеры AVR Технология picoPower В завершение главы затронем такую инновацию Atmel как технология pico- Power, задействованную в ряде новых микроконтроллеров. Для того чтобы “идти в ногу” с требованиями, предъявляемыми к энергопотреблению современных мик- ропроцессорных систем, компания Atmel разработала технологию picoPower, кото- рая позволяет снизить потребляемое напряжение как в рабочем, так и в “спящем” режиме. Ее основные особенности: • работа устройства на напряжении 1,8 В; • потребление тока — 650 нА в рабочем режиме и 100 нА в “спящем” режиме; • малый уровень утечек; • обнаружение провалов напряжения в “спящем” режиме; • кварцевый генератор на 32 кГц с очень малым потреблением энергии; • использование регистра Power Reduction Register (PRR), содержащего управ- ляющие разряды для отключения тактирования неиспользуемых периферийных модулей; • опрос содержимого Flash-памяти в течение нескольких наносекунд с после- дующим ее отключением, что значительно снижает утечку тока. Технология picoPower реализована в микроконтроллерах ATtinylЗА, АТ- tiny44A, ATtiny48, ATtiny88, а также во всех представителях семейства ATmega, у которых в маркировке используется буква “Р” (например, ATmega328P и АТ- mega324PA).
Глава 2 Семейство AVR ATxmega Семейство микроконтроллеров ATxmega расширяет линейку устройств AVR как для совершенствования существующих встроенных систем, так и с прицелом на новые области применения. При этом поддерживаются не только восьми-, но и высокопроизводительные 16-разрядные процессоры, хотя сохраняется совмести- мость с микроконтроллерами ATtiny и ATmega. Основные преимущества семейства ATxmega: • реализация технологии picoPower, позволяющей значительно уменьшить энер- гопотребление; • рабочее напряжение 1,6 В при тактовой частоте 2 МГц; • система обработки событий; • контроллер прямого доступа к памяти; • высокопроизводительные 12-разрядные АЦП и ЦАП; • система шифрования данных; • точная, гибкая система синхронизации с возможностью динамического пере- ключения источника тактового сигнала. На момент издания книги семейство ATxmega представлено подсемействами А и D, однако моделей класса А значительно больше, поэтому мы рассмотрим некото- рые особенности архитектуры, характерные именно для них. Обзор возможностей микроконтроллеров ATxmega А Микроконтроллеры ATxmega А предоставляют в распоряжение программиста 115 команд и 32 рабочих регистра общего назначения. При этом, в отличие от клас- сической RISC-архитектуры, в одной команде можно обратиться сразу к двум рабо- чим регистрам, что значительно повышает производительность системы. Кроме наличия стандартных средств и интерфейсов (Flash, EEPROM, USART, TW1 и т.д.), семейство ATxmega А реализует некоторые возможности, отсутствую- щие в “классических” восьмиразрядных микроконтроллерах AVK: • четырехканальный контроллер прямого доступа к памяти (DMA); • восьмиканальная система обработки событий; • программируемый многоуровневый контроллер прерываний; • интерфейсы TWI, совместимые с протоколами шин 12С и SMBUS; • системы шифрования AES и DES; • восьмиканальные 12-разрядные ЦАП и АЦП с возможностью использования дифференциального входа с программируемым коэффициентом усиления; • до четырех аналоговых компараторов с режимом определения попадания изме- ряемого напряжения в заданный диапазон (режим “Window”);
98 Глава 2. Семейство AVR ATxmega для внутрисхемного программирования и отладки доступны интерфейсы PDI и JTAG. Структурная схема микроконтроллеров ATxmega А показана на рис. 2.1. Р0(0 7] M0SC1 isbH ” т71 PR(O.1) XTAL1 рвр.ту JTAG УСС 1 GND •POLD ►РМ|0,7| РК(О.7| PJJ0..7) РН(0.7] RESEP РО1„С1К PCJO..7] PD(0,7j pqO.TJ PF1O.7J Рис. 2.1. Структурная схема микроконтроллеров ATxmega А
Организация памяти семейства ATxmega 99 Организация памяти семейства ATxmega Кроме того, что касается наличия 32-х рабочих регистров, организация памяти в микроконтроллерах AVR нового семейства ATxmega отличается от “классиче- ской”. Прежде всего следует отметить, что рабочие регистры адресуются независи- мо от области данных, которая теперь включает в себя и область ввода/вывода (рис. 2.2). Память EEPROM по умолчанию адресуется- независимо, как в традицион- ной организации памяти микроконтроллеров AVR, однако может адресоваться и в пространстве памяти данных. В этом случае ей соответствует диапазон адресов $001000..$001FFF. $FFFFFF Внешнее ОЗУ (от Одо 16 Мбайт) RamEnd+1 RamEnd Внутреннее ОЗУ $002000 $001FFF Память EEPROM (до 4 Кбайт) $001000 $OOOFFF Область ввода/вывода (до 4 Кбайт) $000000 R31 $00001F Регистровый файл R0 $020000 Рис. 2.2. Организация памяти SRAM микроконтроллеров семейства ATxmega Микроконтроллеры семейства ATxmega оснащены внутренней памятью SRAM объемом 2, 4, 8, 16 или 32 Кбайт, а также памятью EEPROM объемом 1, 2 или 4 Кбайт (табл. 2.1). До четырех портов микроконтроллеров ATxmega предназначены для подклю- чения модулей внешней памяти типа SRAM (до 16 Мбайт) или SDRAM (до 128 Мбайт), а также — периферийных устройств с отображением в памяти данных (на- пример, ЖК-дисплеев).
100 Глава 2. Семейство AVR ATxmega Таблица 2.1. Объемы памяти данных в микроконтроллерах семейства ATxmega Микроконтроллер Внутренняя память SRAM, Кбайт Адрес “RamEnd” Память EEPROM, Кбайт АТхтеда128А1 8 $003FFF 2 ATxmega192A1 16 $005FFF 4 ATxmega256A1 16 $005FFF 4 ATxmega384A1 32 $009FFF 4 ATxmega64A1 4 $002FFF 2 ATxmega128A3 8' $003FFF 2 ATxmega192A3 • 16 $005FFF 4 ATxmega256A3B 16 $005FFF 1 4 ATxmega256A3 16 $005FFF 4 ATxmega64A3 4 $002FFF 2 ATxmega128A4 8 $003FFF 2 ATxmega16A4 2 $0017FF 1 ATxmega32A4 4 $002FFF 1 ATxmega64A4 4 $002FFF 2 ATxmega128D3 8 $003FFF 2 ATxmega192D3 16 $005FFF 2 ATxmega256D3 16 $005FFF 4 ATxmega64D3 4 $002FFF 2 ATxmega16D4 2 $0017FF 1 ATxmega32D4 4 $002FFF i Область ввода/вывода семейства ATxmega Как и в традиционном варианте, область ввода/вывода семейства ATxmega со- держит все регистры состояния и конфигурирования периферийных устройств и модулей микроконтроллера, включая процессор. Тем не менее, здесь присутствует ряд отличий: • младшие 16 адресов области ввода/вывода — это специальные регистры дан- ных, используемые для хранения информации, наподобие глобальных перемен- ных и флагов; • ассемблерные команды поразрядной обработки и различных проверок приме- нимы только к диапазону адресов $00..$lF, т.е. к 16 регистрам данных и 16 ре- гистрам, отвечающих за работу с виртуальными портами; • изменено размещение регистров в области ввода/вывода (пример для подсемей- ства ATxmega А представлен в приложении Д в конце книги). Арбитраж шины данных Поскольку память данных в микроконтроллерах ATxmega разбита на четыре модуля, к различным ее областям могут одновременно обращаться различные уст- ройства, которые являются ведущими по отношению к шине данных (рис. 2.3). На- пример, центральный процессор может обращаться к внешней памяти, в то время как контроллер прямого доступа (DMA) передает данные из внутренней памяти SRAM в область ввода/вывода (подробнее о контроллере DMA речь пойдет в сле- дующем разделе).
Организация памяти семейства ATxmega 101 Рис. 2.3. Доступ к шине данных в микроконтроллерах ATxmega Когда несколько ведущих устройств обращаются к одной и той же шине, ис- пользуется следующая приоритетность (вверху списка находятся устройства с более высоким приоритетом): • устройство, которое обращается к шине в данный момент; • устройство, которое работает с пакетом данных; • устройство, запрашивающее доступ к данным (процессор имеет приоритет); • устройство, запрашивающее доступ к шине (процессор имеет приоритет). Память программ Память программ в микроконтроллерах ATxmega традиционно выполнена по технологии Flash, и каждая ячейка в ней представляет собой 16-разрядное слово (все команды AYR — 16- или 32-разрядные). Основное отличие памяти программ ATx- mega от “классической” заключается в том, что она разбита на два раздела: прило- жения и загрузчика (рис. 2.4). FlashEnd Раздел загрузчика Раздел таблицы приложения Раздел приложения $000000 Рис. 2.4. Организация памяти программ микроконтроллеров семейства ATxmega Ассемблерная команда spin, которая служит для записи в Flash-память в ходе выполнения приложения, эффективна только в том случае, если она находится в разделе загрузчика. Эта команда может обращаться ко всей памяти программ,
102 Глава 2. Семейство AVR ATxmega включая сам раздел загрузчика. Если загрузчик не используется, то в данном разде- ле можно разместить код приложения. Раздел приложения содержит раздел таблицы, который можно использовать для хранения данных. Его размер совпадает с размером загрузчика. Суть таблицы за- ключается в том, что для нее может применять уровень защиты, отличный от уров- ня защиты приложения. Это позволяет безопасно сохранять в памяти программ дол- говременные данные (например, какие-нибудь важные параметры измерений). Если раздел таблицы не используется для хранения данных, в нем может размещаться программный код. Размер разделов фиксирован и зависит от типа микроконтролле- ра. Им соответствуют различные наборы разрядов блокировки, что обеспечивает не- зависимые настройки защиты. Объем памяти программ в различных микроконтроллерах ATxmega представ- лены в табл. 2.2. Таблица 2.2. Объемы памяти программ в микроконтроллерах семейства ATxmega Микроконтроллер Размер раздела приложения, Кбайт Размер раздела загрузчика, Кбайт Адрес “FlashEnd” АТхтеда128А1 128 8 $010FFF ATxmega192A1 192 8 $018FFF ATxmega256A1 256 8 $020FFF ATxmega384A1 384 8 S030FFF ATxmega64A1 64 4 $0087FF ATxmega 128A3 128 8 $010FFF ATxmega192A3 192 8 S018FFF ATxmega256A3B 256 8 $020FFF ATxmega256A3 256 8 S020FFF ATxmega64A3 64 4 $0087FF ATxmega128A4 128 4 $0107FF ATxmega16A4 16 4 $0027FF ATxmega32A4 32 4 $0047FF ATxmega64A4 64 4 $0087FF ATxmega128D3 128 8 $010FFF ATxmega192D3 192 8 $018FFF ATxmega256D3 256 8 $020FFF ATxmega64D3 64 4 S0087FF ATxmega16D4 16 4 S0027FF ATxmega32D4 32 4 • $0047FF Как видим, номер в маркировке микроконтроллеров ATxmega соответствует объему их памяти программ. Контроллер прямого доступа к памяти Контроллер прямого доступа к памяти (DMA — Direct Memory Access) семей- ства ATxmega организовывает передачу данных между различными модулями па- мяти, а также памятью и периферией с минимальным вмешательством центрального процессора. В нем реализована гибкая система выбора приоритетности каналов, не- сколько режимов адресации, возможность двойной буферизации и передачи данных большими блоками.
Контроллер прямого доступа к памяти 103 Контроллер DMA микроконтроллеров ATxmega А использует четыре канала, каждому из которых соответствует собственный источник данных, пункт назначе- ния и размер блоков, а также — настройки передачи и прерываний. Запросы на пре- рывание могут формироваться в момент завершения передачи данных или при об- наружении контроллером ошибки в одном из каналов. Когда некоторый канал DMA запрашивает передачу данных, арбитр ожидает освобождения шины центральным процессором, после чего разрешает начать процесс передачи, который протекает порциями по одному, два, четыре или восемь байт. Адресация может быть статиче- ской, с инкрементом или декрементом адреса. Передачу по каналу DMA может инициировать программа, периферийное устройство или система обработки собы- тий. Завершенная операция чтения или записи по каналу DMA называется транзак- цией. Количество байт, передаваемых в течение одной транзакции, устанавливается программно и определяется размерами блока и настройками счетчика повторений. Каждый блок передается меньшими порциями по одному, два, четыре или восемь байт. Для активизации контроллера прямого доступа к памяти служит регистр DMACTRL (в семействе ATxmega А ему соответствует адрес $0100 области вво- да/вывода) (рис. 2.5). 7 6 5 4 3 2 1 0 ENABLE RESET —Г — DBUFMODE1 DBUFMODEO PRIMODE1 PRIMODEO Рис. 2.5. Регистр DMACTRL Для активизации контроллера DMA необходимо установить в лог. 1 разряд ENABLE. Если контроллер активен, то обнуление этого разряда не будет выполнено до тех пор, пока не освободится внутренний буфер передачи, и не завершится тран- закция. Рассмотрим назначение остальных разрядов регистра DMACTRL. • RESET — установка этого разряда в лог. 1 разрешает программный сброс, что может быть осуществлено только при отключенном контроллере DMA (т.е. при ENABLE=0). После сброса разряд RESET автоматически обнуляется. • DBUFMODE[1:0] — определяют настройку двойной буферизации для различ- ных каналов (табл. 2.3). Под двойной буферизацией подразумевается связыва- ние двух каналов, в результате которого второй канал подхватывает передачу, когда первый ее заканчивает, и наоборот. Таблица 2.3. Значение разрядов DBUFMODE регистра DMACTRL DBUFMODE1 DBUFMODEO Значение * 0 . 0 Двойная буферизация не используется 0 1 Двойная буферизация для каналов 0 и 1 1 0 Двойная буферизация для каналов 2 и 3 1 1 Двойная буферизация для пар каналов 0/1 и 2/3 • PRIMODE[1:0] — эти разряды определяют внутреннюю приоритетность кана- лов (табл. 2.4). Схема приоритетности используется в тех случаях, когда в один и тот же момент времени запрос на передачу данных выдают сразу несколько каналов.
104 Глава 2. Семейство AVR ATxmega Таблица 2.4. Значение разрядов PRIMODE регистра DMACTRL PRIMODE1 PRIMODE0 Значение 0 0 Низший приоритет — у канала, передавшего данные последним 0 1 Канал 0 — наиболее приоритетный; среди остальных трех ка- налов низший приоритет — у канала, передавшего данные по- следним 1 1 0 Наивысший приоритет — у канала 0; далее — у канала 1; среди остальных двух каналов низший приоритет — у канала, пере- давшего данные последним 1 !• Наивысший приоритет — у канала 0, далее — у канала 1, за- тем — у канала 2. Самый низкий приоритет — у канала 3 Устройство, инициирующее передачу, определяется для каждого канала DMA отдельно с помощью соответствующего регистра TRIGSRC (в микроконтроллерах ATxmega А им соответствуют следующие адреса в области ввода/вывода: $0113 для канала 0; $0123 для канала 1; $0133 для канала 2 и $0143 для канала 3). Этот регистр содержит восьмиразрядный код инициатора, значение которого зависит от типа микроконтроллера и присутствующих в нем периферийных устройств и модулей. Данный код представляет собой сумму некоторого базового числа, соответствую- щего категории устройств, и смещения, задающего конкретное устройство или мо- дуль из выбранной категории. Значения регистра TRIGSRC для всех модулей мик- роконтроллеров ATxmega А перечислены в табл. 2.5. Таблица 2.5. Значения регистра TRIGSRC канала DMA Категория Смещение TRIGSRC Инициатор передачи Система обра- ботки событий $00 $01 (00000001) Канал событий 0 $01 $02 (00000010) Канал событий 1 $02 $03(00000011) Канал событий 2 АЦП на порту А $00 $10 (00010000) Канал 0 $01 $11 (00010001) Канал 1 $02 $12(00010010) Канал 2 $03 $13(00010011) Канал 3 $04 $14 (00010100) Объединение каналов 0..3 логиче- ской операцией “ИЛИ” ЦАП на порту А $00 $15(00010101) Канал 0 $01 $16(00010110) Канал 1 АЦП на порту В $00 $20 (00010000) Канал 0 $01 $21 (00010001) Канал 1 $02 $22 (00010010) Канал 2 $03 $23(00010011) Канал 3 $04 $24 (00010100) Объединение каналов 0..3 логиче- ской операцией “ИЛИ” ЦАП на порту В $00 $25 (00010101) Канал 0 $01 $26 (00010110) Канал 1 Таймер/счетчик, со $00 $40(01000000) Переполнение $01 $41 (01000001) Ошибка $02 $42 (01000010) Сравнение или захват, канал А $03 $43(01000011) Сравнение или захват, канал В $04 $44 (01000100) Сравнение или захват, канал С
Контроллер прямого доступа к памяти 105 Таблица 2.5. Продолжение Категория Смещение TRIGSRC Инициатор передачи Таймер/счетчик, СО $05 $45 (01000101) Сравнение или захват, канал D Таймер/счетчик, С1 $00 $46(01000110) Переполнение $01 $47 (01000111) Ошибка $02 $48 (01001000) Сравнение или захват, канал А $03 $49 (01001001) Сравнение или захват, канал В SPI на порту С " $00 $4А (01001010) Интерфейс SPI на порту С USART, СО $00 $4В (01001100) Прием по USART завершен $01 $4С (01001101) Регистр данных USART пуст USART, С1 $00 $4Е (01001110) Прием по USART завершен $01 $4F (01001111) Регистр данных USART пуст Таймер/счетчик, D0 $00 $60(01100000) Переполнение $01 $61 (01100001) Ошибка $02 $62(01100010) Сравнение или захват, канал А $03 $63(01100011) Сравнение или захват, канал В $04 $64(01100100) Сравнение или захват, канал С $05 $65(01100101) Сравнение или захват, канал D Таймер/счетчик, D1 $00 $66(01100110) Переполнение $01 $67(01100111) Ошибка $02 $68(01101000) Сравнение или захват, канал А $03 $69(01101001) Сравнение или захват, канал В SPI на порту D $00 $6А (01101010) Интерфейс SPI на порту С USART, DO $00 $6В (01101100) Прием по USART завершен $01 $6С (01101101) Регистр данных USART пуст USART, D1 $00 $6Е (01101110) Прием по USART завершен $01 $6F (01101111) Регистр данных USART пуст Таймер/счетчик, E0 $00 $80 (10000000) Переполнение $01 $81 (10000001) Ошибка $02 $82 (10000010) Сравнение или захват, канал А $03 $83(10000011) Сравнение или захват, канал В $04 $84 (10000100) Сравнение или захват, канал С $05 $85 (10000101) Сравнение или захват, канал D Таймер/счетчик, Е1 $00 $86 (10000110) Переполнение $01 $87 (10000111) Ошибка $02 $88 (10001000) Сравнение или захват, канал А $03 $89 (10001001) Сравнение или захват, канал В SPI на порту Е $00 $8А (10001010) Интерфейс SPI на порту С USART, Е0 $00 $8В (10001100) Прием по USART завершен $01 $8С (10001101) Регистр данных USART пуст USART, Е1 $00 $8Е (10001110) Прием по USART завершен $01 $8F (10001111) Регистр данных USART пуст Таймер/счетчик, F0 $00 $А0 (10100000) Переполнение $01 $А1 (10100001) Ошибка $02 $А2 (10100010) Сравнение или захват, канал А $03 $АЗ (10100011) Сравнение или захват, канал В
106 Глава 2. Семейство AVR ATxmega Таблица 2.5. Окончание Категория Смещение TRIGSRC Инициатор передачи $04 $А4 (10100100) Сравнение или захват, канал С $05 $А5 (10100101) Сравнение или захват, канал D Таймер/счетчик, F1 $00 $А6 (10100110) Переполнение $01 $А7 (10100111) Ошибка $02 $А8 (10101000) Сравнение или захват, канал А $03 $А9 (10101001) Сравнение или захват, канал В SPI на порту F $00 $АА (10101010) Интерфейс SPI на порту С USART, F0 $00 $АВ (10101100) Прием по USART завершен $01 $АС (10101101) Регистр данных USART пуст USART, F1 $00 $АЕ (10101110) Прием по USART завершен $01 $AF (10101111) Регистр данных USART пуст Стартовый адрес источника передачи для каждого канала DMA задают три ре- гистра SRCADDR0-SRCADDR2 (т.е. адрес — 24-разрядный), а соответствующий целевой адрес — регистры DESTADDR0-DESTADDR2. Режим адресации для каж- дого канала настраивается особо с помощью регистра ADDRCTRL (в микроконтро- ллерах ATxmega А ему соответствуют следующие адреса в области ввода/вывода: $0112 для канала 0; $0122 для канала 1; $0132 для канала 2 и $0142 для канала 3) (рис. 2.6). 7 6 5 4 3 2 1 0 SRCRELOAD SRCDIR DESTRELOAD DESTDIR Рис. 2.6. Регистр ADDRCTRL Рассмотрим назначение разрядов этого регистра. • SRCRELOAD[1:0] — определяют характер повторной загрузки адреса источ- ника в регистры SRCADDR (табл. 2.6). Если канал занят передачей, эти разряды изменить нельзя. • SRCDIR[l:0] — выбор режима адресации источника (табл. 2.7). Если канал за- нят передачей, эти разряды изменить нельзя. • DESTRELOAD[1:0] — определяют характер повторной загрузки целевого ад- реса в регистры DESTADDR (табл. 2.8). Если канал занят передачей, эти разря- ды изменить нельзя. • DESTDER[l:0] — выбор режима адресации целевого модуля (табл. 2.9). Если канал занят передачей, эти разряды изменить нельзя. Таблица 2.6. Значение разрядов SRCRELOAD SRCRELOAD1 SRCRELOAD0 Значение 0 0 Повторная загрузка не выполняется 0 1 Исходное значение загружается в регистры SRCADDR по завершении передачи каждого блока данных 1 0 Исходное значение загружается в регистры SRCADDR по завершении передачи каждой порции данных 1 1 Исходное значение загружается в регистры SRCADDR по завершении каждой транзакции
Контроллер прямого доступа к памяти 107 Таблица 2.7. Значение разрядов SRCDIR SRCDIR1 SRCDIR0 Значение 0 0 Фиксированный адрес 0 1 Инкремент адреса после каждого доступа 1 0 Декремент адреса после каждого доступа 1 1 Зарезервировано Таблица 2.8. Значение разрядов DESTRELOAD DESTRELOAD1 DESTRELOADO Значение 0 0 Повторная загрузка не выполняется 0 1 Исходное значение загружается в регистры DESTADDR по завершении передачи каждого блока данных 1 0 Исходное значение загружается в регистры DESTADDR по завершении передачи каждой порции данных 1 1 Исходное значение загружается в регистры DESTADDR по завершении каждой транзакции Таблица 2.9. Значение разрядов DESTDIR DESTDIR1 DESTDIR0 Значение 0 0 Фиксированный адрес 0 1 Инкремент адреса после каждого доступа 1 0 Декремент адреса после каждого доступа 1 1 Зарезервировано Количество байт в каждом передаваемом блоке задается регистровой парой TRFCNTH:TRFCNTL. После каждого считанного по каналу DMA байта данное 16- разрядное значение декрементируется. При достижении нуля в регистровую пару TRFCNTH:TRFCNTL повторно загружается значение, которое было записано в нее последним. Количество передач блока задается регистром REPCNT. После каждой переда- чи блока значение этого регистра декрементируется. Если с помощью регистра ADDRCTRL установлен режим повторов, то значение REPCNT определяет момент завершения транзакции. В таком случае при достижении регистром REPCNT нуля канал после передачи последнего блока отключается. Если REPCNT=0, то количе- ство передаваемых блоков не ограничено. Для управления каждым из каналов отве- дено по два регистра: CHxCTRLA и CHxCTRLB (рис. 2.7 и рис. 2.8). 7 6 5 4 3 2 * 1 0 CHEN CHRST REPEAT TRFREQ — SINGLE BURSTLEN Рис. 2.7. Регистр CHxCTRLA 7 6 5 4 3 2 1 0 CHBUSY CHPEND ERRIF TRNIF ERRINTLVL TRNINTLVL Рис. 2.8. Регистр CHxCTRLB Канал DMA активизируется установкой в лог. 1 разряда CHEN регистра CHxCTRLA. Это приводит к автоматической установке флага CHBUSY в регистре
108 Глава 2. Семейство AVR ATxmega CHxTRLB. По завершении транзакции разряды CHEN и CHBUSY автоматически обнуляются. Кроме того, флаг CHBUSY автоматически сбрасывается установкой флага TRNIF Или ERRIF в регистре CHxCTRLB. Рассмотрим назначение других разрядов регистров управления каналом DMA. • CHRST — установка этого разряда в лог. 1 вызывает сброс канала (обнуление всех его регистров), по завершении которого разряд автоматически обнуляется. Разряд CHRST можно изменить только в тот момент, когда канал неактивен (CHEN=0). • REPEAT — установка этого разряда в лог. 1 активизирует режим повторных передач. В момент начала передачи последнего блока он аппаратно обнуляется. Помните, что перед установкой разряда REPEAT необходимо инициализиро- вать соответствующий регистр REPCNT. • TRFREQ — установке этого разряда в лог. 1 соответствует запрос на передачу данных по каналу DMA. В момент начала передачи он автоматически обнуляет- ся. • SINGLE — установка этого разряда в лог. 1 активизирует режим однократной передачи. В нем канал по сигналу от инициатора, заданного регистром TRGSRC, передает посылку, длину которой определяют разряды BURSTLEN1 и BURSTLENO (см. ниже). Разряд SINGLE можно изменить только в тот мо- мент, когда канал неактивен (CHEN=0). • BURSTLEN[1:O] — определяют длину посылки данных (табл. 2.10). Эти разря- ды можно изменить только в тот момент, когда канал неактивен (CHEN=0). ' Таблица 2.10. Значение разрядов BURSTLEN BURSTLEN1 BURSTLENO Длина посылки 0 0 1 байт 0 1 2 байта 1 0 4 байта 1 1 8 байт • CHPEND — пока канал DMA ожидает начала передачи блока данных, этот разряд содержит лог. 1. Как только передача началась или прервана, флаг CHPEND автоматически сбрасывается. , • ERRIF — этот флаг устанавливается при обнаружении ошибки в канале DMA. Он сбрасывается вручную записью лог. 1 в данный разряд регистра CHxCTRLB. • TRNIF — этот флаг устанавливается в результате успешного завершения пере- дачи блока по каналу DMA. Он сбрасывается вручную записью лог. 1 в данный разряд регистра CHxCTRLB. Если установлен режим повторной передачи, дан- ный флаг устанавливается после передачи каждого блока. • ERRINTLVL[1:O] — эти разряды задают уровень прерывания при обнаруже- нии ошибки в канале DMA, т.е. когда установлен флаг ERRIF (табл. 2.11). За- просы на прерывание более высокого уровня прерывают работу процедуры об- работки любого прерывания более низкого уровня. По завершении обработки прерывания более высокого уровня прерванный обработчик низкого уровня продолжает свою работу. • TRNINTLVL[1:O] — задают уровень прерывания при завершении передачи по каналу DMA, т.е. когда установлен флаг TRNIF (см. табл. 2.11).
Система обработки событий 109 Таблица 2.11. Значение разрядов ERRINTLVL/TRNINTLVL ERRINTLVL1/TRNINTLVL1 ERRINTLVLO/TRNINTLVLO Уровень прерывания 0 0 Прерывание отключено 0 1 Прерывание низкого уровня 1 0 Прерывание среднего уровня 1 1 Прерывание высокого уровня Запросы на прерывание от каналов DMA определяют по флагам, устанавливае- мым в регистре INTFLAGS (адрес $0103 в области ввода/вывода микроконтролле- ров ATxmega А) (рис. 2.9). 7 6 5 4 3 2 1 0 CH3ERRIF CH2ERRIF CH1ERRIF CH0ERRIF CH3TRNFIF CH2TRNFIF CH1TRNFIF CHOTRNFIF Рис. 2.9. Регистр INTFLAGS Если в одном из каналов обнаружена ошибка, устанавливается соответствую- щий флаг CHxERRIF, а при успешном завершении передачи — соответствующий флаг CHxTRNFIF. Для сброса любого из флагов в регистре INTFLAGS необходимо записать лог. 1 в требуемый разряд. Последний управляющий регистр, определяющий состояние каналов DMA, на- зывается DMASTATUS (адрес $0104 в области ввода/вывода микроконтроллеров ATxmega А) (рис. 2.10). 7 6 5 4 3 2 1 0 CH3BUSY CH2BUSY CH1BUSY CH0BUSY CH3PEND CH2PEND CH1PEND CHOPEND Рис. 2.10. Регистр DMASTATUS Когда некоторый канал DMA начинает транзакцию, устанавливается соответст- вующий флаг CHxBUSY, который автоматически сбрасывается при отключении ка- нала, а также — при установке флага CHxERRIF или CHxTRFIF в регистре INTFLAGS. Когда в некотором канале DMA ожидается передача блока, в регистре DMASTATUS устанавливается соответствующий флаг CHxPEND, который автома- тически сбрасывается в момент начала или прекращения передачи. В завершение отметим, что в ходе транзакции большинство управляющих реги- стров контроллера прямого доступа к памяти и его каналов недоступны для измене- ния. Так, если установлен флаг CHxBUSY в регистре DMASTATUS, то для моди- фикации доступны только регистры DMACTRL и INTFLAGS (см. рис. 2.9), соответ- ствующий активному каналу регистр TRIGSRC (см. табл. 2.5), а также разряды CHEN, CHRST, TRFREQ и REPEAT регистра CHxCTRLA (см. рис. 2.7). Система обработки событий Система обработки событий, реализованная в микроконтроллерах ATxmega, по- зволяет автоматически активизировать некоторые действия в периферии в результа- те изменения состояния какого-либо периферийного устройства, что можно скон- фигурировать программно. Такой простой подход дает возможность автономно управлять периферией, не привлекая прерывания, центральный процессор и ресур- сы контроллера прямого доступа к памяти.
но Глава 2. Семейство AVR ATxmega Некоторое изменение состояния называется событием. События передаются между периферийными устройствами (порты, АЦП, ЦАП, таймеры/счетчики, кон- троллер прямого доступа к памяти, счетчик реального времени, аналоговые компа- раторы, модуль инфракрасной передачи) по специальной схеме маршрутизации (см. рис. 2.1). Для каждого периферийного устройства может быть определено несколь- ко разновидностей событий. Так, для таймеров/счетчиков это может быть перепол- нение или совпадение содержимого счетного регистра с регистром сравнения. При- мер взаимодействия счетчика и АЦП в рамках системы обработки событий показан на рис. 2.11. Рис. 2.11. Пример взаимодействия счетчика и АЦП в рамках системы обработки событий События бывают одного из двух типов: • сигнальные — только указывают на изменение состояния (большинство пери- ферийных устройств генерирует и использует только такие события); • данных — содержат дополнительную информацию об изменении состояния, которая может быть декодирована пользователем события дня определения не- обходимого действия. Схема маршрутизации состоит из восьмц мультиплексоров, на каждый из кото- рый поступают все события от всех источников. Мультиплексор выбирает, какое событие должно стать входным для пользователей. Его выход называют каналом события. Наличие восьми мультиплексоров подразумевает, что одновременно можно передавать до восьми событий. Кроме того, возможно маршрутизировать одно событие через все мультиплексоры. Каждому мультиплексору соответствует восьмиразрядный управляющий ре- гистр CHxMUX (диапазон адресов в области ввода/вывода микроконтроллеров ATxmega А — $0180..$0187). Его содержимое определяет источник события для данного канала (табл. 2.12). В табл. 2.12 показаны только комбинации разрядов регистра CHxMUX, для которых опреде- лены источники события. Остальные комбинации зарезервированы компанией Atmel для бу- дущего использования.
Система обработки событий 111 Таблица 2.12. Выбор источника событий по содержимому регистра CHxMUX CHxMUX Источник события 7 6 5 4 3 2 1 0 0 0 0 0 0 0 0 0 Отсутствует. События генерируются только вручную 0 0 0 0 1 0 0 0 Переполнение счетчика реального времени 0 0 0 0 1 0 0 1 Совпадение содержимого счетчика реального времени с регистром сравнения 0 0 0 1 0 0 0 0 Аналоговый компаратор на порту А, канал 0 0 0 0 1 0 0 0 1 Аналоговый компаратор на порту А, канал 1 0 0 0 1 0 0 1 0 Аналоговый компаратор на порту А, режим “Window” 0 0 0 1 0 0 1 1 Аналоговый компаратор на порту В, канал 0 0 0 0 1 0 1 0 0 Аналоговый компаратор на порту В, канал 1 0 0 0 1 0 1 0 1 Аналоговый компаратор на порту В, режим “Window” 0 0 1 0 0 0 0 0 АЦП на порту А, канал 0 0 0 1 0 0 0 0 1 АЦП на порту А, канал 1 0 0 1 0 0 0 1 0 АЦП на порту А, канал 2 0 0 1 0 0 0 1 1 АЦП на порту А, канал 3 0 0 1 0 0 1 0 0 АЦП на порту В, канал 0 0 0 1 0 0 1 0 1 АЦП на порту В, канал 1 0 0 1 0 0 1 1 0 АЦП на порту В, канал 2 0 0 1 0 0 1 1 1 АЦП на порту В, канал 3 0 1 0 1 0 0 0 0 Порт А, вывод 0 0 1 0 1 0 0 0 1 Порт А, вывод 1 0 1 0 1 0 0 1 0 Порт А, вывод 2 0 1 0 1 0 0 1 1 Порт А, вывод 3 0 1 0 1 0 1 0 0 Порт А, вывод 4 0 1 0 1 0 1 0 1 Порт А, вывод 5 0 1 0 1 0 1 1 0 Порт А, вывод 6 0 1 0 1 0 1 1 1 Порт А, вывод 7 0 1 0 1 1 0 0 0 Порт В, вывод 0 0 1 0 1 1 0 0 1 Порт В, вывод 1 0 1 0 1 1 0 1 0 Порт В, вывод 2 0 1 0 1 1 0 1 1 Порт В, вывод 3 0 1 0 1 1 1 0 0 Порт В, вывод 4 0 1 0 1 1 1 0 1 Порт В, вывод 5 0 1 0 1 1 1 1 0 Порт В, вывод 6 0 1 0 1 1 1 1 1 Порт В, вывод 7 0 1 1 0 0 0 0 0 Порт С, вывод 0 0 1 1 0 0 0 0 1 Порт С, вывод 1 0 1 1 0 0 0 1 0 Порт С, вывод 2 0 1 1 0 0 0 1 1 Порт С, вывод 3 0 1 1 0 0 1 0 0 Порт С, вывод 4 0 1 1 0 0 1 0 1 Порт С, вывод 5 0 1 1 0 0 1 1 0 Порт С, вывод 6 0 1 1 0 0 1 1 1 Порт С, вывод 7 0 1 1 0 1 0 0 0 Порт D, вывод 0 0' 1 1 0 1 0 0 1 Порт D, вывод 1
112 Глава 2. Семейство AVR ATxmega Таблица 2.12. Продолжение CHxMUX Источник события 7 6 5 4 3 2 1 0 0 1 1 0 1 0 1 0 Порт D, вывод 2 0 1 1 0 1 0 1 1 Порт D, вывод 3 0 1 1 0 1 1 0 0 Порт D, вывод 4 0 1 1 0 1 1 0 1 Порт D, вывод 5 ' 0 1 1 0 1 1 1 0 Порт D, вывод 6 0 1 1 0 1 1 1 1 Порт D, вывод 7 0 1 1 1 0 0 0 0 Порт Е, вывод 0 0 1 1 1 0 0 0 1 Порт Е, вывод 1 0 1 1 1 0 0 1 0 Порт Е, вывод 2 0 1 1 1 0 0 1 1 Порт Е, вывод 3 0 1 1 1 0 1 0 0 Порт Е, вывод 4 0 1 1 1 0 1 0 1 Порт Е, вывод 5 0 1 1 1 0 1 1 0 Порт Е, вывод 6 0 1 1 1 0 1 1 1 Порт Е, вывод 7 0 1 1 1 1 0 0 0 Порт F, вывод 0 0 1 1 1 1 0 0 1 Порт F, вывод 1 0 1 1 1 1 0 1 0 Порт F, вывод 2 0 1 1 1 1 0 1 1 Порт F, вывод 3 0 1 1 1 1 1 0 0 Порт F, вывод 4 0 1 1 1 1 1 0 1 Порт F, вывод 5 0 1 1 1 1 1 1 0 Порт F, вывод 6 0 1 1 1 1 1 1 1 Порт F, вывод 7 1 0 0 0 N Такт синхронизации периферии / N (N = 1..32768) 1 1 0 0 0 0 0 0 Переполнение таймера/счетчика, СО 1 1 0 0 0 0 0 1 Ошибка таймера/счетчика, СО 1 1 0 0 0 1 0 0 Захват или сравнение в канале А таймера/счетчика, СО 1 1 0 0 0 1 0 1 Захват или сравнение в канале В таймера/счетчика, СО 1 1 0 0 0 1 1 0 Захват или сравнение в канале С таймера/счетчика, СО 1 1 0 0 0 1 1 1 Захват или сравнение в канале D таймера/счетчика, СО 1 1 0 0 1 0 0 0 Переполнение таймера/счетчика, С1 1 1 0 0 1 0 0 1 Ошибка таймера/счетчика, С1 1 1 0 0 1 1 0 0 Захват или сравнение в канале А таймера/счетчика, С1 1 1 0 0 1 1 0 1 Захват или сравнение в канале В таймера/счетчика, С1 1 1 0 0 1 1 1 0 Захват или сравнение в канале С таймера/счетчика, С1 1 1 0 0 1 1 1 1 Захват или сравнение в канале D таймера/счетчика, С1 1 1 0 1 0 0 0 0 Переполнение таймера/счетчика, DO 1 1 0 1 0 0 0 1 Ошибка таймера/счетчика, DO 1 1 0 1 0 1 0 0 Захват или сравнение в канале А таймера/счетчика, DO 1 1 0 1 0 1 0 1 Захват или сравнение в канале В таймера/счетчика, DO 1 1 р 1 0 1 1 0 Захват или сравнение в канале С таймера/счетчика, DO 1 1 0 1 0 1 1 1 Захват или сравнение в канале D таймера/счетчика, DO 1 1 0 1 1 0 0 0 Переполнение таймера/счетчика, D1 1 1 0 1 1 0 0 1 Ошибка таймера/счетчика, D1 1 1 0 1 1 1 0 0 Захват или сравнение в канале А таймера/счетчика, D1
Система обработки событий 113 Таблица 2.12. Продолжение CHxMUX Источник события 7 6 5 4 3 2 1 0 1 1 0 1 1 1 0 1 Захват или сравнение в канале В таймера/счетчика, D1 1 1 0 1 1 1 1 0 Захват или сравнение в канале С таймера/счетчика, D1 1 1 0 1 1 1 1 1 Захват или сравнение в канале D таймера/счетчика, D1 1 1 1 0 0 0 0 0 Переполнение таймера/счетчика, Е0 1 1 1 0 0 0 0 1 Ошибка таймера/счетчика, Е0 1 1 1 0 0 1 0 0 Захват или сравнение в канале А таймера/счетчика, Е0 1 1 1 0 0 1 0 1 Захват или сравнение в канале В таймера/счетчика, Е0 1 1 1 0 0 1 1 0 Захват или сравнение в канале С таймера/счетчика, Е0 1 1 1 0 0 1 1 1 Захват или сравнение в канале D таймера/счетчика, Е0 1 1 1 0 1 0 0 0 Переполнение таймера/счетчика, Е1 1 1 1 0 1 0 0 1 Ошибка таймера/счетчика, Е1 1 1 1 0 1 1 0 0 Захват или сравнение в канале А таймера/счетчика, Е1 1 1 1 0 1 1 0 1 Захват или сравнение в канале В таймера/счетчика, Е1 1 1 1 0 1 1 1 0 Захват или сравнение в канале С таймера/счетчика, Е1 1 1 1 0 1 1 1 1 Захват или сравнение в канале D таймера/счетчика, Е1 1 1 1 1 0 0 0 0 Переполнение таймера/счетчика, F0 1 1 1 1 0 0 0 1 Ошибка таймера/счетчика, F0 1 1 1 1 0 1 0 0 Захват или сравнение в канале А таймера/счетчика, F0 1 1 1 1 0 1 0 1 Захват или сравнение в канале В таймера/счетчика, F0 1 1 1 1 0 1 1 0 Захват или сравнение в канале С таймера/счетчика, F0 1 1 1 1 0 1 1 1 Захват или сравнение в канале D таймера/счетчика, F0 1 1 1 1 1 0 0 0 Переполнение таймера/счетчика, F1 1 1 1 1 1 0 0 1 Ошибка таймера/счетчика, F1 1 1 1 1 1 1 0 0 Захват или сравнение в канале А таймера/счетчика, F1 1 1 1 1 1 1 0 1 Захват или сравнение в канале В таймера/счетчика, F1 1 1 1 1 1 1 1 0 Захват или сравнение в канале С таймера/счетчика, F1 1 1 1 1 1 1 1 1 Захват или сравнение в канале D таймера/счетчика, F1 Если выбрать источник, для которого в данной модели микроконтроллера от- сутствует соответствующее периферийное устройство, то система обработки собы- тий поведет себя так же, как при CHxMUX=0 (маршрутизация не выполняется, со- бытия генерируются только вручную, о чем речь пойдет чуть позже). Событие обычно длится один цикл синхронизации периферии (исключение со- ставляют, разве что, порты, генерирующие события постоянно), а от момента его формирования до момента выполнения пользователем некоторого действия прохо- дит не более двух циклов. Регистрация события системой маршрутизации происхо- дит по ближайшему нарастающему фронту такта, т.е. в течение одного цикла, а еще один цикл требуется для передачи события пользователю. Действия по обнаружению событий в каждом периферийном модуле реализо- ваны по-своему. Например, в 16-разрядном таймере/счетчике микроконтроллеров ATxmega А за это отвечает регистр управления CTRLD (адреса в области ввода/ вы- вода для различных счетчиков: $0803, $0843, $0903, $0943, $0А03, $0А43, $0В03,. $0В43)(рис. 2.12). Разряды EVACT определяют действие по событию, выполняемое таймером (табл. 2.13).
114 Глава 2. Семейство AVR ATxmega 7 6 5 4 3 2 1 0 EVACT EVDLY EVSEL Рис. 2.12. Регистр CTRLD управления 16-разрядным таймером/счетчиком Таблица 2.13. Значение разрядов EVACT EVACT2 EVACT1 EVACT0 Действие по событию 0 0 0 Отсутствует 0 0 1 Захват на входе 0 1 . 0 Счет в прямом или обратном направлении по внешнему сигналу 0 1 1 Квадратурная дешифрация (см. раздел ниже) 1 0 0 Начать заново период импульсов 1 0 1 Фиксация частоты 1 1 0 Фиксация ширины импульсов 1 1 1 Зарезервировано Выбор одного из действий приведет к изменению содержимого регистров ССх (управление захватом и сравнением), а также соответствующих разрядов состояния. В такой конфигурации флаг ошибки (ERRIF) свидетельствует о переполнении бу- фера. Генерирование событий вручную Если события для канала не генерируются автоматически (CHxMUX = 0), их можно генерировать вручную с помощью регистров STROBE (адрес $0190 в облас- ти ввода/вывода микроконтроллеров ATxmega) и DATA (адрес $0191 в области ввода/вывода микроконтроллеров ATxmega). Эти регистры содержат по одному разряду на каждый канал событий (разряду 0 соответствует канал 0, разряду 1 — канал 1 и т.д.). Запись лог. 1 в разряд регистра STROBE формирует событие в соот- ветствующем канале. Для того чтобы сформировать событие данных, перед уста- новкой разрядов в регистре STROBE должен быть инициализирован регистр DATA. Способ декодирования сгенерированных вручную событий иллюстрирует табл. 2.14. Таблица 2.14. Декодирование комбинаций соответствующих разрядов регистров STROBE и DATA STROBEn DATAn Событие данных Сигнальное событие 0 0 Отсутствует Отсутствует 0 1 Событие данных 1 Отсутствует 1 0 Событие данных 2 Есть 1 1 Событие данных 3 Есть Таким образом, в различных каналах можно одновременно генерировать разно- типные события. Они длятся один цикл синхронизации и “затирают” другие актив- ные события в соответствующих каналах. Фильтрация Каждый канал событий содержит цифровой фильтр, который активизируется и конфигурируется с помощью первых трех разрядов регистра CHxCTRL (диапазон
Система обработки событий 115 адресов в области ввода/вывода микроконтроллеров ATxmega А — $0188- $018F) (рис. 2.13). 7 6 5 4 3 2 1 0 — QDIRM QDIEN QDEN DIGFILT Рис. 2.13. Регистр CHxCTRL Разряды DIGFILT[2:0] определяют длину цифрового фильтра. Его суть заклю- чается в том, что событие пропускается в канал только в том случае, если оно опра- шивается на протяжении заданного числа циклов тактирования периферии (табл. 2.15). Таблица 2.15. Конфигурирование цифрового фильтра для канала событий DIGFILT2 DIGFILT1 DIGFILT0 Количество опросов 0 0 0 1 (фильтрация отсутствует) 0 0 1 2 0 1 0 3 0 1 1 4 1 0 0 5 1 0 1 6 1 1 0 7 1 1 1 8 Квадратурный дешифратор В состав системы обработки событий входят три так называемых квадратурных дешифратора (quadrature decoder, QDEC). Квадратурный сигнал характеризуется на- личием двух прямоугольных импульсов, смещенных относительно друг друга по фазе на 90 градусов. Это позволяет измерять параметры вращательного движения путем подсчета фронтов двух импульсов. Соотношение фаз этих импульсов опреде- ляет направление вращения. Типичный пример квадратурных сигналов от кругового датчика положения вала показан на рис. 2.14. Рис. 2.14. Квадратурные сигналы от кругового датчика положения вала
116 Глава 2. Семейство AVR ATxmega Сигналы QDPH0 и QDPH90 — квадратурные. Когда импульс QDPH0 предше- ствует импульсу QDPH90, то вращение происходит в прямом направлении, в про- тивном случае — в обратном направлении. Конкатенация этих двух сигналов назы- вается квадратурным или фазовым состоянием. Для определения абсолютного кру- гового смещения можно воспользоваться третьим импульсом, который появляется один раз на протяжении одного оборота (сигнал QDINDX на рис. 2.14). Наличие квадратурного дешифратора в составе схемы обработки событий по- зволяет декодировать квадратурные сигналы на входах портов и генерировать со- бытия данных, на основании которых таймер/счетчик может выполнять определен- ное действие (например, счет). Для активизации дешифратора необходимо устано- вить в лог. 1 разряд QDEN в регистре управления каналом событий CHxCTRL (см. рис. 2.13). ПРИМЕЧАНИЕ В семействе ATxmega А квадратурный дешифратор доступен только для каналов 0, 2 и 4. Если канал события необходимо использовать для передачи квадратурного со- стояния (например, для получения индекса счета), в регистре CHxCTRL следует ус- тановить разряд QDIEN. Состояние сигналов QDPH0 и QDPH90, при котором рас- познается индексный сигнал и формируется соответствующее событие для счетчика (см. рис. 2.13), определяется значением разрядов QDIRM[1:O] того же регистра CHxCTRL (табл. 2.16). Таблица 2.16. Значение разрядов QDIRM QDIRM1 QDIRM0 Состояние, при котором распознается индекс 0 0 QDPH0 = 0, QDPH90 = 0 0 1 QDPH0 = 0, QDPH90 = 1 1 0 QDPH0= 1,QDPH90 = 0 1 1 QDPHO = 2, QDPH90 = 1 Подводя итог, дадим полную процедуру настройки квадратурного дешифрато- ра. 1. Сконфигурировать два соседних вывода какого-либо порта в качестве входов для фазовых сигналов QDPH0 и QDPH90 (активный — низкий уровень). 2. Определить вывод QDPH0 как вход мультиплексора для канала событий N. 3. Активизировать в канале событий N квадратурный дешифратор и цифровую фильтрацию. 4. При желании можно сконфигурировать еще один вывод в качестве входа для индексного сигнала QINDX (считывание по обоим фронтам) и определить его как вход мультиплексора для канала событий Л/+1. Далее следует установить разряд QDIEN в регистре CH/v+iCTRL h выбрать режим распознавания индекса (см. табл. 2.16). 5. Назначить для таймера/счетчика квадратурную дешифрацию в качестве дейст- вия по событию (см. табл. 2ЛЗ). 6. Выбрать для таймера/счетчика в качестве источника события соответствующий канал события. 7. Инициализировать регистр периода таймера/счетчика значением “количество импульсов в линии кругового датчика положения вала” * 4 - 1. 8. Активизировать таймер/счетчик.
Система синхронизации 117 Значение угла поворота вала теперь можно считывать непосредственно из счет- ного регистра таймера/счетчика. Если в момент появления индексного сигнала со- держимое счетного регистра отличается от минимального значения “BOTTOM”, ус- танавливается флаг ошибки счетчика. Этот флаг также устанавливается, если значе- ние положения пересекает отметку “BOTTOM” при отсутствии индексного сигнала. Система синхронизации В микроконтроллерах ATxmega реализована гибкая система синхронизации с большим набором источников тактового сигнала, среди которых есть как точные встроенные осцилляторы, так и внешние кварцевые осцилляторы и резонаторы. Для получения большого диапазона тактовых частот можно использовать высокочас- тотную систему фазовой подстройки частоты (PLL — Phase Locked Loop) и предделители. Для автоматической калибровки внутренних осцилляторов доступ- ны две схемы цифровой автоподстройки частоты (DFLL — Digital Frequency Locked Loop). После сброса микроконтроллеры ATxmega А всегда тактируются от внутренне- го осциллятора на 2 МГц. Настройки источника тактового сигнала и коэффициент предделителя можно в любой момент изменить программно. Структурная схема системы синхронизации микроконтроллеров ATxmega А показана на рис. 2.15. Источники тактового сигнала в микроконтроллерах ATxmega можно разбить' на две категории: внутренние осцилляторы и внешние тактовые генераторы. Большин- ство из них можно напрямую включить или отключить программно, в то время как для некоторых других это происходит автоматически в зависимости от текущих на- строек периферии. Для работы внутренних осцилляторов никаких внешних компонентов не требу- ется. Рассмотрим их применительно к микроконтроллерам ATxmega А. • Низковольтный (ULP — Ultra Low Power) осциллятор на 32 кГц. Этот внутренний осциллятор потребляет очень мало энергии, однако не рассчитан на высокую точность работы. Он использует встроенный предделитель, обеспечи- вающий на выходе, кроме 32 кГц, также сигнал частотой 1 кГц. Данный осцил- лятор включается автоматически при его назначении в качестве источника так- тового сигнала для счетчика реального времени, сторожевого таймера или сис- темы обнаружения провалов напряжения. • Откалиброванный RC-осциллятор на 32,768 кГц. Его встроенный преддели- тель обеспечивает также выходную частоту 1,024 кГц. Калибровочное значение записывается при сбросе аппаратно в регистр R32KCAL (адрес в области вво- да/вывода микроконтроллеров ATxmega А — $0054). Его можно также изме- нить программно. • Откалиброванный RC-осциллятор на 32 МГц. Использует схему цифровой автоподстройки частоты, которую можно использовать для автоматической ка- либровки непосредственно во время выполнения программы. При сбросе 13- разрядное калибровочное значение записывается аппаратно в регистры CALA и CALB (адреса в области ввода/вывода микроконтроллеров ATxmega А — $0062 и $0063), однако может быть задано и программно. • Откалиброванный RC-осциллятор на 2 МГц. Использует схему цифровой автоподстройки частоты, которую можно использовать для автоматической ка- либровки непосредственно во время выполнения программы. При сбросе 13-
118 Глава 2. Семейство AVR ATxmega разрядное калибровочное значение записывается аппаратно в регистры CALA и CALB (адреса в области ввода/вывода микроконтроллеров ATxmega А — $0069 и $006А), однако может быть задано и программно. Рис. 2.15. Структурная схема системы синхронизации микроконтроллеров ATxmega А Для реализации внешних осцилляторов (кварцевых или керамических резона- торов) традиционно служат выводы XTAL1 и XTAL2, а вывод XTAL1 также может служить для подачи внешнего тактового сигнала. Выводы TOSC1 и TOSC2 предна- значены для подключения кварцевого осциллятора на 32 кГц. Типичная схема под- ключения кварцевого осциллятора или резонатора частотой 32 кГц или 0,4.. 16 МГц показана в предыдущей главе на рис. 1.4. Для актиЬизации того или иного осциллятора следует установить соответст- вующий разряд в регистре OSCCTRL (адрес в области ввода/вывода микроконтрол- леров ATxmega А — $0050):
Система синхронизации 119 • RC2MEN — внутренний RC-осциллятор на 2 МГц (этот разряд установлен по умолчанию); • RC32MEN — внутренний RC-осциллятор на 32 МГц; • RC32KEN — внутренний RC-осциллятор на 32 кГц; • XOSCEN — внешний осциллятор; • PLLEN — система фазовой автоподстройки частоты. При установке в лог. 1 разряда XOSCEN необходимо настроить параметры внешнего осциллятора с помощью регистра XOSCCTRL (адрес в области вво- да/вывода микроконтроллеров ATxmega А — $0052) (рис. 2.16). 7 6 5 4 3 2 1 О FRQRANGE X32KLPM — XOSCSEL Рис. 2.16. Регистр XOSCCTRL Первые четыре разряда этого регистра определяют тип и время стабилизации кварца или резонатора, подключенного к выводам XTAL или TOSC (табл. 2.17). Таблица 2.17. Выбор внешнего осциллятора XOSCSEL Источник тактового сигнала Время стабилизации 3 2 1 0 0 0 0 0 Внешний тактовый сигнал 6 циклов 0 0 1 0 32,768 кГц на TOSC 16К циклов 0 0 1 1 0,4..16МГцна XTAL 256 циклов 0 1 1 1 0,4.. 16 МГц на XTAL 1К циклов 1 0 1 1 0,4.. 16 МГц на XTAL 16К циклов Диапазон частот для кварцевого осциллятора на выводах XTAL определяют разряды FRQRANGE[1:O] (табл. 2.18). Таблица 2.18. Выбор диапазона частот для кварцевого осциллятора на выводах XTAL FRQRANGE1 FRQRANGE0 Диапазон частот Рекомендованная емкость конденсаторов С1 и С2 0 0 0.4..2 МГц 100 пФ 0 1 2..9 МГц 15 пФ 1 0 9..12 МГц 15 пФ 1 1 12..16 МГц 10 пФ Наконец, установка в 1 разряда X32KLPM регистра XOSCCTRL активизирует режим пониженного энергопотребления для кварцевого осциллятора на 32 кГц. Состояние того или иного осциллятора можно определить по содержимому раз- рядов регистра OSCSTATUS (адрес в области ввода/вывода микроконтроллеров ATxmega А — $0051). Если осциллятор стабилизирован и готов к использованию, то для него устанавливается соответствующий флаг: • RC2MRDY — готовность внутреннего RC-осциллятора на 2 МГц; • RC32MRDY — готовность внутреннего RC-осциллятора на 32 МГц; • RC32KRDY — готовность внутреннего RC-осциллятора на 32 кГц; • XOSCRDY — готовность внешнего источника тактового сигнала;
120 Глава 2. Семейство AVR ATxmega • PLLRDY — система фазовой автоподстройки частоты зафиксирована на выб- ранной частоте и готова к использованию в качестве источника тактового сиг- нала. Источник входного сигнала для системы фазовой автоподстройки частоты оп- ределяет регистр PLLCTRL (адрес в области ввода/вывода микроконтроллеров ATxmega А — $0055) (рис. 2.17). 7 6 5 4 3 2 1 0 PLLSRC — PLLFAC Рис. 2.17. Регистр PLLCTRL Значение разрядов PLLSRC дано в табл. 2.19. Таблица 2.19. Выбор источника входного сигнала для системы фазовой автоподстрой- ки частоты PLLSRC1 PLLSRC0 Источник 0 0 Внутренний RC-осциллятор на 2 МГц 0 1 Зарезервировано 1 0 Внутренний RC-осциллятор на 32 МГц 1 1 Внешний тактовый сигнал частотой минимум 0,4 МГц Разряды PLLFAC регистра PLLCTRL задают коэффициент умножения от 1 до 31. Частота на выходе системы PLL должна находиться в диапазоне 10..200 МГц. Выбор источника тактового сигнала системной синхронизации В качестве источника тактового сигнала системной синхронизации может быть выбран любой калиброванный внутренний осциллятор, внешние источники такто- вого сигнала и выход системы фазовой автоподстройки частоты (см. рис. 2.15). По- лученный сигнал поступает в блок предделителей, который может разделить такт до его поступления в процессор и периферию на коэффициент от 1 до 2048 (рис. 2.18). Первый предделитель (А) реализует деление на число от 1 до 512, а второй и третий (В и С) — на 1, 2 или 4. Выбор тактового сигнала Рис. 2.18. Схема выбора источника тактового сигнала системной синхронизации
Система синхронизации 121 Источник тактового сигнала системной синхронизации выбирают программно с помощью трех первых разрядов (SCLKSEL[2:0]) регистра CLKCTRL (адрес в об- ласти ввода/вывода микроконтроллеров ATxmega А — $0040) (табл. 2.20). Таблица 2.20. Выбор источника тактового сигнала системной синхронизации SCLKSEL2 SCLKSEL1 SCLKSEL0 Источник 0 0 0 Внутренний RC-осциллятор на 2 МГц 0 0 1 Внутренний RC-осциллятор на 32 МГц 0 1 0 Внутренний RC-осциллятор на 32 кГц 0 1 1 Внешний осциллятор или тактовый сигнал 1 0 0 Система фазовой автоподстройки частоты Остальные три комбинации разрядов SCLKSEL зарезервированы для использо- вания в будущем. ПРИМЕЧАНИЕ Смена источника тактового сигнала системной синхронизации займет четыре тактовых цикла: два на старом источнике и два на новом. Кроме того, аппаратные средства защиты не позво- лят выбрать нестабильный или отключенный осциллятор, а также — отключить осциллятор, задействованный в качестве источника тактового сигнала системной синхронизации. За конфигурирование блока предделителей отвечает регистр PSCTRL (адрес в области ввода/вывода микроконтроллеров ATxmega А — $0041) (рис. 2.19). 7 6 5 4 3 2 1 0 — PSADIV PSBCDIV Рис. 2.19. Регистр PSCTRL Пять разрядов PSADIV определяют коэффициент деления для предделителя А (табл. 2.21). Они доступны для записи во время выполнения программы. Таблица 2.21. Выбор коэффициента деления для предделителя А PSADIV Коэффициент деления 4 3 2 1 0 0 0 0 0 0 1 0 0 0 0 1 2 0 0 0 1 1 4 0 0 1 0 1 8 0 0 1 1 1 16 0 1 0 0 1 32 0 1 0 1 1 64 0 1 1 0 1 128 0 1 1 1 1 256 1 0 0 0 1 512 Разряды PSBCDIV определяют коэффициенты деления для предделителей В и С (табл. 2.22). Для запрета изменений в регистрах CLKCTRL и PSCTRL с целью защиты от случайной смены источника тактового сигнала системной синхронизации и коррек- ции настроек предделителей служит разряд 0 регистра LOCK (адрес в области вво-
122 Глава 2. Семейство AVR ATxmega да/вывода микроконтроллеров ATxmega А — $0042). Запись лог. 1 в этот разряд ак- тивизирует блокировку изменений. Таблица 2.22. Выбор коэффициентов деления для предделителей В и С PSBCDIV1 PSBCDIV0 Коэффициент для предделителя В Коэффициент для предделителя С 0 0 1 1 0 1 1 2 1 0 4 1 1 1 2 2 Счетчики реального времени Счетчики реального времени (RTC — Real Time Counter) обычно используют в различных режимах пониженного энергопотребления для отслеживания времени и “пробуждения” устройства через определенные периоды. В микроконтроллерах ATxmega А реализованы два таких счетчика: 16-разрядный RTC и 32-разрядный RTC32. Оба тактируются сигналом частотой 32 кГц или 1 кГц с последующим де- лением. Выбор источника тактирования и его активизацию определяет регистр RTCCTRL (адрес в области ввода/вывода микроконтроллеров ATxmega А — $0043) (рис. 2.20). 7 6 5 4 3 2 1 0 — — — — RTCSRC RTCEN Рис. 2.20. Регистр RTCCTRL Разряды RTCSRC определяют опорный тактовый сигнал для счетчиков реаль- ного времени (табл. 2.23). Таблица 2.23. Выбор тактового сигнала для счетчиков реального времени RTCSRC2 RTCSRC1 RTCSRC0 Источник 0 0 0 1 кГц от внутреннего ULP-осциллятора на 32 кГц 0 0 1 1 кГц от осциллятора на 32 кГц на выводе TOSC 0 1 0 1 кГц от внутреннего RC-осциллятора на 32 кГц 1 0 1 32 кГц от осциллятора на 32 кГц на выводах TOSC Источник тактирования для счетчиков реального времени активизируется уста- новкой в лог. 1 разряда RTCEN регистра RTCCTRL. Как RTC, так и RTC32 могут генерировать запросы на прерывание и события: • по совпадению значения счетчика со значением, записанным в соответствую- щие регистры сравнения (для RTC — регистровая пара COMPL и СОМРН; для RTC32 — регистры СОМРО..СОМРЗ); • по переполнению, т.е. по совпадению значения счетчика со значением, записан- ным в соответствующие регистры периода (для RTC — регистровая пара PERL и PERH; для RTC32 — регистры PER0..PER3). Момент прерывания определяется по установке соответствующего флага (COMPIF или OVFIF) в регистре INTFLAGS (адрес в области ввода/вывода микро- контроллеров ATxmega А для RTC — $0403, для RTC32 — $0423). Разрешение пре- рываний реализовано с прмощью регистра INTCTRL (адрес в области ввода/вывода
Модуль питания от батареи 123 микроконтроллеров ATxmega А для RTC — $0402, для RTC32 — $0422). Разряды OVFINTLVL[1:0] определяет уровень прерывания по переполнению, а разряды COMPINTLVLfl :0] — по совпадению с регистром сравнения. Счетчик RTC 16-разрядный счетчик RTC управляется регистром RTCCTRL (адрес в области ввода/вывода микроконтроллеров ATxmega А — $0400), в котором используются только первых три разряда, определяющих коэффициент деления тактового сигнала RTC (табл. 2.24). Таблица 2.24. Выбор коэффициента деления тактового сигнала для RTC PRESCALER2 PRESCALER1 PRESCALERO Коэффициент 0 0 0 0 (RTC остановлен) 0 0 1 1 0 1 0 2 0 1 1 8 1 0 0 16 1 0 1 64 1 1 0 256 1 1 1 1024 Счетчик RTC32 32-разрядный счетчик RTC32 тактируется сигналом частотой 1,024 кГц или 1 Гц, полученного от осциллятора на 32,768 кГц, подключенного между выводами TOSC1 и TOSC2. Для его активизации необходимо установить в лог. 1 разряд ENABLE в регистре RTC32CTRL (адрес в области ввода/вывода микроконтролле- ров ATxmega А — $0420). От момента записи значения в этот регистр и до момента активизации RTC32 требуется один тактовый цикл счетчика реального времени. Одна из основных сфер применения этого счетчика — работа от напряжения Vbat (батарея), когда возможна только малая частота тактирования. Выбор частоты осуществляют с помощью управляющего регистра VBATCTRL (адрес в области ввода/вывода микроконтроллеров ATxmega А — $00F0), который рассматривается в следующем разделе. Модуль питания от батареи В микроконтроллерах ATxmega А реализована возможность автоматического переключения с питания от рабочего напряжения Vcc на питание от батареи, под- ключенной к заданному выводу Vbat- Это обеспечивает работу счетчика реального времени RTC32, осциллятора на 32,768 кГц и двух управляющих регистров. Пере- ключение на батарею при пропадании рабочего напряжения (как и возврат к нормальному режиму питания) происходит автоматически. Для управления модулем питания от батареи служат два регистра: VBATCTRL и VBATSTATUS (адреса в области ввода/вывода микроконтроллеров ATxmega А — $00F0 и $00F 1) (рис. 2.21 и рис. 2.22). Разряд XOSCSEL регистра VBATCTRL определяет частоту входного тактового сигнала для счетчика реального времени RTC32. По умолчанию он содержит лог. 0, что соответствует тактовой частоте 1 Гц. Если его установить в лог. 1, то будет вы-
124 Глава 2. Семейство AVR ATxmega бран сигнал частотой 1,024 кГц. Тактирование начинается по установке в лог. 1 раз- ряда XOSCEN. Для отключения тактирования необходимо активизировать сброс модуля питания от батареи, установив в лог. 1 разряд RESET. 7 6 5 4 3 2 1 0 — — — XOSCSEL XOSCEN XOSCFDEN ACCEN RESET Рис. 2.21. Регистр VBATCTRL 7 6 5 4 3 2 1 0 BBPWR • — — XOSCRDY XOSCFAIL BBBODF BBPODF Рис. 2.22. Регистр VBATSTATUS Рассмотрим последовательность работы модуля, реализующего питание от ба- тареи, с использованием разрядов регистров VBATCTRL и VBATSTATUS. При по- даче питания или общем сбросе микроконтроллер проверяет наличие напряжения на выводе Vbat- Если требуемый уровень напряжения не обнаружен, то в регистре VBATSTATUS автоматически устанавливается флаг BBPWR. Если этот флаг уста- новлен, то далее программа должна проверить состояние флагов BBBODF и BBPODF регистра VBATSTATUS. Первый из них устанавливается, если обнаружен провал, а второй — повторная подача напряжения Vbat- Если флаги BBBODF и BBPODF сброшены, то это говорит о том, что питание от батареи стабильно и модуль можно активизировать. Для этого следует устано- вить в лог. 1 разряд ACCEN регистра VBACTRL и проверить, не было ли сбоя в ра- боте осцилляторов на выводах XOSC, опросив флаг XOSCFAIL. Если он установ- лен, то это говорит о некорректном значении счетчика реального времени RTC32. Если флаг BBBODF и/или BBPODF на предыдущем этапе оказался установлен- ным, то это говорит, что после отключения рабочего напряжения микроконтролле- ра, произошел сбой питания от батареи. В таком случае необходимо выполнить сле- дующую последовательность действий. 1. Установить в лог. 1 разряд ACCEN (разрешение доступа к модулю). 2. Установить в лог. 1 разряд RESET (сброс модуля). 3. Активизировать осциллятор на выводах XOSC. 4. Дождаться появления лог. 1 в разряде XOSCRDY регистра VBATSTATUS, что говорит о готовности осциллятора. 5. Активизировать режим обнаружения сбоев осциллятора, установив в лог. 1 раз- ряд XOSCFDEN регистра VBATCTRL. 6. Сконфигурировать и активизировать счетчик реального времени RTC32 (см. предыдущий раздел). В завершение отметим, что для сохранения данных в модуле питания от бата- реи перед потерей или провалом рабочего напряжения можно воспользоваться ре- гистровой парой BACKUP[O:1] (адреса в области ввода/вывода микроконтроллеров ATxmega А — $00F2 и $00F3). Обработка прерываний За обработку прерываний в микроконтроллерах ATxmega А отвечает програм- мируемый многоуровневый контроллер PMIC (Programmable Multi-level Interrupt
Обработка прерываний 125 Controller), который может определять приоритетность запросов и поддерживает немаскируемые прерывания. Каждому прерывания от периферийных устройств на- значен один из трех уровней приоритетности: низкий, средний или высокий. Пре- рывания более высокого уровня могут прерывать работу обработчиков прерываний более низкого уровня. В пределах каждого уровня приоритетности очередность об- работки прерываний определяется по старшинству адресов векторов прерывания (вектора с меньшими адресами имеют более высокий приоритет). Уровень того или иного прерывания определяется комбинацией двух разрядов в соответствующем управляющем регистре периферийного устройства: • 00 — прерывание запрещено; • 01 — прерывание низкого уровня; • 10 — прерывание высокого уровня; • 11 — прерывание среднего уровня. Например, уровень прерывания по переполнению одного из таймеров/счетчи- ков Микроконтроллера ATxmega А определяют разряды OVFINTLVL[1:0] соответ- ствующего регистра INTCTRLA. Так, если установлен уровень, отличной от “00”, и для микроконтроллера установлен флаг общего разрешения прерываний, то кон- троллер PMIC определяет возникновение переполнения по появлению лог. 1 в раз- ряде OVFIF соответствующего управляющего регистра INTFLAGS. Немаскируемые прерывания Немаскируемыми называются аппаратные прерывания, набор которых зависит от конкретной модели микроконтроллера. Подобные запросы обрабатываются неза- висимо от состояния флага общего разрешения прерываний и, в свою очередь, ни- когда не изменяют этот флаг. Никакие другие прерывания не могут прервать обра- ботчик немаскируемого прерывания. Если одновременно поступает несколько за- просов на обработку немаскируемого прерывания, то их приоритетность определя- ется по старшинству адресов векторов. Для того чтобы определить, обрабатывается ли в данный момент какое-либо немаскируемое прерывание, следует опросить разряд NMIEX управляющего реги- стра PMICSTATUS (адрес в области ввода/вывода микроконтроллеров ATxmega А — $00А0)(рис. 2.23). 7 6 5 4 3 2 1 0 NMIEX — — — — HILVLEX MEDLVLEX LOLVLEX Рис. 2.23. Регистр PMICSTATUS Первые три флага этого регистра определяют, активен ли в данный момент об- работчик прерывания высокого (HILVLEX), среднего (MEDLVLEX) или низкого (LOLVLEX) уровня. Если один из таких обработчиков был прерван немаскируемым прерыванием, то соответствующий флаг останется установленным до момента за- вершения прерванной процедуры. Регистр управления контроллером прерываний Для управления контроллером прерываний служит регистр PMICCTRL (адрес в области ввода/вывода микроконтроллеров ATxmega А — $00А2) (рис. 2.24).
126 Глава 2. Семейство AVR ATxmega 7 6 5 4 3 2 1 О RREN IVSEL — — — HILVLEN MEDLVLEN LOLVLEN Рис. 2.24. Регистр PMICCTRL Запись лог. 1 в один из первых трех разрядов этого регистра разрешает преры- вания нйзкого, среднего или высокого уровня. Разряд IVSEL определяет, куда помещаются вектора прерываний. Если он со- держит лог. 1, то векторы будут перемещены в начало раздела загрузчика памяти программ, в противном случае — в начало раздела приложения. При установке в лог. 1 разряда RREN активизируется циклическое планирова- ние прерываний низкого уровня, при котором адрес вектора последнего признанно- го прерывания низкого уровня получит самый низкий приоритет при следующем запросе на обработку одного или нескольких прерываний низкого уровня. Без при- менения такой схемы (т.е. при статическом определении приоритетности) может возникнуть ситуация, когда при наличии нескольких запросов низкого уровня до прерывания с самым низким приоритетом очередь так никогда и не дойдет. * При циклическом планировании адрес вектора последнего признанного преры- вания низкого уровня сохраняется в управляющем регистре INTPRI (адрес в облас- ти ввода/вывода микроконтроллеров ATxmega А — $00А1). Аналого-цифровое преобразование Аналого-цифровой преобразователь (АЦП) микроконтроллеров ATxmega А реализует 12гразрядное разрешение и допускает скорость преобразования до двух миллионов опросов в секунду. Его особенности: • измерения могут быть как на одиночном выводе, так и дифференциальными; в последнем случае для увеличения динамического диапазона возможно вклю- чение усилительного каскада; • доступны несколько внутренних сигнальных входов; • преобразование может быть начато или программно, или в качестве реакции на событие какого-либо периферийного устройства; • для получения опорных напряжений используются как очень точный внутрен- ний на 1 В, так и внешние источники; • доступен встроенный датчик температуры; • измерение может осуществляться одновременно по четырем каналам, каждому из которых соответствует собственный набор управляющих регистров (т.е. для АЦП можно создать четыре независимых конфигурации измерений, и затем ис- пользовать их по своему усмотрению в зависимости от потребностей приложе- ния); • в качестве аналоговых входов у микроконтроллеров ATxmega А используются выводы портов А и В. Для разрешения преобразований следует установить в лог. 1 разряд ENABLE управляющего регистра ADCxCTRLA (адрес в области ввода/вывода микрокон- троллеров ATxmega А — $0200 для АЦП на порту А и $0240 для АЦП на порту В). Одиночное преобразование по одному из четырех каналов начинается после уста- новки в лог. 1 соответствующего разряда CH[3:0]START в этом же регистре
Аналого-цифровое преобразование 127 ADCxCTRLA. По окончанию преобразования в одном из каналов соответствующий разряд аппаратно обнуляется. Конфигурирование АЦП \ До начала преобразования АЦП и канал необходимо сконфигурировать. Начнем с управляющего регистра ADCxCTRLB (адрес $0201 или $0241) (рис. 2.25). 7 6 5 4 3 2 10 — — — CONVMODE FREERUN RESOLUTION — Рис. 2.25. Регистр ADCxCTRLB управления АЦП Выбор разрешения преобразования Разрешение преобразования определяют разряды RESOLUTION регистра ADCxCTRLB (табл. 2.25). Таблица 2.25. Выбор разрешения аналого-цифрового преобразования RESOLUTION1 RESOLUTIONO Описание 0 0 1.2-разрядное разрешение, выравнивание результа- та по правому краю 1 0 8-разрядное разрешение, выравнивание результата по правому краю 1 1 12-разрядное разрешение, выравнивание результа- та по левому краю Выбор очередности преобразований в каналах Если с помощью разрядов CH[3:0]START регистра ADCxCTRLA задано преоб- разование одновременно для нескольких каналов, то они перебираются поочередно по направлению от нулевого к третьему. Микроконтроллеры ATxmega также позво- ляют задать циклический перебор всех или нескольких каналов. Для этого необхо- димо установить в лог. 1 разряд FREERUN регистра ADCxCTRLB и задать значения разрядов SWEEP[l:0] управляющего регистра ADCxEVCTRL (адрес $0203 или $0243): • 00 — только канал 0; • 01—каналы 0 и 1; • 10 — каналы 0, 1 и 2; • 11 — все четыре канала. Выбор режима измерения Если разряд CONVMODE регистра ADCxCTRLB содержит 0 (значение по умолчанию), то АЦП работает в режиме беззнакового измерения по одному каналу или опроса внутреннего сигнала. В противном случае используется знаковый ре- жим, в котором допустимо дифференциальное измерение. В случае беззнакового измерения на отрицательный вход АЦП подается половина опорного напряжения Vref минус некоторое фиксированное смещение AV, номинальное значение ко- торого составляет 0,05 • Vref- При беззнаковом режиме отрицательный вход соединен
128 Глава 2. Семейство AVR ATxmega с “землей” (в случае измерения внутреннего сигнала или сигнала на одиночном выводе) или же на него подается сигнал с одного из четырех аналоговых входов (ADC0-3 в случае диф- ференциального измерения без усиления или ADC4-7 в случае дифференциального измере- ния с усилением). Для каждого из четырех каналов АЦП тип измерения задается с помощью реги- стров с именами вида ADCxCHnCTRL (рис. 2.26) и ADCxCHnMUXCTRL (рис. 2.27), где “х” — “А” или “В”, а “п” — “0”..“3”. 7 6 5 4 3 2 1 0 START • — GAIN INPUTMODE Рис: 2.26. Регистр ADCxCHnCTRL управления каналом АЦП 7 6 5 4 3 2 1 0 — MUXPOS — MUXNEG Рис. 2.27. Регистр ADCxCHnMUXCTRL управления каналом АЦП Разряд START — это аналог соответствующего данному каналу разряда CHnSTART в регистре ADCxCTRLA. Разряды INPUTMODE[1:0] в комбинации с рассмотренным выше разрядом CONVMODE определяют источник входного измеряемого сигнала (табл. 2.26). Таблица 2.26. Определение входного измеряемого сигнала CONVMODE INPUTMODE1 INPUTMODEO Измеряемый сигнал 0 или 1 0 0 Внутренний на положительном входе АЦП 0 или 1 0 1 Одиночный аналоговый вход на положи- тельном входе АЦП 1 1 0 Дифференциальный входной сигнал 1 1 1 Дифференциальный входной сигнал с уси- лением Для последнего случая коэффициент усиления задают с помощью разрядов GAIN[2:0] регистра ADCxCHnCTRL: • 000—1; • 001—2; • 010 — 4; • 011—8; • 100 — 16; • 101—32; • 110 — 64. Разряды MUXPOS[2:0] в комбинации с рассмотренными выше разрядами INPUTMODE[1:0] определяют тип сигнала, подаваемого на положительный вход АЦП (табл. 2.27). ПРИМЕЧАНИЕ В микроконтроллерах с одним АЦП на положительный вход можно также подать сигнал из другого аналогового порта, отличного от основного. Для этого необходимо установить в лог. 1 разряд MUXPOS3.
Аналого-цифровое преобразование 129 Таблица 2.27. Выбор типа сигнала, подаваемого на положительный вход АЦП INPUTMODE[1:0] MUXPOS2 MUXPOS1 MUXPOS0 Тип сигнала 00 0 0 0 С датчика температуры 0 0 1 Внутреннее точное опорное напря- жение, базовое для других внутрен- них опорных напряжений 0 1 0 1/10 напряжения Vcc 0 1 1 С выхода ЦАП 01, 10,11 0 0 0 С входа ADC0 0 0 1 С входа ADC1 0 1 0 С входа ADC2 0 1 1 С входа ADC3 1 0 0 С входа ADC4 1 0 1 С входа ADC5 1 1 0 С входа ADC6 1 1 1 С входа ADC7 Разряды MUXNEG[1:O] определяют тип сигнала, подаваемого на отрицатель- ный вход АЦП в случае дифференциальных измерений (т.е. когда разряд INPUT- MODE^ 1) (табл. 2.28). Таблица 2.28. Выбор типа сигнала, подаваемого на отрицательный вход АЦП INPUTWIODEO MUXNEG1 MUXNEG0 Тип сигнала 0 0 0 С входа ADC0 0 1 С входа ADC1 1 0 С входа ADC2 1 1 С входа ADC3 1 0 0 С входа ADC4 0 1 С входа ADC5 1 0 С входа ADC6 1 1 С входа ADC7 Выбор опорного напряжения Опорное напряжение АЦП выбирают с помощью управляющего регистра AD- CxREFCTRL (адрес $0202 или $0242) (рис. 2.28). 765432 1 0 — — REFSEL BANDGAP TEMPREF Рис. 2.28. Регистр ADCxREFCTRL Разряды REFSEL[l:0] определяют источник опорного напряжения и диапазон преобразования: • 00 — внутреннее напряжение 1 В; • 01 — внутреннее напряжение Vcc/1.6; • 10 — внешнее напряжение на выводе AREF порта А (если такой вывод присут- ствует); • 11 — внешнее напряжение на выводе AREF порта В (если такой вывод присут- ствует).
130 Глава 2. Семейство AVR ATxmega Установка в лог. 1 разряда BANDGAP делает доступным для измерений с по- мощью АЦП внутренний точный источник опорного напряжения, определяемого шириной запрещенной зоны. Если какие-либо другие функции АЦП уже использу- ют это напряжение (например, в случае выбора внутреннего опорного напряжения 1 В), то разряд BANDGAP можно не устанавливать. Наконец, запись лог. 1 в разряд TEMPREF определяет в качестве опорного на- пряжение на выходе датчика температуры. Выбор коэффициента деления частоты тактирования АЦП микроконтроллеров ATxmega тактируется сигналом ClkpER, который слу- жит для обеспечения синхронизации периферийных устройств (см. рис. 2.15). Час- тоту этого сигнала для проведения измерений можно разделить, установив требуе- мое значение в первых трех разрядах управляющего регистра ADCxPRESCALER (адрес $0204 или $0244): • ООО — коэффициент деления 4; • 001 —коэффициент деления 8; • 010 — коэффициент деления 16; • 011 — коэффициент деления 32; • 100 — коэффициент деления 64; • 101—коэффициент деления 128; • 110 — коэффициент деления 256; • 111 — коэффициент деления 512. Результаты измерения При 12-разрядном разрешении и измерениях со знаком результат может нахо- диться в диапазоне -2048..2047 ($F800..$007FF). В беззнаковом режиме измерений результат находится в диапазоне 0..4095 (O..$OFFF). Полученное в результате преоб- разования значение записывается в регистровую пару RESH:RESL соответствующе- го канала. В режиме измерений с учетом знака результирующее значение вычисляется по формуле: 7? = (Г-У)/Kref-^-2047, где V* — напряжение на положительном входе АЦП; V — напряжение на отрица- тельном входе АЦП; Pref — опорное напряжение; К — коэффициент усиления (ес- ли не активен режим дифференциальных измерений с усилением, то он всегда равен 1). В случае беззнакового режима измерений функция преобразования имеет вид: R = (V - (-AV)) / Vref • 4095. С помощью разрядов RESOLUTION[1:0] управляющего регистра ADCxCTRLB (см. табл. 2.25) можно задать восьмиразряднре разрешение. В этом случае преобра- зование будет выполнено быстрее, однако сужается диапазон доступных значений. Прерывания от АЦП АЦП микроконтроллеров ATxmega А может формировать запросы на прерыва- ние двух видов:
Цифро-аналоговое преобразование 131 • по завершению преобразования в одном из каналов; • в том случае, если результат преобразования.выше или ниже заданного порого- вого значения. Управление прерываниями реализуется независимо для каждого канала с по- мощью регистра ADCxCHnINTCTRL (рис. 2.29). 7 6 5 4 3 2 1 О — — — — INTMODE INTLVL Рис. 2.29. Регистр ADCxCHnINTCTRL Разряды INTLVL[1:O] определяют уровень прерывания, а разряды INTMO- DE[1:O] — режим прерывания: • 00 — по завершению преобразования; • 01 — если результат меньше порогового значения; • 11 — если результат больше порогового значения. Для последних двух режимов пороговое значение сохраняют в регистровой napeADCxCMPH:ADCxCMPL (адреса $0218:$0219 или $0258:$0259). Момент возникновения прерывания в канале определяют по установке флага IF (нулевой разряд) в регистре ADCxCHnINTFLAG. При выполнении вектора преры- вания этот флаг автоматически сбрасывается. Кроме того, подобным же образом ус- танавливаются и автоматически обнуляются флаги CH[3:0]IF в управляющем реги- стре ADCxINTFLAGS (адрес $0206 или $0246). Цифро-аналоговое преобразование Цифро-аналоговый преобразователь (ЦАП) получает аналоговые напряжения из некоторых цифровых значений. В микроконтроллерах ATxmega А присутствует два ЦАП, которые реализуют 12-разрядное разрешение и могут выполнять до миллиона замеров в секунду. При этом в каждом ЦАП доступны два канала преобразований, а результирующее напряжение может выдаваться на один вывод или на два различ- ных вывода через схему выборки и хранения. Выходное напряжение определяется формулой: Рцап = CHnDATA / 4095 • Pref. Здесь CHnDATA — цифровые данные для преобразования, сохраняемые в ре- гистровой паре DACxCHnDATAH:DACxCHnDATAL Источник опорного напряже- ния Pref для ЦАП определяют разряды REFSEL[l:0] управляющего регистра DACxCTRLC (адрес $0302 или $0322): • 00 — внутренне напряжение 1 В; • 01—напряжение Усс, • 10 — напряжение на выводе AREF порта А; • 11 — напряжение на выводе AREF порта В. Режим преобразования задает управляющий регистр DACxCTRLB (адрес $0301 или $0321) (рис. 2.30).
132 Глава 2. Семейство AVR ATxmega 7 6 5 4 3 2 1 0 — CHSEL — — — CH1TRIG CH0TRIG Рис. 2.30. Регистр DACxCTRLB Выходные каналы ЦАП определяют разряды CHSEL[1:0]: • 00 — только по одному каналу 0; • 10 — по двум каналам через схему выборки и хранения. Напряжение на выходе ЦАП можно также использовать внутренне. Это опреде- ляется разрядами регистра DACxCTRLA (адрес $0300 или $0320) (рис. 2.31). 7 6 5 4 3 2 1 0 — — — IDOEN CH1EN CH0EN — ENABLE Рис. 2.31. Регистр DACxCTRLA Рассмотрим назначение разрядов этого регистра: • ENABLE — активизация или отключение ЦАП в целом; • CH0EN — если в этом разряде — лог. 1, то напряжение с выходного канала 0 подается на вывод микроконтроллера; в противном случае оно используется только внутренне; • CH1EN — если в этом разряде — лог. 1, то напряжение с выходного канала 1 подается на вывод микроконтроллера; в противном случае оно используется только внутренне; • IDOEN — установка в лог. 1 этого разряда подает напряжение с выхода ЦАП на входные мультиплексоры АЦП и аналогового компаратора. Начало преобразования Преобразование начинается автоматически по записи данных в регистровую пару DACxCHnDATAH:DACxCHnDATAL или по заданному входящему событию в выбранном канале событий, если в регистрах присутствуют данные, которые еще не были преобразованы. Последний режим работы определяют разряды CH1TRIG и CH0TRIG управляющего регистра DACxCTRLB (см. рис. 2.30). Если в один из них записать лог. 1, то преобразование в соответствующем канале начнется при на- личии данных в регистре DACxCHnDATAH по поступлению события, заданного тремя разрядами EVSEL регистра DACxEVCTRL (адрес $0303 или $0323): • 000 — канал событий 0; • 001 — канал событий 1; • 010 — канал событий 2; • 011 — канал событий 3; • 100 — канал событий 4; • 101 — канал событий 5; • 110 — канал событий 6; • 111 — канал событий 7.
Цифро-аналоговое преобразование 133 Завершение преобразования определяют по установке флагов CH0DRE и CH1DRE,сигнализирующих о том, что регистр данных в соответствующем канале пуст, и в него можно записать очередное значение. Ограничения на время преобразования Для того чтобы цифро-аналоговое преобразование давало корректные результа- ты, необходимо соблюдать некоторые ограничения по времени с привязкой к часто- те тактирования периферии CIRper: • интервал между двумя преобразованиями не должен быть меньше 1 мкс для од- ноканального режима и 1,5 мкс для двухканального; • время обновления в двухканальном режиме не должно превышать 30 мкс. Эти настройки определяет управляющий регистр DACxTIMCTRL (адрес $0304 или $0324) (рис. 2.32). 7 6 5 4,3 2 1 0 — CONINTVAL REFRESH Рис. 2.32. Регистр DACxTI MCTRL Разряды CONINTVAL[2:0] задают минимальный интервал между двумя после- довательными преобразованиями (табл. 2.29). Таблица 2.29. Настройка минимального интервала между двумя преобразованиями CONINTVAL2 CONINTVAL1 CONINTVALO Количество циклов CIKper Одноканальный режим Двухканальный режим 0 0 0 1 1 0 0 1 2 3 0 1 0 4 6 0 1 1 8 * 12 1 0 0 16 24 1 0 1 32 48 1 1 0 64 96 1 1 1 128 192 Разряды REFRESH[3:0] задают время обновления в двухканальном режиме: • 0000 — 16 циклов ClkpER; • 0001 — 32 цикла CIRper; • 0010 — 64 цикла С IRper; • 0011 — 128 циклов ClkpER; • 0100 — 256 циклов CIRper; • 0101 — 512 циклов CIRper; • 0110 — 1024 цикла CIRper; • 0111 — 2048 циклов CIRper; • 1000 — 4096 циклов CIRper; • 1001 — 8192 цикла CIRper; • 1010 — 16384 цикла CIRper;
134 Глава 2. Семейство AVR ATxmega • 1011 — 32768 циклов CIIcper; • 1100 — 65536 циклов ClkpER; • 1111 — отключение автоматического обновления. Аналоговый компаратор Аналоговые компараторы микроконтроллеров ATxmega А сгруппированы по два на каждый аналоговый порт (рис. 2.33). Со входа микроконтроллера От внутреннего источника Со входа микроконтроллера От внутреннего источника Отмасштабированное Усс Со входа микроконтроллера От внутреннего источника Выход 0 микроконтроллера Со входа микроконтроллера От внутреннего источника Отмасштабированное Усс Рис. 2.33. Два аналоговых компаратора на одном порту Входные сигналы для положительного и отрицательного входов каждого из двух компараторов определяют управляющие регистры ACxnMUXCTRL, где “х” обозначает порт А или В, а “п” — номер компаратора (для порта А такие два реги- стра имеют адреса $0382 и $0383, а для порта В — $0392 и $0393) (рис. 2.34). 7 6 5 4 3 2 1 0 MUXPOS MUXNEG Рис. 2.34. Регистр ACxnMUXCTRL Разряды MUXPOS[2:0] задают источник для положительного входа компарато- ра • 000 — аналоговый вход 0; • 001 — аналоговый вход 1; • 010 — аналоговый вход 2; • 011 — аналоговый вход 3; • 100 — аналоговый вход 4; • 101 — аналоговый вход 5; • 110 — аналоговый вход 6; • 111 — выход ЦАП.
Аналоговый компаратор 135 Разряды MUXNEG[2:0] задают источник для отрицательного входа компаратора: • ООО — аналоговый вход 0; • 001 — аналоговый вход 1; • 010 — аналоговый вход 3; • 011 — аналоговый вход 5; • 100 — аналоговый вход 7; • 101 — выход ЦАП; • 110 — внутренне точное опорное напряжение; • 111 — отмасштабированное напряжение Усс- Коэффициент масштабирования напряжения Усс записывают в младшие пять разрядов регистра ACxCTRLB. Отмасштабированное напряжение, подаваемое на отрицательный вход компаратора, имеет значение: KsCALE = Исс • (К + 1) / 64. Режимы работы компаратора Под режимами работы компаратора подразумеваются различные условия фор- мирования запросов на прерывание. За это отвечают управляющие регистры ACxnCTRL (рис. 2.35) и ACxWINCTRL (рис. 2.36). 7 6 5 4 3 2 1 0 INTMODE INTLVL HSMODE HYSMODE ENABLE Рис. 2.35. Регистр ACxnCTRL 7 6 5 4 3 2 1 0 — — — WEN WINTMODE WINTLVL Рис. 2.36. Регистр ACxWINCTRL Рассмотрим назначение разрядов регистра ACxnCTRL: • ENABLE — активизация компаратора; • HYSMODEfl :0] — выбор режима входного гистерезиса во избежание постоян- ного переключения на выходе компаратора, если входные напряжения близки по значению, и на них воздействую помехи: ► 00 — гистерезис отсутствует; ► 01 — малый гистерезис; ► 10 — большое гистерезис; • HSMODE — если в этот разряд записать лог. 1, то компаратор перейдет в ско- ростной режим работы с целью минимизации задержки на распространение сигнала (следует учитывать, что в таком режиме потребляется больше энергии); • INTLVL[1:0] — разряды, определяющие уровень прерывания от компаратора; • INTMODE[1:0] — эти разряды задают режим формирования прерываний от аналогового компаратора: ► 00 — по переключению уровня выходного сигнала; ► 10 — по ниспадающему фронту выходного сигнала; ► 11 — по нарастающему фронту выходного сигнала.
136 Глава 2. Семейство AVR ATxmega При записи лог. 1 в разряд WEN регистра ACxWINCTRL (см. рис. 2.36) два компаратора на одном порту переходят в режим “окна”, в котором можно опреде- лить, попадает ли входной сигнал в заданный диапазон напряжений. Схема сигна- лов в таком режиме показана на рис. 2.37. Рис. 2.37. Схема сигналов в режиме “окна” Разряды WINTLVL[1:O] задают уровень прерывания от компаратора в режиме “окна”, а разряды ^ВЧТМОПЕ[1:0] — режим прерывания: • 00 — если входной сигнал больше верхнего предела “окна”; • 01 — если входной сигнал попадает внутрь “окна”; • 10 — если входной сигнал меньше нижнего предела “окна”; • 11 — если входной сигнал лежит вне “окна”. Флаги состояния компаратора и прерываний содержатся в управляющем реги- стре ACxSTATUS (адрес $0387 или $0397) (рис. 2.38). 7 6 5 4 3 2 1 0 WSTATE АС1STATE AC0STATE — WIF AC1IF AC0IF Рис. 2.38. Регистр ACxSTATUS Разряды AC0IF и,АС 1 IF — флаги прерываний от компараторов 0 и 1 соответст- венно, а разряд W1F — флаг прерывания в режиме “окна”. Все три флага при вы- полнении соответствующего вектора прерывания автоматически сбрасываются. Разряды AC0STATE и АС 1 STATE показывают состояние входного сигнала компаратора 0 и 1 соответственно, а разряды WSTATE[l:0] — состояние в режиме “окна”: • 00 — сигнал больше верхнего предела “окна”; • 01 — сигнал — внутри “окна”; • 10 — сигнал меньше нижнего предела “окна”. Средства шифрования В микроконтроллерах ATxmega поддерживаются популярные стандарты шиф- рования AES (Advanced Encryption Standard) и DES (Data Encryption Standard), при- чем последний реализован на уровне процессорного ядра с помощью специальной команды des. Эта команда, занимающая один цикл, для шифрования или дешифро- вания блока из восьми байт (64 бит) данных должна быть выполнена подряд 16 раз.
Средства шифрования 137 Перед началом шифрования/дешифрования в регистровый файл должны быть за- гружены блоки данных (регистры R0-R7) и ключа (регистры R8-R15). Одно выполнение команды des выполняет один цикл алгоритма DES. Для по- лучения корректного зашифрованного текста требуется 16 повторов. Промежуточ- ные результаты после каждого шага сохраняются в тех же регистрах R0-R15. После 16 повторов ключ будет храниться в регистрах R8-R16, а зашифрованный/ дешиф- рованный текст — в регистрах R0-R7. В качестве операнда команде des передается порядковый номер повторения, а флаг Н в регистре состояния определяет характер операции: шифрование (Н=0) или дешифрование (Н=1). Модуль шифрования AES В состав микроконтроллеров ATxmega А входит модуль шифрова- ния/дешифрования по алгоритму AES. Дня шифрования в память ключа необходи- мо загрузить 128-битный ключ, а в память состояния — 128-битный блок данных. Для этого следует последовательно 16 раз выполнить запись в регистры KEY (адрес $00СЗ) и STATE (адрес $00С2). Зашифрованный/дешифрованный текст доступен в памяти состояния после 375 тактовых циклов. Перед загрузкой ключа и данных модуль AES необходимо настроить. Для этого служит управляющий регистр AESCTRL (адрес $00С0) (рис. 2.39). 7 6 5 4 3 2 1 0 START AUTO RESET DECRYPT — XOR — — Рис. 2.39. Регистр ACxSTATUS Характер работы модуля определяет разряд DECRYPT, Если он содержит лог. 0, то будет выполнено шифрование, в противном случае — дешифрование. Если .установить в лог. 1 разряд XOR, то данные, загружаемые в память состоя- ния, будут поразрядно объединяться с уже хранимыми там данными с помощью ло- гической операции “Исключающее ИЛИ”. В противном случае новые данные будут просто затирать старые. Установка в лог. 1 разряда RESET приведет к сбросу модуля шифрования AES по ближайшему нарастающему фронту сигнала тактирования периферии. Все реги- стры, указатели и блоки памяти модуля примут исходные значения. Разряд сохраня- ет состояние лог. 1 на протяжении одного тактового цикла, после чего автоматиче- ски обнуляется аппаратно. Для запуска процедуры шйфрования/дешифрования необходимо записать лог. 1 в разряд START. Запись в него лог. 0 прервет активный процесс. При обнаружении установленных флагов SRIF или ERROR в регистре AES STATUS (см. ниже) разряд START обнуляется автоматически. Запись лог. 1 в разряд AUTO активизирует режим автозапуска процесса шифро- вания/дешифрования. В таком режиме процесс начинается (т.е. автоматически уста- навливается в лог. 1 разряд START), если выполнены следующие условия: • разряд AUTO инициализирован до начала загрузки данных в память состояния; • указатели памяти ключа и памяти состояния — нулевые; • память состояния полностью загружена данными. В случае успешного завершения шифрования/дешифрования результат будет получен в памяти состояния, на что указывает установленный флаг SRIF в регистре
138 Глава 2. Семейство AVR ATxmega AESSTATUS (адрес $00С1). Для получения этих данных необходимо 16 раз после- довательно обратиться на чтение к регистру STATE. После первого же такого об- ращения флаг SRIF будет сброшен. Установка флага SRIF формирует запрос на прерывание от модуля шифрования AES. Уро- вень такого прерывания определяют первые два разряда (INTLVL[1:0]) управляющего регист- ра AESINTCTRL (адрес $0004). В случае возникновения ошибки при работе с модулем шифрования AES в ре- гистре AESSTATUS будет установлен флаг ERROR. Это может произойти в двух случаях: • запись лог. 1 в разряд START регистра AESCTRL в тот момент, когда память состояния или ключа еще не полностью загружена или прочитана; • доступ на чтение или запись к регистру AESCTRL в тот момент, когда разряд START содержит лог. 1. Для сброса флага ERROR в его позицию необходимо записать лог. 1. Модуль обмена данными по инфракрасному каналу Микроконтроллеры ATxmega оснащены модулем обмена данными по инфра- красному каналу (IRCOM), поддерживающий скорость передачи до 115,2 кбит/с. При этом реализованы три схемы модуляции: • 3/16 периода передачи данных; • фиксированная, программируемая длительность импульсов, основанная на сиг- нале тактирования периферии ClkPER; • отключенная импульсная модуляция. Схема модуляции устанавливается путем записи некоторого значения в уп- равляющий регистр TXPLCTRL (адрес $08F0). Если этот регистр содержит 0, то ис- пользуется 3/16 периода передачи данных. Запись в него значения от 1 до 254 дает фиксированную длину импульсов, а значение 255 отключает кодирование импуль- сов, в результате чего сигналы RX и ТХ проходят через модуль 1RCOM без измене- ний. Модуль IRCOM может быть подключен к любому приемопередатчику USART для кодирования/декодирования инфракрасных импульсов (рис. 2.40). Модуль IRCOM активизируется автоматически, когда какой-либо из модулей USART переходит в режим инфракрасной передачи. Для этого необходимо записать “10” в старшие два разряда управляющего регистра USARTxCTRLC. ... ...... ....................... .......--... . — ЦШшШ:. ..ЖМММВ. В каждый момент времени обмениваться данными с модулем IRCOM может только один приемопередатчик USART. Кроме того, в качестве входящего сигнала для приемника IRCOM может слу- жить какой-либо канал событий, который определяется записью битовой комбина- ции “1ххх” в младшие четыре разряда управляющего регистра IRCOMCTRL (адрес $08F2). Комбинации “1000” соответствует канал событий 0, а комбинации “1111” — канал событий 7.
Модуль обмена данными по инфракрасному каналу 139 Система обра- ботки событий EairJ События IRCOM Декодиро- вание им- пульсов RXD (код.) USARTxn USARTC1 USARTC0 Кодирова- ние импуль- сов RXD (цекод.) TXD (декод.) TXD (код.) g RXDnx 3 TXDnx .й TXD.,, RXD... RXDC1 TXDC1 RXDC0 TXDC0 Рис. 2.40. Подключение модуля IRCOM к USART
ЧАСТЬ 11 Компиляторы и средства разработки для микроконтроллеров AVR
Глава 3 Компилятор WinAVR WinAVR (http: //winavr. sourceforge. net) — это набор инструментальных средств, предназначенных для программирования RISC-микроконтроллеров семей- ства AVR на языке С. Он был создан трудом множества добровольцев, посвятивших свое свободное время тому, чтобы бескорыстно помогать другим. В комплект по- ставки входит компилятор GNU GCC для языков С и C++, а также — замечательная программа Programmers Notepad, которая будет использоваться в этой книге для разработки программ. Установочный файл WinAVR средств находятся на прилагаемом к книге компакт-диске в папке Software\AVR\WinAVR. Для запуска программы Programmers Notepad следует запустить на выполнение файл pn.exe, который находится в папке \WinAVR\pn. или воспользоваться коман- дой меню Пуск ► Все программы ► WinAVR ► Programmers Notepad. Интерфейс Programmers Notepad прост и интуитивно понятен: за исключением меню Tools, все остальные меню — обычные для любого приложения Windows (File, Edit, View, Window, Help), и потому на них мы останавливаться не будем. Окно Pro- grammers Notepad при первом запуске показано на рис. 3.1. Рис. 3.1. Окно Programmers Notepad при первом запуске
142 Глава 3. Компилятор WinAVR Внешние средства компиляции и синтаксического анализа активизируются че- рез меню Tools (если в среде разработки открыт какой-либо файл с исходным ко- дом). Для того чтобы добавить в это меню команду для создания файлов, исполь- зуемых при эмуляции в среде AVRStudio, необходимо выполнить команду Tools ► Options и в диалоговом окне Options выбрать категорию параметров Tools (рис. 3.2). Рис. 3.2. Внешние средства компиляции и синтаксического анализа Для того чтобы добавить новый элемент в список, нажмем кнопку Add и в диа- логовом окне Свойства: New Tool установим следующие параметры на вкладках Properties (Свойства) и Console I/O (Консольный ввод-вывод) (рис. 3.3): • Name—[WinAVR] Make Extcoff — имя средства; Рис. 3.3. Добавление средства создания файлов COFF для эмуляции программ в среде AVR Studio
Эмуляция 143 • Command — make. exe — компиляция и сборка программы осуществляется с помощью средства make. ехе, расположенного в папке \winAVR\utils\ bin, на основании параметров компиляции (формат выходного файла, тип мик- роконтроллера и др.), указанных в файле makefile (такой файл должен быть скопирован в ту же папку, что и исходный код программы — это будет показа- но чуть позже); • Folder,— %d — это означает, что выходные файлы размещаются в той же папке, что и исходные; • Parameters — extcof f — параметр, передаваемый файлу make. ехе; здесь воз- можны следующие варианты: ► all — на выходе получают файлы для загрузки в микроконтроллер; ► clean — удаление всех выходных файлов; ► cof f — преобразование файлов из формата ELF (Executable and Linkable For- mat) в AVR COFF (Common Object File Format) для использования в среде AVR Studio 3.x или VMLAB; ► extcof f — преобразование файлов из формата ELF в расширенный формат AVR COFF для использования в среде AVR Studio 4.x или выше) — нас ин- тересует именно этот вариант; ► program — загрузка НЕХ-файла в микроконтроллер с помощью специальной программы avrdude. ехе, входящей в пакет WinAVR; ► filename. s — просто компиляция файла filename. с в ассемблерный код; • Save — Current File — автоматическое сохранение при компиляции только те- кущего файла с исходным кодом; • выбор элемента Use the main output window на вкладке Console I/O означает, что для вывода сообщений о ходе и результатах компиляции будет использовано общее, а не индивидуальное окна Output (расположено вдоль нижнего края окна Programmers Notepad); • Clear output before running? — этот флажок лучше сбросить, чтобы содержимое окна Output не очищалось перед очередным вызовом средства. Нажимаем кнопку ОК вначале в окне Свойства: New Tool, а затем — в окне Options, чтобы сохранить изменения в списке подключаемых средств. Процесс компиляции в среде Programmers Notepad проиллюстрируем на приме- ре простой программы, создающей эффект сигнала “SOS” с помощью светодиодов, подключенных к микроконтроллеру AVR. Для создания исходного кода программы в среде Programmers Notepad можно воспользоваться одним из двух способов: • выполнить команду меню File ► New ► C/C++, чтобы создать новый файл исход- ного кода, а затем ввести в него текст из листинга 3.1; после этого следует вы- полнить команду меню File ► Save (комбинация клавиш <Ctrl+S>) и сохранить созданный файл в отдельной папке под именем SOS. с; • предварительно скопировать с прилагаемого к книге компакт-диска на жесткий диск папку Projects\WinAVR\SOS, а затем выполнить команду меню File ► Open (комбинация <Ctrl+O>) и открыть из скопированной папки файл sos. с. Листинг 3.1. Файл SOS. с для компилятора WinAVR #include <avr/io.h> #include cutil/delay.h>
144 Глава 3. Компилятор WinAVR Листинг 3.1. Окончание void Pause(int ms) { PORTD = OxFF; //Все светодиоды отключены _delay_ms(ms); //Задержка void P(void) { PORTD* *= 0; _delay_ms(500); Pause(500); void D(void) { PORTD = 0; _delay_ms(1000); Pause (500)1; } //Включаем все светодиоды //Короткая задержка //Пауза с погасшими светодиодами //Включаем все светодиоды //Длинная задержка //Пауза с погасшими светодиодами int main (void) { DDRD = OxFF; // Настройка порта D для вывода while(1) //Бесконечный цикл { Р(); Р(); Р();//.. . DO; D(); D(); //------- Р(); Р(); Р(); //. . . Pause(10000); } J______________________ ПРИМЕЧАНИЕ Программные элементы мы пока рассматривать не будем, поскольку это —• материал сле- дующих глав. Этот пример используется только для изучения среды программирования. Перед компиляцией заглянем в файл makefile. Скопируйте его в папку с файлом SOS. с из папки \Projects\WinAVR\SOS, если еще этого не сделали. При копировании этого файла из проекта в проект изменению подлежат, в основном, следующие поля: • мои — тип микроконтроллера, для которого создаются выходные файлы; • F_CPU — рабочая частота микроконтроллера в герцах; • FORMAT — формат загружаемого файла (используются значения srec, ihex, binary); • target — имя исходного файла (без расширения . с). Предположим, программа SOS должна компилироваться для микроконтроллера Atmegal69 в формате ihex (читатель может использовать необходимые ему значе-
Эмуляция 145 ния). В этом случае соответствующий фрагмент файла makefile будет выглядеть следующим образом: # MCU name MCU = atmegal69 # Output format, (can be srec, ihex, binary) FORMAT = ihex # Target file name (without extension). TARGET = SOS Теперь откомпилируем программу SOS. с. Для этого в среде Programmers Note- pad выполним команду меню Tools ► [WinAVR] Make АП. Если в окне Output в нижней части Programmers Notepad не было выдано сообщений об ошибках, значит компи- ляция прошла успешно и можно создать файл для эмулятора AVR Studio. Для этого выполним команду меню Tools ► [WinAVR] Make Extcoff. В результате в одной папке с файлом SOS. с будет создан файл SOS. cof. Обратите внимание на панель Text Clips (Фрагменты текста), расположенную вдоль левого края окна Programmers Notepad. Оно содержит список всех символов из таблицы ASCII с указанием их кода в десятичной и шестнадцатеричной форме. Для быстрой вставки того или иного символа в текст программы достаточно дважды щелкнуть мышью на требуемом элементе в этом списке. Кроме того, справа от вкладки Text Clips находится вкладка Tags (Метки), отображающая программу в виде иерархической структуры ее функций. Для быстрого перехода к той или иной функции достаточно просто дважды щелкнуть мышью на соответствующем элементе в панели Tags.
Глава 4 Среда разработки AVR Studio AVR Studio — среда, созданная компанией Atmel (распространяется бесплатно), которая используется для загрузки созданных программ в тот или иной программа- тор, а также эмуляции выполнения программ на том или ином микроконтроллере. • В этой книге рассматривается версия AVR Studio 4.13, установочный файл которой находится на прилагаемом к книге компакт-диске в папке Sof tware\AVR\AVRStudio4. AVR Studio — это интегрированная среда разработки (IDE — Integrated Devel- opment Environment), которая очень удобна для отладки AVR-приложений в операционной системе Windows. Эта среда предлагает интерфейс программного имитатора и Ьнутрисхемного эмулятора для микроконтроллеров AVR RISC. Кроме того, AVR Studio поддерживает набор разработчика STK500, позволяющий про- граммировать AVR-устройства, а также новый встроенный эмулятор JTAG. Поскольку описание эмуляторов, которые сами по себе не являются составной частью AVR Studio, а должны приобретаться у компании Atmel, выходит за темати- ческие рамки этой книги, то в дальнейшем ограничимся только рассмотрением ин- тегрированного' имитатора. Среду AVR Studio можно запустить по команде меню Пуск ► Все программы ► Atmel AVR Tools ► AVR Studio 4. При первом запуске AVR Studio на экране появится окно приветствия (рис. 4.1). Рис. 4.1. Окно приветствия AVR Studio 4 С помощью этого окна можно выполнить одну из трех операций: • создать новый проект “с нуля” — кнопка New Project; • открыть какой-либо файл . cof или . hex с диска — кнопка Open;
Эмуляция 147 • открыть один из проектов, которые использовались последними — для этого следует выбрать один из элементов в расположенном ниже списке. Для примера, загрузим для эмуляции созданную в предыдущей главе програм- му SOS.с. Для этого в окне приветствия нажмем кнопку Open и откроем файл SOS.cof. В результате будет предложено указать имя для проекта AVR Studio, со- храняемого в файле .aps. Назовите проект SOS cof.aps и нажмите кнопку Save (Сохранить). В результате откроется окно, в котором необходимо выбрать тип эму- лятора и микроконтроллера (рис. 4.2). Рис. 4.2. Выбор эмулятора и типа микроконтроллеров В данном случае нас интересует интегрированный имитатор AVR Simulator и микроконтроллер Atmega169 (читатель может использовать другой необходимый ему тип микроконтроллеров). Теперь можно нажать кнопку Finish (Готово), чтобы перейти к эмуляции и отладке программы. ПРИМЕЧАНИЕ Для того чтобы окно приветствия при последующих запусках AVR Studio не отображалось, в нем следует сбросить флажок Show dialog at startup. В таком случае все операции по соз- данию и загрузке проектов выполняются с помощью команд меню File и Project, а окно выбо- ра эмулятора и типа микроконтроллеров, соответствующее рис. 4.2, открывается по команде меню Debug ► Select Platform and Device Окно AVR Studio при открытии нового проекта показано на рис. 4.3. В данный момент в рабочем пространстве отображаются следующие панели: • Processor — текущее содержимое счетчика команд (Program Counter), указателя вершины стека (Stack Pointer), регистров двойной длины X, Y и Z, счетчика вы- полненных циклов (Cycle Counter), тактовой частоты процессора (Frequency), ре- гистра состояния SREG, 32-х рабочих регистров, а также — текущий момент времени в ходе выполнения программы (Stop Watch); • Disassembler — дизассемблированный код программы; • I/O View — содержимое регистров всех периферийный устройств и портов вы- бранного микроконтроллера; • Message — окно с сообщениями о ходе выполнения различных операций в среде AVR Studio.
148 Глава 4. Среда разработки AVR Studio Рис. 4.3. Проект AVR Studio Содержимое счетчика команд, регистров X, Y, Z и R00-R31, а также — разря- дов регистров периферии и SREG можно изменять вручную в ходе отладки про- грамм, щелкнув на них мышью. Измененные эмулятором или пользователем данные обозначаются в AVR Studio красным цветом (для числовых данных). Установлен- ным в лог. 1 разрядам в регистровых полях соответствуют серые, а обнуленным — белые прямоугольники. Строка, подлежащая исполнению первой, обозначена в окне Disassembler жел- той стрелкой. Для того чтобы увидеть исходный код программы, следует щелкнуть мышью на вкладке Project (Проект) в окне Processor, а затем — дважды щелкнуть на элементе SOS_cof ► Source ► SOS.c в иерархической структуре проекта (рис. 4.4). Следует учитывать, что исходный код извлечен из файла . cof или . hex, и по- тому редактированию не подлежит. Изменения следует вносить в среде Program- mers Notepad, а затем — по-новому выполнять компиляцию и создание объектного файла и переключиться в AVR Studio. Если в AVR Studio был открыт тот же файл, то внешние изменения будут распознаны и на экране появится предложение авто- матически обновить содержимое окна исходного кода. Эту же операцию можно вы- полнить и вручную с помощью кнопки панели инструментов Reload Object File. Эмуляция Как уже было отмечено ранее, окно I/O View позволяет контролировать работу устройств ввода-вывода микроконтроллера, выбранного для эмуляции. Например,
Эмуляция 149 с помощью элемента PORTD мы можем увидеть созданную ранее программу SOS. с в действии (рис. 4.5). Для этого достаточно запустить ее на выполнение командой 3 меню Debug ► Auto Step (комбинация клавиш <Alt+F5>) или соответствующей кнопкой панели инструментов Debug. Рис. 4.4. Просмотр исходного кода программы Рис. 4.5. Программа SOS включает все “светодиоды”, подключенные к выводам порта D
150 Глава 4. Среда разработки AVR Studio ПРИМЕЧАНИЕ Команда Auto Step отличается от команды Run (клавиша <F5>) тем, что в ходе выполнения программы после каждого шага обновляются окна AVR Studio (в случае команды Run — не обновляются). - ВНИМАНИЕ! Поскольку эмулятор выполняет программу в виртуальной среде, она работает значительно медленнее, чем в реальном микроконтроллере (особенно, выполнение функций задержки, наподобие _delay__ms из программы SOS.с). Если попытаться запустить программу SOS на эмуляцию в том виде» в каком она показана в листинге 3.1, то функции _delay_ms будут выполняться так долго, что может показаться, что программа “зависла”. Во избежание этого на этапе отладки в AVR Studio значения задержек следует выбирать в сотни или даже тысячи раз меньше. Например, в программе SOS короткой задержке может соответствовать значение 1 вместо 500, длинной — значение 2, а паузе — 10. Если даже такие задержки покажутся чи- тателю слишком долгими, то на этапе отладки можно заменить вызов функции _delay__ms вызовом функции delay us, которая реализует задержки в микросекундах. Для того чтобы приостановить выполнение программы, следует выполнить ко- манду меню D^bug ► Break (комбинация клавиш <Ctrl+F5>) или нажать соот- ветствующую кнопку панели инструментов Debug. Полному останову с воз- вратом к первой команде соответствует команда Debug ► Reset (комбинация клавиш <Shift+F5>). Ж В ходе выполнения программы можно наблюдать за изменением состояния ре- гистров процессора и периферии в окнах Processor и I/O View. По умолчанию значе- ния в окне Processor отображаются в шестйадцатеричной форме. Для того чтобы переключиться к десятичному формату отображения, следует щелкнуть внутри это- го окна правой кнопкой мыши и сбросить в контекстном меню флажок Hexadecimal Display (рис. 4.6). Progfam Counter Stack Pointer X pointer Y pointer Z pointer Cycle Counter Frequency Stop V/at ch SREG Registers R00 R01 R02 0x000088 1275 [256 1279 808 7546 4 0000 MHz 1886 50 us Г~! ГП F-] ГП ГЛ ПЛ СП ГП о о о Рис. 4.6. Переключение формата отображения значений регистров в окне Processor Для возврата к шестнадцатеричному представлению необходимо опять устано- вить флажок возле пункта Hexadecimal Display. Другие важные команды контекстного меню окна Processor: • Reset Stopwatch — обнуление значения “секундомера”; • Reset Cycle Counter — обнуление значения счетчика циклов; • Show Stopwatch as milliseconds — выбор в качестве единиц времени для “секун- домера” миллисекунд. В результате эта команда контекстного меню изменится на Show Stopwatch as microseconds, и ее выбор приведет к возврату к микросе- кундным отсчетам.
Окно Memory 151 Окно Memory Окно Memory позволяет пользователю при необходимости контролировать или изменять некоторую область памяти микроконтроллера AVR: память программ, па- мять EEPROM, память данных, память ввода/вывода, рабочие регистры процессора. Одновременно могут быть открыты сразу три окна Memory — для этого использу- ются соответствующие команды меню View (рис. 4.17), комбинация клавиш rzzi <Alt+4>, а также кнопка Toggle Memory Window панели инструментов. |ЛЦ Рис. 4.7. Два окна Memory AVR-Studio Тип области памяти выбирают с помощью раскрывающегося списка, располо- женного в верхнем левом углу окна Memory. В примере на рис. 4.7 для верхнего ок- на была выбрана память программ, а для нижнего — память данных. С помощью кнопки 8/16, расположенной справа от раскрывающегося списка, а также команд контекстного меню 1 Byte и 2 Byte пользователь может переклю- чаться между режимами разбивки дампа памяти на одно- и двухбайтные фрагменты, а с помощью кнопки abc — отобразить/скрыть дополнительную колонку с ASCII- значениями отображенной области памяти. Л Поле Address служит для отображения и ввода адреса ячейки памяти, на кото- рой в данный момент установлен курсор. Количество колонок со значениями ячеек памяти выбирается с помощью раскрывающегося списка Cols (если в этом списке выбран элемент Auto, то количество колонок выбирается автоматически в зависимо- сти от ширины окна Memory). Содержимое ячейки памяти в окне Memory можно легко изменить. Введенные значения расцениваются как шестнадцатеричные числа, при этом новое значение попадает в ячейку памяти сразу же после каждого нажатия клавиши. Если это неже- лательно (например, в случае применения эмулятора при доступе на запись к регистру UDR приемопередатчика USART инициируется новая передача, хотя в этом случае байт еще неполный), то новое значение можно альтернатив- но вводить в специальном диалоговом окне, которое откры- вается по двойному щелчку мыши на соответствующей ячейке памяти (рис. 4.8). В этом случае вводимое значение записывается в ячейку только тогда, когда в окне Edit будет нажата кнопка ОК (клавиша <Enter>). Значения, которые изменились с момента последней операции отладки, ото- бражаются красным шрифтом. Адреса восьмиразрядных ячеек памяти и ASCII- Рис. 4.8. Изменение значения ячейки памяти
152 Глава 4. Среда разработки AVR Studio символы выделены серым фоном, а адреса 16-разрядных ячеек памяти — голубым фоном. Окно Register Окно Register (рис. 4.9) показывает содержимое 32-х рабочих регистров микро- контроллера, которое обновляется после выполнения каждой команды. Оно откры- вается по соответствующей команде меню View, по нажатию комбинации клавиш <Alt+O> или с помощью кнопки Toggle Register Window панели инструментов. Рис. 4.9. Окно Register среды AVR Studio Значения, Изменившиеся в результате последней отладочной операции (напри- мер, при пошаговом проходе или в результате достижения точки останова) отобра- жаются красным шрифтом. Для того чтобы изменить содержимое регистра, следует остановить выполнение программы и сделать двойной щелчок мышью на выбранном регистре. Правила из- менений значений в регистрах аналогичны правилам изменения значений в окнах Memory. Окно Watch Рис. 4.10. Окно Watch среды AVR Studio Окно Watch (рис. 4.10) служит для ото- бражения типов, значений и адресов таких объектов как, например, переменные в про- грамме на С. Оно открывается по соответст- вующей команде меню View, по нажатию комбинации клавиш <Alt+l> или с помощью кнопки Toggle Watch Window панели ин- струментов. mU Это окно состоит из четырех колонок. В первой указано имя объекта, за кото- .рым ведется наблюдение, во второй — текущее значение, в третьей — тип объекта (Integer, unsigned Char ит.д.), а в четвертой —его адрес. Пользователь может добавлять новые объекты в окно Watch по команде контекстного меню Add Item или же по команде контекстного меню Add Watch в окне исходного кода. В последнем случае в список Watch будет добавлен элемент кода, на котором установлен курсор. Элементы окна Watch можно удалять по одному с помощью команды контекстного меню Remove Selected Item или все сразу по команде контекстного меню Remove All Items. Отладка программы Под отладкой подразумевают пошаговое выполнение программы с контролем содержимого регистров микроконтроллера (проверка на низком уровне) и перемен-
Настройка параметров имитатора 153 ных (проверка на программном уровне). Для отладки программ в AVR Studio ис- пользуют команды меню Debug и кнопки одноименной панели инструментов. Прежде, чем рассмотреть эти команды имеет смысл разъяснить такое понятие как “точка прерывания”, Точка прерывания (breakpoint) — это строка исходного кода, на которой работа программы приостанавливается. Таких точек (обозначаются коричневым кружком слева от строки) может быть установлено столько же, сколько эффективных строк в программе. Для установки/удаления точки прерывания в текущей строке служит команда меню Debug ► Toggle Breakpoint (клавиша <F9>) или соответствующая кнопка панели инструментов Debug. Для удале- ния всех расставленных в программе точек прерывания служит команда меню Debug ► Remove Breakpoints или кнопка Remove all program breakpoints панели инструментов Debug. Для последовательного перехода от одной точки прерывания к другой используется команда меню Debug ► Next Breakpoint или комбинация клавиш <Ctrl+F9>. Для перехода в режим отладки используются следующие команды меню Debug: • Run, Auto Step — переход в режим отладки происходит, если ветре- rg чается точка прерывания; • Step Into (клавиша <F11>) — выполняет текущую команду с заходом в подпрограммы (все окна обновляются); • Step Over (клавиша <F10>) — выполняет текущую команду без захода в подпрограммы (все окна обновляются); • Step Out (комбинация клавиш <Shift+F 11>) — запускает программу и вы- полняет ее до тех пор, пока не встретится окончание текущей подпрог- раммы; если ход выполнения находится в областй основной программы, то про- грамма будет выполняться до тех пор, пока не будет остановлена пользователем командой Break или не встретит точку прерывания; • Run То Cursor (комбинация клавиш <Ctrl+Fl 0>) — запускает программу, которая выполняется до тех пор, пока не будет достигнута позиция курсо- ра в окне исходного кода; если встречается точка останова, то выполнение про- граммы не останавливается; если позиция курсора не достигается никогда, то программа выполняется до тех пор, пока не будет остановлена командой Break. После выполнения команды все окна обновляются. Настройка параметров имитатора Для того чтобы выбрать имитацию работы конкретного микроконтроллера, а также его рабочую частоту, служит диалоговое окно Simulator Options (рис. 4.11), которое открывается по команде меню Debug ► AVR Simulator Options (комбинация клавиш <Alt+O>). Здесь допустимые параметры выбранного микроконтроллера ото- бражаются в текстовом поле, расположенном справа. Создание проекта и компиляция программы Среда AVR Studio позволяет не только загружать для имитации исполняемый код, созданный другими компиляторами, но и разрабатывать и компилировать про- граммы на ассемблере и С с помощью внутренних средств. Для этого необходимо нажать кнопку New Project в окне приветствия (см. рис. 4.1) или выбрать команду меню Project ► New Project непосредственно в интегрированной среде, чтобы создать
154 Глава 4. Среда разработки AVR Studio новый проект AVR Studio. В результате откроется диалоговое окно, показанное на рис. 4.12. Рис. 4.11. Диалоговое окно Simulator Options Рис. 4.12. Создание нового проекта AVR Studio Здесь в списке Project type (Тип проекта) необходимо выбрать С-компилятор AVR GCC, указать имя проекта в поле Project Name, имя главного файла .с — в по- ле Initial file, и, если требуется, — нажать кнопку справа от поля Location (Размеще- ние) и выбрать папку, в которой будут сохранены файлы проекта. Затем следует нажать кнопку Next, чтобы перейти к следующему окну мастера создания проекта, выбрать отладочную платформу и тип микроконтроллера (см. рис. 4.2) и нажать кнопку Finish. В результате в окне AVR Studio откроется панель AVR GCC, отображающая структуру проекта, и текстовый редактор, в котором мож- но ввести код программы (рис. 4.13). В проект AVR Studio можно также добавлять любые существующие файлы с исходным программным кодом. Для этого необходимо щелкнуть правой кнопкой мыши на элементе Source Files в панели AVR GCC и выбрать в контекстном меню команду Add Existing Source File(s) (рис. 4.14).
Создание проекта и компиляция программы 155 Рис. 4.13. Создание программы на С непосредственно в среде AVR-Studio Б v Hello (default)* Source :[gj Hell I Qj Header Ext erne Other F Add Existing Source File(s).,. Create New Source File Show File Paths Edit Configuration Options, Рис. 4.14. Добавление в проект уже существующих файлов с исходным программным кодом Например, в ветке Source Files можно выделить созданный по умолчанию пус- той файл . с, нажать клавишу <Delete>, чтобы удалить его, а затем добавить в про- ект уже знакомую нам программу SOS. с. Для того чтобы открыть текст программы в окне редактора, необходимо дважды щелкнуть мышью на соответствующем име- ни файла в панели AVR GCC. Если в контекстном меню, показанном на рис. 4.14 выбрать команду Edit Confi- guration Options, то откроется диалоговое окно с параметрами проекта (рис. 4.15). Его можно также открыть, выбрать команду меню Project ► Configuration Options или нажав кнопку Edit Current Configuration Options панели инструментов AVRGCC- PLUGIN. Основные параметры проекта находятся в разделе General. Здесь можно задать имя проектного файла .elf (поле Output File Name), указать папку для сохранения файлов (поле Output File Directory), выбрать тип микроконтроллера (раскрывающий- ся список Device) и задать частоту процессора в герцах (поле Frequency). В раскрывающемся списке Optimization можно задать уровень автоматической оптимизации программного кода: • -ОО — оптимизация не выполняется;
156 Глава 4. Среда разработки AVR Studio • -01 — уменьшение размера кода и времени выполнения без выполнения опти- мизации, что значительно увеличивает время компиляции; • -02 — средний уровень оптимизации; • -03 — уровень -02 плюс анализ имен регистров и подставляемых функций; • -Оз — оптимизация по размеру кода (рекомендованное значение). Рис. 4.15. Окно настройки параметров проекта Наконец, с помощью флажков, расположенных вдоль нижнего края раздела General, можно указать, какие файлы должны создаваться в результате компиляции. По умолчанию выбрано создание только файлов . hex. Еще один раздел окна Project Options, который имеет смысл рассмотреть, — это Custom Options (рис. 4.16). Здесь можно настроить параметры компиляции и компо- новки исходных файлов, а также указать внешний компилятор. Флажку Use WinAVR соответствует подключение рассмотренного в предыдущей главе компилятора Win- AVR и входящего в его состав средства обработки файлов makefile (программа make. ехе). Компиляция проекта После ввода или загрузки исходного кода программы, проект можно откомпи- лировать. Для этого можно выбрать команду меню Build ► Build, нажать клавишу <F7> или воспользоваться кнопкой Build Active Configuration панели инстру- Г^~| ментов AVRGCCPLUGIN. Если проект был откомпилирован успешно, то в конце Un отчета в окне Build в нижней части среды AVR Studio появится надпись “Build suc- ceeded”, а в папке, указанной в поле Output File Directory диалогового окна Project Op- tions (см. рис. 4.15) появятся файлы Makefile, . elf, . О и, возможно, — . hex, .map и .Iss (если были установлены соответствующие флажки в разделе General окна параметров проекта). Если в исходном коде программы были найдены ошибки, то в окне Build поя- вится сообщение “Build failed...”, и отобразится перечень ошибок, обозначенных красной окружностью. Двойной щелчок мышью на одной из ошибок установит кур- сор в соответствующей строке исходного кода (рис: 4.17).
Создание проекта и компиляция программы 157 Рис. 4.16. Параметры компиляции Б! *§Hello(default) Й Зойке Files _delay_ms( 1000); //Длинная задержка Pause(500); //Пауза с погасшими светодиодами Header Files IS External Dependencies Й <1 Other Files int main (void) DDD - OxFF, while(1) '/ Настройка порта D для вывода //Бесконечный цикл } } РО; DO; РО; ... . Pause(SOOO). Р(); D(); РО; Р(); DO; РО; 0^ E:\Work\Books\MKPress\CforMC2\CD\Projects\WinAVR\SOS\SOS.c \ 4 P Ш_____________________________ , ........ ................. ../Vark/Books/MKPress/CforMC2/CB/Projects/l?inAVR/S0S/50S. с: 26: error: ’DDB’ undeclared Цfirst us<jJ ../Work/Books/MKPress/CforHC2/CD/Projects/UinAVR/S0S/S0S.c:26: error: (Each undeclared identifiei ../../Work/Books/MKPress/CforMC2/CD/Projects/WinAVR/S0S/S0S.c:26: error: for each function it appeax make: *«* [SOS.o] Error 1 Build failed with 3 errors and 1 warnings... Ш Build [O Message \ Find in Flies ; ^Breakpoints and Tracepcints Рис. 4.17. В тексте программы была найдена ошибка После того как программа откомпилирована, ее можно отладить. Для этого не- обходимо перейти в соответствующий режим работы AVR Studio, выбрав команду меню Debug ► Start Debugging, нажав комбинацию клавиш <Ctrl+Shift+ Alt+5> ГТ-] или воспользовавшись кнопкой Start Debugging панели инструментов Debug. bfei Использование средств эмуляции и отладки уже было рассмотрено в начале этой главы. Преимущество работы с проектом, созданным непосредственно в AVR Studio, заключается в том, что ход выполнения программы можно отслеживать по коду С, а не по листингу дизассемблера, что гораздо удобнее. Для выхода из режима отладки следует выбрать команду меню Debug ► Stop Debugging, нажать комбинацию клавиш <Ctrl+Shift+F5> или воспользоваться Г”] кнопкой Stop Debugging панели инструментов Debug. IflU
Глава 5 Среда разработки CodeVisionAVR CodeVisionAVR — это еще одна популярная интегрированная среда разработки, компиляции и отладки программ для микроконтроллеров AVR, созданная компани- ей HP InfoTech. В ее состав также входит мастер создания программ CodeWizar- dAVR и встроенный терминал для тестирования систем, использующих последова- тельный обмен данными. В качестве отладчика в CodeVisionAVR служит рассмот- ренный в предыдущей главе AVR Studio от Atmel. еВ этой книге рассматривается оценочная версия CodeVisionAVR 1.25.7, установочный файл ко- торой находится на прилагаемом к книге компакт-диске в папке Software\AVR\ CodeV i s i onAVR. Для открытия среды разработки можно воспользоваться ярлыком CodeVision- AVR С Compiler, размещенным при установке пакета на Рабочем столе Windows, или же соответствующей командой меню Пуск ► Все программы ► CodeVisionAVR. Окно CodeVisionAVR при первом запуске имеет вид, показанный на рис. 5.1 Рис. 5.1. Окно CodeVisionAVR при первом запуске Для создания нового проекта необходимо выбрать ко- манду меню File ► New или нажать кнопку Create new file па- нели инструментов. В результате откроется диалоговое is| окно Create New File (рис. 5.2). МмИ Созданию проекта в этом окне соответствует переклю- чатель Project. Если его выбрать и нажать кнопку ОК, то поя- вится запрос на использование мастера CodeWizardAVR. Он будет рассмотрен позже, поэтому для начала можно создать Рис. 5.2. Диалоговое окно Create New File проект вручную, нажав в окне запроса кнопку No (Нет). В результате CodeVision-
Компиляция и построение проекта 159 AVR предложит указать имя и папку размещения файла проекта .prj. Когда про- ектный файл будет определен, отроется диалоговое окно Configure Project (Конфи- гурировать проект) (рис. 5.3). Рис. 5.3. Диалоговое окно Configure Project При создании нового проекта это окно на вкладке Files (Файл) будет содержать единственную ссылку на файл . prj. Для того чтобы добавить в проект файл с ис- ходным кодом . с, необходимо нажать кнопку Add. В качестве примера воспользу- емся файлом SOS. с, рассмотренным в главе 3. Скопируйте его в одну папку с но- вым проектным файлом SOS .prj, и добавьте в проект с помощью Цнопки Add диа- логового окна Configure Project. В результате у элемента, соответствующего проекту, на вкладке Files появится подчиненная ссылка, и будут активизированы кнопки Remove для удаления и Edit File Name для редактирования имени файла (рис. 5.4). Рис. 5.4. В проект добавлен файл с исходным кодом Компиляция и построение проекта Параметры компиляции проекта можно настроить непосредственно в процессе его создания на вкладке С Compiler диалогового'окна Configure Project (рис. 5.5).
160 Глава 5. Среда разработки CodeVisionAVR Рис. 5.5. Вкладка С Compiler диалогового окна Configure Project Эта вкладка содержит четыре вложенных вкладки: • Code Generation — собственно, параметры компиляции; • Messages — набор предупреждающих сообщений, которые могут выдаваться в ходе компиляции; • Globally #define — определение макроса #def ine, видимого во всех файлах про- екта (макросы рассматриваются в главе 16); • Paths — списки дополнительных путей к включаемым и библиотечным файлам. Рассмотрим подробнее некоторые параметры, настраиваемые на вкладке Code Generation: . • Chip — тип микроконтроллера; • Clock — тактовая частота процессора; • Memory Model — модель памяти; перечень элементов в этом списке зависит от выбранного типа микроконтроллера: ► Tiny — доступны только первые 256 байт памяти SRAM, а для хранения мас- сивов констант и строк доступны 64 Кбайт Flash-памяти; ► Small — доступны 64 Кбайт памяти SRAM, а для хранения массивов констант и строк доступны 64 Кбайт Flash-памяти; ► Medium (только для микроконтроллеров с не менее чем 128 Кбайт памяти программ) — модель, аналогичная Small, за тем исключением, что указатели на константы 32-разрядные, а указатели на функции — 16-разрядные, что достаточно для адресации 128 Кбайт Flash-памяти; ► Large (только для микроконтроллеров с не менее чем 256 Кбайт памяти про- грамм) — все указатели — 32-разрядные, что позволяет адресовать 256 Кбайт Flash-памяти;
Компиляция и построение проекта 161 • Optimize for — способ оптимизации исполняемого кода: по размеру (Size) или по скорости работы (Speed); • Optimization Level — уровень оптимизации; • Program Type — тип программы: приложение (Application) или загрузчик (Boot Loader); • Data Stack Size — размер стека данных; • Heap Size — размер “кучи” (области памяти, используемой для динамического размещения функций); • Internal SRAM size — объем внутренней памяти SRAM; • External SRAM size — объем внешней памяти SRAM; • File Output Formats — форматы файлов, создаваемых в папке проекта в результа- те компиляции. После настройки параметров компиляции в окне Configure Project можно нажать кнопку ОК, чтобы загрузить проектные файлы в рабочую область CodeVisionAVR (рис. 5.6). Рис. 5.6. Новый проект в рабочей области CodeVisionAVR Для открытия диалогового окна Configure Project после создания проекта можно воспользоваться командой меню Project ► Configure или кнопкой Configure the project панели инструментов.- ПРИМЕЧАНИЕ Обратите внимание на окно Notes, включенное в состав проекта. Оно позволяет создавать текстовые комментарии, которые после выбора команды меню File ► Save АП сохраняются в
162 Глава 5. Среда разработки CodeVisionAVR проектной папке в файле .txt. Для переключения между окном комментариев и редактором исходного кода необходимо щелкнуть мышью на соответствующем элементе в окне Navigator. Теперь можно попробовать откомпилировать проект. Для этого выберите ко- манду меню Project ► Compile, нажмите клавишу <F9> или воспользуйтесь кнопкой Compile the project панели инструментов. В результате откроется окно с информаци- ей о параметрах и результатах компиляции (рис. 5.7). Рис. 5.7. Диалоговое окно с информацией о параметрах и результатах компиляции Поскольку мы воспользовались исходным кодом, рассчитанным на компилятор WinAVR, то вполне логично, что он не будет откомпилирован в CodeVisionAVR без ошибок. Так, в окне Information показано, что в 34 обработанных строках было най- дено шесть ошибок. Их перечень с указанием соответствующих номеров программ- ных строк можно увидеть в окнах Navigator и Messages в рабочей области CodeVisi- onAVR (рис. 5.8). Для того чтобы перейти к строке с ошибкой можно щелкнуть мышью на соот- ветствующем элементе в ветке Errors окна Navigator или дважды щелкнуть на инте- ресующем элементе в окне Messages. В результате в окне редактора будет выделена ошибочная строка. Среда CodeVisionAVR позволяет выполнить поиск синтаксических ошибок в тексте файла, от- крытого в данный момент в окне редактора, еще до компиляции. Для этого следует выбрать команду меню Project ► Check Syntax или нажать кнопку Check Syntax for the currently edited file. Исправим ошибки. Во-первых, для компилятора CodeVisionAVR заголовочный файл io. h можно явно не включать. Вместо него следует указать файл . h, соответ-
Компиляция и построение проекта 163 ствующий выбранной модели микроконтроллера. Например, для ATmega 169 он на- зывается Меда 169.h. Все стандартные включаемые файлы компилятора CodeVisi- onAVR находятся в папке \<nanKa_CodeVisionAVR>\inc, которая определяется автоматически. Здесь же находится и файл delay.h, реализующий функции за- держки. Таким образом, вместо #include <util/delay.h> в данном примере не- обходимо указать просто #include <delay. h>. Рис. 5.8. Отображение ошибок, найденных в исходном тексте программы Вызов функций задержки для компилятора CodeVisionAVR практически анало- гичен вызовам для WinAVR за тем исключением, что не нужно указывать первого символа подчеркивания Таким образом, результирующий код программы SOS. с для CodeVisionAVR представлен в листинге 5.1. еЭту программу можно также найти на прилагаемом к книге компакт-диске в папке Pro j ects \ CodeVi s ionAVR\SOS. После успешной компиляции проекта в одной папке с файлом . prj будет соз- дан результирующий ассемблерный код . asm. Листинг5.1. Файл SOS.с для компилятора CodeVisionAVR #include <Megal69.h> linclude <delay.h> void Pause(int ms) { PORTD = OxFF; //Все светодиоды отключены
164 Глава 5. Среда разработки CodeVisionAVR Листинг 5.1. Окончание delay ms(ms); } //Задержка void P(void) { PORTD = 0; delay_ms(500); //Включаем все светодиоды //Короткая задержка Pause(500); } //Пауза с погасшими светодиодами void D(void) { PORTD = 0; delay_ms(1000); //Включаем все светодиоды //Длинная задержка Pause(500); } //Пауза с погасшими светодиодами int main (vo^Ld) { * DDRD = OxFF; // Настройка порта D для вывода while(1) //Бесконечный цикл { Р(); Р(); Р(); //. . . DO; D(); D(); РО; Р(); Р(); Pause(10000); // //. . . } Для того чтобы, кроме ассемблерного кода, получить файлы, заданные пара- метром компилятора File Output Formats (см. рис. 5.5) (т.е. .cof, .obj, .hex и т.д.) необходимо выполнить построение проекта. Этому процессу соответствует команда меню Project ► Make, комбинация клавиш <Shift+F9> и кнопка Make the project lj$g| панели инструментов. Создание проекта с помощью мастера CodeWizardAVR Если в диалоговом окне Create New File (см. рис. 5.2) выбрать переключатель Project, и затем в следующем окне с запросом выбрать Yes (Да), то будет запущен мастер создания проектов CodeWizardAVR (рис. 5.9). Его можно также запустить без использования окна Create New File. Для этого следует выбрать команду меню Tools ► CodeWizardAVR, нажать комбинацию клавиш <Shift+F2> или восполь- ПЕ1 зоваться кнопкой Run the CodeWizardAVR панели инструментов. ШВ Мастер CodeWizardAVR позволяет автоматически создать программный код для инициализации процессора, портов ввода-вывода, основных периферийных мо- дулей и ЖК-модуля. На любом этапе результирующий код можно предварительно посмотреть, выбрав в окне CodeWizardAVR команду меню File ► Program Preview (рис. 5.10).
Создание проекта с помощью мастера CodeWizardAVR 165 Рис. 5.9. Мастер CodeWizardAVR Рис. 5.10. Предварительный просмотр результирующего кода Для фактического создания файла . с следует выбрать команду меню File ► Ge- nerate, Save and Exit. Рассмотрим вкладки мастера CodeWizardAVR (их содержимое может разли- чаться в зависимости от выбранной модели микроконтроллера). Вкладка Chip (Кри- сталл) (см. рис. 5.9) определяет тип устройства, тактовую частоту процессора и вид программы: приложение или загрузчик. Если установить флажок Check Reset Source, то в программу будет добавлен код, позволяющий идентифицировать условия, вы- звавшие сброс микроконтроллера. Вкладка Chip может также содержать флажок Crystal Oscillator Divider Enabled, установка которого ак- тивизирует делитель частоты осциллятора. В этом слу- чае коэффициент деления указывают в поле Crystal Oscillator Divider. Вкладка External SRAM (на рис. 5.10 не показана) позволяет выбрать объем и параметры внешней памяти SRAM (для тех микроконтроллеров AVR, которые поддерживают подключение такой памяти). Вкладка Ports (рис. 5.11) определяет конфигура- цию портов ввода-вывода. Щелкая мышью на кнопках в столбце Data Direction, можно определить направле- ние передачи данных для соответствующих выводов порта: In — ввод; Out — вывод. Если вывод сконфигу- рирован как вход, то с помощью расположенной спра- ва, в столбце Pullup/Output Value кнопки его можно пе- ревести в третье состояние (Т) или активизировать внутренний подтягивающий резистор, подключенный к полюсу источника питания (Р). Если вывод сконфи- гурирован как вход, то его состояние можно сразу же установить в 0 или 1. Вкладка Bit-Banged (рис. 5.12) позволяет выбрать порт для подключения микросхемы часов реального Fde Hdp External IRQ j Timers | USARTO | USART1 Analog Comparator ] ADC j SPI | I2C IWie i 2Wue(!2C) ] LCD Bit-Banged | Pro|ect Inloimation Chip | External SRAM Purls В | Port £ | Port D | Pe l l > Dola Direction Pullup/Output Value B«0 .In Tj 8<i0 8П In T Bill B»2 In I BH2 £*3 In т B4 3 ♦ BMJnJ J.’BrU Bit 5 In I Bit 5 BitGJnJ jj'BitB EH 7 In I Bit 7 Рис. 5.11. Вкладка Ports мастера CodeWizardAVR
166 Глава 5. Среда разработки CodeVisionAVR времени DS1302 и определить, какие разряды порта будут использоваться для вво- да-вывода, для сигнала тактирования и сигнала сброса. Для активизации зарядки DS1302 малым током необходимо установить флажок Trickle Charge. Вкладка Project Information позволяет определить текстовую информацию, кото- рая будет помещена в заголовке комментариев в “шапке” результирующего файла . с: название, версия, дата, автор, организация, примечания. Вкладка 1 Wire (рис. 5.13) конфигурирует однопроводной интерфейс: • 1 Wire Port — порт, используемый для реализации линии передачи данных; • Data Bit — разряд порта, которому соответствует линия передачи данных; • если используются датчики температуры DS1820 или DS 18S20, то следует ус- тановить флажок Enabled; • если к шине подключено несколько датчиков, то необходимо установить фла- жок Multiple Devices. Вкладка 2 Wire (I2C) (рис. 5.14) позволяет настроить параметры двухпроводного интерфейса TWI (12С): • 2 Wire Enabled — акгивизация/отключение интерфейса; • Generate Acknowledge Pulse — формирование импульса квитирования; • Slave Address — адрес ведомого устройства (в шестнадцатеричном виде); • General Call Recognition — установка этого флажка соответствует активизации опознавания общего вызова, переданного по шине TWI; • Bit Rate — максимальная частота следования импульсов в линии SCL; • 2 Wire Interrupt — если установить этот флажок, то интерфейс TW1 будет фор- мировать запросы на прерывание. Рис. 5.12. Вкладка Bit-Banged Рис. 5.13. Вкладка 1 Wire Рис. 5.14. Вкладка 2 Wire (I2C) Вкладка External IRQ (рис. 5.15) конфигурирует внешние прерывания. Установка одного из флажков INTx Enabled разрешает соответствующее прерывание. Список
Создание проекта с помощью мастера CodeWizardAVR 167 Mode позволяет выбрать режим формирования запроса на прерывание: по низкому уровню сигнала на входе (Low level), по ниспадающему (Falling Edge) или по нарас- тающему (Rising Edge) фронту. Для каждого разрешенного прерывания по сигналу на входе мастер создаст пустую подпрограмму обработки прерывания. Вкладка Timers позволяет сконфигурировать таймеры/счетчики. Она содержит несколько вложенных вкладок, количество которых зависит от выбранного микро- контроллера. Набор параметров на каждой такой вкладке также зависит от типа устройства и номера таймера/счетчика (рис. 5.16). Рис. 5.15. Вкладка External IRQ Рис. 5.16. Параметры таймеров/счетчиков 0 и 1 Рассмотрим некоторые из них, общие для различных видов таймера: • Clock Source — источник тактирования; • Clock Value — частота тактирования, которая задается в килогерцах, если пара- метр Clock Source имеет значение System Clock, или определяется путем деления частоты на выбранном входе (если выбрать значение Timer х Stopped, то таймер/ счетчик будет отключен); • Mode — режим работы таймера/счетчика: обычный, ШИМ и т.п.; • Output или Out. X — действие на соответствующем выходе при совпадении со- держимого счетчика со значением, указанным в поле Compare или Comp. X: Dis- connected — выход отключен; Toggle — смена состояния на противоположное; Clear — обнуление; Set — установка в лог. 1; • флажки или списки флажков со словом “Interrupt” соответствуют разрешению или запрету соответствующих прерываний; • Timer Value или Value — исходное значение счетного регистра (в шестнадцате- ричной форме); • Inp. Capture — содержимое регистра захвата на входе. Еще одна вложенная вкладка: Watchdog — определяет параметры инициализа- ции сторожевого таймера (рис. 5.17). Для того чтобы активизировать этот таймер,
168 Глава 5. Среда разработки CodeVisionAVR необходимо установить флажок Watchdog Timer Enabled, а затем выбрать коэффици- ент деления частоты осциллятора с помощью группы переключателей Oscillator Prescaler. Если выбранный микроконтроллер предусматривает прерывания от сто- рожевого таймера, то вкладка Watchdog также будет содержать флажок Watchdog Timeout Interrupt для разрешения этого прерывания. Вкладки UARTx или USARTx задают конфигурацию приемо-передатчиков UART или USART (рис. 5.18): • установка флажков Receiver или Transmitter активизирует приемник и передат- чик соответственно, а флажков Rx Interrupt или Тх Interrupt разрешает преры- вание по окончании приема или передачи; • Baud Rate — скорость передачи данных в Кбит/с; • Communication Parameters — параметры обмена данными: количество битов данных и стоп-битов, а также наличие проверки на четность; • Mode — режим передачи: синхронный или асинхронный в режиме ведущего/ве- домого устройства. Вкладка LCD (рис. 5.19) позволяет определить параметры подключения ЖК- дисплея: порт и количество символов на строку дисплея. Рис. 5.17. Параметры сторожевого таймера Рис. 5.18. Вкладка USART0 Рис. 5.19. Вкладка LCD Если выбранный микроконтроллер содержит контроллер ЖК-дисплея, то в окне CodeWizardAVR будет вкладка LCD Controller с параметрами конфигурирования этого контроллера (рис. 5.20): • LCD Enabled — активизация/отключение ЖК-контролера; • LCD Low Power Waveform — при установке этого флажка на выводы ЖК-дисплея будет подаваться импульсное напряжение, что уменьшит его энергопотребле- ние;
Создание проекта с помощью мастера CodeWizardAVR 169 • LCD Frame Complete interrupt — установке этого флажка соответствует разреше- ние прерывания по заполнению кадра; • Duty Cycle — рабочий цикл: статический, 1/2,1/3 или 1/4; • Bias — смещение для нестатического рабочего цикла; • Clock Source — источник тактового сигнала: системный или внешний; • Frame Rate — частота обновления кадра в герцах; • Used Segments — вывод, используемый для управления сегментом ЖК-дисплея; • Contrast Control — напряжение между выводом управления сегментом ЖК-дис- плея и общим выводом. Оно определяет контрастность дисплея. Следующая вкладка, которая может присутствовать не для всех микроконтрол- леров AVR, — это SPI (рис. 5.21). Как следует из ее названия, она служит для кон- фигурирования последовательного интерфейса SPI: режим передачи (SPI Mode), по- зицию фронта строба SCK относительно бита данных (Clock Phase), полярность так- товых импульсов (Clock Polarity), частоту тактирования интерфейса (SPI Clock Rate), работу в режиме ведомого или ведущего устройства (SPI Туре) и порядок передачи данных: с младшего или старшего разряда (Data Order). Рис. 5.20. Вкладка LCD Controller Рис. 5.21. Вкладка.SPI Установке флажка SPI Interrupt соответствует разрешение прерывания от интер- фейса SPI, а флажка Clock Rate х2 — удвоение частоты тактирования. Для конфигурирования интерфейс^ 12С служит вкладка I2C (рис. 5.22). Здесь, выбрав в раскрывающемся списке I2C Port порт для реализации шины 12С, можно выбрать разряды этого порта, соответствующие линиям SDA и SCL. Ниже располо- жен набор вложенных вкладок, позволяющих активизировать (установка флажка Enabled) и сконфигурировать различные устройства, подключенные к интерфейсу 12С: датчик температуры LM75, термостат DS1621, часы реального времени PCF- 8563, PCF8583 или DS1307.
170 Глава 5. Среда разработки CodeVisionAVR Если выбранный микроконтроллер оснащен универсальным последовательным интерфейсом US.I, то окно CodeWizardAVR будет содержать соответствующую вкладку (рис. 5.23). й CodeWizardAVR - unMledxt Ede adp Bit-Banged | Pi eject Information | Chip j Ports j External IRQ | Timers I ICO Controller USI | USART | Analog Comparator j AOC SPI I2C j tWire | LCD I2C Port J PORTA 3 « SDA Bit [o " 3 SCI Bit |7“2 Рис. 5.23. Вкладка USI Рис. 5.22. Вкладка I2C Если в раскрывающемся списке Mode выбран элемент Disabled, то интерфейс USI отключен. В противном случае он определяет режим работы интерфейса: SPI по трем линиям или 12С по двум линиям. Параметр Clock определяет источник такти- рования для сдвигового регистра и счетчика USI, а установка флажков USI Counter Overflow Interrupt и USI Start Condition Interrupt разрешает прерывания по переполне- нию счетчика и возникновению условия начала передачи соответственно. Следующие две вкладки мастера CodeWizardAVR, которые имеет смысл затро- нуть, — это Analog Comparator (Аналоговый компаратор) (рис. 5.24) и ADC (АЦП) (рис. 5.25). Вкладка Analog Comparator содержит набор флажков, определяющих режим ра- боты устройства: • Bandgap Voltage Reference — подача внутреннего опорного напряжения на по- ложительный вход компаратора; • Negative Input Multiplexer — подключение аналогового мультиплексора АЦП к отрицательному входу компаратора; • Analog Comparator Input Capture — управление функцией захвата таймера/счет- чика 1 сигналом с выхода компаратора; • Analog Comparator Interrupt—разрешение прерывания от аналогового компара- тора (тип прерывания выбирают с помощью расположенной ниже группы пере- ключателей); • Disable Digital Input Buffer on AINx — запрет входа цифрового буфера на выводе AINx. Что касается вкладки ADC, то ее содержимое может различаться в зависимости от возможностей АЦП выбранного микроконтроллера.
Создание проекта с помощью мастера CodeWizardAVR 171 С CodeWizardAVR ~ urrttUedxwp FSe Help I2C | IWire | 2WM2CJ LCD | В it-Banged j Project Information Chip I Ports | External IRQ | Timers USART Analog Comparator |aDC j SPI (7 Analog Comparator Enabled Г Bandgap Voltage Reference Г Negative Input Multiplexer Г Analog Comparator Input Capture P Analog Coniparatw Irtetrup^ Analog Comparator Interrupt Mode \ f* Interrupt on Output loggia j : C interrupt on Failing Output Edge i C Interrupt on firing Output Edge < Г DisoUe DigUal Input Buller on AINQ Г Disable Digital Input Buller on AIN1 Рис. 5.24. Вкладка Analog Comparator Рис. 5.25. Два варианта вкладки ADC Рассмотрим только некоторые общие параметры: • Interrupt — разрешение прерывания по завершению преобразования; • Use 8 bite — использование только восьми младших разрядов результата преоб- разования; • Volt Ref — источник опорного напряжения; • Clock — частота тактирования АЦП; • Auto Trigger Source — источник автоматического запуска (аналоговый компара- тор, внешний запрос на прерывание и т.п.); • Disable Digital Input Buffers — запрет цифровых входов буферов, используемых АЦП. Окно CodeWizardAVR может содержать и другие вкладки, не рассмотренные выше (например, Voltage Reference с параметрами коррекции опорного напряжения), однако такие случаи довольно редки, поэтому мы их рассматривать здесь не будем. Сохранение и открытие проекта CodeWizardAVR Конфигурацию микроконтроллера, выполненную в окне CodeWizardAVR, можно сохранить для повторного использования. Для этого необходимо выбрать команду меню File ► Save или File ► Save as (для сохранения копии проекта под другим име- нем). Проект CodeWizardAVR сохраняет в файле с расширением .cwp, который представляет собой обычный текстовый документ с перечнем установок микрокон- троллера, который можно отредактировать в любом редакторе, наподобие Блокнота. ПРИМЕЧАНИЕ Мастер CodeWizardAVR также предлагает сохранить свой проект в момент генерирования ис- ходного кода программы и файла . prj по команде меню File ► Generate, Save and Exit.
172 Глава 5. Среда разработки CodeVisionAVR Сохраненный файл . cwp можно загрузить в окне CodeWizardAVR, выбрав ко- манду меню File ► Open. Создание новых файлов с исходным кодом Если после создания проекта файл . с должен быть не добавлен извне, а создан непосредственно в среде CodeVisionAVR, то -для этого необходимо выбрать коман- ду меню File ► New (или нажать соответствующую кнопку панели инструментов) и выбрать в диалоговом окне Create New File (см. рис. 5.2) переключатель Source. В результате после, нажатий кнопки ОК в проект будет добавлен пустой документ с именем по умолчанию untitled, с. При вводе кода программы различные конструкции языка С будут выделяться разными цветами и с помощью разных параметров шрифта. Эти и другие настройки редактора можно изменить в диалоговом окне Editor Settings (рис. 5.26), которое от- крывается по команде меню Settings ► Editor. Рис. 5.26. Диалоговое окно Editor Settings В частности, здесь можно задать размер отступа, создаваемого по нажатию кла- виши <ТаЬ>: параметр Tab Size. Например, для автора отступ в восемь символов ка- жется несколько завышенным. Удобнее использовать табуляторы по 3-4 символа. Кроме того, если читателю надоел стандартный для систем программирования шрифт Courier, то он может сменить его, нажав кнопку Font. Одно из очень удобных средств редактора CodeVisionAVR — набор шаблонов программных конструкций, реализующих ветвление и циклы. Он находится на вкладке Code Templates (по умолчанию расположена слева от окна редактора). Кро- ме всего прочего, набор шаблонов содержит заготовку для создания главной функ- ции программы: main (подробнее об этом — в главе 16). Для размещения той или иной конструкции в исходном коде ее необходимо перетащить мышью из вкладки Code Templates в окно редактора (рис. 5.27). ПРИМЕЧАНИЕ Обратите внимание на синюю полоску вдоль левого края программной конструкции. Она оп- ределяет длину данной конструкции. Если щелкнуть мышью на маленькой пиктограмме
Отладка программы 173 в виде знака расположенной на этой полосе, то конструкция будет свернута до одной первой строки. Для того чтобы развернуть ее, следует щелкнуть на пиктограмме Подоб- ное свертывание бывает удобным при анализе больших программ. Рис. 5.27. Размещение шаблона в коде программы: вверху — процесс; внизу — результат Отладка программы Для отладки программ в среде CodeVi- sionAVR по умолчанию предоставлен доступ к внешнему отладчику AVR Studio (см. пре- дыдущую главу) и встроенному терминалу. В первом случае пакет AVR Studio должен быть уже установлен в системе, а путь к не- му и версия — указаны в диалоговом окне Debugger Settings (рис. 5.28), которое откры- Рис. 5.28. Диалоговое окно Debugger Settings вается по команде меню Settings ► Debugger. Кроме того, для работы с внешним отладчиком проект необходимо построить с пра- вильной настройкой результирующих файлов. Для AVR Studio требуется формат . cof, поэтому обратите внимание на значение параметра File Output Formats на вкладке С Compiler диалогового окна Configure Project (см. рис. 5.5). Для вызова отладчика следует выбрать команду меню Tools ► Debugger, нажать комбинацию клавиш <Shift+F3> или воспользоваться кнопкой Run the debug- ger панели инструментов. В результате будет открыта среда AVR Studio и I2J появится окно приветствия (см. рис. 4.1). В нем необходимо нажать кнопку Open, выбрать интересующий файл . cof, задать имя проекта . aps, выбрать отладочную платформу (например, AVR Simulator) и тип микроконтроллера и нажать кнопку Finish (Готово). При этом AVR Studio может добавить некоторые дополнительные определения в текст программы. В таком случае в одной папке с исходным файлом . с будет создана копия с тем же именем, но с добавлением двух символов подчер- кивания, и в рабочую область AVR Studio загружена будет именно она. Методы отладки с помощью AVR Studio уже были рассмотрены в предыдущей главе, поэтому останавливаться на них мы не будем.
174 Глава 5. Среда разработки CodeVisionAVR Использование терминала Встроенный в CodeVisionAVR терминал служит для отладки систем, исполь- зующих последовательный обмен данными по протоколам RS232, RS422 и RS485. Его параметры настраивают в диалоговом окне Terminal Settings (рис. 5.29), которое открывают по команде меню Settings ► Terminal. Рис. 5.29. Диалоговое окно Terminal Settings Термина^ активизируют с помощью команды меню Tools ► Terminal, ком- бинации клавиш <Shift+F5> или кнопки Run the terminal панели инструментов. Isu Окно терминала содержит поле для отображения текста, передаваемого по по- следовательному интерфейсу, и типичный набор кнопок: Disconnect (Разъединить); Send (Передать) для передачи некоторого шестнадцатеричного кода, предваритель- но введенного в поле Hex Code; Rx File (Принять в файл) для сохранения полученных символов в файле; Тх File (Передать из файла); Hex для отображения символов в ви- де соответствующих им шестнадцатеричных кодов (для возврата в обычный режим необходимо нажать кнопку ASCII); Clear для очистка окна терминала и Reset Chip для сброса микроконтроллера, установленного на отладочной плате. После нажатия кнопки Disconnect все перечисленные кнопки исчезнут, и вместо них появится единственная кнопка Connect (Соединить).
Г ЛАВА 6 Программаторы для микроконтроллеров AVR Эмуляция эмуляцией, но любая программа, предназначенная для использования в микроконтроллерах, конечно же, должна быть каким-то образом записана в память программ целевого устройства. Какое бы средство программирования для этого ни использовалось, процесс всегда выглядит одинаково. 1. Подсоединить микроконтроллер к специальному адаптеру, который в свою оче- редь соединен с компьютером. 2. Перевести микроконтроллер в режим программирования. 3. Записать данные в память (Flash или EEPROM) с помощью специальных про- граммный средств. 4. Вывести микроконтроллер из режима программирования. Программаторы могут использоваться самые разнообразные. Обобщенно их можно разбить на три категории: • с параллельным интерфейсом; • с последовательным интерфейсом; • с интерфейсом USB. Один из вариантов адаптеров, совместимый с платами STK.200/300/500, для программирования микроконтроллеров AVR по параллельному интерфейсу пред- ставлен на рис. 6.1. Его принципиальная схема показана на рис. 6.2, а монтажная схема и разводка платы — на рис. 6.3. Рис. 6.1. Адаптер для программирования микроконтроллеров AVR по параллельному интерфейсу В схеме задействованы следующие компоненты: • ST1 — D-Sub штекер на 25 контактных выводов; • JP1 — разъем для подключения к печатной плате 2x5; • IC1 — микросхема SN74HC244;
176 Глава 6. Программаторы для микроконтроллеров AVR • D1 — диод Шотки ВАТ43 или ВАТ46; • R1 — резистор 100 кОм; • С1 — керамический конденсатор на 100 нФ. Рис. 6.2. Схема для программирования микроконтроллеров AVR по параллельному интерфейсу Рис. 6.3. Монтажная схема и разводка платы для адаптера Отладочные платы, наподобие STK500, подключаются к ПК по последователь- ному интерфейсу, а значит, разработчику доступно и последовательное программи- рование. Такой подход обрел широкую популярность и поддерживается, в том чис- ле, и средой AVR Studio. При последовательном программировании обычно используется интерфейс SPI. При этом программатор работает в режиме ведущего, а подлежащий программиро-
Отладка программы 177 ванию микроконтроллер — ведомого устройства. Последовательный интерфейс со- стоит из линий SCK, MOST (вход) и MISO (выход). По нарастающему фронту им- пульсов в линии SCK биты данных записываются в подлежащий программирова- нию микроконтроллер, а по ниспадающему фронту — считываются (рис. 6.4). Тактовый цикл | 1 | 2|3|4|5| 6| 7| 8| Рис. 6.4. Временная диаграмма передачи данных в режиме последовательного программирования Последовательное программирование доступно также и в микроконтроллерах AVR, в которых отсутствует интерфейс SPI. Для этого служит схема, показанная в обобщенном виде на рис. 6.5. Номиналы конденсаторов могут от- личаться в зависимости от типа програм- матора и микроконтроллера. Например, для модели AT90S2313 он в одном случае составляет 22 пФ, а в другом — 27 пФ. В качестве альтернативы схеме, пока- занной на рис. 6.5, на вход XTAL1 может быть подан внешний тактовый сигнал. Рис. 6.5. Монтаж микроконтроллера AVR для последовательного программирования Вход XTAL2 в этом случае остается от- крытым. В заключение скажем также несколько слов об адаптерах, рассчитанных на ра- боту с интерфейсом USB. В качестве примера можно рассмотреть программатор USBProg, информацию о котором (на немецком языке) можно найти на сайте www.embeddeci-projects.net (рис. 6.6). Рис. 6.6. USB-программатор USBProg Пример схемы его соединения с микроконтроллером AVR представлена на рис. 6.7.
178 Глава 6. Программаторы для микроконтроллеров AVR £ 8 I £ «-Ч U Рис. 6.7. Пример соединения адаптера USBProg с микроконтроллером ATmega32-A
Программные средства для программирования микроконтроллеров 179 Программные средства для программирования микроконтроллеров Кроме отладочной платы и/или аппаратного программатора (адаптера), для за- писи программ в память микроконтроллера требуется также специальное про- граммное обеспечение. В большинстве случаев оно совместимо с популярными средствами эмуляции и отладки, наподобие AVR Studio, что позволяет программи- ровать устройства непосредственно из интегрированной среды разработки. Кроме AVR Studio, можно использовать и другие популярные пакеты, предназначенные для программирования микроконтроллеров, например: PonyProg2000, AVRDUDE, USBProg Flashtool и др. ©Установочные пакеты РопуРгод2000 и USBProg Flashtool находятся на прилагаемом к книге ком- пакт-диске в папке Software\AVR. Основная тема данной книги — применение языка С для разработки встроен- ных приложений, поэтому подробно на процессе программирования мы останавли- ваться не будем. За дополнительной информацией по этому вопросу обращайтесь к специализированным изданиям. Кратко остановимся только на некоторых аспек- тах программирования микроконтроллеров в среде AVR Studio и CodeVisionAVR. Программирование устройства в среде AVR Studio 4 После того как микроконтроллер помещен в гнездо отладочной платы или про- грамматора, соединенного с ПК, и на него подано питание, в среде AVR Studio для настройки соединения следует выбрать команду меню Tools ► Program AVR ► Con- nect или нажать кнопку Display the Connect dialog панели инструментов STK500. В результате откроется диалоговое окно Select AVR Programmer, в котором не- = обходимо выбрать текущий программатор и порт, по которому он подключен к ПК (рис. 6.8). Рис. 6.8. Диалоговое окно Select AVR Programmer Программаторам, использующим интерфейсы USB, здесь в списке Platform по умолчанию соответствуют элементы JTAGICE mkll, AVRISP mkll и AVR Dragon. После того как программатор и порт выбраны, можно нажать кнопку rjjjZ Connect для установки соединения. Если при этом в списке Port был выбран Ьк элемент Auto, то AVR Studio выполнит поиск порта самостоятельно. Этому же дей- ствию соответствует выбор в главном меню команды Tools ► Program AVR ► Auto Connect или нажатие кнопки Connect to the Selected AVR Programmer панели инстру- ментов STK500.
180 Глава 6. Программаторы для микроконтроллеров AVR Если все аппаратные подключения были выполнены правильно, то на экране должно появиться диалоговое окно, соответствующее рис. 6.9. Рис. 6.9. Окно управления процессом программирования Здесь на вкладке Program необходимо выбрать целевое устройство (раскрыва- ющийся список Device), а также указать исполняемые НЕХ-файлы для памяти про- грамм (поле Flash - Input HEX File) и/или памяти EEPROM (поле EEPROM - Input HEX File). Перед программированием для контроля можно очистить память программ и данных микроконтроллера, нажав кнопку Erase Device. Собственно программиро- вание начинается по нажатию соответствующей кнопки Program. Рассмотрим другие элементы вкладки Program: • Programming mode — режимы программирования: ► ISP — внутрисхемное; ► PP/HVSP — высоковольтное параллельное или последовательное; ► JTAG — для программаторов AVR Dragon и JTAGICE mkll. • Erase Device Before Programming — если этот флажок установлен (рекомендует- ся), то память микроконтроллера перед записью будет очищена; • Verify Device After Programming — если этот флажок установлен (рекомендуется), то содержимое памяти микроконтроллера после записи будет проверено на кор- ректность; • Use Current Simulator/Emulator FLASH (EEPROM) Memory — этот переключатель можно выбрать для использования исполнимого кода не из внешнего файла . hex, а из открытого в данный момент проекта AVR Studio; • Verify — кнопка проверки записанных в память Flash или EEPROM данных; • Read — кнопка чтения записанных в память Flash или EEPROM данных. Показанное на рис. 6.9. окно позволяет также программировать разряды предо- хранения и блокировки. Для этого служат вкладки Fuses и LockBits соответственно. Вкладка Advanced служит для чтения из микроконтроллера байтов сигнатуры и ка- либровки осциллятора, а также для записи последнего по заданному пользователем
Программные средства для программирования микроконтроллеров 181 адресу памяти Flash или EEPROM. Вкладка Board позволяет изменить условия работы от- ладочной платы, а вкладка Auto — задать ав- томатически выполняемую последователь- ность операций. Для отладочных плат и программаторов, отличных от STK500/600, процесс програм- мирования может отличаться от описанного выше. Так, для плат myAVR все происходит по команду меню Tools ► AVR Prog. В резуль- тате откроется диалоговое окно, представлен- ное на рис. 6.10. В этом окне следует ввести имя объектного файла в поле Hex file (или най- ти его, нажав кнопку Browse), а затем нажать кнопку Program в разделе Flash или EEPROM. Программирование устройства в среде CodeVisionAVR Рис. 6.10. Окно, используемое при программировании р помощью плат myAVR Для выбора программатора, порта, по которому он подключен к ПК, и, возмож- но, — некоторых других параметров соединения в среде CodeVisionAVR необходи- мо выбрать команду меню Settings ► Programmer и указать соответствующие значе- ния в диалоговом окне Programmer Settings (рис. 6.11). Отметим, что CodeVi- sionAVR поддерживает следующие аппаратные средства: • Atmel STK200/300/500; • Atmel AVRISP Mkll (USB); • Atmel AVR Dragon; • Atmel JTAG-ICE Mkll (USB); • Atmel AVRProg (AVR910); • Dontronics DT006; • Vogel Elektronik VTEC-ISP; • Futurlec JRAVR; • MicroTronics ATCPU/Mega2000. Рис. 6.11. Диалоговое окно Programmer Settings Если используется самодельный программатор (например, показанный на рис. 6.1-6.3), то в диалоговом окне Programmer Settings в раскрывающемся списке AVR Chip Programmer Туре необходимо выбрать элемент Kanda Systems STK200+/300 и указать интересующий параллельный порт. После того как выбран аппаратный программатор, можно начать процесс запи- си исполняемого кода в целевое устройство. Для этого в среде CodeVisionAVR не- обходимо выбрать команду меню Tools ► Chip Programmer, нажать комбинацию кла- виш <Shift+F4> или воспользоваться кнопкой Run the chip programmer панели B| инструментов. Ifli В результате откроется диалоговое окно, показанное на рис. 6.12. Целевое уст- ройство выбирают в раскрывающемся списке Chip. По нажатию кнопки Program АП (Запрограммировать все) автоматически выполняется следующая последователь- ность операций. 1. В микроконтроллере очищается память программ и данных.
Глава 6. Программаторы для микроконтроллеров AVR 2. Выполняется проверка, корректно ли очищена память программ и данных. 3. Программируется и проверяется Flash-память. 4. Программируется и проверяется память EEPROM. 5. Программируются разряды блокировки. 6. Программируются разряды предохранения. Рис. 6.12. Диалоговое окно CodeVisionAVR Chip Programmer Нажатию кнопки Program All также соответствует выбор в окне CodeVisionAVR Chip Programmer команды меню Program ► АН. Другие команды меню Program по- зволяют выполнять перечисленные выше шесть операций по отдельности. Рассмотрим другие элементы диалогового окна CodeVisionAVR Chip Programmer: • Reset Chip — сброс микроконтроллера; • SCK Freq — тактовая частота в килогерцах; • FLASH — в этих полях отображается начальный и конечный адреса занятой об- ласти памяти программ, а также — контрольная сумма; • EEPROM — в этих полях отображается начальный и конечный адреса занятой области памяти EEPROM, а также — контрольная сумма; • FLASH Lock Bits — выбор степени защиты программы: ► No Protection — защита отсутствует; ► Programming disabled — запрещено программирование микроконтроллера; ► Programming and Verification disabled — запрещено программирование и чте- ние памяти микроконтроллера; • Program Fuse Bit(s) — если этот флажок установлен, то команде меню Program ► АН или Program ► Fuse Bits(s) будут запрограммированы разряды предохране- ния, отмеченные флажками в расположенном ниже списке; • Boot Lock Bit х — выбор значения для разрядов блокировки загрузчика;
Программные средства для программирования микроконтроллеров 183 • Check Signature — если этот флажок установлен, то перед любой операцией бу- дут проверяться байты сигнатуры; • Check Erasure — если этот флажок установлен, то после очистки памяти микро- контроллера будет проверено качество выполнения этой операции; • Preserve EEPROM — если этот флажок установлен, то при очистке памяти мик- роконтроллера по команде меню Program ► Erase Chip будет очищена только память программ (Flash); • Verify — если этот флажок установлен, то после программирования микрокон- троллера будет выполнена проверка на корректность записанных данных. Наконец, кратко рассмотрим назначение других пунктов меню диалогового ок- на CodeVisionAVR Chip Programmer: • File — команды, позволяющие загрузить (Load) содержимое файла . rom, . hex или .bin в буфер Flash-памяти или файла . еер, . hex или .bin в буфер памяти EEPROM, а также выполнить обратную операцию, т.е. сохранить (Save) содер- жимое буфера в указанном файле; • Edit — команды для вызова окна, позволяющего просмотреть и отредактировать буфер памяти Flash или EEPROM; • Read — команды для чтения в соответствующий буфер содержимого памяти Flash или EEPROM, а также — просмотра байтов сигнатуры, разрядов блоки- ровки и предохранения, байтов калибровки и версии программного обеспечения программатора; • Compare — команды для сравнения содержимого памяти Flash или EEPROM с соответствующим буфером.
ЧАСТЬ III Архитектура микроконтроллеров PIC
Г ЛАВА 7 Восьмиразрядные микроконтроллеры PIC В настоящее время микроконтроллеры PIC, производимые компанией Microchip Technology Inc., — одни из наиболее популярных в мире. Они основаны на модифи- цированной гарвардской RISC-архитектуре и поставляются в самых разнообразных аппаратных конфигурациях. Отличительной особенностью микроконтроллеров PIC является их совместимость “снизу вверх”, т.е. программы, написанные для более старых моделей, могут легко и во многих случаях — без каких-либо модификаций быть запущены в более новых устройствах. Базовый набор команд микроконтрол- леров PIC содержит всего лишь 33 инструкции, и большинство моделей (за исклю- чением самых современных) использует один и тот же набор команд. Все микроконтроллеры PIC реализуют следующие аппаратные возможности: • цифровые порты ввода-вывода; • встроенный таймер с восьмиразрядным предделителем частоты; • сброс по включению электропитания; • сторожевой таймер; • “спящий” режим, позволяющий экономить электроэнергию; • интерфейс со внешним тактовым генератором; • память данных; • память программ типа EEPROM или Flash. Некоторые модели реализуют следующие дополнительные функции: • аналоговые входные каналы; • аналоговые компараторы; • дополнительные таймеры; • память данных БЕРНОМ; • внешние и внутренние прерывания; • внутренний осциллятор; • выходной сигнал с широтно-импульсной модуляцией (ШИМ); • интерфейс USART для последовательного обмена данными. Некоторые из более сложных микроконтроллеров PIC предлагают следующие дополнительные возможности: • шинный интерфейс CAN; • шинный интерфейс 12С; • шинный интерфейс SPI; • прямой интерфейс с модулем ЖК-дисплея;
186 Глава 7. Восьмиразрядные микроконтроллеры PIC • интерфейс USB; • схема управления электродвигателем. Для начала мы рассмотрим “традиционные” семейства микроконтроллеров PIC, работающие с восьмиразрядным данными. Все они разбиты на три основных под- семейства: • микроконтроллеры с 12-разрядным командным словом (например, PIC 12С5ХХ и PIC 16С5Х); • микроконтроллеры с 14-разрядным командным словом (например, PIC 16F8X); • микроконтроллеры с 16-разрядным командным словом (например, PIC 17С7ХХ иР1С 18С2ХХ). Все три подсемейства используют одну и ту же RISC-архитектуру и одинако- вый набор команд при наличии нескольких дополнительных инструкций в моделях с 14-разрядным и 16-разрядным командным словом. В этой главе мы остановимся подробнее на микроконтроллерах семейств Р1С16 и Р1С12, а в следующей — на более современных устройствах семейства PIC18F. Также, мы не могли обойти вниманием новые разработки компании Microchip: 16- разрядную архитектуру PIC24 и 32-разрядную — PIC32. Изучению их особенностей посвящены главы 9 и 10 соответственно. Общие аспекты архитектуры восьмиразрядных микроконтроллеров РЮ Несмотря на большое разнообразие восьмиразрядных микроконтроллеров PIC, все они обладают некоторыми общими особенностями: наличие памяти программ и памяти данных; портов ввода-вывода, таймеров и т.д. Таким образом, имеет смысл рассмотреть эти аспекты архитектуры, общие для разных подсемейств, чтобы не повторяться в последствии. Организация памяти Память микроконтроллеров PIC состоит из трех основных компонентов: реги- стровый файл; память данных; память программ. Регистровый файл содержит все регистры, доступные в микроконтроллере PIC. Он разделен на две части: регистры специального назначения (SFR — Special Function Registers) и регистры общего назначения (GPR — General Purpose Registers) (рис. 7.1). Так, например, в микроконтроллере PIC16F84 присутствует 68 регистров общего назначения, используемых для хранения временных данных. Регистры специального назначения служат для управления внутренними про- цессами микроконтроллера PIC. Их набор варьируется в зависимости от конкретной модели. Среди важных регистров специального назначения можно назвать OPTION и INTCON, регистры ввода-вывода, таймеров, АЦП и др. Память данных используется для того, чтобы хранить все программных пере- менных. Она — энергозависимая. Это означает, что при отключении питания все содержащиеся в ней данные будут потеряны. В “традиционных” микроконтролле- рах PIC разрядность каждой ячейки памяти составляет восемь бит. По этой причине такие микроконтроллеры PIC называются восьмиразрядными. В настоящее время также доступны 16- и 32-разрядные архитектуры PIC, о которых речь пойдет в гла- вах 9 и 10.
Общие аспекты архитектуры восьмиразрядных микроконтроллеров PIC 187 Важно помнить, что, в отличие от рассмотренных в части I микроконтроллеров AVR, память данных микроконтроллеров PIC разбита на банки. В некоторых моделях таких банков два, в других — четыре или более. Требуемый банк памяти выбирается программно. Память программ служит для хранения пользовательской программы. В более старых микроконтроллерах PIC память программ была выполнена по технологии EPROM. Это означало, что ее содержимое перед программированием стиралось с помощью ультрафиолетового излучения. В современных микроконтроллерах PIC память программ реализована по технологии Flash, при которой стирание и повтор- ное программирование осуществляют с помощью программаторов. Большинство микроконтроллеров PIC может также программироваться без удаления их из схемы. Этот процесс, называемый внутрисхемным последовательным программированием ISP), ускоряет разработку проектов и снижает затраты на разработку. Хотя память программ главным образом используется для хранения программы, никто не пре- пятствует задействовать ее для хранения постоянных данных. Первым словом (ширина командного слова — 12, 14 или 16 разрядов) памяти программ микроконтроллеров PIC является адрес вектора сброса, по которому про- исходит переход при включении питания или подаче сигнала низкого уровня на вход MCLR. Таким образом, первая команда, выполняемая после сброса, размещена по адресу 0 памяти программ. Объемы памяти данных и памяти программ в различных моделях восьмираз- рядных микроконтроллеров PIC перечислены в табл. 7.1. Таблица 7.1. Параметры памяти данных и памяти программ в различных восьмираз- рядных микроконтроллерах PIC Модель Разрядность командного слова, бит Объем памяти данных, байт Объем памяти программ, слов 12С508 12 25 512 16С505 12 41 1 024 16С54 12 25 384 16С554 14 80 512 16С57 12 72 2 048 16С58А 12 73 2 048 16С64 14 128 2 048 16F627 14 224 1 024 16F628 14 224 2 048 16F676 14 64 1 024 16F73 14 192 4 096 16F84 14 36 1 024 16F876 14 368 8 192 16F877 14 368 8 192 17С43 16 454 4 096 17С752 16 678 8 192 18С242 16 512 8 192 18С252 16 1 536 16 384 18F4520 16 1 536 32 768
188 Глава 7. Восьмиразрядные микроконтроллеры PIC Организация тактирования Микроконтроллеры PIC оснащены встроенным осциллятором, который может работать в одном из пяти режимов: • LP — маломощный кварц; • XT — кварц/резонатор; • HS — высокоскоростной кварц/резонатор; • RC — цепочка резистор-конденсатор; • без внешних компонентов (только в некоторых микроконтроллерах РТС). В режимах LP, XT и HS внешний осциллятор может быть подключен ко входу OSC1 (рис. 7.1). При использовании внешнего кварца ко входам OSC1 и OSC2 мик- роконтроллера подключают два конденсатора (рис. 7.2), номинал которых выбира- ют в соответствии с табл. 7.2. Например, при частоте кварца 4 МГц можно исполь- зовать два конденсатора на 22 пФ. PIC 16F84 Внешний тактовый сцгнал Рис. 7.1. Использование внешнего осциллятора OSC1 OSC2 22pF 4MHz 22 pF Рис. 7.2. Схема с кварцевым осциллятором Таблица 7.2. Выбор конденсатора для работы кварцевого осциллятора Режим Частота С1,С2 LP 32 кГц 68-100 пФ LP 200 кГц 15-33 пФ XT 100 кГц 100-150 пФ XT 2 МГц 15-33 пФ XT 4 МГц 15-33 пФ HS 4 МГц 15-33 пФ HS 10 МГц 15-33 пФ Что касается резонаторов, то они работают в диапазоне частот от 4 МГц до поч- ти 8 МГц. Они не столь точны, как кварцевые осцилляторы, и обычно представляют собой устройства с тремя выводами, два из которых связаны со входами OSC1 и OSC2 микроконтроллера, а третий — с “землей” (рис. 7.3). Для приложений, в которых точность синхронизации неважна, ко входу OSC1 микроконтроллера можно подключить внешний резистор и конденсатор (рис. 7.4).
Общие аспекты архитектуры восьмиразрядных микроконтроллеров PIC 189 Частота такого осциллятора зависит от номиналов резистора и конденсатора (см. табл. 7.3), напряжения питания и температуры. Для большинства случаев примене- ния резистор на 5 кОм с конденсатором на 20 пФ дает приблизительно 4 МГц, что приемлемо для систем, некритичных к временным характеристикам. Рис. 7.3. Схема резонаторного осциллятора Таблица 7.3. Выбор компонентов RC-осциллятора С R Частота 20 пФ 5 кОм 4,61 МГц 10 кОм 2,66 МГц 100 кОм 311 кГц 100 пФ 5 кОм 1,34 МГц 10 кОм 756 кГц 100 кОм 82,8 кГц 300 пФ 5 кОм 428 кГц 10 кОм 243 кГц 100 кОм 26,2 кГц В завершение этой темы отметим, что некоторые микроконтроллеры PIC оснащены встроенным осцилля- тором, не требующим никаких внешних компонентов. Он обычно работает с частотой 4 МГц и выбирается в ходе программирования устройства. Например, микро- контроллеры PIC 16F62X могут работать от внутреннего RC-осциллятора на 4 МГц, а для обеспечения перемен- ной частоты к выводу RA7 может быть дополнительно подключен резистор (рис. 7.5). В зависимости от номи- нала этого резистора частота осциллятора составляет от 200 кГц до 10,4 МГц. В этом режиме вывод RA7 недос- тупен для цифрового ввода-вывода. Значение резистора для настройки частоты внутрен- него осциллятора: • 0—10,4 МГц; • 1 кОм — 10,0 МГц; Рис. 7.5. Изменение частоты внутреннего осциллятора
190 Глава 7. Восьмиразрядные микроконтроллеры PIC • 10 кОм —7,4 МГц; • 20 кОм — 5,3 МГц; • 47 кОм — 3 МГц; • 100 кОм—1,6 МГц; • 220 кОм — 800 кГ ц; • 470 кОм — 300 кГц; • 1 МОм — 200 кГц. Частота внутреннего осциллятора некоторых микроконтроллеров (например, PIC 16F630) может быть откалибрована для получения более точных импульсов синхронизации в критических ко времени приложениях (например, при последова- тельном обмене данными). Для этого служит специальный регистр OSCCAL, в который загружается калибровочная константа, по умолчанию хранимая в послед- ней ячейке памяти. Кроме того, можно самостоятельно корректировать значение ре- гистра OSCCAL для подстройки частоты осциллятора. Порты Для управления вводом-выводом через каждый параллельный порт служит со- ответствующая пара регистров: • регистр данных — PORTx; • регистр управления направлением передачи — TRISx. 0 0 0 0 0 0 1 1 PORTB 7 6 5 4 3 2 1 _°J Рис. 7.6. Регистры TRISB и PORTB Количество таких пар регистров соответствует количеству портов. С их помо- щью через любой порт может быть одновременно выдано или принято от одного до восьми бит данных. Порты в микроконтроллерах PIC — двуна- правленные. Это означает, что любой вывод порта может использоваться и как вход, и как выход. Это задает соответствующий управляющий регистр TRISx. Запись в некоторый разряд регистра TRISx лог. 1 делает соответствующий вывод порта вхо- дом, а лог. 0 — выходом. Например, для того что- бы разряды 0 и 1 порта В были входами, а все ос- тальные — выходами, в регистр TRISB необходи- мо записать значение 00000011 (рис. 7.6). В некоторых микроконтроллерах PIC (например, 18Сх) порт D может работать в режиме управляемого параллельного порта PSP (Parallel Slave Port). Это означает, что он действует как регистр, который может быть подключен к шине другого мик- роконтроллера, обмениваясь с ним данными. В режиме PSP, как и в случае обмена данными с любым периферийным устройством, используются сигналы RD (чтение), WR (запись) и CS (выбор кристалла) — разряды 0-2 порта Е (пример — рис. 7.7). Для управления режимом PSP используется регистр TRISE (рис. 7.8). Режим PSP активизируется путем установки в лог. 1 разряда PSPMODE. Прерывания раз- решаются установкой в лог. 1 разряда PSPIE (разряд 7) регистра PIE1, а запросы формируются в разряде PSPIF (разряд 7) регистра PIR1. С помощью разрядов 0-2 регистра TRISE осуществляется выбор режима для соответствующих разрядов пор- та Е.
Общие аспекты архитектуры восьмиразрядных микроконтроллеров PIC 191 Микроконтроллер в режиме PSP Внешний микроконтроллер Рис. 7.7. Пример подключения внешнего микроконтроллера PIC в режиме PSP 7 6 5 4 3 2 1 О IBF OBF IBOV PSPMODE — TRISE2 TRISE1 TRISE0 Рис. 7.8. Регистр TRISE Когда на линиях CS и RD (выводы Е2 и ЕО) одновременно появляется низкий уровень сигнала, содержимое регистра OUTREG выводится через порт D. При запи- си в регистр OUTREG устанавливается в лог. 1 разряд OBF регистра TRISE. Это оз- начает, что выходной буфер заполнен данными. После передачи данных разряд OBF автоматически обнуляется. Когда на линиях CS и WR (выводы Е2 и Е1) одновременно появляется низкий уровень сигнала, осуществляется прием данных через порт D. Принятая величина сохраняется в регистре INREG, при этом автоматически устанавливается в лог. 1 разряд IBF регистра TRISE. После программного считывания содержимого регистра INREG этот разряд автоматически обнуляется. Если ранее принятый байт не считывается до поступления следующего байта в регистр INREG, то устанавливается в лог. 1 разряд IBOV регистра TRISE, указы- вающий на переполнение входного буфера. Вывод порта микроконтроллера может выдавать и принимать ток силой до 25 мА. Когда вывод выдает ток, схема нагрузкй одним концом связана с этим выво- дом, а другим — с “землей” (рис. 7.9 слева). Энергия поступает в нагрузку, когда вывод порта переходит в состояние лог. 1. Если вывод принимает ток, то схема нагрузки одним концом подключена к на- пряжению питания, а другим связана с выводом (рис. 7.9 справа). Энергия поступа- ет в нагрузку, когда вывод порта переходит в состояние лог. 0. Нагрузка Рис. 7.9. Подключение нагрузки к выводу порта: слева — выдача тока; справа — получение тока
192 Глава 7. Восьмиразрядные микроконтроллеры PIC Таймеры Некоторые восьмиразрядные микроконтроллеры PIC (например, 16F84) осна- щены только одним таймером, в то время как другие могут предоставлять до трех таймеров. В этом случае они нумеруются, начиная с нуля: TMRO, TMR1 и TMR2. Кроме того, практически все микроконтроллеры PIC оснащены так называемым сторожевым таймером. Поскольку TMR0 и сторожевой таймер присутствуют почти в любой модели PIC, мы начнем именно с нйх. TMR0 и сторожевой таймер Таймер TMR0 представляет собой восьмиразрядный регистр (адрес $01) и мо- жет работать в режиме таймера или счетчика. В последнем случае его содержимое увеличивается на единицу всякий раз при поступлении тактового импульса на вы- вод Т0СК1 микроконтроллера. В режиме таймера прирост содержимого, происходит с частотой, определяемой частотой системной синхронизации и коэффициентом предварительного деления, задаваемой регистром OPTION (рис. 7.10). 7 б 5 4 3 2 1 0 RBPU INTEDG TOCS TOSE PSA PS2 PS1 PSO Рис. 7.10. Регистр OPTION Коэффициент деления выбирают с помощью разрядов PS2:PS0 регистра OPTION в диапазоне от 2 до 256 (табл. 7.4). Например, при использовании тактовой частоты 4 МГц, базовый командный цикл составляет 1 мкс (частота тактирования внутренне делится на четыре). Таким образом, если, например, выбрать коэффици- ент деления 16, то содержимое счетчика будет увеличиваться на единицу через ка- ждые 16 мкс. Таблица 7.4. Выбор коэффициента деления с помощью регистра OPTION PS2 PS1 PSO Коэффициент деления 0 0 0 2 0 0 1 4 0 1 0 8 0 1 1 16 1 0 0 32 1 0 1 64 1 1 0 128 1 1 1 256 При переполнении (т.е. переходе от 255 к 0) счетного регистра формируется прерывание от таймера (если оно разрешено). Например, если необходимо выдавать запрос на прерывание с интервалом в 200 мкс при тактовой частоте 4 МГц, то мы можем задать коэффициент деления 4 и разрешить прерывания от таймера. В ре- зультате мы получим период следования импульсов тактирования таймера 4 мкс. Для получения 200 мкс на таймер необходимо подать 50 тактовых импульсов, а зна- чит в регистр TMR0 должно быть предварительно загружено значение 256 - 50 = = 206, т.е. до переполнения должно быть отсчитано 50 единиц. Что касается сторожевого таймера, то его осциллятор независим от сигнала сис- темной синхронизации, а период его срабатывания составляет 18 мс. Во избежание сброса от сторожевого таймера, его следует периодически программно обнулять.
Общие аспекты архитектуры восьмиразрядных микроконтроллеров PIC 193 Для увеличения периода срабатывания можно использовать предделитель. При этом доступны коэффициенты деления частоты 1, 2, 4, 8, 16, 32, 64 и 128. Например, ко- гда установлен коэффициент 128, то период срабатывания сторожевого таймера со- ставит около 2 с (18 х 128 = 2 304 мс). Если сторожевой таймер не используется, то его при программировании микроконтроллера можно отключить. Функциональная схема включения TMR0 и сторожевого таймера показана на рис. 7.11. Рис. 7.11. Схема включения TMR0 и.сторожевого таймера Источник входного сигнала для TMR0 выбирают с помощью разряда TOCS ре- гистра OPTION (см. рис. 7.10): • 0 — внутренний осциллятор микроконтроллера с делением частоты fosc на 4; • 1 — внешний тактовый сигнал на входе RA4/T0CK1. Мы затронем лишь вариант , с внутренним осциллятором. При использовании кварца на 4 МГц частота внутреннего осциллятор составит fosc/4 = 1 МГц, что соот- ветствует периоду Т = l(f = IO-6 или 1 мкс. Таймер TMR0 выбирают в качестве ис- точника для предделителя путем обнуления разряда PSA в регистре OPTION (см. рис. 7.10). Требуемое значение коэффициента деления выбирают с помощью разря- дов PS2:PS0 того же регистра (см. табл. 7.4). Разряд PSA затем должен быть обну- лен для назначения предделителя таймеру. Теперь содержимое регистра TMR0 бу- дет увеличиваться на единицу по каждому импульсу от внутреннего осциллятора. Когда TMR0 переходит от 255 к 0, формируется запрос на прерывание от тай- мера (если оно разрешено). Загружая некоторое значение в регистр TMR0, можно управлять количеством отсчетов до получения переполнения. *Для вычисления вре- мени до момента переполнения таймера при заданном периоде следования тактовых импульсов, исходном значении и коэффициенте деления частоты можно воспользо- ваться следующей формулой: Tovf = 4 х Tqsc х К х (256 - TMR0), (7.1) где Tqvf — время до момента переполнения (мкс), lose — период следования им- пульсов от осциллятора (мкс); К — коэффициент делителя частоты, выбранный с помощью регистра OPTION; TMR0 — значение, загруженное в регистр TMR0.
194 Глава 7. Восьмиразрядные микроконтроллеры PIC Предположим, мы используем кварц на 4 МГц, а коэффициент деления равен 8 (PS2:PS0.= 010). Также примем, что в регистр TMR0 загружено десятичное число 100. В таком случае время до переполнения составляет: Tovf = 4 х (1 / 4 МГц ) х 8 х (256 - 100) = 4 х 0,25 мкс х 8 х 156 = 1248 мкс. На практике нам необходимо знать на время до переполнения, как таковое, а значение, которое должно быть загружено в регистр TMR0. Его можно вычислить по формуле, полученной из уравнения (hl): TMR0 = 256 -(2ovf)/(4 х Tqsc х К) . (1.2) Предположим, мы хотим, чтобы прерывание возникло через 500 мкс. При этом тактовая частота и коэффициент деления — такие же, как и в предыдущем примере. В таком случае, значение, которое должно быть загружено в регистр TMR0, равно: TMR0 = 256 - 500/(4 х 0,25 х 8) = 193,5. Таким образом, в регистр TMR0 необходимо загрузить число 193. Значения, ко- торые должны быть записаны в регистр TMR0 для получения различных периодов до переполнения, показаны в табл. 7.5 (принимается, что используется кварц на 4 МГц). TMR1 Хотя TMR0 — базовый таймер, присутствующий почти во всех микроконтрол- лерах PIC, некоторые модели предоставляют несколько таймеров, например: TMR0, TMR1 и TMR2. Дополнительные таймеры расширяют функциональные возможно- сти устройства. Так, TMR1 — это 16-разрядный таймер, состоящий из двух восьми- разрядных регистров TMR1H и TMR1L. Как показано на рис. 7.12, с TMR1 исполь- зуется предделитель частоты. При этом доступны коэффициенты деления 1, 2, 4, и 8. Таблица 7.5. Значения TMR0 для получения различных периодов до переполнения Время до пере- полнения, мкс Коэффициент деления 2 4 8 16 32 64 128 256 100 206 231 243 250 253 254 — — 200 156 206 231 243 250 253 254 — 300 106 181 218 237 246 251 253 255 400 56 156 206 231 243 250 253 254 * 500 6 131 193 224 240 248 252 254 600 — 106 181 218 237 16 251 253 700 — 81 168 212 234 245 250 253 800 — 56 156 206 231 243 250 253 1 000 — 6 131 193 225 240 248 252 5 000 — — — — 100 178 77 236 10 000 — — — — — 100 178 217 20 000 — — — — — — 100 178 30 000 — — — — — — — 139 40 000 — — — — — — — 100 50 000 — — — — — — — 60 60 000 — — — — — — — 21
Общие аспекты архитектуры восьмиразрядных микроконтроллеров PIC 195 Рис. 7.12. Структура TMR1 Работой TMR1 управляет регистр T1CON (рис. 7.13). 7 6 5 4 3 2 1 О — — T1CKPS1 TICKP5O T1OSCEN TISYNC TMR1CS TMR1ON Рис. 7.13. Регистр T1CON TMR1 может работать в режиме таймера и счетчика; что определяется состоя- нием разряда TMR1CS. В режиме таймера содержимое регистра TMR1 увеличива- ется на единицу по каждому импульсу в сигнале с частотой /bsc/4. Для включения или выключения TMR1 служит разряд TMR1ON. Счет выполняется от 0 до 65 535. При переходе от 65 535 к 0 возникает прерывание по переполнению (если оно раз- решено). Когда TMR1 работает в режиме счетчика, его содержимое увеличивается на единицу по каждому нарастающему фронту сигнала на входе TIOSO. Коэффициент деления частоты тактового сигнала для TMR1 задают разряды TICKPS[1:0] регистра T1CON (табл. 7.6). Таблица 7.6. Выбор коэффициента деления с помощью регистра T1CON TICKPS1 TICKPS0 Коэффициент деления 0 0 1 0 1 2 1 0 4 1 1 8 Счетный регистр таймера TMR1 представляет собой регистровую пару TMR1H:TMR1L, а управление прерываниями осуществляется с помощью разрядов регистров PIR1 и PIE1: • регистр PIR1: ► разряд 0 — TMR1IF — флаг переполнения TMR1; ► разряд 2 — ССР 1 IF — флаг прерывания при возникновении захвата по входу; • регистр PIE 1: ► разряд 0 — TMR1IE — флаг разрешения прерывания при переполнении TMR1; ► разряд 2 — ССР НЕ — флаг разрешения прерывания при возникновении за- хвата по входу. TMR2 TMR2 — это восьмиразрядный таймер с предделителем и постделителем часто- ты, содержащий восьмиразрядный регистр периода PR2 (рис. 7.14). Его назначение
196 Глава 7. Восьмиразрядные микроконтроллеры PIC — измерение временных интервалов для реализации ШИМ, обеспечения опреде- ленной скорости обмена по последовательному порту и т.п. В этом смысле он подо- бен таймеру TMR0. Рис. 7.14. Схема таймера TMR2 Таймер TMR2 тактируется импульсами, следующими с частотой такта систем- ной синхронизации, деленной на четыре. Каждый раз, когда содержимое счетного регистра TMR2 совпадает с содержимым регистра PR2, таймер автоматически сбра- сывается в исходное (нулевое) состояние. При каждом совпадении TMR2 и PR2 генерируется запрос на прерывание, час- тоту возникновения которого можно также масштабировать с помощью выходного делителя частоты. Для управления таймером TMR2 используется регистр T2CON (рис. 7.15). 7 6 5 4 3 2 1 О — TOUTPS3 TOUTPS2 TOUTPS1 TOUTPSO TMR2ON T2CKPS1 T2CKPS0 Рис. 7.15. Регистр T2CON микроконтроллеров PIC Назначение отдельных разрядов регистра T2CON: • T2CKPS[l: 0] — управление предделителем частоты (табл. 7.7); • TMR2ON — подключение таймера (0 — отключен, 1 — включен); • TOUTPS[3:0] — выбор коэффициента деления частоты запросов на прерывание при TMR2 = PR2 (табл. 7.8). Таблица 7.7. Назначение разрядов T2CKPS[1:0] регистра T2CON T1CKPS1 T1CKPS0 Коэффициент деления частоты тактового сигнала 0 0 1 0 1 4 1 X 16 Таблица 7.8. Назначение разрядов TOUTPS[3:0] регистра T2CON TOUTPS3 TOUTPS2 TOUTPS1 TOUTPSO Коэффициент деления частоты запросов 0 0 0 0 1 0 0 0 1 2
Общие аспекты архитектуры восьмиразрядных микроконтроллеров PIC 197 Таблица 7.8. Окончание TOUTPS3 TOUTPS2 TOUTPS1 TOUTPSO Коэффициент деления частоты запросов 0 0 1 0 3 0 0 1 1 4 0 1 0 0 5 0 1 0 1 6 0 1 1 0 7 0 1 1 1 8 1 0 0 0 9 1 . 0 0 1 10 1 0 1 0 11 1 0 1 1 12 1 1 0 0 13 1 1 0 1 14 1 1 1 0 15 1 1 1 1 16 _ _ . __J Для организации прерываний используются разряды TMR2IE (флаг разреше- ния) и TMR2IF (флаг прерывания) регистров PIE1 и PIR1 соответственно. Для того чтобы эффективно использовать таймер TMR2, используются сле- дующие формулы: Г=(4х^1 х К2 х PR2) //; PR2 = T*fl(4 х к\ Х/Г2), где Т — требуемая временная задержка, К\ — коэффициент предварительного де- ления частоты;. К2 — коэффициент деления частоты запросов на прерывание; PR2 — содержимое регистра PR2;/— частота системной синхронизации. Модуль ССР Таймеры TMR1 и TMR2 микроконтроллеров PIC применяются в составе модуля сравнения/захвата/ШИМ — ССР (Compare-Capture-PWM). Таких модулей может быть два: ССР1 и ССР2, — управление которыми реализовано с помощью регист- ров CCPxCON (рис. 7.16). 7 6 5 4 3 2 1 О — — DC1BX1 DC1BX0 ССР1МЗ ССР1М2 ССР1М1 ССР1М0 Рис. 7.16. Регистр CCPxCON микроконтроллеров PIC Назначение отдельных разрядов регистра CCPxCON: • ССР1М[3:0] — выбор режима захвата/сравнения (табл. 7.9); • DC 1 ВХ[ 1:0] — два младших разряда 10-разрядной ШИМ. Таблица 7.9. Назначение разрядов ССР1М[3:0] регистра CCPxCON ССР1МЗ ССР1М2 ССР1М1 ССР1М0 Значение 0 0 X X Модуль ССР отключен 0 1 0 0 Захват по каждому ниспадающему фронту 0 1 0 1 Захват по каждому нарастающему фронту 0 1 1 0 Захват по каждому 4-му нарастающему фронту 0 1 1 1 Захват по каждому 16-му нарастающему фронту
198 Глава 7. Восьмиразрядные микроконтроллеры PIC Таблица 7.9. Окончание ССР1МЗ ССР1М2 ССР1М1 ССР1М0 Значение 1 0 0 0 В случае совпадения на выходе — высокий уро- вень 1 0 0 1 В случае совпадения на выходе — низкий уровень 1 0 1 0 В случае совпадения — запрос на прерывание 1 0 1 1 Особый случай режима сравнения 1 1 X X Режим ШИМ В режиме захвата (т.е. фиксации значения таймера в момент появления опреде- ленного условия) используются регистры CCPR1H, CCPR1L (в случае TMR1) или CCPR2H, CCPRL (в случае TMR2). В таком режиме таймер выполняет функции счетчика тактовых импульсов, и при наступлении условия захвата его содержимое переписывается в регистровую пару CCPRx. В режиме сравнения модуль ССР формирует сигнал на выходе ССРх в том слу- чае, когда содержимое счетного регистра становится равным значению, записанно- му в регистровой паре CCPRxH:CCPRxL. Этот режим обычно используется для вы- дачи сигналов на внешние устройства по истечении некоторого временного интер- вала. В режиме ШИМ таймер работает как делитель частоты,, формирующий период ШИМ-сигнала. Его значение постоянно сравнивается с содержимым регистра PR2, и при совпадении компаратор сбрасывает таймер в исходное состояние, после чего цикл повторяется. Параллельно организован контур сравнения, включающий в себя таймер, второй компаратор и регистр CCPRxH. Выходы обоих компараторов управ- ляют RS-триггером, выход которого соединен с выводом ССРх. Вначале триггер устанавливается в “1” по сигналу сброса таймера, а по сигналу компаратора контура сравнения — сбрасывается в “0”. Таким образом, на выходе RS-триггера формируется сигнал с периодом, определяемым содержимым регист- ров PR2 и CCPRxH. Обработка прерываний Прерывания — это вызовы определенных функций, генерируемые, главным образом, аппаратной частью микроконтроллера. В результате прерывания выполне- ние программы останавливается, и происходит переход к соответствующей подпро- грамме обработки прерывания. Прерывания бывают внутренними и внешними. Ис- точниками внутреннего прерывания являются встроенные модули микроконтролле- ра (например, таймер/счетчик или сторожевой таймер). Внешние прерывания вызы- ваются сбросом (сигнал на выводе RESET) или сигналами предустановленного уровня на выводах 1NT. В ряде восьмиразрядных микроконтроллербв PIC выбор фронта для активиза- ции прерывания по входу INT определяется состоянием разряда INTEDG регистра OPTION (см. рис. 7.10). Лог. 1 в этом разряде соответствует прерывание по нарас- тающему, а лог. 0 — по ниспадающему фронту сигнала. В микроконтроллерах PIC источники прерывания, кроме RESET, не рассматри- ваются в отдельности, им обычно соответствует один вектор, а в некоторых моде- лях — два вектора для прерываний с различной приоритетностью. Определять, ка- кое именно прерывание требует обслуживания, — задача программиста, и многие компиляторы с языка С предоставляют для этой цели готовые функции, освобож- дающйе от необходимости самому “вычислять” источник прерывания.
Общие аспекты архитектуры восьмиразрядных микроконтроллеров PIC 199 В момент возникновения прерывания в стек помещается адрес возврата — ад- рес команды, которая должна быть выполнена первой после выхода из подпрограм- мы обработки прерывания. В результате выполнения последней ассемблерной ко- манды подпрограммы обработки прерывания (для микроконтроллеров PIC это ко- манда ret fie) адрес возврата извлекается из стека в счетчик команд, и выполнение программы продолжается. В микроконтроллерах PIC управление прерываниями реализовано с помощью регистров специальных функций, и отличается от устройства к устройству. Напри- мер, в моделях 12С6х, 14000, 16х для этой цели используются регистры INTCON (рис. 7.17), PIE и PIR, а программы обработки прерываний всегда начинают испол- няться с адреса $004. 7 6 5 4 3 2 1 О GIE PEIE TOIE INTE RBIE TOIF INTF RBIF Рис. 7.17. Регистр INTCON микроконтроллеров PIC12C6x, PIC14000, Р1С16х Разряд GIE — это флаг общего разрешения прерываний. Если он установлен в лог. 1, то все немаскированные прерывания разрешены, если же он сброшен в лог. 0, то все прерывания запрещены. Разряд PEIE регистра INTCON может использоваться в качестве флага разре- шения всех прерываний от периферии, определяемых с помощью регистров PIE и PIR. Флаг TOIE разрешает (лог. 1) или запрещает (лог. 0) прерывания при перепол- нении таймера TMR0), а флаг TOIF определяет запрос на соответствующее преры- вание. Разряд INTE — флаг разрешения внешнего прерывания по входу INT, а разряд INTF — флаг запроса на прерывания по этому входу. Аналогичное значение, но для порта В имеют разряды RBIE и RBIF. Регистр PIE содержит флаги разрешения прерываний от периферийных уст- ройств, а регистр PIR — соответствующие флаги запросов на прерывание. Позиции разрядов в этих регистрах для различных микроконтроллеров отличаются. Микроконтроллеры серии Р1С17Сх В микроконтроллерах серии Р1С17Сх используется четыре вектора прерываний: • $00008 — внешнее прерывание по входу INT (приоритет — высокий); • $00010 — прерывание от таймера TMR0 (приоритет — высокий); • $00018 — внешнее прерывание по входу ТОСК1 (приоритет — высокий); • $00020 — прерывание от периферийных устройств (приоритет — низкий). Для управления прерываниями в этой серии микроконтроллеров используется регистр INTSTA (рис. 7.18). 7_______6_______5 4________3______2_______1_______0 PEIF TOCKIF TOIF INTF PEIE TOCKIE TOIE INTE Рис. 7.18. Регистр INTSTA микроконтроллеров PIC17CX Рассмотрим назначение разрядов этого регистра: • PEIF — устанавливается в лог. 1 в случае задержки прерывания, инициирован- ного периферийным устройством;
200 Глава 7. Восьмиразрядные микроконтроллеры PIC • TOCKIF — флаг разрешения внешнего прерывания по входу TOCKI (при пере- ходе к вектору $00018 аппаратно сбрасывается в лог. 0); • TOIF — флаг переполнения счетчика TMR0 (при переходе к вектору $00010 ап- паратно сбрасывается в лог. 0); • INTF — флаг разрешения внешнего прерывания по входу INT (при переходе к вектору $00008 аппаратно сбрасывается в лог. 0); • PEIE — флаг разрешения прерываний от периферийных устройств; • TOCKIE — флаг разрешения внешних прерываний по входу ТОСК1; • TOIE — флаг разрешения прерываний от таймера TMR0; • INTE — флаг разрешения прерываний по входу INT. Флаги разрешений и запросов на прерывания от внешних устройств находятся в регистрах PIE и PIR. При этом их разряды имеют следующую взаимосвязь с пери- ферией микроконтроллера: • 0 (RCIE/RCIF) — прием данных приемопередатчиком UASRT; • 1 (TXIE/TXIF) — передача данных приемопередатчиком UASRT; • 2 (С А1 IE/С А1 IF) — модуль ССР 1; • 3 (CA2IE/CA2IF) — модуль ССР2; • 4 (TMR1IE/TMR1 IF) — таймер TMR1; • 5 (TMR2IE/TMR2IF) — таймер TMR2; • 6 (TMR3IE/TMR3IF) — таймер TMR3; • 7 (RBIE/RB1F) — порт В. Микроконтроллеры серии Р1С18Сх В этой серии микроконтроллеров PIC применяется схема управления прерыват ниями, немного напоминающая задействованную в сериях 12С6х, 14000 и 16х, од- нако есть четыре важных отличия: • каждому источнику прерываний задается собственный уровень приоритета; • вместо одного регистра INTCON используется три (INTCON, INTCON2, INTCON3); • вместо одного регистра PIE и PIR используется по два (PIE1/PIE2; PIR1/PIR2); • присутствует регистры IPR1 и IPR2, задающие приоритеты прерываний от пе- риферийных устройств. Рассмотрим вначале регистры INTCON (рис. 7.19). 7 6 5 4 3 2 1 0 INTCON GIE PEIE TMR0IE INTOIE RBIE TMR0IF INTOIF RBIF 7 6 5 4 3 2 • 1 0 INTCON2 _RBPU INTEDG0 INTEDG1 INTEDG2 — TMR0IP — RBIP 7 6 5 4 3 2 1 0 INTCON3 INT2IP INT1IP — INT2IE INT1IE — INT2IF INT1IF Рис. 7.19. Регистры INTCON микроконтроллеров PIC18CX
Общие аспекты архитектуры восьмиразрядных микроконтроллеров PIC 201 Назначение разрядов регистров INTCON: • INTCON: ► GIE — флаг общего разрешения прерываний; ► PEIE — флаг разрешения всех запросов на прерывание с низким приорите- том; ► TMR0IE — флаг разрешения прерываний от таймера TMR0; ► INT0IE — флаг разрешения прерываний по входу INTO; ► RBIE — флаг разрешения прерывания по изменению состояния порта В; ► TMR0IF — запрос на прерывание от таймера TMR0; ► INT0IF — запрос на прерывание по входу INTO; ► RBIF — запрос на прерывание по изменению состояния порта В; • INTCON2: ► INTEDG0 — выбор фронта для внешнего прерывания по входу INTO (лог. 1 — по нарастающему фронту); ► INTEDG1 — выбор фронта для внешнего прерывания по входу 1NT1 (лог. 1 — по нарастающему фронту); ► INTEDG2 — выбор фронта для внешнего прерывания по входу INT2 (лог. 1 — по нарастающему фронту); ► TMR0IP — задает высокий приоритет для прерывания от таймера TMR0; ► RBIP — задает высокий приоритет для прерывания по изменению состояния порта В; • INTCON3: ► INT2IP — задает высокий приоритет для внешних прерываний по входу INT2; ► INTI IP — задает высокий приоритет для внешних прерываний по входу INT1; ► INT2IE — флаг разрешения внешних прерываний по входу INT2; ► INTI IE — флаг разрешения внешних прерываний по входу INT1; ► INT2IF — запрос на прерывание до входу INT2; ► INTI IF — запрос на прерывание по входу INT1. Структура регистров PIE показана на рис. 7.20. 2 1 0 7 6 5 4 3 PIE1 PSPIE ADIE RCIE TXIE SSPIE CCP1IE TMR2IE TMR1IE 7 6 5 4 3 2 1 0 PIE2 — — — '— BCLIE LVDIE TMR3IE CCP2IE Рис. 7.20. Регистры PIE микроконтроллеров Р1С18Сх Назначение разрядов регистров PIE: • PSPIE — флаг разрешения прерывания от PSP при выполнении операций чте- ния/записи; • ADIE — флаг разрешения прерывания по завершению аналого-цифрового пре- образования; • RCIE — флаг разрешения прерывания от USART при приеме данных; • TXIE — флаг разрешения прерывания от USART при передаче данных; • SSPIE — флаг разрешения прерывания от MSSP;
202 Глава 7. Восьмиразрядные микроконтроллеры PI • ССРПЕ — флаг разрешения прерывания от модуля ССР1; • TMR2IE — флаг разрешения прерывания при совпадении содержимого таймер; TMR2 и регистра PR2; • TMR1 ТЕ — флаг разрешения прерывания при переполнении таймера TMR1; • BCLIE — флаг разрешения прерывания при конфликте на шине; • LVDIE — флаг разрешения прерывания при обнаружении низкого уровня пи- тающего напряжения; • TMR3IE — флаг разрешения прерывания при переполнении таймера TMR3; • CCP2IE — флаг разрешения прерывания от модуля ССР2. Регистры PIR и IPR имеют сходную структуру и взаимосвязь разрядов с раз личными устройствами и модулями. Сброс Сброс используется для того, чтобы привести микроконтроллер в заранее из вестное состояние. В случае с восьмиразрядными микроконтроллерами PIC управ ление при сбросе обычно передается на адрес 0 памяти программ (первая исполняв мая команда программы пользователя). Операция сброса также приводит в исход ное состояние различные регистры специального назначения. Сброс возникает по одной из следующих причин: • при включении питания; • при появлении сигнала низкого уровня на входе MCLR; • по переполнению сторожевого таймера. Наиболее распространенные виды сброса — при подаче питания, когда вхо MCLR подключен к напряжению питания через резистор (например, на 4,7 кОм (рис. 7.21). Кроме того, во многих системах необходимо предусмотреть сброс мик роконтроллера по нажатию внешней кнопки. Простейшая схема обеспечения внеш него сброса показана на рис. 7.22. В этой схеме вход MCLR в ходе работы микро контроллера находится в состоянии лог. 1. При нажатии кнопки он переходит в со- стояние лог. 0, что приводит к сбросу. Когда кнопка сброса отпущена, микрокон- троллер начинает выполнять команды, начиная с адреса 0 памяти программ. +Vdd 4.7 К MCLR PIC Рис. 7.22. Использование для сброса внешней кнопки Рис. 7.21. Сброс при подаче питания Последовательный обмен данными В случае последовательного обмена данными используется только одна инфор- мационная линия. При этом передача бывает асинхронной и синхронной. При сии-
Общие аспекты архитектуры восьмиразрядных микроконтроллеров PIC 203 хронном последовательном вводе-выводе синхронизируется передача отдельных битов данных с помощью одновременно передаваемого тактового сигнала. Син- хронная последовательная передача данных применяется, главным образом, на уровне печатных плат, в том числе — для обмена данными между различными ин- тегрированными блоками в составе схемы микроконтроллера и различными пери- ферийными схемами (например, для обработки видеосигнала). В противоположность этому, при асинхронной передаче данных передается не тактовый сигнал, а старт-бит и стоп-бит, определяющие начало и завершение пе- редачи слова данных. Главной областью применения асинхронной передачи дан- ных, как правило, является не обмен данными в составе схемы, а коммуникация ме- жду блоками, разделенными пространственно и обладающими признаками собст- венного интеллекта. В качестве примера можно назвать связь между персональным компьютером и принтером, модемом, программирующим устройством или регист- ратором данных. В микроконтроллерах PIC асинхронная передача данных осуществляется с помощью приемопередатчика USART или по шине CAN, а для синхронного вво- да-вывода используется особый режим приемопередатчика USART, а также интер- фейсы SPI и 12С (или с помощью порта MSSP). Рассмотрим перечисленные средства подробнее. Приемопередатчик USART В восьмиразрядных микроконтроллерах PIC скорость обмена данными через приемопередатчик USART задается восьмиразрядным счетчиком во взаимодейст- вии с регистром SPBRG. Когда содержимое счетчика и регистра SPBRG совпадает, счетчик сбрасывается в нуль. На значение скорости передачи через USART также влияет состояние разряда BRGH регистра управления TXSTA (рис. 7.23). Этот раз- ряд определяет, какая требуется скорость для передачи данных: высокая (BRGH = 1) или низкая (BRGH = 0). 7_______6______5 4_______3 2_______1_______0 CSRC ТХ9 TXEN SYNC — BRGH TRMT TX9D Рис. 7.23. Регистр TXSTA микроконтроллеров PIC Значение для записи в регистр SPBRG вычисляется по следующей формуле: SPBRG = (/osc х 4brgh) / (64 х скорость передачи) - 1. Например, для того чтобы получить скорость передачи 9 600 бод для микрокон- троллера с рабочей частотой fosc = Ю МГц в регистр SPBRG должно быть записано значение (10 х 106 х 4) / (64 х 9 600) - 1 = 64,1 (округляем до 64). Управление приемопередатчиком USART осуществляется с помощью регист- ров TXSTA (см. рис. 1.32) и RCSTA (управление процессом приема) (рис. 7.24). 7 6 5 4 3 2 1 0 SREN RX9 SREN CREN ADDEN FERR OERR RX9D Рис. 7.24. Регистр RCSTA микроконтроллеров PIC Приемопередатчик USART может обмениваться данными не только в асин- хронном, но и в синхронном режиме. В этом случае поразрядный сдвиг данных из сдвигового регистра в линию передачи (или наоборот) осуществляется по синхро- импульсам самого приемопередатчика USART или внешнего устройства. Выбор
204 Глава 7. Восьмиразрядные микроконтроллеры PIC режима работы USART осуществляется с помощью разряда SYNC регистра TXSTA (1 — синхронный режим; 0— асинхронный режим), а выбор источника тактовых импульсов в синхронном режиме — с помощью разряда CSRC (1 — внутренний ис- точник; 0 — внешний источник). Назначение остальных разрядов регистра TXSTA: '• TX9D — девятый бит передаваемых данных, если ТХ9 = 1; • TRMT — флаг, сигнализирующий о завершении передачи байта; • TXEN — флаг разрешения передачи данных; • ТХ9 — разрешение (лог. 1) передачи данных в девятиразрядном формате. Назначение разрядов регистра RCSTA: • RX9D — девятый бит принимаемых данных, если RX9 = 1; • OERR — флаг, указывающий на переполнение буфера приема; • FERR — флаг, указывающий на обнаружение ошибки в формате принимаемых данных; • ADDEN — разрешение обнаружения адреса в асинхронном режиме передачи девяти бит данных — в некоторых микроконтроллерах PIC приемник USART может использоваться для приема сразу двух байтов в формате “данные:адрес”, где адрес предназначен для идентификации устройства, связанного с шиной данных (в таком случае подпрограмма обработки прерывания вначале проверит адрес запрошенного устройства и только потом обработает байт данных); • CREN — разрешение режима непрерывного приема; • SREN — флаг разрешения однократного приема в синхронном режиме (после приема данных автоматически сбрасывается в лог. 0); • RX9 — флаг разрешения приема девяти бит данных; • SREN — флаг активизации USART (для передачи битов данных используется вывод 6 порта С, а для приема — вывод 7 того же порта). Флаги запросов (TXIF и RCIF) и разрешения (TXIE и RCIE) прерываний от USART находятся в регистрах PIR и PIE. Синхронная передача данных по интерфейсу SPI Интерфейс SPI (Serial Peripheral Interface) служит для обмена данными с пери- ферийными устройствами. В качестве таких устройств могут выступать простые сдвиговые регистры или буквенно-цифровые модули индикации, а также сложные микропроцессорные системы или системы регистрации данных. Многие компании- изготовители предлагают большой выбор устройств с интерфейсом SPI. В случае обмена данными по интерфейсу SPI микроконтроллер работает в режиме ведущего устройства (Master), взаимодействуя с одним или несколькими ведомыми блоками (Slave). Схема передачи данных по интерфейсу SP1 микрокон- троллеров PIC показана на рис. 7.25 (MSB — старший разряд, a LSB — младший разряд передаваемого байта). Ведущее устройство берет на себя активную часть обмена данными, вызывая передачу и управляя-процессом. Ведомое устройство не может само быть активным. Оно принимает и передает данные только тогда, когда происходит его активизация со стороны ведущего устройства по линии /SS. Ведущее устройство также генери- рует такт для передачи по выходной линии SCK. Для ведомого блока вывод SCK
Общие аспекты архитектуры восьмиразрядных микроконтроллеров PIC 205 является входом, через который он получает от Master-устройства тактирующие сигналы. Сдвиговой регистр MASTER Рис. 7.25. Схема передачи данных по интерфейсу SPI микроконтроллеров PIC Если ведомое устройство активизируется ведущим по линии /SS, то начинается обмен данными: Master записывает подлежащий передаче байт в свой сдвиговой ре- гистр данных SSPBUF. С помощью каждого выработанного тактового импульса Master перемещает < один бит данных на выход SDO, a Slave одновременно в обратном направлении передает один бит на вход SDI ведущего блока. Таким об- разом, в течение цикла SPI, состоящего из восьми тактовых импульсов, Master и Slave обмениваются байтом данных. По окончании передачи данных в регистре состояния интерфейса SPI устанав- ливается флаг соответствующего запроса на прерывание. Этот флаг указывает на окончание передачи и вызывает запрос на прерывание после того как в регистре уп- равления SPI будет установлен разряд разрешения на прерывание от интерфейса SPI. В режиме “Master” текущая передача данных может быть преждевременно за- вершена выдачей в линию /SS сигнала лог. 1. В микроконтроллерах PIC для последовательной синхронной передачи данных используется порт MSSP, работающий в режиме интерфейса SPI или 12С. Линиям - SPI соответствуют выводы порта А и С: • /SS — зависит от модели (например, разряд 5 порта А); • SDO — разряд 5 порта С; • SDI — разряд 4 порта С; • SCK — разряд 3 порта С. Для управления интерфейсом SPI в восьмиразрядных микроконтроллерах PIC используются регистры SSPSTAT (рис. 7.26) и SSPCON1 (рис. 7.27). 7 6 5 4 3 2 1 0 SMP СКЕ D/A Р S R/W UA BF Рис. 7.26. Регистр SSPSTAT микроконтроллеров PIC 7 6 5 4 3 2 1 0 WCOL SSPOV SSPEN СКР SSPM3 SSPM2 SSPM1 SSPM0 Рис. 7.27. Регистр SSPCON1 микроконтроллеров PIC
206 Глава 7. Восьмиразрядные микроконтроллеры PIC Назначение разрядов регистра SSPSTAT: • BF — флаг заполнения буфера данных; • UA, R/W, S, Р, D/A — имеют отношение к рассмотренному ниже последова- тельному интерфейсу 12С; • СКЕ — выбор активного фронта импульсов SCK для передачи данных (исполь- зуется совместно с разрядом СКР регистра SSPCON1); • SMP — точка стробирования данных в режиме Master (1 — стробирование в конце битового интервала; 0 — стробирование в середине интервала). В режиме Slave этот разряд всегда содержит лог. 0. Назначение разрядов регистра SSPCON1: • SSPM[3:0] — выбор режима работы порта MSSP (значения для интерфейса SPI представлены в табл. 7.10); • СКР — выбор фронта для передачи (если СКР = 0, то передача осуществляется по нарастающему фронту тактового сигнала); • SSPEN — флаг разрешения работы интерфейса SPI; • SSPOV — флаг переполнения приемного буфера; • WCOL — флаг коллизий при записи (1 — запись новых данных в буферный ре- гистр была произведена в момент передачи). Таблица 7.10. Выбор режима работы порта MSSP для интерфейса SPI SSPM3 SSPM2 SSPM1 SSPM0 Режим .0 0 0 0 Режим Master, частота = Fosc / 4 0 0 0 1 Режим Master, частота = Fosc /16 0 0 1 0 Режим Master, частота = Fosc / 64 0 0 1 1 Режим Master, частота = выход TMR2 / 2 0 1 0 0 Режим Slave, вывод SS разрешен 0 1 0 1 Режим Slave, вывод SS не используется Синхронная передача данных по интерфейсу 12С Протокол шины 12С и процесс адресации подключенных к ней устройств был подробно рассмотрен в главе 1, “Восьмиразрядные микроконтроллеры AVR”, по- этому повторно останавливаться на этих вопросах мы не будем. В микроконтроллерах PIC обмену данными по интерфейсу 12С соответствует особый режим работы порта MSSP. Линии SCL соответствует вывод 3 порта С, а линии SDA — вывод 4 того же порта. Для управления передачей в режиме 12С используются три регистра: уже рас- смотренные выше SSPSTAT (см. рис. 7.26) и SSPCON1 (см. рис. 7.27), а также SSPCON2 (рис. 7.28). Назначение разрядов регистра SSPSTAT, имеющих отношение к 12С: • BF — флаг заполнения буфера данных; • UA — устанавливается в лог. 1 в том случае, если необходимо модифицировать адрес устройства (содержимое регистра SSPADD); • R/W — указывает на тип операции: 0 — запись, 1 — чтение; • S — устанавливается в лог. 1 при обнаружении условия начала передачи; • Р — устанавливается в лог. 1 при обнаружении условия завершения передачи;
бщие аспекты архитектуры восьмиразрядных микроконтроллеров PIC 207 • D/A — признак переданного байта: 0 — байт адреса, 1 — байт данных. Назначение разрядов регистра SSPCON1, имеющих отношение к 12С: • SSPM[3:0] — выбор режима работы порта MSSP (значения для интерфейса 12С представлены в табл. 7.11); • СКР — установка этого разряда в лог. 1 разрешает тактирование; • SSPEN — флаг разрешения работы интерфейса; • SSPOV — флаг переполнения приемного буфера; • WCOL — флаг коллизий при записи (1 — запись новых данных в буферный ре- гистр была произведена в момент передачи). аблица 7.11. Выбор режима работы порта MSSP для интерфейса 12С SSPM3 SSPM2 SSPM1 SSPM0 Режим 0 1 1 0 Режим Slave, используется 7-разрядный адрес 0 1 1 1 Режим Slave, используется 10-разрядный адрес 1 0 0 0 Режим Master, частота = Fosc / (4 (SSPADD + 1)) J 0 1 1 Режим Master с программным управлением 1 1 1 0 Режим Slave, используется 7-разрядный адрес J 1 1 1 Режим Slave, используется 10-разрядный адрес 7________6_______5 4________3_______2________1________0 GCEN ACKSTAT ACKDT ACKEN RCEN PEN RSEN SEN Рис. 7.28. Регистр SSPCON2 микроконтроллеров PIC Назначение разрядов регистра SSPCON2: • SEN — устанавливается в лог. 1 для создания условия начала передачи; • RSEN — устанавливается в лог. 1 для создания повторных условий начала пе- редачи; • PEN — сбрасывается в лог. 0 для создания условия окончания передачи; • RCEN — устанавливается в лог. 1 для разрешения режима приема; • ACK.EN — инициирует последовательность битов квитирования; • ACKDT — устанавливается в лог. 1 для отправки подтверждения при приеме байта; • ACKSTAT — устанавливается в лог. 1 при получении подтверждения приема от ведомого устройства. Аналого-цифровое преобразование АЦП преобразовывает аналоговые сигналы (например, напряжение) в цифро- вую форму. В большинстве микроконтроллеров PIC, оснащенных АЦП, для анало- гового ввода используются выводы порта А, совмещающие цифровые и аналоговые функции. Количество АЦП отличается в зависимости от модели микроконтроллера PIC. Так, в состав устройства 16F876 входит пять, a 16F877 — восемь АЦП. При этом, фактически, в них присутствует только один АЦП, а входы мультиплексируется, совместно используя один и тот же преобразователь (рис. 7.29). Разрядность АЦП может составлять 8 или 10 разрядов. Так, в состав PIC 16F876 и PIC 16F877 входят 10-разрядные преобразователи, а в состав PIC 16F73 — восьмиразрядные.
208 Глава 7. Восьмиразрядные микроконтроллеры PIC АЦП требует некоторого .опорного напряжения (обычно 5 В). Таким образом, если мы используем 10-разрядный преобразователь (1 024 уровней дискретности), то разрешающая способность преобразователя составит 5 / 1024 = 0,00488 В или 4,88 мВ, т.е. мы можем измерять аналоговые напряжения с разрешением 4,88 мВ. Например, если измеряемое аналоговое входное напряжение равно 4,88 мВ, то мы получим 10-разрядное цифровое значение 0000000001. Если аналоговое входное напряжение равно 2 х 4,88 = 9,76 мВ, то получится 10-разрядное цифровое значение 0000000010. Если же входное напряжение равно 3 х 4,88 = 14,64 мВ, то 10-разряд- ное цифровое значение составит 0000000011 и т.д. АЦП Преобразованный цифровой сигнал Мультиплексор Рис. 7.29. Мультиплексная структура АЦП Подобным же образом, если опорное напряжение равно 5 В, и мы используем восьмиразрядный преобразователь (256 уровней дискретности), то разрешающая способность составит 5 / 256 = 19,53 мВ. Например, если измеряемое входное на- пряжение равно 19,53 мВ, то мы получим восьмиразрядное цифровое значение 00000001. Если входное напряжение равно 2 х 19,53 = 39,06 мВ, то мы получим восьми разрядное цифровое значение 00000010 и т.д. Для управления АЦП в микроконтроллерах PIC служат регистры ADCONO (рис. 7.30} и ADCON1 (рис. 7.31). 7 6 5 4 3 2 1 0 ADCS1 ADCS0 CHS2 CHS1 CHS0 GO/DONE ADIF ADON Рис. 7.30. Регистр ADCONO микроконтроллеров PIC Назначение разрядов регистра ADCONO: • ADON — флаг разрешения использования АЦП; • ADIF — разряд запроса на прерывание по окончанию преобразования; • GO/DONE — установка этого разряда в лог. 1 активизирует АЦП; по оконча- нию преобразования автоматически сбрасывается в лог. 0; • CHS[2:0] — выбор аналогового входа порта А (назначение этих разрядов зави- сит от типа микроконтроллера); • ADCS[ 1:0] — выбор рабочей частоты АЦП (табл. 7.12). Таблица 7.12. Выбор рабочей частоты АЦП микроконтроллеров PIC ADCS1 ADCS0 Частота 0 0 Частота системной синхронизации / 2 0 1 Частота системной синхронизации / 8 1 0 Частота системной синхронизации / 32 1 1 Тактирование от встроенного RC-осциллятора АЦП (250 кГц)
Общие аспекты архитектуры восьмиразрядных микроконтроллеров PIC 209 Максимальная допустимая рабочая частота АЦП микроконтроллеров PIC — 625 кГц. Это следует учитывать при выборе коэффициента деления частоты сис- темной синхронизации. Использование внутреннего RC-осциллятора АЦП не рекомендуется для микроконтроллеров с частотой системной синхронизации выше 1 МГц. 7 6 5 4 3 2 1 О ADFM — — — PCFG3 PCFG2 PCFG1 PCFG0 Рис. 7.31. Регистр ADCON1 микроконтроллеров PIC Назначение разрядов регистра ADCON1: • ADFM — выбор разрешения преобразования: 1 — 10 бит; 0 — 8 бит; • PCFG[3:0] — разряды конфигурации, которые определяют, какие выводы порта АЦП являются аналоговыми входами, а какие используются для подачи опор- ных напряжений Vref+ и Vref_. Наиболее распространенная конфигурация — 0000, которая определяет все восемь выводов как аналоговые входы, а в качестве опорных напряжений устанавливает Vdd и Vss- Другие значения разрядов PCFG[3:0] варьируются в зависимости от типа микроконтроллера (пример — в табл. 7.13). Таблица 7.13. Пример использования разрядов конфигурации АЦП PCFG[3:0] AN7 AN6 AN5 AN4 AN3 AN2 AN1 ANO Vref+ Vref- 0000 А А А А А A A A Vdd Vss 0001 А А А А Vref+ A A A RA3 Vss 0010 D D D А А A A A Vdd Vss 0011 D D D А Vref+ A A A RA3 Vss 0100 D D D D А D A A Vdd Vss 0101 D D D D Vref+ D A A RA3 Vss 0110 D D D D D D D D Vdd Vss 0111 D D D D D D D D Vdd Vss 1000 А А А А Vref+ Vref- A A RA3. RA2 1001 D D А А А A A A Vdd Vss 1010 D D А А Vref+ A A A RA3 Vss 1011 D D А А Vref+ Vref- A A RA3 RA2 1100 D D D А Vref+ Vref- A A RA3 RA2 1101 D D D D Vref+ Vref- A A RA3 RA2 1110 D D D D D D D A Vdd Vss 1111 D D D D Vref+ Vref- D A RA3 RA2 Встроенный аналоговый компаратор В ряде моделей микроконтроллеров PIC используется встроенный аналоговый компаратор напряжения, сравнивающий входное напряжение на двух входах. Как только напряжение на неинвентирующем входе станет больше, чем на инвенти- рующем, на выходе компаратора устанавливается лог. 1. Часто аналоговый компа- ратор используют для сравнения некоторого входного напряжения с опорным.
210 Глава 7. Восьмиразрядные микроконтроллеры PIC Для активизации компаратора требуется предварительно перевести соответст- вующие выводы микроконтроллера в режим входов. Время срабатывания компара- торов небольшое, поэтому с их помощью можно быстро формировать ответные ре- акции на изменение соотношений входных напряжений. В микроконтроллерах PIC конфигурация входов компаратора (вывода порта А) настраивается с помощью разрядов регистра CMCON (рис. 7.32). В некоторых мо- делях используются два аналоговых компаратора (например, в серии 16С62х). В этом случае для управления их работой также служит регистр CMCON. 7 6 5 4 3 2 1 0 C2OUT сюит — — CIS СМ2 СМ1 смо Рис. 7.32. Регистр CMCON микроконтроллеров серии Р1С16С62х Назначение разрядов регистра CMCON: • СМ[2:0] — выбор режима работы компаратора (табл. 7.14); • CIS — разряд управления входным коммутатором компаратора (табл. 7.14); • ’* С1 OUT — выходной сигнал компаратора 1; • C2OUT — выходной сигнал компаратора 2. Таблица 7.14. Конфигурация входов компараторов напряжения в серии Р1С1вСв2х CIS СМ2 СМ1 смо Компаратор 1 Компаратор 2 Вход + Вход- Вход + Вход- X 0 0 0 RA0 RA3 RA2 RA1 0 0 0 1 RA2 RAO RA2 RA1 1 0 0 1 RA2 RA3 RA2 RA1 0 0 1 0 Vref RAO Vref RA1 1 0 1 0 Vref RA3 Vref RA2 X 0 1 1 RA2 RAO RA2 RA1 X 1 0 0 RA3 RAO RA2 RA1 X 1 0 1 — — RA2 RA1 X 1 1 0 RA2 RAO RA2 RA1 X 1 1 1 — — — — Семейство микроконтроллеров PIC16 Семейство микроконтроллеров PIC 16 растет очень обширно, однако все его представители имеют идентичное ядро и набор команд. Различия составляют только периферийные устройства, некоторые другие средства, а также размеры корпусов. Данные о некоторых представителях семейства PIC16 представлены в табл. 7.15. Даже такая небольшая сводка явно показывает все разнообразие доступных моде- лей. Первым в списке идет микроконтроллер 16F84A, особенности которого мы и рассмотрим в качестве примера. Он имеет “родственника”: микроконтроллер 16LF84A, расширенный диапазон питания которого позволяет работать при пони- женных напряжениях. Эти устройства доступны в разных корпусах, могут работать в разных диапазонах температур и с разной частотой тактового генератора. Напри- мер, микроконтроллер 16F84A существует в версиях на 4 и 20 МГц.
Семейство микроконтроллеров PIC16 211 Табл. 7.15. Некоторые представители семейства PIC16 Модель Число вы- водов (кор- пус DIP) Тактовая частота, МГц Память Периферия 16F84A 18 До 20 1 Кбайт памяти про- грамм 68 байт ОЗУ 64 байт EEPROM 1 восьмиразрядный таймер 1 пятиразрядный порт 1 восьмиразрядный порт 16F873A 28 До 20 4 Кбайт памяти про- грамм 192 байт ОЗУ 128 байт EEPROM 3 восьмиразрядных порта 3 счетчика/таймера 2 модуля ССР 2 модуля последовательного обмена данными 5 10-раз рядных каналов АЦП 2 аналоговых компаратора 16F874A 40 До 20 4 Кбайт памяти про- грамм 192 байт ОЗУ 128 байт EEPROM 5 восьмиразрядных портов 3 счетчика/таймера 2 модуля ССР 2 модуля последовательного обмена данными 8 10-раз рядных каналов АЦП 2 аналоговых компаратора 16F876A 28 До 20 8 Кбайт памяти про- грамм 368 байт ОЗУ 256 байт EEPROM 3 восьмиразрядных порта 3 счетчика/таймера 2 модуля ССР 2 модуля последовательного обмена данными 5 10-раз рядных каналов АЦП 2 аналоговых компаратора 16F877A 40 До 20 8 Кбайт памяти про- грамм 368 байт ОЗУ 256 байт EEPROM 5 восьмиразрядных портов . 3 счетчика/таймера 2 модуля ССР 2 модуля последовательного обмена данными 8 10-разрядных каналов АЦП 2 аналоговых компаратора. е Технические описания перечисленных здесь микроконтроллеров (на английском языке) можно найти на прилагаемом к книге компакт-диске в папке Datasheets\Р1С. Микроконтроллер 16F84A Микроконтроллер 16F84A (вначале назывался 16С84) — один из самых успеш- ных микроконтроллеров PIC. Появился он в то время, когда большинство произво- дителей микроконтроллеров пытались сделать свои модели большими, совершен- ными и сложными. Однако компания Microchip приняла смелое решение и оставила свои модели маленькими, простыми и простыми в использовании. Хотя в то время большинство микроконтроллеров имели встроенную в кристалл память программ типа EPROM с длительным циклом стирания, микроконтроллер 16С84 было решено
212 Глава 7. Восьмиразрядные микроконтроллеры PIC снарядить памятью типа EEPROM, что ускорило и упростило его программирова- ние и привело к более частой модернизации систем. Затем появилась версия с тех- нологией Flash, и название микроконтроллера было изменено с “С84” на “F84’’. Структурная схема микроконтроллера PIC 16F84A показана на рис. 7.33. Счетчик команд Флэш память программ 1 Их 14 Шина / команд7 1 14 [ Регистр команд ~| Инструкция декодирования и управления Тактовый генератор Шина данных в EEPROM память данных Адрес RAM Прямой адрес 8 8-ми уровневый стек (13-ти разрядный) EEPROM память данных RAM Регистры файлов Таймер включения питании Таймер запуска генератора Сброс по включению питания Сторожевой таймер RA4/TOCKI | РегистрW | Порт ввода/вывода адрес | PemcTpFSR Рис. 7.33. Структурная схема микроконтроллера PIC 16F84A EEADR OSC2/CLKOUT MCLR Vdo, Vss Ч^Мультиплексор/ RBWWT 5^ Регистр состояния Результат любой операции, выполняемой центральным процессором, сохраня- ется в рабочем регистре W, однако в нем не всегда присутствуют все необходимые данные о только что выполненной операции. Например, что произойдет, если в ре- зультате выполнения команды сложения будет превышен восьмиразрядный диапа- зон? Рабочий регистр не умеет распознавать подобные ситуации, и потому сохранит некорректный результат. Учитывая это, в любой центральный процессор компьютера встроен набор ло- гических разрядов, которые иногда называют флагами условий. Они предназначены для передачи дополнительной информации о результате выполнения последней ко- манды, например, является ли он нулевым, отрицательным или положительным. В микроконтроллере 16F84A эти флаги хранятся в регистре состояния (рис. 7.34). По сути, к категории флагов условий можно отнести только три разряда этого реги- стра: с 0 по 2, т.е. С, DC и Z. Им соответствует флаг переноса, знак переноса и флаг нулевого результата. 7 6 5 4 3 2 1 0 — — RP0 то PD Z DC С Рис. 7.34. Регистр состояния микроконтроллера PIC 16F84A
Семейство микроконтроллеров PIC16 213 Разряд RP0 отвечает за выбор банка памяти: 0 — банк 0 (диапазон адресов $00..$7F; 1 — банк 1 (диапазон адресов $80..$FF). Флаг ТО устанавливается после подачи питания, сброса сторожевого таймера и перехода микроконтроллера в “спящий” режим, и сбрасывается при переполнении сторожевого таймера. Флаг PD устанавливается после подачи питания или сброса сторожевого тайме- ра, и сбрасывается при переходе микроконтроллера в “спящий” режим. Организация памяти Структура памяти программ и стека микроконтроллера PIC 16F84A показана на рис. 7.35, а структура ОЗУ — на рис. 7.36. Рис. 7.35. Структура памяти программ и стека микроконтроллера PIC 16F84A Схема, показанная на рис. 7.35, содержит счетчик команд, стек и собственно память программ. Все три элемента не могут работать друг без друга. В память про- грамм загружается программный код, выполняемый микроконтроллером, который представляет собой список команд. Адрес следующей команды, которую должен выполнить микроконтроллер, хранится в счетчике команд. Таким образом, он вы- полняет функцию указателя. Значение счетчика команд можно также поместить в стек. Это происходит в случае перехода к подпрограмме или при возникновении прерывания. ПРИМЕЧАНИЕ Ассемблерные команды, обозначенные на схеме как CALL, RETURN, RETFIE и RETLW, от- носятся к подпрограммам и прерываниям. Поскольку книга посвящена программированию на языке С, подробно останавливаться на них бы не будем.
214 Глава 7. Восьмиразрядные микроконтроллеры PIC Как видим, диапазон адресов памяти программ составляет $0000..$03FF. Имея 13-разрядный счетчик команд, микроконтроллер теоретически может адресовать область $0000..$ 1FFF. Дополнительное адресное пространство окрашено в серый цвет, так как оно фактически не используется. Первая ячейка памяти программ называется вектором сброса. При запуске про- граммы на выполнение (например, при подаче питания), счетчик команд устанавли- вается в 0, поэтому первая ячейка памяти, на которую он указывает, — это вектор сброса. Таким образом, программист должен поместить первую команду именно в этой ячейке. Вектор прерывания от периферии, для подпрограмм обслуживания этих прерываний, действует аналогичным образом. Адрес в файле OOh 0th 02h 03П (Mh 05h 07h 09h OAh OBh OCh 4Fh 50h Косвенный ддриР} Косвмиьйвдрк^^ TMR0 OPTION JO PCL PCX STATUS STATUS F8R FSR PORTA TRISA PORTS EEADR еесонгго PCLATH PCLATH INTCON INTCON 68 регистров общего назначения (SRAM) Отображена в банке 0 BOh 81h 82h 83h 84h 85h 86h «Th 88h «Ah 8Bh 8Ch Адрес в файле CFh ООП 7Fh Банк 1 FFh БанкО О Неиспользуемая область памяти данных, считывается как к0п Примечание 1: Не физические регистры Рис. 7.36. Структура ОЗУ микроконтроллера PIC 16F84A Область ОЗУ (см. рис. 7.36) распределена по банкам и разбита на две важные области. Нижняя из них — память данных общего назначения, занимающая ячейки с адресами от $0С до $4F. Над ней размещены регистры специального назначения. Проблема, которая присуща любой памяти, заключается в том, что чем больше памяти, тем шире должна быть ее шина адреса. Одним из методов уменьшения ад- ресной шины является разбиение памяти на несколько меньших блоков одинакового размера, называемых банками. В каждый момент времени в качестве целевого мо- жет быть выбран только один банк.
Семейство микроконтроллеров PIC 16 215 Микроконтроллер PIC 16F84A содержит два таких банка. Адрес каждого из них — семиразрядный адрес RAM. Активный банк выбирают с помощью разряда RP0 регист- ра состояния (см. рис. 7.34). Перед получением любого доступа к памяти программист должен удостовериться, что этот разряд содержит корректное значение. На рис. 7.33 показано, что существует два возможных источника адреса ОЗУ, один из которых выбирается с помощью мультиплексора адресов. Если адрес явля- ется частью команды и поступает на мультиплексор из регистра команд, то он на- зывается прямым. Кроме того, адрес можно получить из регистра выбора файла FSR (File Select Register), относящегося к регистрам специального назначения (см. рис. 7.36). Если пользователь загружает в регистр FSR адрес, который может быть использован в качестве адреса ячейки в памяти данных, то такая методика называ- ется косвенной адресацией. Фактические адреса памяти изображены на рис. 7.36 в столбце “Адрес в файле”. Они — восьмиразрядные, однако из рис. 733 видно, что разрядность адресной шины ОЗУ составляет только семь бит, а при прямой адресации доступны только пять разрядов адреса. Важно понимать, что эти адреса состоят из семиразрядного адреса ОЗУ и разряда выбора банка из регистра состояния, подставляемого вместо старше- го, восьмого разряда. Во время программирования важно разделять эти источники, удостоверившись, что старший разряд задействован для выбора банка. Слово конфигурации Особым элементом памяти программ микроконтроллера 16F84A является слово конфигурации (рис. 7.37). 13 12 11 10 9 8 7 6 5 4 3 2 1 0 СР СР СР СР СР СР СР СР СР СР PWRTE WDTE F0SC1 F0SC0 Рис. 7.37. Слово конфигурации микроконтроллера PIC 16F84A Назначение разрядов слова конфигурации: • СР — разряды конфигурации защиты кода; • PWRTE: 0 — таймер включения питания активен; 1 — таймер включения пита- ния отключен; • WDTE: 0 — сторожевой таймер отключен; 1 — сторожевой таймер включен; • FOSC[1:O] — выбор типа осциллятора: 00 — LP; 01 — XT; 10 — HS; 11 — RC. С помощью слова конфигурации пользователь может, во время загрузки про- граммы, определить некоторые свойства конфигурации микроконтроллера. Впо- следствии они остаются фиксированными до следующего программирования. Этот подход отличается от других возможностей, наподобие записи в регистры специ- ального назначения. Хотя слово конфигурации является частью памяти программ, к нему нельзя по- лучить доступ из программы или любым другим способом во время работы про- граммы. Память EEPROM Память EEPROM — энергонезависимая и особенно удобна для хранения пере- менных данных, которые, скорее всего, потребуется хранить длительный период времени. В микроконтроллере 16F84A она адресуется с помощью специального ре- гистра EEADR, а данные передаются через регистр EEDATA (см. рис. 7.36).
216 Глава 7 Восьмиразрядные микроконтроллеры PIC Считать данные из памяти EEPROM просто, а вот записать — нет. По меркам электрических процессов, процесс записи в данном случае занимает много времени (миллисекунды), и поэтому следует по возможности избегать случайной записи в память EEPROM. Таким образом, необходим набор средств управления для ини- циализации процесса записи и определения момента его окончания. Эти функции выполняет регистр EECON1 (рис. 7.38). 7 6 5 4 3 2 1 0 — — — EEIF WRERR WREN WR RD Рис. 7.38. Регистр EECON1 микроконтроллера PIC 16F84A Для того чтобы считать данные из ячейки памяти EEPROM, необходимый адрес требуется поместить в регистр EEADR и установить в лог. 1 разряд RD регистра EECON1. Данные из соответствующей ячейки памяти будут сразу же скопированы в регистр EEDATA. Для записи в ячейку памяти EEPROM соответствующие данные и адрес следует поместить в регистры EEDATA и EEADR соответственно. Процесс записи разреша- ется путем установки в лог. 1 разряда WREN регистра EECON1, после чего необхо- димо передать последовательно байты $55 и $АА в регистр EECON2. Эти коды по- зволяют обезопаситься от случайной записи (например, при включении питания или при его исчезновении). Далее устанавливается в лог. 1 разряд WR регистра EE- CON 1, чем фактически и начинается процесс записи. О завершении этого процесса сигнализирует установка флага EEIF. Микроконтроллеры серии 12F50x При производстве некоторых микроконтроллеров PIC компания Microchip су- мела втиснуть большое количество функций в крошечный корпус с восемью выво- дами. К ним относится и серия PIC 12F50x, представители которой (12F508 и 12F509) в значительной степени напоминают модель PIC 16F54. Для них не тре- буется никакого внешнего осциллятора (кварцевого или RC), поскольку микросхема оснащена внутренним осциллятором на 4 МГц. Она даже позволяет внешним сигна- лам выводить себя из “спящего” состояния. Для любого приложения, в котором не- большой размер является преимуществом, и достаточно шести выводов микрокон- троллеры серий PIC 12F50x просто неоценимы. Основные отличительные особенности этой серии устройств связаны с регист- ровым файлом (рис. 7.39). Первое» отличие связано с регистром состояния STATUS. Серия PIC 12F50x предлагает возможность выхода из “спящего” режима при изменении состояния од- ного из трех выводов: GPO, GP1 или GP3. Для контроля за этим используется ранее незадействованный седьмой разряд регистра STATUS. Кроме того, данная функция разрешена только в том случае, если обнулен седьмой разряд регистра OPTION. ПРИМЕЧАНИЕ Вывод GP3 работает только как вход и не может быть сконфигурирован как выход. Шестой разряд регистра OPTION также выполняет особую роль. Если он обну- лен, то микроконтроллер на выводах GPO, GP1 и GP3, когда они ни к чему не под- ключены, установит состояние лог. 1. Эта функция известна под названием “слабые подтягивающие сопротивления” (weak pull-ups). Она полезна, когда выводы исполь-
Микроконтроллеры серии 12F50x 217 зуются как входы, которые переводится в состояние логического нуля, если что то происходит (например, если между выводом и О В подключить кнопку, то ее нажа- тие переводит вход в состояние лог. 0). Если активизированы слабые подтягиваю- щие сопротивления, то отпадает необходимость во внешнем подтягивающем рези- сторе. Если данная функция не нужна, то шестой разряд регистра OPTION должен быть установлен в лог. 1. Рис. 7.39. Регистровый файл микроконтроллеров PIC 12F50X Еще одна отличительная особенность микроконтроллеров PIC 12F50x — нали- чие по адресу $05 в регистровом файле регистра OSCCAL. Он служит для калиб- ровки осциллятора. Для обеспечения более высокой точности работы внутреннего осциллятора на 4 МГц в регистр OSCCAL должно быть занесено специальное чи- словое значение. Как и в случае с серией PIC 16F5x, процессор вначале выполнит команду, хранимую в последней ячейке памяти программ. В процессе изготовления микроконтроллера в эту ячейку записывается особая ассемблерная команда, которая переносит калибровочное значение в рабочий регистр: movlw хх ; перемещает калибровочное значение в регистр w После выполнения данной команды ход выполнения программы автоматически возвращается к адресу $000. При стирании памяти нового микроконтроллера PIC вначале следует считать содержимое памяти программ и записать числовое значение, запрограммированное изготовителем, чтобы впоследствии записать его по требуемому адресу самостоятельно. Для того чтобы сделать внутренний осциллятор более точным, по адресу $000 следует записать следующую команду:
218 Глава 7. Восьмиразрядные микроконтроллеры PIC movwf OSCCAL ; используется предустановленное значение Если точность осциллятора значения не имеет, то эту команду можно пропус- тить и просто разместить по адресу $000 с помощью команды org команду goto start. В завершение отметим, что в микроконтроллерах PIC 12F50x реализовано две особые ог/ции конфигурирования: • возможность отключить сброс по сигналу на выводе MCLR; • возможность использования внутреннего осциллятора.
Глава 8 Семейство PIC18F Семейство микроконтроллеров PIC18F было разработано компанией Microchip для реализации комплексных проектов с применением операционной системы ре- ального времени (RTOS — Real-Time Operating System) и сложных протоколов об- мена данными, таких как TCP/IP, CAN, USB и ZigBee. Перечислим основные характеристики микроконтроллеров семейства PIC18F: • восьмиразрядная шина данных; • 77 16-разрядных команд; • допускается использование программного кода, предназначенного для микро- контроллеров PIC16; • память программ до 2 Мбайт; • ОЗУ до 4 Кбайт; • частота процессора до 40 МГц; • аппаратный умножитель 8><8; • возможность назначать прерываниям уровни приоритетности; • до двух восьми- и до трех 16-разрядных таймеров/счетчиков; • до четырех внешних источников прерывания; • возможность приема и выдачи тока до 25 мА; • до пяти модулей ССР; • порт MSSP (режимы SPI и 12С); • один или два модуля USART; • порт PSP; • высокоскоростной 10-разрядный АЦП; • программируемый модуль обнаружения провалов напряжения; • сторожевой таймер со встроенным RC-осциллятором; • возможность внутрисхемного программирования. Кроме того, некоторые представители семейства PIC18F предоставляют сле- дующие интерфейсы: • CAN 2.0; • USB 2.0; • интерфейс прямого управления ЖК-дисплеем; • TCP/IP; • ZigBee; • интерфейс прямого управления двигателем.
220 Глава 8. Семейство PIC18F На рис. 8.1 показана структурная схема микроконтроллеров PIC18F4x2. 21 .21 Схема инкремен- та/декре мента Шина данных Фиксация данных □ЗУ (до 4 Кбайт) Фиксация адреса Память программ (до 2 Мбайт) Фиксация данных 16 I Фиксация [ I таблицы I Регистр команды |pCLATu|pCLATb| | PCU| РСН| PCL| Счетчик команд £ |31-уровн стек | OSC2AXKO OSC1/CLKI Дешифрация команды и управление жг T1OSCI T1OSCO MCLR VOD,VSS Схема управ- ления такти- < рованием Тошыйисточ- нис опорного =i напряжения Таймыр запуска Таймер пуска осциллятора Сброс по подаче -Лианна..... Сторожевой таймер Сброс по провалу напряжения Низковольт- ное програм- мирование Внутрисхем- ный отпад- чик Фиксация адреса Адрес 4N 12 FSRO FSR1 FSR2 Схема »| Декодир инкДО/ |де*рем TV |БанкО, F| 12 | PROOH PRODLl 3 | Умножитель 8x81 ♦ Л ,8 |В1ТОР| IWREGkr RA0/AN0 RA1/AN1 RA2/AN2/VREF- RA3/AN3A/REF* RA4/TOCK[ RA5AN4SS4VDIN RA6 । ПортЕ RDQ/PSPO | RD1/PSP1 . RD2/PSP2 ' RD3ZPSP3 I RD4/PSP4 RD5/PSP5 I RD6/PSP6 । RD7/PSP7 . 1 -—-И REVANWR ’—И RE2.'AN7/CS RE0/AN5/RD т 21 8 8 8 8 8 Рис. 8.1. Структурная схема микроконтроллеров PIC18F4x2 Сравнение характеристик некоторых популярных моделей семейства PIC18F дано в табл. 8.1. В этой главе мы рассмотрим микроконтроллеры PIC18Fxx2. Архи- тектура остальных представителей семейства PIC 18F подобна.
Организация памяти 221 Таблица 8.1. Некоторые представители подсемейства PIC18Fxx2 Свойство PIC18F242 PIC18F252 PIC18F442 PIC18F452 Память программ, Мбайт 16 32 16 32 ОЗУ, байт 768 1536 768 1536 Память EEPROM, байт 256 Параллельные порты 3 I I 5 _ Таймеры/счетчики 4 Источники прерывания 17 | 18 Модули ССР 2 Каналы АЦП 5 I I § В качестве примера сравним характеристики микроконтроллеров семейств PIC 16F и PIC 18F. Их сходства: • схема расположения выводов; • имена и функции регистров специального назначения; • набор периферийных устройств. Отличия микроконтроллеров PIC18F: • удвоено число команд; • 16-разрядное командное слово; • аппаратный умножитель 8x8; • больше внешних источников прерывания; • система прерываний допускает назначение приоритетности; • расширенный регистр состояния; • увеличен объем памяти программ и данных; • увеличен стек; • тактовый генератор с системой фазовой автоподстройки частоты (PLL); • усовершенствованная архитектура портов ввода-вывода; • присутствует набор конфигурационных регистров; • уменьшено энергопотребление. Организация памяти В качестве примера рассмотрим микроконтроллер PIC18F452. Начнем с органи- зации ОЗУ, которое состоит из 16 банков по 256 байт в каждом, хотя из нйх исполь- зуются только шесть (рис. 8.2). Эти шесть банков (1536 байт) занимают нижнюю область ОЗУ. В случае использования компилятора с языка С переключение банков происходит автоматически, т.е. пользователю не нужно думать о том, в каком месте программы выбрать тот или иной банк. ПРИМЕЧАНИЕ На рис. 8.2 используются следующие обозначения: “РОН” — регистры общего назначения; ’РСН" — регистры специального назначения. Организация памяти программ микроконтроллера PIC18F452 показана на рис. 8.3. Область, доступная для пользователя, занимает пространство адресов от $0000 до $7FFF. Доступ по адресу в диапазоне $8000..$lFFFFF приведет к считыва-
222 Глава 8. Семейство PIC18F нию нулевых значений. Память программ адресуется побайтно, а команды хранятся по два или четыре байта. Старший байт командного слова всегда записывается в ячейки с четными адресами. BSR<3:0> = 0101 = 0110 = 0000 --------► = 0001 = 0010 --------► = 0011 --------► = 0100 = 1110 --------► Рис. 8.2. Организация ОЗУ микроконтроллера PIC18F452 Конфигурационные регистры Микроконтроллер PIC18F452 предоставляет набор конфигурационных регист- ров, которые программируются с помощью программатора. Доступные разряды та- ких регистров в незапрограммированном состоянии содержат “I”. Рассмотрим основные из этих регистров подробнее. Первый конфигурационный регистр находится по адресу $300001 и называется CONFIG Ш (рис. 8.4).
Организация памяти 223 | Счетчик команд CALL t RCALb. RETUREfft 2 V RETFIE,RETLW ' 1-й уровень стека 31-й уровень стека Вектор сброса Вектор прерывания с высоким приоритетом ooooh Вектор прерывания с низким приоритетом Встроенная в кристалл память программ OOOBh 0018h 7FFFh BOOOh iFFFFFh 200000b- Рис. 8.3. Организация памяти программ микроконтроллера PIC18F452 7 6 5 4 3 2 1 0 — — OSCSEN — — FOSC2 FOSC1 FOSC0 Рис. 8.4. Конфигурационный регистр CONFIG1H Этот регистр служит для выбора источников тактирования микроконтроллера. Назначение его разрядов: • OSCSEN — активизация переключения источников системной синхронизации: 1 — в качестве источника системной синхронизации используется главный ос- циллятор; 0 — активно переключение осцилляторов; • FOSC[2:0] — выбор осциллятора: ► 111 — RC, вывод OSC2 сконфигурирован как RA6; ► 110 — HS, активизирована фазовая автоподстройка частоты, тактовая частота равна 4 х fosc-9 ► 101 — ЕС, вывод OSC2 сконфигурирован как RA6; ► 100 — ЕС, вывод OSC2 сконфигурирован как выход с делением частоты на четыре; ► ОН—RC; ► 010 —HS; ► 001 — XT; ► 000 —LP. Второй конфигурационный регистр находится по адресу $300002 и называется CONFIG2L (рис. 8.5). 7 6 5 4 3 2 1 0 — — — — BORV1 BORVO BOREN PWRTEN Рис. 8.5. Конфигурационный регистр CONFIG2L
224 Глава 8. Семейство PIC18F Этот регистр служит для настройки схемы обнаружения провалов напряжения. Назначение его разрядов: • BORV[1:0] — выбор порогового напряжения, ниже которого происходит сброс микроконтроллера: 11 — 2,5 В; 10 — 2,7 В; 01 — 4,2 В; 00 — 4,5 В; • BOREN — активизация слежения за провалами напряжения: 1 — активно; 0 — отключено; • PWRTEN — активизация таймера включения: 1 — отключен; 0 — активен. Следующий конфигурационный регистр находится по адресу $300003 и назы- вается CONFIG2H (рис. 8.6). 7 6 5 4 3 2 1 0 — — — — WDTPS2 WDTPS1 WDTPS0 WDTEN Рис. 8.6. Конфигурационный регистр CONFIG2H Этот регистр служит для конфигурирования сторожевого таймера. Назначение его разрядов: • WDTPS[2:0] — выбор коэффициента деления частоты тактирования сторожево- го таймера: 111 — 128; 110 — 64; 101 — 32; 100 — 16; 011 — 8; 010 — 4; 001 — 2; 000 — деление отсутствует; • WDTEN — активизация сторожевого таймера: 1 — активен; 0 — выключен. Конфигурационный регистр CONFIG3H, расположенный по адресу $300005, содержит единственный разряд ССР2МХ. Его назначение — мультиплексирование входа/выхода модуля ССР2: 1 — с выводом RC1; 0 — с выводом RB3. Следующий конфигурационный регистр, который мы рассмотрим, находится по адресу $300008 и называется CONFIG5L (рис. 8.7). 7 6 5 4 3 2 1 0 — — — — СРЗ СР2 СР1 СРО Рис. 8.7. Конфигурационный регистр CONFIG5L Этот регистр определяет защиту блоков памяти программ. Обнуление того или иного разряда этого регистра соответствует защите определенного диапазона адре- сов: • СРО —$0200..$lFFF; • CPI — $2000..$3FFF; • СР2 — $4000..$5FFF; • СРЗ — $6000..$7FFF. Еще один “защитный” конфигурационный регистр — CONFIG5H (рис. 8.8). 7 6 5 4 3 2 1 0 CPD СРВ — — — — — — Рис. 8.8. Конфигурационный регистр CONFIG5H Этот регистр, расположенный по адресу $300009, отвечает за защиту памяти EEPROM (разряд CPD) и кода загрузчика (СРВ). Обнуление разряда соответствует активизации защиты.
Организация тактирования 225 Для защиты от записи памяти программ, памяти EEPROM и кода загрузчика служит пара регистров CONFIG6L, расположенный по адресу $30000А (рис. 8.9), и CONFIGH, расположенный по адресу $30000В (рис. 8.10). 7 6 5 4 3 2 1 0 — — — — WRT3 WRT2 WRT1 WRT0 Рис. 8.9. Конфигурационный регистр CONFIG6L 7 6 5 4 3 2 1 0 WRTD WRTB WRTC — — — — — Рис. 8.10. Конфигурационный регистр CONFIG6H Соответствие разрядов WRT[3:0] различным блокам памяти программ анало- гично сказанному выше для разрядов СР[2:0] регистра CONFIG5L. То же самое от- носится и к разрядам WRTD и WRTB: они защищают от записи память EEPROM и код загрузчика. Разряд WRTC отвечает за защиту от записи блока конфигураци- онных регистров. Защиту от табличного чтения памяти программ и области загрузчика реализуют конфигурационные регистры CONFIG7L (рис. 8.11) и CONFIG7H (рис. 8.12), распо- ложенные по адресам $30000С и $30000D соответственно. 7 6 5 4 3 2 1 0 — — — — EBTR3 EBTR2 EBTR1 EBTR0 Рис. 8.11. Конфигурационный регистр CONFIG7L 7 6 5 4 3 2 1 0 — EBTRB . — — — — — — Рис. 8.12. Конфигурационный регистр CONFIG7H Организация тактирования Организация тактирования микроконтроллеров семейства PIC18F во многом подобна той, которая была рассмотрена в предыдущей главе. Затронем лишь неко- торые отличительные особенности, характерные, в частности, для PIC18F452. Пре- жде всего отметим, что за выбор источника тактового сигнала отвечает рассмотрен- ный выше конфигурационный регистр CONFIGШ (см. рис. 8.4). В случае использования кварцевого осциллятора между выводами OSC1 и OSC2 (см. рис. 7.2) номиналы конденсатором следует выбирать по табл. 8.2. Таблица 8.2. Выбор конденсаторов для кварцевого осциллятора PIC18F452 Режим Частота С1,С2 LP 32 кГц 33 пФ LP 200 кГц 15 пФ хт 200 кГц 22-68 пФ XT 1 МГц 15 пФ XT 4 МГц 15 пФ HS 4 МГц 15 пФ HS 8 МГц 15-33 пФ
226 Глава 8. Семейство PIC18F Таблица 8.2. Выбор конденсаторов для кварцевого осциллятора PIC18F452 Режим Частота С1, С2 HS 20 МГц 15-33 пФ HS 25 МГц 15-33 пФ В случае использования внешнего тактового сигнала на входе OSC1 микрокон- rpojpiep перевести в такой режим, чтобы на выходе OSC2 был получен импульсный сигнал с частотой в четыре раза меньше частоты сигнала на OSC1. Этому режиму соответствует запись двоичного значения “110” или “100” в разряды FOSC[2:0] конфигурационного регистра CONFIG 1Н (см. рис. 8.4). Также доступны два режи- ма, когда вывод OSC2 выполняет роль обычного порта ввода-вывода RA6. При подключении к выводу OSC1 RC-осциллятора номиналы конденсатора и резистора для микроконтроллеров PIC18Fxx2 выбирают по табл. 8.3. Таблица 8.3. Выбор компонентов RC-осциллятора С R Частота 22 пФ 3,3 кОм 3,3 МГц 4,7 кОм 2,3 МГц 10 кОм 1,08 МГц 30 пФ 3,3 кОм 2,4 МГц 3,9 кОм 2 МГц 4,7 кОм 1,7 МГц 10 кОм 793 кГц Внутренний осциллятор Некоторые микроконтроллеры семейства PIC18F оснащены встроенным осцил- лятором (в подсемействе PIC18Fxx2 он отсутствует). При его использовании выво- ды OSC1 и OSC2 могут выполнять роль обычных портов RA6 и RA7. Для управле- ния внутренним осциллятором служит регистр OSCCON (рис. 8.13). 7 6 5 4 3 2 1 0 IDLEN IRCF2 IRCF1 IRCF0 OSTS IOFS SCSI scso Рис. 8.13. Регистр OSCCON Рассмотрим назначение разрядов этого регистра: • IDLEN — выбор режима работы осциллятора: 1 — в “спящем” режиме; 0 — в активном режиме; • IRCF[2:0] — выбор частоты: 111 —8МГц; 110 —4МГц; 101 — 2 МГц; 100 — 1 МГц; 011 — 500 кГц; 010 — 250 кГц; 001 — 125 кГц; 000 — 31 кГц; • OSTS — флаг, указывающий на срабатывание таймера запуска внутреннего ос- циллятора; _ • IOFS — флаг стабильности работы внутреннего осциллятора (1 — стабилен). Переключение источника тактирования Разряды SCS[1:0] регистра OSCCON отвечают за переключение источника так- тирования с основного осциллятора на низкочастотный тактовый сигнал и обратно: • 00 — внешний осциллятор на выводах OSC1/OSC2; '
Таймеры 227 • 01 — осциллятор таймера 1; • 1 х — внутренний осциллятор. Для разрешения такого режима должен быть предварительно обнулен разряд OSCSEN конфигурационного регистра CONFIG 1Н (см. рис. 8.4). Если микроконтроллер не оснащен внутренним осциллятором (как, например, PIC18F452), то регистр OSCCON содержит единственный (нулевой) разряд SCS. В таком случае лог. 1 в данном разряде соответствует работе от осциллятора тайме- ра 1, а лог. 0 — основному осциллятору на выводах OSC1/OSC2. Таймеры Многие представители семейства PIC18F предоставляют в распоряжение поль- зователя четыре таймера. Рассмотрим их применительно к микроконтроллеру PIC18F452. Поскольку таймер 2 в семействе PIC18F реализован типичным для восьмиразрядных микро- контроллеров образом, он здесь рассмотрен не будет (см. предыдущую главу). То же самое относится и к двум модулям ССР, для управления которыми предназначены регистры ccpiconhcx^ TMR0 Таймер 0 микроконтроллера PIC18F452 подобен таймеру 0 семейства PIC16 за тем исключением, что может работать не только в восьми-, но и в 16-разрядном ре- жиме. Кроме того, для управления TMR0 вместо традиционного регистра OPTION (см. рис. 7.10) служит регистр TOCON (рис. 8.14). 7 6 5 4 3 2 1 0 TMROON T08BIT TOCS TOSE PSA T0PS2 T0PS1 TOPSO Рис. 8.14. Регистр TOCON Функция младших шести разрядов этого регистра аналогична функциям соот- ветствующих разрядов регистра OPTION, Разряд T08BIT определяет работу в вось- ми- (I) или 16-тиразрядном (0) режиме, а разряд TMROON включает (1) или оста- навливает (0) таймер. В 16-разрядном режиме вместо одного счетного регистра используется регист- ровая пара TMR0L:TMR0 (рис. 8.15). Младший байт (TMR0L) загружается непо- средственно с шины данных, а старший (TMR0) — через буфер TMR0H. Во время чтения из регистра TMR0L старший байт результата также загружается в регистр TMR0H. Таким образом, результат считывается двумя командами: вначале — младший байт, затем — старший. Аналогичным образом, при записи данных в регистр TMR0L регистр TMR0 об- новляется содержимым буфера TMR0H. Таким образом, перед инициализацией таймера должно быть предварительно записан старший байт в регистр TMR0H. Этот байт будет перенесен в регистр TMR0 автоматически при записи в регистр TMR0L.
228 Глава 8. Семейство PIC18F Рис. 8.15. Счетные регистры TMR0 в 16-разрядном режиме TMR1 Схема этого таймера и управление им реализовано в представителях семейства PIC18F так же, как и во всех остальных восьмиразрядных микроконтроллерах PIC. Отличие заключается только в наличии разряда RD 16 в регистре T1CON. Если этот разряд обнулен, то запись и чтение счетного регистра TMR1 представляет собой две восьмиразрядные операции. В том случае, если RD 16 = 1, работа с регистровой па- рой TMR1L:TMR1 реализована так же, как при работе TMR0 в 16-разрядном режи- ме, т.е. через буфер TMR1H (см. рис. 8.15). TMR3 Структура таймера 3 подобна структуре таймера 1, поэтому останавливаться на нем подробно мы не будем. Рассмотрим только соответствующий ему управляющий регистр T3CON (рис. 8.16). 7 6 5 4 3 2 1 О RD16 ТЗССР2 T3CKPS1 T3CKPS0 ТЗССР1 T3SYNC TMR3CS TMR3ON Рис. 8.16. Регистр T3CON Назначение разрядов этого регистра: • TMR3ON — активизация/отключение таймера 3; • TMR3CS — выбор источника тактирования: 1 — внешний осциллятор или сиг- нал на выводе T1CKI; 0 — внутренний тактовый сигнал частотойybsc/4; • T3SYNC — управление синхронизацией с внешним тактовым сигналом: 1 — синхронизация отсутствует; 0 — синхронизация активна; • ТЗССР1 — выбор таймера 1 в качестве источника тактирования для модулей ССР: 1 — TMR1 тактирует модуль ССР1, a TMR3 — ССР2; 0 — TMR1 тактиру- ет оба модуля ССР; • T3CKPS[1:0] — выбор коэффициент деления частоты: 11 — 8; 10 — 4; 01 — 2; 11 — деление отсутствует; • ТЗССР2 — если этот разряд установлен в лог. 1, то TMR3 тактирует оба модуля ССР;
ацп 229 • RD16 -н если этот разряд обнулен, то запись и чтение счетного регистра TMR3 представляет собой две восьмиразрядные операции. В том случае, если RD 16 = = 1, работа с регистровой парой TMR3L:TMR3 реализована так же, как при ра- боте TMR0 в 16-разрядном режиме, т.е. чер^з буфер TMR3H (см. рис. 8.15). АЦП Аналого-цифровое преобразование у представителей семейства PIC18F реали- зовано практически так же, как было показано в предыдущей главе. Единственное отличие заключается в появлении нового разряда ADCS2 в управляющем регистре ADCON1 (см. рис. 7.31). Его назначение — удвоить количество возможных коэф- фициентов деления частоты осциллятора для тактирования АЦП (табл. 8.4). Таблица 8.4. Выбор рабочей частоты АЦП микроконтроллеров PIC18F ADCS2 ADCS1 ADCS0 Частота 0 0 0 Частота системной синхронизации / 2 0 0 1 Частота системной синхронизации / 8 0 1 0 Частота системной синхронизации / 32 0 1 1 Тактирование от встроенного RC-осциллятора АЦП 1 0 0 Частота системной синхронизации / 4 1 0 1 Частота системной синхронизации /16 1 1 0 Частота системной синхронизации / 64 1 1 1 Тактирование от встроенного RC-осциллятора АЦП Напомним, что разряды ADCS[1:O], указанные в табл. 8.4, находятся в уп- равляющем регистре ADCONO (см. рис. 7.30). Обработка прерываний Обработка прерываний у представителей семейства PIC18F реализована прак- тически так же, как было показано в предыдущей главе для микроконтроллеров се- рии PIC18C. Основное отличие заключается в появлении нового управляющего ре- гистра RCON (рис. 8.17). IPEN — — RI то PD POR BOR Рис. 8.17. Регистр RCON Старший разряд этого регистра (IPEN) отвечает за активизацию схемы назначе- ния прерываниями уровней приоритетности. Если IPEN = 0, то приоритетность не учитывается, и при возникновении любого прерывания происходит переход по ад- ресу памяти программ $00008. В этом режиме разряд PEIE регистра INTCON (см. рис. 7.19) разрешает/запрещает все прерывания от периферии, а разряд GIE отвечает за общее разрешение прерываний. Если IPEN = 1, то все прерывания разбиваются на две группы: с высоким и с низким приоритетом. Вектор высокоприоритетных прерываний находится в памяти программ по адресу $00008, а низкоприоритетных — по адресу $00018 (см. рис. 8.3). Теперь, если для того или иного прерывания установить соответствующий разряд приоритетности (находятся в регистрах INTCON2, INTCON3, IPR1 и IPR2), то оно станет высокоприоритетным, а в противном случае — низкоприоритетным.
230 Глава 8. Семейство PIC18F Установка в лог. 1 разряда GIEH в регистре INTCON разрешает все высокоприори- тетные прерывания, а установка разряда GIEL — все низкоприоритетные. Остальные разряды регистра RCON — это флаги, позволяющие определить причину сброса микроконтроллера: у • RI — если этот разряд обнулен, то это указывает на выполнение команды reset; • ТО — если этот разряд обнулен, то это указывает на сброс от сторожевого тай- мера; он устанавливается в лог. 1 при включении питания, а также — по коман- де clrwdt или sleep; • PD — если этот разряд обнулен, то это указывает на выполнение команды sleep; он устанавливается в лог. 1 при включении питания или по команде clrwdt; • POR — если этот разряд обнулен, то это указывает на сброс при подаче пита- ния; • BOR — если этот разряд обнулен, то это указывает на сброс при обнаружении провала напряжений.
Глава 9 Семейство PIC24 В 2007 году компания Microchip дала миру новое семейство микроконтролле- ров, оперирующих уже не восьми-, а 16-разрядными данными. Эта технология по- лучила название PIC24. Номер “24” в ее названии объясняется использованием 24- разрядных команд и 24-разрядной адресации. В остальном многие архитектурные характеристики микроконтроллеров PIC24 пересекаются с их восьмиразрядными предшественниками, однако есть и ряд существенных отличий. Поскольку рассмот- реть подробно технологию PIC24 в рамках этой книги не представляется возмож- ным, мы затронем лишь основные ее особенности. Кроме того, в главе 22 будут да- ны примеры программ для микроконтроллера PIC24FJ128GA010. Все микроконтроллеры PIC24 делятся на несколько подсемейств: • PIC24F04KА20х — самые простые представители семейства с 14 и 20 вывода- ми, минимальным составом периферии, небольшим объемом ОЗУ (512 байт), поддержкой последовательной передачи данных по инфракрасному каналу и новым модулем аналоговых измерений CTMU; • PIC24FxxKA 1 Ох — расширенная версия предыдущего подсемейства: 20 выво- дов, 1,5 Кбайт ОЗУ, 512 байт памяти EEPROM, часы реального времени; • PIC24FJxGA — более сложные микроконтроллеры с ОЗУ объемом 8 Кбайт, портами РМР и PSP и интерфейсом JTAG' однако без поддержки CTMU; • PIC24FJxGB — устройства с ОЗУ объемом 16 Кбайт, возможностью переназна- чения 44 цифровых линий ввода-вывода различным периферийным устройст- вам непосредственно во время выполнения программы (технология PPS), пор- тами РМР и PSP, интерфейсами USB и JTAG, модулем CTMU и возможностью беспроводной последовательной передачи данных; • PIC24HJ — микроконтроллеры с модулем прямого доступа к памяти (DMA), контроллером прерываний, девятью 16-разрядными таймерами, 18/32-каналь- ными АЦП и интерфейсом CAN. Максимальная частота — 200 МГц! Базовые характеристики микроконтроллеров PIC24 сведены в табл. 9.1, набор периферийных модулей — в табл. 9.2, а наличие интерфейсов передачи данных — в табл. 9.3. Таблица 9.1. Базовые характеристики микроконтроллеров PIC24 Устройство Выво- дов ОЗУ, Кбайт Память про- грамм, Кбайт Память EEPROM, байт Порты (линий) 24F04KA200 14 0,5 4 — А(7), В(5) 24F04KA201 20 0,5 4 — А(7), В(10) 24F08KA101 20 1,5 8 512 А(7), В(11) 24F08KA102 28 1,5 8 512 А(8), В(16) 24F16KA101 20 1,5 16 512 А(7), В(11) 24F16KA102 28 1,5 16 512 А(8), В(16)
232 Глава 9. Семейство PIC24 Таблица 9.1. Продолжение Устройство Вы- во- дов ОЗУ, Кбайт Память программ, Кбайт Память EEPROM, байт Порты (линий) 24FJ128GA006 64 8 128 — В(16), С(4), D(12), Е(8), F(7), G(6) 24FJ128GA008 80 8 128 — А(4), В(16), 0(6), D(16), Е(10), F(9), G(8) 24FJ128GA010 100 8 128 — , А(12), В(16), С(8), D(16), Е(10), F(11), G(12) 24FJ64GA006 64 8 64 — В(16), 0(4), D(12), Е(8), F(7), G(6) 24FJ64GA008 80 8 64 — А(4), В(16), С(6), D(16), Е(10), F(9), G(8) 24FJ64GA010 100 8 64 — А(12), В(16), С(8). D(16), Е(10), F(11), G(12) 24FJ96GA006 64 8 96 — В(16), 0(4), D(12), Е(8), F(7), G(6) 24FJ96GA008 80 8 96 — А(4), В(16), С(6), D(16), Е(10), F(9), G(8) 24FJ96GA010 100 8 96 — А(12), В(16), С(8), D(16), Е(10), F(11), G(12) 24FJ128GB106 64 16 128 — В(16), 0(4), D(12), Е(8), F(5), G(6) 24FJ128GB108 80 16 128 — А(4), В(16), С(6), D(16), Е(10), F(7), G(8) 24FJ128GB110 100 16 128 — А(<2), В(16), С(8). D(16), Е(10), F(9), G(12) 24FJ192GB106 64 16 192 — В(16), 0(4), D(12), Е(8), F(5), G(6) 24FJ192GB108 80 16 192 — А(4), В(16), С(6), D(16), Е(10), F(7). G(8) 24FJ192GB110 100 16 192 — А(12), В(16), С(8), D(16), Е(10), F(9), G(12) 24FJ256GB106 64 16 256 — В(16), 0(4), D(12), Е(8), F(5), G(6) 24FJ256GB108 80 16 256 — А(4), В(16), С(6), D(16), Е(10), F(7), G(8) 24FJ256GB110 100 16 256 — А(12), В(16), 0(8), D(16), Е(10), F(9), G(12) 24FJ64GB106 64 16 64 — В(16), 0(4), D(12), Е(8), F(5), G(6) 24FJ64GB108 80 16 64 4 А(4), В(16), С(6), D(16), Е(10), F(7), G(8) 24FJ64GB110 100 16 64 — А(12), В(16), С(8), D(16), Е(10), F(9), G(12) 24HJ128GP206 64 8 128 — А(14), В(16), 0(8), D(16), Е(8), F(11), G(12) 24HJ128GP210 100 8 128 — А(14), В(16), 0(8), D(16), Е(8), F(11), G(12) 24HJ128GP306 64 16 128 — А(14), В(16)> 0(8), D(16), Е(8), F(11), G(12) 24HJ128GP310 100 16 128 — А(14), В(16), С(8), D(16), Е(8), F(11), G(12)
Обработка прерываний 233 Таблица 9.1. Окончание Устройство Вы- во- дов ОЗУ, Кбайт Память программ, Кбайт Память EEPROM, байт Порты (линий) 24HJ128GP506 64 8 128 — А(14), В(16), С(8), D(16), Е(8). F(11), G(12) 24HJ128GP510 100 8 128 — А(14), В(16), С(8), 0(16), Е(8), F(11), G(12) 24HJ256GP206 64 16 256 — А(14), В(16), 0(8), 0(16), Е(8), , F(11). G(12) 24HJ256GP210 100 16 256 — А(14), В(16), С(8), D(16), Е(8), F(11),G(12) 24HJ256GP610 100 16 256 — А(14), В(16), 0(8), D(16), Е(8), F(11). G(12) 24HJ64GP206 64 8 64 — А(14), В(16), С(8), D(16), Е(8), F(11), G(12) 24HJ64GP210 64 8 64 — А(14), В(16), 0(8), D(16), Е(8), F(11), G(12) 24HJ64GP506 64 8 64 — А(14), В(16), 0(8), D(16), Е(8), F(11), G(12) 24HJ64GP510 64 8 64 — А(14), В(16), С(8), D(16), Е(8), F(11), G(12) Таблица 9.2. Периферийные модули микроконтроллеров PIC24 Устройство Тай- ме- ры Часы ре- ального времени Захват на вхо- де Сравнение на выходе / ШИМ UART АЦП (кана- лов) Ком- пара- торы CTMU 24F04KA200 3 — 1 1 1 1(7) 2 Есть 24F04KA201 3 — 1 1 1 1 О) 2 Есть 24FxxKA10x 3 Есть 1 1 2 1 О) 2 Есть 24FJxGA 5 Есть 5 5 2 1 (16) 2 — 24FJxGB 5 Есть 9 9 4 1 (16) 3 Есть 24HJ128GP206 9 Есть 8 8 2 1 (18) — — 24HJ128GP210 9 Есть 8 8 2 1(32) — — 24HJ128GP306 9 Есть 8 8 2 1 (18) — — 24HJ128GP310 9 Есть 8 8 2 1 (32) — — 24HJ128GP506 9 Есть 8 8 2 1 (18) — — 24HJ128GP510 9 Есть 8 8 2 1 (32) — — 24HJ256GP206 9 Есть 8 8 2 1 (18) — — 24HJ256GP210 9 Есть 8 8 2 1 (32) — — 24HJ256GP610 9 Есть 8 8 2 2(32) — — 24HJ64GP206 9 Есть 8 8 2 1 (18) — — 24HJ64GP210 9 Есть 8 8 2 1 (32) — — 24HJ64GP506 9 Есть 8 8 2 1 (18) — — 24HJ64GP510 9 Есть 8 8 2 1 (32) — —
234 Глава 9. Семейство PIC24 Таблица 9.3. Интерфейсы микроконтроллеров PIC24 Устройство IrDA SPI l2C РМР PSP JTAG USB CAN 24F04KA20X Есть 1 1 — — — — — 24FxxKA10x Есть 1 1 — — — — — 24FJxGA Есть 2 2 Есть Есть Есть — — 24FJXGB Есть 3 3 Есть Есть Есть Есть — 24HJ128GP206 Есть 2 2 — — — — — 24HJ128GP210 Есть 2 2 — — — — — 24HJ128GP306 Есть 2 2 — — — — — 24HJ128GP310 Есть 2 2 — — — — — 24HJ128GP506 Есть 2 2 — — — — 1 24HJ128GP510 Есть 2 2 — — — — 1 24HJ256GP206 Есть 2 2 — — — — — 24HJ256GP210 Есть 2 2 — — — — — 24HJ256GP610 Есть 2 2 — — — — 2 24HJ64GP206 Есть 2 1 — — — — — 24HJ64GP210 Есть 2 2 — — — — — 24HJ64GP506 Есть 2 2 — — — — 1 24HJ64GP510 Есть 2 2 — — — — 1 Структура микроконтроллера PIC24 показана на примере подсемейства PIC24FJxGA (рис. 9.1). Поскольку подробное изучение технологии PIC24 выходит за тематические рамки этой книги, мы затронем только некоторые отличительные особенности данного семейства устройств. Порты Попытка программно сконфигурировать выводы порта В, как входы, путем за- писи нулей в соответствующие разряды регистра TRISB может завершиться ничем. Причина в том, что большинство выводов порта В мультиплексированы с аналого- выми входами АЦП. Другими словами, в 16-разрядной архитектуре PIC порты А и В поменялись ролями. В восьмиразрядных микроконтроллерах PIC только пользователь мог опреде- лить направление передачи данных через тот или иной вывод, даже если его ис- пользования требовал какой-либо периферийный модуль. В архитектуре PIC24 ре- жим работы вывода всецело зависит от входного/выходного сигнала некоторого пе- риферийного модуля, мультиплексированного на этот вывод, независимо от содер- жимого регистра TRISx. По умолчанию выводы, мультиплексированные с “аналоговыми” входами, от- соединены от своих “цифровых” входов. При подаче питания все выводы порта В по умолчанию выполняют функцию аналоговых входов. Как следствие, чтение пор- та В даст все нули. Тем не менее, в отличие от регистра PORTB, выходной фиксатор порта В (регистр LATB) содержит корректное значение. Для соединения входов порта В с цифровыми входами необходимо оперировать настройками модуля АЦП. За цифро-аналоговое распределение каждого вывода от- вечает регистр специального назначения AD1PCFG (рис. 9.2). Таким образом, для реализации задачи цифрового вывода через порт В необходимо записан лог. 1 в со- ответствующие разряды регистра ADI PCGF. Если же разряд содержит лог. О, то со-
Порты 235 ответствующий вывод сконфигурирован в аналоговом режиме, чтение порта запре- щено, и АЦП опрашивает напряжение на выводе. Рис. 9.1. Структурная схема микроконтроллеров PIC24FJxGA
236 Глава 9. Семейство PIC24 15 14 13 12 11 10 9 8 PCFG15 PCFG14 PCFG13 PCFG12 PCFG11 PCFG10 PCFG9 PCFG8 7 6 5 4 3 2 1 0 PCFG7 PCFG6 PCFG5 PCFG4 PCFG3 PCFG2 PCFG1 PCFG0 Рис. 9.2. AD1PCFG, регистр конфигурирования порта АЦП ПРИМЕЧАНИЕ Как видно из рис. 9.2, большинство управляющих регистров PIC24, включая регистры пор- тов, — 16-разрядные. Таймеры В архитектуре Р1С24 отсутствует таймер 0. Все остальные таймеры, которых может быть от трех до девяти, — 16-разрядные. Имена всех регистров специального назначения, отвечающих за управление таймерами, совпадают с именами, исполь- зованными в восьмиразрядных микроконтроллерах PIC. По структуре они также во многом сходны, но все же не забывайте сверяться со спецификациями. Новые возможности таймеров PIC24: • наличие 16-разрядного регистра периода, предназначенного для организации периодического сброса таймера; • для таймеров 2/3,4/5, 6/7 и 8/9 доступен новый механизм одновременного ис- пользования в паре, обеспечивающий 32-разрядный режим счета; • к таймеру 1 была добавлена новая возможность стробирования внешнего такто- вого сигнала. Прерывания Архитектура PIC24 предоставляет гибкую систему прерываний, поддерживаю- щая до П8 различных источников прерывания. Для обеспечения оперативного от- клика на событие и быстрого возврата в главную программу крайне важно миними- зировать время отклика (период между возникновением события и выполнением первой команды подпрограммы обслуживания прерывания). В архитектуре PIC24 это время не только очень мало, но и фиксировано для каждого источника прерыва- ния: всего лишь три командных цикла для внутренних событий и четыре для внеш- них. Благодаря этой важной особенности системы управления прерываниями, мик- роконтроллеры PIC24 получают явное преимущество перед многими конкурентами. Кроме того, важно отметить, что микроконтроллеры PIC24 хранят все векторы прерываний в одной большой таблице, называемой IVT (Interrupt Vector Table). Компиляторы с языка С, рассчитанные на работу с 16-разрядными устройствами (в частности, рассматриваемый в главе 14 компилятор СЗО), автоматически связы- вают эти векторы со специальными, определенными пользователем функциями. В качестве примера рассмотрим систему прерываний микроконтроллера PIC 24FJ128GA010. Внешние источники прерываний для этого микроконтроллера: • пять — для внешних выводов с обнаружением по изменению уровня;
Прерывания 237 • 22 — для внешних выводов, соединенных с модулем уведомления об изменени- ях (Change Notification); • пять — для модулей захвата на входе (Input Capture); • пять — для модулей сравнения на выходе (Output Compare); • два — для модулей UART; • четыре — для синхронных последовательных интерфейсов (SPI и 12С); • один — для ведущего параллельного порта (РМР). Внутренние источники прерываний микроконтроллера PIC24FJ128GA010: • пять — для таймеров; • один — для АЦП; • один — для модуля аналоговых компараторов; • один — для часов и календаря реального времени; • один — для средств контроля циклическим Избыточным кодом (CRC). Каждому источнику прерываний соответствует пять управляющих разрядов в различных регистрах специального назначения (табл. 9.4): • разряд разрешения прерывания (обычно обозначен с помощью суффикса IE): О — соответствующее событие не вызывает прерывания; 1 — прерывание раз- решено; • флаг прерывания (обычно ^Обозначен с помощью суффикса IF) — устанавлива- ется каждый раз при возникновении соответствующего события независимо от состояния разряда разрешения; ПРИМЕЧАНИЕ Однажды установленный флаг прерывания должен быть сброшен вручную. Другими словами, его необходимо обнулить до выхода из подпрограммы обслуживания прерывания, иначе эта же подпрограмма будет сразу же вызвана еще раз. • уровень приоритетности (обычно обозначен с помощью суффикса IF). Преры- ванию можно назначить один из семи уровней приоритетности. Если одновре- менно возникает два различных запроса на прерывание, то первым будет об- служен тот из них, для которого определен более высокий приоритет. Для ко- дирования приоритетности каждого источника прерываний отведены три раз- ряда. В каждый момент времени уровень приоритетности для задач процессора PIC24 хранится в регистре SR в разрядах IPL0..IPL2. Прерывания, у которых приоритет ниже текущего значения IPL, игнорируются. При подаче питания всем источникам прерываний по умолчанию назначается уровень приоритетно- сти 4, а процессору — уровень 0. Таблица 9.4. Векторы прерываний микроконтроллера PIC24FJ128GA010 Источник прерывания Номер вектора Адрес в IVT Адрес BAIVT Размещение разрядов прерывания Флаг Разрешение Приоритет АЦП1 — преобразование завершено 13 $00002Е $00012Е IFS0<13> IEC0<13> IPC3<6:4> Внешнее прерывание 0 0 $000014 $000114 IFS0<0> IEC0<0> IPC0<2:0> Внешнее прерывание 1 20 $00003С $000130 IFS1<4> IEC1<4> IPC5<2:0> Внешнее прерывание 2 29 $00004Е $00014Е IFS1<13> IEC1<13> IPC7<6:4> Внешнее прерывание 3 53 $00007Е $00017Е IFS3<5> IEC3<5> IPC13<6:4>
238 Глава 9. Семейство PIC24 Таблица 9.4. Окончание Источник прерывания Номер вектора Адрес в IVT Адрес bAIVT Размещение разрядов прерывания Флаг Разрешение Приоритет Внешнее прерывание 4 54 $000080 $000180 IFS3<6> IEC3<6> IPC13<10:8> Генератор CRC 67 $00009А $00019А IFS4<3> IEC4<3> IPC16<14:12> Захват на входе 1 1 $000016 $000116 IFS0<1> IEC0<1> IPC0<6:4> Захват на входе 2 5 $00001Е $00011Е IFS0<5> IEC0<5> IPC1<6:4> Захват на входе 3 37 $00005Е $00015Е IFS2<5> IEC2<5> IPC9<6:4> Захват на входе 4 38 $000060 $000160 IFS2<6> IEC2<6> IPC9<10:8> Захват на входе 5 39 $000062 $000162 IFS2<7> IEC2<7> IPC9<14:12> « Компаратор 18 $000038 $000138 IFS1<2> IEC1<2> IPC4<10:8> Уведомление об изменениях 19 $00003А $0001ЗА IFS1<3> IEC1<3> IPC4<14:12> Сравнение на выходе 1 2 $000018 $000118 IFS0<2> IEC0<2> IPC0<10:8> Сравнение на выходе 2 6 $000020 $000120 IFS0<6> IEC0<6> IPC1<10:8> Сравнение на выходе 3 25 $000046 $000146 IFS1<9> IEC1<9> IPC6<6:4> Сравнение на выходе 4 26 $000048 $000148 IFS1<10> IEC1<10> IPC6<10:8> Сравнение на выходе 5 41 $000066 $000166 IFS2<9> IEC2<9> IPC10<6:4> Таймер 1 3 $00001А $00011А IFS0<3> IEC0<3> IPC0<14:12> Таймер 2 7 $000022 $000122 IFS0<7> IEC0<7> IPC1<14:12> Таймер 3 8 $000024 $000124 IFS0<8> IEC0<8> IPC2<2:0> Таймер 4 27 $00004А $00014А IFS1<11> IEC1<11> IPC6<14:12> Таймер 5 28 $00004С $00014С IFS1<12> IEC1<12> IPC7<2:0> Часы/календарь реального времени 62 $000090 $000190 IFS3<14> IEC3<14> IPC15<10:8> 12С 1 — событие ведомого блока 16 $000034 $000134 IFS1<0> IEC1<0> IPC4<2:0> 12С 1 — событие ведущего блока 17 $000036 $000136 IFS1<1> IEC1<1> IPC4<6:4> 12С 2 — событие ведомого блока 49 $000076 $000176 IFS3<1> IEC3<1> IPC12<6:4> 12С 2 — событие ведущего блока 50 $000078 $000178 IFS3<2> IEC3<2> IPC12<10:8> РМР (ведущий параллельный порт) 45 $00006Е $00016Е IFS2<13> IEC2<13> IPC11<6:4> SPI 1 — ошибка 9 $000026 $000126 IFS0<9> IEC0<9> IPC2<6:4> SPI 1 — событие 10 $000028 $000128 IFS0<10> IEC0<10> IPC2<10:8> SPI 2 — ошибка 32 $000054 $000154 IFS2<0> IEC2<0> IPC8<2:0> SPI 2 — событие 33 $000056 $000156 IFS2<1> IEC2<1> iPC8<6:4> UART 1 — ошибка 65 $000096 $000196 IFS4<1> IEC4<1> IPC16<6:4> UART 1 — передатчик 12 $00002С $00012С IFS0<12> IEC0<12> IPC3<2:0> UART 1 — приемник 11 $00002А $00012А IFS0<11> IEC0<11> IPC2<14:12> UART 2 — ошибка 66 $000098 $000198 IFS4<2> IEC4<2> IPC16<10:8> UART 2 — передатчик 31 $000052 $000152 IFS1<15> IEC1<15> IPC7<10:8> UART 2 — приемник 30 $000050 $000150 IFS1<14> IEC1<14> IPC7<10:8> При подаче питания все источники прерываний по умолчанию неактивны. На- ряду с назначенным уровнем приоритетности, также существует относительный (установленный по умолчанию) приоритет среди различных источников прерыва- ний в соответствии с фиксированным порядком их следования в таблице IVT. Вложение прерываний Прерывания можно вкладывать одно в другое, прерывая менее приоритетные подпрограммы обслуживания прерываний более приоритетными. Этот механизм контролируется разрядом NSTDIS регистра INTCON1. Если этот разряд содержит
Окно Program Space Visibility 239 лог. 1, то при поступлении запроса на прерывание процессору присваиваемся мак- симальный уровень приоритетности (IPL = 7) независимо от уровня приоритетно- сти, определенного для данного события. Это гарантирует, что новые прерывания не будут обслужены до тех пор, пока обслуживается текущее. Другими словами, при установке NSTDIS = 1 уровень приоритетности каждого прерывания использу- ется только для разрешения конфликтов при одновременном поступлении разных запросов, в результате чего все прерывания обслуживаются последовательно. Системные прерывания Первые восемь позиции в таблице IVT занимают дополнительные векторы, предназначенные для обнаружения особых ошибочных состояний, наподобие сбоя выбранного осциллятора, обращения по некорректному адресу, переполнения стека или деления на ноль (математическая ошибка) (табл. 9.5). Таблица 9.5. Векторы системных прерываний Номер вектора Адрес в IVT Источник системного прерывания 0 000004h Зарезервировано 1 000006h Ошибка тактового генератора 2 000008h Ошибочный адрес 3 OOOOOAh Ошибка стека 4 OOOOOCh Математическая ошибка 5 OOOOOEh Зарезервировано 6 00001Oh Зарезервировано 7 000012h Зарезервировано Поскольку такие ошибки обычно приводят к фатальным последствиям для ра- ботающего Приложения, им назначены фиксированные уровни приоритетности вы- ше семи базовых уровней, доступных для всех остальных прерываний. Это также означает, что их невозможно случайно маскировать (или задержать с помощью раз- ряда NSTDIS), благодаря чему мы получаем дополнительный уровень надежности. В архитектуре PIC24 отсутствует отдельный управляющий разряд, запрещающий все преры- вания, зато присутствует специальная команда disi, запрещающая прерывания на ограни- ченное число циклов. ................................... ..................................Й......Й.................................................. ............................... Окно Program Space Visibility Архитектура PIC24 предоставляет два метода чтения памяти программ: • с помощью специальной команды табличного чтения third; • с помощью окна Program Space Visibility (PSV), которое можёт занимать до 32 Кбайт памяти программ, доступной для шины. Другими словами, PSV — это своеобразный мост между шинами памяти про- грамм и данных (рис. 9.3). Обратите внимание на тот факт, что микроконтроллеры PIC24 используют 24- разрядную шину памяти программ при 16-разрядной шине данных. Ввиду этого не- соответствия разрядности двух шин использование “моста” PSV становится еще бо- лее интересным. В действительности PSV связывает с шиной памяти данных только младшие 16 разрядов шины памяти программ. Старшая часть (восемь разрядов) ка-
240 Глава 9. Семейство PIC24 ждого слова памяти программ для окна PSV недоступна. В то же время, при исполь- зовании команд табличного чтения память программ доступна полностью, но — це- ной необходимости проводить различие между работой с данными в ОЗУ (прямая адресация) и с данными в памяти программ (через специальные команды таблично- го доступа). Пространство памяти программ (Flash) Пространство памяти данных (ОЗУ) 24 разряда 16 разрядов 0x0000 0x0800 0x2800 0X7FFF OxFFFF Таким образом, программисту микроконтроллеров PIC24 предоставляется вы- бор: более удобный, однако менее эффективный с точки зрения использования па- мяти метод пересылки данных между двумя шинами с помощью окна PSV, или же более эффективное и менее “прозрачное” решение в виде команд табличного досту- па. Интерфейс SPI В дополнение к возможностям SPI, реализованным в большинстве микрокон- троллеров PIC в модулях SSP и MSSP, модуль SPI-интерфейса микроконтроллеров PIC24 предоставляет ряд новых возможностей: • режим 16-битной передачи; • выбор фазы опроса входных данных; • режим покадровой передачи; • управление синхроимпульсами передачи кадров (выбор полярности и активного фронта); • расширенный режим (восьмиуровневые FIFO-буферы приема/передачи). В частности, в ходе операции последовательного чтения и/или страничной за- писи для повышения производительности и увеличения (вдвое) числа циклов, дос- тупных центральному процессору в промежутках между обращениями к буферам SPI, можно использовать режим 16-битной передачи. Однако по-настоящему раз- грузить процессор позволяет расширенный режим (Enhanced Mode) с его восьми- уровневыми FIFO-буферами. До восьми слов (16 байт) можно записывать в буферы SPI или извлекать их оттуда небольшими фрагментами, оставляя в промежутках го- раздо больше времени центральному процессору на обработку данных.
Порт РМР 241 Порт РМР Разработчики PIC24 создали новый адресуемый параллельный порт РМР для автоматизации и ускорения доступа к большому спектру внешних устройств общего назначения, включая аналого-цифровые преобразователи, буферы оперативной па- мяти, совместимые с шиной ISA интерфейсы, модули ЖК-дисплеев и даже жесткие диски и карты CompactFlash. Можно сказать, что РМР — это гибкая шина ввода-вывода, добавленная в архи- тектуру PIC24, которая не мешает ни 24-разрядной шине памяти программ, ни 16- разрядной шине памяти данных (и не замедляет их работу). Порт РМР предлагает: • восьми- или 16-разрядный двунаправленный тракт данных; • до 64 Кбайт адресного пространства (16 адресных линий); • шесть дополнительных линий стробирования/управления: ► разрешения; ► фиксации адреса; ► чтения; ► записи; ► две линии выбора кристалла. Порт РМР также можно сконфигурировать для работы в режиме ведомого, что- бы подключиться в качестве адресуемого периферийного устройства к более круп- ной микропроцессорной или микроконтроллерной системе. Командные последовательности чтения из шины и записи в нее — полностью программируемые, поэтому можно не только сконфигурировать под целевую шину полярность и набор управляющих сигналов, но и точно настроить временные харак- теристики в соответствии с быстродействием периферийных устройств. Как и в случае со всеми остальными периферийными модулями микроконтрол- лера PIC24, за конфигурирование порта РМР отвечает ряд управляющих регистров. Первый из них — PMCON, содержащий знакомый набор разрядов, типичный для всех регистров xxCON (рис. 9.4). 15 14 13 12 11 10 9 8 PMPEN — PSIDL ADRMUX1 ADRMUX0 PTBEEN PTWREN PTRDEN 7 6 5 4 3 2 1 0 CSF1 CSFO ALP CS2P CS1P ВЕР WRSP RDSP Рис. 9.4. Регистр PMCON Другие регистры управления модулем РМР: PMMODE, PMADDR, PMSTAT, PMPEN и PADCFG1. Они предоставляют множество разнообразных возможностей, однако подробно останавливаться на них мы сейчас не будем. Это лучше сделать на примере взаимодействия микроконтроллера PIC24 с ЖК-модулем, рассмотренного в главе 22. АЦП Структура модуля АЦП микроконтроллеров PIC24 показана на рис. 9.5
242 Глава 9. Семейство PIC24 Управление конфигурацией вывода Рис. 9.5. Структурная схема модуля АЦП микроконтроллеров PIC24 Эта схема предлагает множество интересных возможностей: • под аналоговые входы можно задействовать до 16 выводов; • для выбора различных входных аналоговых каналов и источников опорного на- пряжения служат два входных мультиплексора; • результат, полученный на выходе 10-разрядного преобразователя, можно от- форматировать под 16-разрядную целочисленную или вещественную арифме- тику (со знаком или без); • схема управления предусматривает различные последовательности автоматиче- ского преобразования с синхронизацией с работой других модулей и входов, задействованных в данном процессе; • результат преобразования сохраняется в 16-разрядном буфере глубиной 16 слов, который можно сконфигурировать для последовательного считывания или простой FIFO-буферизации.
ацп 243 Регистры конфигурирования АЦП: • ADIPCFG — маска выбора аналоговых входных каналов (0 в некотором разря- де обозначает аналоговый, а 1 — цифровой вход); • AD1CON1 — определяет автоматическое начало преобразования по заверше- нию этапа выборки; результат будет отформатирован как обычное беззнаковое целое с выравниванием по правому разряду; • AD1CSSL — конфигурирование функции опроса; • ADI CON2 — определяет использование мультиплексора MUXA и соединяет входы опорного сигнала АЦП с аналоговыми входами AVdd и AVss; • ADI CON3 — выбирает источник тактирования и коэффициент деления для преобразования. По сути аналого-цифровое преобразование — это двухэтапный процесс. Преж- де всего необходимо снять сигнал входного напряжения, после чего вход можно от- ключить и выполнить собственно преобразование считанного напряжения в число- вое значение. Эти два этапа контролируются двумя управляющими разрядами в ре- гистре AD1CON1: SAMP и DONE. Для обеспечения необходимой точности измерений важную роль играет хроно- метраж этих двух этапов. • На этапе выборки внешний сигнал подается на внутренний конденсатор, кото- рый необходимо зарядить до уровня входного напряжения. Для этого требуется выделить достаточно времени, которое обычно пропорционально импедансу источника входного сигнала, а также емкости конденсатора* В общем случае, чем больше время выборки, тем лучше результат, согласующийся с частотой входного сигнала. • Длительность этапа преобразования зависит от выбранного источника тактиро- вания АЦП. Тактовый сигнал обычно получают из синхросигнала центрального процессора после пропускания через делитель или с помощью независимого RC-осциллятора. Последний вариант, хотя и привлекает своей простотой, хо- рошо подходит в тех случаях, когда преобразование выполняется в “спящем” режиме при отключенном тактовом генераторе центрального процессора. В ос- тальном, предпочтительный способ формирования тактового сигнала — с по- мощью делителя, поскольку он обеспечивает синхронизацию с центральным процессором и, как следствие, — более надежное подавление внутреннего шу- ма. Частота тактового сигнала должна быть максимально большой согласно спецификациям модуля АЦП. Согласно базовому методу программист сам отвечает за обеспечение точных временных характеристик этапа выборки с помощью двух циклов ожидания. Одна- ко микроконтроллеры PIC24 позволяют отчасти автоматизировать данный процесс. Длительность этапа выборки определяется без нашего участия при условии, что им- педанс входного источника достаточно мал для того, чтобы обеспечить максималь- ную продолжительность дискретизации 32 х Tad. Этого можно достичь, записав в разряды SSRC регистра AD1CON1 двоичное значение 111, чтобы активизировать автоматическое начало преобразования по завершении периода дискретизации. Сам период выбирают с помощью разрядов SAM регистра AD1CON3.
244 Глава 9. Семейство PIC24 Автоматическое начало преобразования по завершении этапа выборки дает два преимущества: , • гарантированно корректное время выборки без необходимости использовать какие-либо циклы задержки и/или другие ресурсы; • для выполнения всей процедуры дискретизации и преобразования достаточно одной команды (начала этапа выборки). Когда АЦП сконфигурирован подобным образом, активизация преобразования и считывание результата становится совсем простой задачей. 1. Разряд AD1CHS выбирает входной канал для мультиплексора. 2. Запись лог. 1 в разряд SAMP регистра ADI CON1 начинает этап выборки с ав- томатическим выбором длительности, после которого сразу же следует преоб- разование. 3. Как только будет выполнена вся процедура, и результат готов к использованию, в регистре AD1CON1 устанавливается флаг DONE. 4. Чтение регистра ADC 1BUF0 сразу же дает требуемый результат преобразова- ния. Модуль CTMU В микроконтроллерах PIC24 появился новый аналоговый модуль, позволяющий измерять уровень заряда конденсаторов, точно определять различия временных ха- рактеристик импульсных сигналов и формировать асинхронные последовательности импульсов. Его название — CTMU (Charge Time Measurement Unit). Этот модуль — идеальный вариант для организации взаимодействия с емкостными тактильными датчиками. Управление модулем CTMU осуществляют с помощью двух регистров: CTMUCON (рис. 9.6) и CTMUICON (рис. 9.7). 15 14 13 12 11 10 9 8 CTMUEN — CTMUSIDL TGEN EDGEN EDGSEQEN IDISSEN CTTRIG 7 6 5 4 3 2 1 0 EDG2POL EDG2SEL1 EDG2SEL0 EDG1POL EDG1SEL1 EDG1SEL0 I EDG2STAT EDG1STAT Рис. 9.6. Регистр CTMUCON Назначение разрядов регистра CTMUCON: • CTMUEN — включение (1) и отключение (0) модуля CTMU; • CTMUSIDL-— прекращение (1) или продолжение (0) работы модуля при пере- ходе микроконтроллера в “спящий” режим; • TGEN — разрешение (1) или запрет (0) формирования задержки фронта; • EDGEN — разблокирование (1) или блокирование (0) фронтов; • EDGSEQEN — разрешение последовательности фронтов: 1 — для возникнове- ния фронта 2 должен появиться фронт 1; 0 — последовательность фронтов не отслеживается; • IDISSEN — аналоговый выход выдачи тока заземлен (1) или не заземлен (0); • CTTRIG — разрешение (1) или запрет (0) выхода срабатывания;
Модуль CTMU 245 • EDGxPOL — выбор полярности фронта “х”: 1 — реакция на нарастающий фронт; 0 — реакция на ниспадающий фронт; • EDGxSEL[l :0] — выбор источника для фронта “х”: 11 — вывод CTED1; 10 — CTED2; 01 — модуль сравнения на выходе 1; 00 — модуль таймера 1; • EDGxSTAT — состояние фронта “х”: 1 — событие произошло; 0 — событие не произошло. 12 11 10 9 8 15 14 13 ITRIM5 ITRIM4 ITRIM3 ITRIM2 ITRIM1 ITRIM0 IRNG1 IRNG0 7 6 5 4 3 2 1 0 — — — — — — — —- Рис. 9.7. Регистр CTMUICON Назначение разрядов регистра CTMUICON: • ITRIM[5:0] — выбор источника тока: ► 000000 — номинальный ток, заданный разрядами IRNG[1:0]; ► 000001 — минимальное положительное отклонение от номинального тока; ► 011111 — максимальное положительное отклонение от номинального тока; ► 100000 — максимальное отрицательное отклонение от номинального тока; ► 111111 — минимальное отрицательное отклонение от номинального тока; • IRNG[1:0] — выбор пределов источника тока: 11 — 100 х базовый ток; 10 — 10 х базовый ток; 01 — уровень базового тока (номинал — 0,55 мкА); 00 — источ- ник тока отключен. Измерение заряда конденсатора Модуль CTMU измеряет заряд путем формирования выходного импульса, дли- тельность которого равна времени между моментами появления фронтов на двух входных каналах, задаваемых с помощью разрядов EDG1SEL и EDG2SEL регистра CTMUCON. Емкость конденсатора рассчитывается по формуле: C = I*dV/dT. Схема подключений для измерения заряда показана на рис. 9.8. Для измерения заряда АЦП опрашивает конденсатор Сарр, соединенный с одним из его входных каналов, после получения импульса от CTMU. Резистор Rpr обеспечивает калибров- ку источника тока на втором входном канале АЦП. По завершении импульса АЦП определяет напряжение на конденсаторе, а фактическое вычисление емкости возла- гается на программу. В примере на рис. 9.8 показано, что события на входы EDG1 и EDG2 модуля CTMU поступают от таймера 1, однако его роль могут выполнять и внешние источ- ники импульсного сигнала. Измерение времени Схема подключений для измерения времени по длительности импульса с при- менением внутреннего конденсатора Сдо модуля АЦП показана на рис. 9.9.
246 Глава 9. Семейство PIC24 FIC24F Таймер 1 i CTMU *-l EDG1 Источник I Рис. 9.8. Схема подключений для измерения заряда конденсатора с помощью модуля CTMU PIC24F ! CTMU | *“| EDG1 ИСТОЧНИК । тока > EDG2 АЦП “Выходной импульс Cad Рис. 9.9. Схема подключений для измерения времени с помощью модуля CTMU Формирование импульсных последовательностей и задержек Модуль CTMU также может формировать на выходе импульсный сигнал, фрон- ты которого являются асинхронными по отношению к сигналу системной синхро- низации. Точнее сказать, он выдает импульсы с запрограммированндй задержкой. Когда модуль путем записи лог. 1 в разряд TGEN регистра CTMUCON (см. рис. 9.6) конфигурируется на формирование импульсных задержек, внутренний источ- ник тока соединяется со входом В компаратора 2. С этим же входом через вывод C2INB соединен конденсатор Cdelay, а ко входу А компаратора подключен источ- ник опорного напряжения компаратора (рис. 9.10). При обнаружении фронта на входе EDG1 модуль CTMU начинает заряжать конденсатор Cdelay- Когда уровень заряда превышает некоторый порог, заданный источником опорного напряжения, на вывод CTPLS выдается импульс. Длитель- ность задержки определяется номиналом Cdelay и напряжением СVref-
Модуль CTMU 247 Рис. 9.10. Схема подключений для формирования импульсных задержек с помощью модуля CTMU
Глава 10 Семейство PIC32 В 2008 году компания Microchip выпустила новое семейство микроконтролле- ров, оперирующих 32-разрядными данными. Эта технология получила название PIC32. Многие архитектурные характеристики микроконтроллеров PIC32 пересе- каются с их восьми- и 16-разрядными предшественниками, однако есть и ряд суще- ственных отличий. Поскольку рассмотреть подробно технологию PIC32 в рамках этой книги не представляется возможным, мы затронем лишь основные ее особен- ности. Кроме того, в главе 23 будут даны примеры программ для микроконтроллера PIC32MX360F512L. На момент издания этой книги существовала только серия микроконтроллеров PIC32MX. Общие особенности устройств этой серии: • 32-разрядное ядро с пятиуровневым конвейером; • максимальная.тактовая частота — 80 МГц (кроме моделей PIC32MX320F032H и PIC32MX420F032H, у которых тактовая частота не превышает 40 МГц); • наличие модуля, реализующего операции умножения и деления за один такто- вый цикл; • два регистровых файла; • модуль предварительной выборки, ускоряющий работу с памятью Flash; • низкие рабочие напряжения в диапазоне 2,3..3,6 В; • совместимость функций выводов с большинством представителей семейства PIC24; • до восьми модулей прямого доступа к памяти (DMA) с автоматическим опреде- лением разрядности данных; • интерфейс USB 2.0 с выделенными каналами DMA; • 16-канальный 10-разрядный АЦП; • два аналоговых компаратора; • 12 Кбайт Flash-загрузчика; • раздельные системы фазовой автоподстройки частоты (PLL) для центрального процессора и интерфейса USB; • аппаратные часы реального времени (RTCC); • модули UART с аппаратным шифратором/дешифратором IrDA и поддержкой интерфейсов RS-232, RS-485 и UN 1.2; • встроенный регулятор напряжения; • по пять таймеров, модулей захвата на входе и модулей сравнения на выходе; • наличие портов PMP/PSP и интерфейса JTAG. Базовые характеристики микроконтроллеров PIC32 сведены в табл. 10.1, а на- личие каналов DMA и интерфейсов передачи данных — в табл. 10.2.
Модуль CTMU 249 Таблица 10.1. Базовые характеристики микроконтроллеров PIC24 Устройство Выво- дов ОЗУ, Кбайт Память программ, Кбайт Порты (линий) 32MX320F032H 64 8 32 В(16), 0(4), 0(12), Е(8), F(7), G(6) 32MX320F064H 64 16 64 В(16), С(4), D(12), Е(8), F(7), G(6) 32MX320F128H 64 16 128 В(16), С(4), D(12), Е(8), F(7), G(6) 32MX320F128L 100/121 16 128 A(12), B(16), C(8), D(16), E(10), F(11), G(12) 32MX340F128H 64 32 128 B(16), C(4), D(12), E(8), F(7), G(6) 32MX340F128L 100/121 32 128 A(12), B(16), 0(8), D(16), E(10), F(11), G(12) 32MX340F256H 64 32 256 B(16), 0(4), D(12), E(8), F(7), G(6) 32MX340F512H 64 32 512 B(16), 0(4), D(12), E(8), F(7), G(6) 32MX360F256L 100/121 32 256 A(12), B(16), C(8), D(16), E(10), F(11), G(12) 32MX360F512L 100/121 32 512 A(12), B(16), 0(8), D(16), E(10), F(11), G(12) 32MX420F032H 64 8 32 B(16), 0(4), D(12), E(8), F(7), G(6) 32MX440F128H 64 32 128 B(16), 0(4), D(12), E(8), F(7), G(6) 32MX440F128L 100/121 32 128 A(12), B(16), C(8), D(16), E(10), F(11), G(12) 32MX440F256H 64 32 256 B(16), 0(4), D(12), E(8), F(7), G(6) 32MX440F512H 64 32 512 B(16), C(4), D(12), E(8), F(7), G(6) 32MX460F256L 100/121 32 256 A(12), B(16), C(8), D(16), E(10), F(11). G(12) 32MX460F512L 100/121 32 512 A(12), B(16), 0(8), D(16), E(10), F(11), G(12) 32MX575F256H 64 64 256 B(16), 0(4), D(12), E(8), F(5), G(6) 32MX575F256L 100 64 256 A(12), B(16), 0(8), D(16), E(10), F(9), G(12) 32MX575F512H 64 64 512 B(16), 0(4), D(12), E(8), F(5), G(6) 32MX575F512L 100 64 512 A(12), B(16), 0(8), D(16), E(10), F(9), G(12) 32MX675F256H 64 64 256 B(16), 0(4), D(12), E(8), F(5), G(6) 32MX675F256L 100 64 256 A(12), B(16), C(8), D(16), E(10), F(9), G(12) 32MX675F512H 64 64 512 B(16), 0(4), D(12), E(8), F(5), G(6) 32MX675F512L 10СГ 64 512 A(12), B(16), 0(8), D(16), E(10), F(9), G(12) 32MX695F512H 64 128 512 B(16), 0(4), D(12), E(8), F(5), G(6) 32MX695F512L 100 128 512 A(12), B(16), C(8), D(16), E(10), F(9), G(12) 32MX775F256H 64 64 256 B(16), 0(4), D(12), E(8), F(5), G(6) 32MX775F256L 100 64 256 A(12), B(16), 0(8), D(16), E(10), F(9), G(12) 32MX775F512H 64 64 512 B(16), 0(4), D(12), E(8), F(5), G(6) 32MX775F512L 100 64 512 A(12), B(16), 0(8), D(16), E(10), F(9), G(12) 32MX795F512H 64 128 512 B(16), 0(4), D(12), E(8), F(5), G(6) 32MX795F512L 100 128 512 A(12), B(16), C(8), D(16), E(10), F(9), G(12) Таблица 10.2. Каналы DMA и интерфейсы в микроконтроллерах PIC32 Устройство Каналы DMA UART SPI l2C Ethernet CAN Программируемые Выделенные 32MX320F032H 0 0 2 2_ 2 — — 32MX320F064H 0 0 2 2 2 — — 32MX320F128H 0 0 2 2 2 — — 32MX320F128L 0 0 2 2 2 — — 32MX340F128H 4 0 2 2 2 — — 32MX340F128L 4 0 2 2 2 — — 32MX340F256H 4 0 2 2 2 — —
250 Глава 10. Семейство PIC32 Таблица 10.2. Окончание Устройство Каналы DMA UART SPI 12С Ethernet CAN Программируемые Выделенные 32MX340F512H 4 0 2 2 2 — — 32MX360F256L 4 0 2 2 2 — — 32MX360F512L 4 0 2 2 2 — — 32MX420F032H 0 2 2 1 2 — — 32MX440F128H 4 2 2 1 2 — — 32MX440F128L 4 2 2 2 2 — — 32MX440F256H 4 2 2 1 2 — — 32MX440F512H 4 2 2 1 2 — — 32MX460F256L 4 2 2 2 2 — — 32MX460F512L 4 2 2 2 2 — — 32MX575F256H 8 4 6 3 4 — 1 32MX575F256L 8 4 6 4 5 — 1 32MX575F512H 8 4 6 ч 3 4 — 1 32MX575F512L 8 4 6 4 5 — 1 32MX675F256H 8 4 6 3 4 1 — 32MX675F256L 8 4 6 4 5 1 — 32MX675F512H 8 4 6 3 4 1 — 32MX675F512L 8 4 6 4 5 1 — 32MX695F512H 8 4 6 3 4 1 — 32MX695F512L 8 4 6 4 5 1 - — 32MX775F256H 8 8 6 3 4 1 2 32MX775F256L 8 8 6 4 5 1 2 32MX775F512H 8 8 6 3 4 1 2 32MX775F512L 8 8 6 4 5 1 2 32MX795F512H 8 8 6 3 4 1 2 32MX795F512L 8 8 6 4 5 1 2 Структура микроконтроллера PIC32 показана на рис. 10.1 ан примере подсе- мейств Р1С32МХЗх/4х. Поскольку подробное изучение технологии PIC32 выходит за тематические рамки этой книги, мы затронем только некоторые отличительные особенности данного семейства устройств. Порты ‘ Работа с параллельными портами в микроконтроллерах PIC32 реализована ана- логично тому, как это сделано у представителей в семейства PIC24 (см. предыду- щую главу). Кроме того, следует отметить, что вместо двухпроводного подключения к внут- рисхемному программатору и (или) отладчику (интерфейс ICSP/ICD) в устройствах PIC32 предлагается дополнительный интерфейс JTAG, поддерживающий функции не только отладки, как это было в PIC24, но и программирования. Выводы JTAG мультиплексированы с линиями RAO, RAI, RA4 и RA5 порта А. Отметим так же, что все управляющие регистры портов в микроконтроллерах PIC32 — 32-разрядные, однако порты не масштабируются. Например, модуль порта А по-прежнему группирует менее 16 выводов, хотя регистры PORTA и TRISA — 32-разрядные. Это упрощает перенос в PIC32 кода из более старых архитектур.
Таймеры 251 Шина периферии, тактируемая сигналом SYSCLK <--13 Vbo.Vss <—3 мая iijietjis п сдач-; JWUHHH CN1-22 ЯО 'Г)н,'фр Н,И(Ъ ПрчЧЛГМ напряжений Рис. 10.1. Структурная схема микроконтроллеров PIC32MX3x/4x йсцшпчно; j Таймеры Внутренне в PIC32MX таймеры реализованы практически так же, как в серии PIC24H (в принципе, то же самое можно сказать и обо всех остальных периферий- ных модулях). Основное различие между этими двумя архитектурами — разделение сигнала тактирования шины ядра и шины периферии (см. рис. 10.1). Для микрокон- троллеров PIC такое решение — совершенное новое. Оно освобождает процессор- ное ядро от скоростных ограничений Flash-памяти и периферийных модулей, что позволяет достичь нового уровня производительности, не жертвуя совместимостью со старыми приложениями. Системная шина Архитектура PIC32 отличается от всех своих предшественников тем, что в ней вместо классической для микроконтроллеров PIC гарвардской модели используется более традиционная модель фон Неймана. Теперь две раздельные, полностью неза-
252 Глава 10. Семейство PIC32 висимые шины заменены одной 32-разрядной системной шиной, по которой осуще- ствляется доступ как к памяти программ, так и к памяти данных. Такой подход дает три преимущества: • более простая, унифицированная модель программирования; • отпадает необходимость прибегать к различным уловкам для получения досту- па к таблицам данных, размещенным в памяти программ; • процессоры PIC впервые получают возможность выполнять код, размещенный в ОЗУ. Для повышения производительности работы с одной системной шиной в мик- роконтроллерах PIC32 реализована пятиуровневая конвейеризация, а также — ме- ханизм предварительной выборки (кэширование). Все это позволяет выполнять лю- бую команду за один тактовый цикл. Организация памяти Память микроконтроллеров PIC32MX разбита на виртуальную и физическую. Всем аппаратным ресурсам (память программ, ОЗУ и периферия) соответствуют адреса в физическом пространстве. Виртуальные адреса используются исключи- тельно центральным процессором для извлечения и выполнения команд, а также — для доступа к периферии. К физическому пространству адресов также обращаются контроллеры DMA и Flash, получающие доступ к памяти независимо от процессора. Пример распределения адресного пространства в микроконтроллерах PIC32MX показан на рис. 10.2. Следует отметить, что для управления доступа к памяти в PIC32 были реализо- ваны два новых механизма: FMT (Fixed Mapping Translation — фиксированное пре- образование адресов памяти) и ВМХ (Bus Matrix — шинная матрица). Так, фикси- рованная схема FMT упрощает разработку приложений и перенос кода в микрокон- троллеры PIC32, в то же время значительно уменьшая размеры устройств. Модуль ВМХ предоставляет гибкость в разбиении основной памяти на разделы, а также помогает осуществлять арбитраж доступа со стороны процессора, запросов на выборку команд, запросов от DMA и логики внутрисхемного программирования. Разработчики PIC32 обеспечили возможность накладывать определенные “пра- вила” на использование памяти для защиты от распространенных программных ошибок. Например, при работе операционной системы (ОС) может потребоваться запретить доступ приложения к определенным участкам ОЗУ. Другими словами, пользовательский код не должен касаться кода ядра. Для реализации этого необхо- димо вначале обратиться к модулю ВМХ. С помощью управляющих регистров шинной матрицы мы можем разбить ос- новную'физическую память на фрагменты различной величины (рис. 10.3). Напри- мер, регистр BMXPUPBA позволяет разделить часть память программ таким обра- зом, чтобы пользователю были доступны только адреса от $BD000000 и выше. Аналогичным образом данные пользователя могут быть отделены от данных ядра путем разбиения ОЗУ с помощью регистров BMXDKPBA и BMXXDUDBA. Они также позволяют разместить в определенных участках ОЗУ программный код, что значительно повышает производительность приложения. На следующем этапе система FMT преобразовывает все физические адреса в вир- туальные, т.е. создаются два совершенно независимых адресных пространства, в ко- торых могут работать программы: одно — для пользовательских приложений (адре-
Организация памяти 253 са ниже $80000000), а другое — для ядра (адреса выше $80006000). Полученное распределение виртуальной памяти, видимой приложению, которое работает в по- льзовательском режиме, иллюстрирует рис. 10.4. Обратите внимание, что область загрузчика л пользовательском режиме вообще не отображается. Такого адреса, который позволил бы приложению затронуть за- щищенную область, просто не существует. Благодаря этому, каким бы некоррект- ным ни был пользовательский код, он не повредит операционную систему. Виртуальная память Физическая память OxFFFFFFFF OxBFCO3OOO 0XBFC02FFF 0XBFC02FF0 0xBFC02F£F OxBFCOOOOO OxSFOOOOOO OxBFSFFFFF OxBFSOOOOO OxBDDOSOOO 0xBD007FFF OxBDOGOOOD OxA0002000 OxAOOOIFFF OxAOOOOOOO Qx9FC03000 0X9FCD2FFF 0x9FC02FEF 0x9FC02FEF OxSFCOOOOO OxSDOOSOOD 0x9D007FFF OxSDOOOOOO 0x80002000 OxSOOOIFFF 0x80000000 0x00000000 Зарезервировано ОЗУ ОЗУ Зарезервировано Регистры конфигурирования устройств Flash-загрузчик Зарезервировано Регистры специального назначения Зарезервировано Память программ Зарезервировано Зарезервировано Регистры конфигурирования устройств Flash-загрузчик Зарезервировано Память программ Зарезервировано * Зарезервировано Регистры конфигурирования устройств Flash-загрузчик Зарезервировано Регистры специального назначения Зарезервировано Память программ Зарезервировано ОЗУ OxFFFFFFFF 0X.1FC03D00 0X1FCO2FFF 0X1FCO2FF0 QX1FC02FEF QxlFCOOOOO Ox1F9COOOO 0X1F8FFFFF OX1F800000 0x10008000 Gx1D007FFF 0x10000000 0x00002000 0x00001FFF 0x00000000 Рис. 10.2. Организация памяти микроконтроллеров PIC32MX
254 Глава 10. Семейство PIC32 ОЗУ пользо- вателя (данные) ОЗУ пользо- вателя (прог- рамма) $00000000 BMXDKDBA BMXDUDBA $BFOOOOOO+ $BFOOOOOO+ $FFFFFFFF BMXDUDBA BMXOUPBA Ptfc. 10.3. Разбиение ОЗУ на фрагменты с помощью модуля ВМХ $70000000 $FFFFFFFF $7F000000+ $7FOOOOOO+ BMXDUDBA BMXDUPBA Рис. 10.4. Распределение виртуальной памятке пользовательском режиме Аналогичным образом, обратите внимание, что в пользовательском виртуаль- ном адресном пространстве не отображаются регистры специального назначения. Другими словами, какой бы некачественной ни была программа, она не сможет по- лучить доступ к аппаратным средствам и изменить конфигурацию устройств. Описанный сложный механизм распределения памяти имеет смысл только при создании операционных систем реального времени (RTOS). Во всех остальных слу- чаях программа работает обычным образом в адресном сегменте KSEG0 или KSEGI (см. рис. 10.2). Разница между этими двумя сегментами заключается в том, что код в K.SEG0 доступен для механизма кэширования, а код в KSEG1 — нет. Прерывания и исключения Для процессорного ядра PIC32 все прерывания относятся к более общей катего- рии исключений (exception) — событий, нарушающих нормальную работу про- граммы, например: сигнал сброса, ошибка деления на ноль, обращение к отсутст- вующему адресу памяти и т.д. В действительности, прерывания — наиболее “бла- гоприятный” тип исключений. При обработке всех возможных исключений процессорное ядро опирается на несколько векторов, которые размещаются в ОЗУ или (и) в памяти программ со- гласно табл. 10.3. Как всегда, подобные векторы размещаются в секции программы, выполняемой после включения микроконтроллера.
Прерывания и исключения 255 Таблица 10.3. Векторы исключений Источник исключения Область памяти Описание Сброс и немаскируемые прерывания Память программ Обычный сброс и запрос на немаскируемое прерывание Внутрисхемная отладка Память программ Используется интерфейсами ICD и JTAG при внутрисхемной отладке Ошибка кэша ОЗУ или память программ Ошибочное состояние, специфическое для механизма кэширования Общее исключение ОЗУ или память программ Все остальные типы исключений Прерывание ОЗУ или память программ Обычный вектор прерывания Как видим, обычным прерываниям в таблице векторов исключений соответст- вует единственный элемент, а значит всем возможным событиям,/вызывающим прерывания, ставится в соответствие одна подпрограмма обработки. Как только возникает запрос на прерывание, всю информацию о нем (источник события и наиболее подходящую реакцию) внутри подпрограммы обслуживания прерывания можно извлечь из специального регистра CAUSE. । В качестве примера рассмотрим систему прерываний микроконтроллера PIC 32MX360F512L. Внешние источники прерываний для этого микроконтроллера: • пять — для внешних выводов с обнаружением по изменению уровня; • 22 — для внешних выводов, соединенных с модулем уведомления об изменени- ях (Change Notification); • пять — для модулей захвата на входе (Input Capture); • пять — для модулей сравнения на выходе (Output Compare); • два — для модулей UART; • четыре — для синхронных последовательных интерфейсов (SPI и 12С); • один — для ведущего параллельного порта (РМР). Как видим, перечень внешних источников для микроконтроллеров PIC32MX идентичен аналогичному перечню для семейства PIC24 (см. предыдущую главу) Теперь рассмотрим внутренние источники прерываний микроконтроллера PIC 32MX360F512L: • один — для внутреннего 32-разрядного таймера процессорного ядра; • пять — для 16-разрядных таймеров/счетчиков; • один — для АЦП; • один — для модуля аналоговых компараторов; • один — для часов и календаря реального времени; • один — для контроллера Flash-памяти; • один — для монитора работы системы тактирования; • два — программные прерывания; • четыре — для каналов DMA. Как видим, здесь, по сравнению с архитектурой PIC24, есть ряд существенных отличий.
256 Глава 10. Семейство PIC32 ПРИМЕЧАНИЕ Модуль управления прерываниями микроконтроллеров PIC32 способен обрабатывать до 96 независимых событий, чего более чем достаточно для любых приложений. Каждому источнику прерываний соответствует семь управляющих разрядов в различных регистрах специального назначения. • Разряд разрешения прерывания (обычно обозначен с помощью суффикса IE): 0 — соответствующее событие не вызывает прерывания; 1 — прерывание раз- решено. Примечание................................. При включении питания все источники прерываний по умолчанию запрещены. • Флаг прерывания (обычно обозначен с помощью суффикса IF) — устанавлива- ется каждый раз при возникновении соответствующего события независимо от состояния разряда разрешения. ПРИМЕЧАНИЕ Однажды установленный флаг прерывания должен быть сброшен вручную. Другими словами, его необходимо обнулить до выхода из подпрограммы обслуживания прерывания, иначе эта же подпрограмма будет сразу же вызвана еще раз. • Уровень приоритетности группы (обычно обозначен с помощью суффикса IP). Прерыванию можно назначить один из семи уровней приоритетности. Если од- новременно возникает два различных запроса на прерывание, то первым будет обслужен тот из них, для которого определен более высокий приоритет. Для кодирования приоритетности каждого источника прерываний отведены три раз- ряда. В каждый момент времени уровень приоритетности для задач процессора PIC32 хранится в регистре статуса в разрядах IPL0..IPL2. Прерывания, у которых приоритет ниже текущего значения IPL, игнорируются. • Еще два разряда (новшество PIC32) определяют четыре дополнительных уровня приоритетности внутри данной группы. Если одновременно возникает два со- бытия с одинаковым приоритетом, то первым будет обработано то, у которого выше субприоритет. Все запросы на прерывания с тем же уровнем приоритет- ности, что и активное, будут игнорироваться до тех пор, пока не обнулится со- ответствующий флаг. Внутри любой группы задана относительная приоритетность различных источ- ников по умолчанию, которая может отличаться в зависимости от конкретной моде- ли микроконтроллера. Например, для PIC32MX360F512L она выглядит следующим образом (источники с более высоким приоритетом находятся ближе к вершине спи- ска): • таймер процессорного ядра; • программное прерывание 0 от процессорного ядра; • программное прерывание 1 от процессорного ядра; • внешнее прерывание 0; • прерывание от таймера 1; • прерывание от модуля захвата на входе 1; • прерывание от модуля сравнения на выходе 1;
Прерывания и исключения 257 • внешнее прерывание 1; • прерывание от таймера 2; • прерывание от модуля захвата на входе 2; • прерывание от модуля сравнения на выходе 2; • внешнее прерывание 2; • прерывание от таймера 3; • прерывание от модуля захвата на входе 3; • прерывание от модуля сравнения на выходе 3; • внешнее прерывание 3; • прерывание от таймера 4; • прерывание от модуля захвата на входе 4; • прерывание от модуля сравнения на выходе 4; • внешнее прерывание 4; • прерывание от таймера 5; • прерывание от модуля захвата на входе 5; • прерывание от модуля сравнения на выходе 5; • ошибка SPI 1; • передача данных по SPI 1 завершена; • прием данных по SPI 1 завершен; • ошибка UART 1; • прием данных через UART 1 завершен; • передача данных через UART 1 завершена; • конфликт в шине I2C 1; • событие ведомого устройства на шине I2C 1; • событие ведущего устройства на шине I2C 1; • прерывание по изменению состояния входа; • завершено аналого-цифровое преобразование; • прерывание от порта РМР; • прерывание от аналогового компаратора 1; • прерывание от аналогового компаратора 2; • ошибка SPI 2; • передача данных по SPI2 завершена; • прием данных по SPI2 завершен; • ошибка UART 2; • прием данных через UART 2 завершен; • передача данных через UART 2 завершена; • конфликт в шине 12С 2; • событие ведомого устройства на шине 12С 2; • событие ведущего устройства на шине 12С 2; • прерывание от монитора системы тактирования;
258 Глава 10. Семейство PIC32 • прерывание от RTCC; • прерывание от DMA-канала 0; • прерывание от DMA-канала 1; • прерывание от DMA-канала 2; • прерывание от DMA-канала 3; • прерывание от контроллера Flash-памяти. Система тактирования Микроконтроллеры PIC32MX могут тактироваться от одного из пяти источни- ков: • внутренний осциллятор FRC, предназначенный для высокопроизводительных задач при малом энергопотреблении, — не требует внешних компонентов и по- сле калибровки обеспечивает относительно точный (±2%) тактовый сигнал час- тотой 8 МГц; • внутренний низкочастотный и маломощный осциллятор LPRC — не требует внешних компонентов и обеспечивает базовый (неточный) такт 32 кГц; • главный внешний осциллятор POSC, предназначенный для высокопроизводи- тельных задач с большой точностью тактирования, — кварц XT или HS часто- той до 20 МГц на выводах OSCI и OSCO; • вторичный, низкочастотный и маломощный внешний осциллятор SOSC — кварц на 32768 Гц на выводах SOSCI и SOSCO (может использоваться как для тактирования всего микроконтроллера, так и — таймера 1 и RTCC); • внешний тактовый сигнал ЕС. Интерфейс SPI По сравнению с микроконтроллерами PIC24 семейство PIC32 реализует сле- дующие дополнительные возможности при работе с интерфейсом SPI: • размещение разрядов в регистре SPIxCON теперь более соответствует размеще- нию разрядов в управляющих регистрах других периферийных модулей (на- пример, разряды ON, FRZ и IDL теперь находятся в стандартных позициях 15, 14 и 13, а раньше были в регистре SPIxSTAT); • разряды управления режимом покадровой передачи (FRMEN, SPIFSD и др.) были перемещены из регистра SPIxCON2 в регистр SPIxSTAT; • новый разряд MODE32 выбирает режим 32-разрядной передачи; • предделитель модуля SPI расширен до полного девятиразрядного генератора частоты, управляемого регистром SPIxBRG. Порт РМР Порт РМР микроконтроллеров PIC32 во многом аналогичен этому же интер- фейсу в семействе PIC24, однако присутствует и ряд существенных отличий: • размещение разрядов в регистре PMCON теперь более соответствует размеще- нию разрядов в управляющих регистрах других периферийных модулей (разря- ды ON, FRZ и IDL находятся в стандартных позициях 15, 14 и 13);
АЦП 259 • убран выходной сигнал РМВБ; • разряд PMPTTL для выбора триггера Шмитта или входных уровней ТТЛ из ре- гистра PADCFG1 перенесен в регистр PMCON; • в регистре PMMODE были изменены битовые комбинации IRQM =11 и IRQM = 10; • регистр PMPEN переименован в PMAEN; • одновременный доступ ко всем буферам данных обеспечивают 32-разрядные регистры PMDIN и PMDOUT. АЦП Модуль АЦП микроконтроллеров PIC32 во многом реализован аналогично это- му же модулю в семействе PIC24, однако присутствует и ряд существенных отли- чий: • в регистре AD1CON1 задается еще один вариант формата преобразования: 32- разрядное дробное слово; • в регистр ADI CON1 был добавлен разряд CLRASAM, позволяющий остановить последовательность преобразования после первого прерывания; • регистр ADI CON2 реализует новый режим автокалибровки для уменьшения ошибки преобразования (для перехода в этот режим служит разряд OFFCAL); • разряды управляющего регистра AD1CHS смещены в верхнюю половину 32- разрядного регистра. Кроме того, появился разряд CH0NB0 для выбора отрица- тельного входа второго входного мультиплексора. Модуль сравнения на выходе Модуль сравнения на выходе микроконтроллеров PIC32 во многом аналогичен этому же модулю в семействе PIC24, однако присутствует и два существенных от- личия: • размещение разрядов в регистре OCxCON теперь более соответствует размеще- нию разрядов в управляющих регистрах других периферийных модулей (для удобства управления в режимах малого энергопотребления теперь доступны разряды ON, FRZ и IDL); • был добавлен разряд ОС32 для активизации 32-разрядного режима работы, ко- гда модуль связан с парой таймеров.
ЧАСТЬ IV Компиляторы и средства разработки для микроконтроллеров PIC
Глава 11 Компилятор CCS-PICC Компилятор CCS-PICC разработан для запуска в среде Windows 95/98/Me/NT4/ 2000/ХР. Прилагаемый к книге компакт-диск содержит демонстрационную 30-днев- ную версию компилятора PCW 4.102, который накладывает ограничения на размер исходного компилируемого файла до 2 Кбайт и работает только с семью микрокон- троллерами PIC. • Установочный файл компилятора CCS-PICC demoupd. ехе можно также найти на прилагае- мом к книге компакт-диске в папке Sof tware\PIC\CCS-PICC. Компилятор CCS-PICC доступен через его интегрированную среду разработки (IDE), позволяющую пользователю создавать проекты из одного или нескольких файлов исходного кода, настраивать опции компилятора, а также компилировать исходный код в исполняемые файлы, предназначенные для загрузки в целевой мик- роконтроллер. По умолчанию, после установки CCS-PICC на Рабочем столе Windows будет размещен ярлык PIC С Compiler, который и используется для запуска среды разра- ботки. В любом случае, IDE CCS-PICC можно запустить по команде меню Пуск ► Все программы ► PIC-C ► PIC С Compiler. Окно среды разработки CCS-PICC при первом запуске показано на рис. 11.1. Рис. 11.1. Окно IDE CCS-PICC при первом запуске Создание проектов CCS-PICC вручную В среде разработки CCS-PICC в большинстве случаев речь идет не просто о фай- ле с кодом на языке С, а о проекте, состоящем из одного или более файлов с исход- ным кодом программы (главный файл проекта имеет расширение .pjt). Новый
262 Глава 11. Компилятор CCS-PICC проект можно создавать вручную с помощью команды меню Project ► Create или сгенерировать его автоматически с помощью мастера PIC Wizard, который вызыва- ется по команде меню Project ► PIC Wizard или Project ► 24 Bit Wizard. Оба метода создания нового проекта запрашивают у пользователя имя главного исходного фай- ла для проекта и целевое устройство. Если было выбрано создание проекта вручную, то вначале появится стандарт- ное диалоговое окно, предлагающее выбрать имя главного исходного файла проекта (с расширением . с). После выбора такого файла откроется диалоговое окно, пред- лагающее указать целевой микроконтроллер (рис. 11.2). ПРИМЕЧАНИЕ Это же диалоговое окно можно открыть в любой момент и после создания проекта по коман- де меню Options ► Options ► Project Options. Если готового исходного кода нет, и необходимо начать создание проекта “с нуля”, то можно выбрать любой файл . с (например, из папки \Program Files\ PlCC\Examples), а затем выделить его в списке диалогового окна Project Options и нажать кнопку Remove (Удалить). В дальнейшем файл исходного кода будет соз- дан автоматически. В таком случае понадобится также изменить папку размещения и имя проектного файла. Для этого следует нажать кнопку ... справа от поля Project Name и задать новое расположение и имя файла . р j t. Рис. 11.2. Диалоговое окно Project Options ПРИМЕЧАНИЕ В версии компилятора CCS-PICC, поставляемого с этой книгой, в качестве целевого устрой- ства можно использовать только микроконтроллеры PIC16C554, PIC16F877, PIC16F877A, PIC18C452, PIC18F452, PIC18F458 и PIC24FJ128GA006. Заголовочные файлы для устройств по умолчанию устанавливаются в папку \Program Files\PICC\Devices. Для того чтобы задать размещение файлов с описанием поддерживаемых ком- пилятором микроконтроллеров, отличное от выбранного по умолчанию, в окне Proj- ect Options следует нажать кнопку Include Files. В результате откроется соответст- вующий раздел параметров проекта (рис. Г1.3). ПРИМЕЧАНИЕ Суть заголовочных файлов с расширением . h подробно рассматривается в следующей части книги. Сейчас только отметим, что это — внешние файлы описаний, подключаемые к про- граммному модулю с помощью директивы #include.
Создание проектов CCS-PICC вручную 263 Рис. 11.3. Раздел Include Files диалогового окна Project Options Для того чтобы добавить новый путь в список, следует ввести его в располо- женном внизу поле (или найти с помощью диалогового окна поиска, нажав кнопку с изображением папки) и нажать кнопку Add. Для удаления текущего элемента из списка предназначена кнопка Delete. После того как список путей поиска сформиро- ван, можно нажать кнопку Apply (Применить), чтобы завершить создание проекта. Если проект создается на основе существующего файла . с, то в одной с ним папке будет создан проектный файл с тем же именем, но с расширением .pjt. В противном случае появится запрос на создание файла noname. с. После утверди- тельного ответа на этот запрос будет создан проект с именем, заданным в диалого- вом окне Project Options. В любом случае в рабочей среде CCS-PICC откроется ис- ходный код главного файла . с (рис. 11.4). Рис. 11.4. Создана заготовка для разработки программы на языке С На рис. 11.4 показан случай создания проекта “с нуля”. К видим, к проекту под- ключен внешний файл описаний для микроконтроллера PIC18F458, выбранного ра- нее в диалоговом окне Project Options.
264 Глава 11. Компилятор CCS-PICC Что касается мастера создания проектов PIC Wizard, то при работе с ним поль- зователь должны знать, как будет применяться микроконтроллер, а также иметь ба- зовые знания об архитектуре целевого устройства. Этот мастер мы рассмотрим чуть позже, а сейчас создайте в качестве примера в отдельной папке новый исходный файл SOS. с для микроконтроллера PIC18F458. Введите в него код, представленный в листинге 11.1. Этот пример — аналог рассмотренного в главе 3 для микрокон- троллеров AVR. Листинг 11.1. Файл SOS. а для микроконтроллера PIC18F458 #include <18F458.h> #use delay(clock=20000000) ♦fuses HS, NOWDT void Pause(int ms) { output_D(OxFF); //Все светодиоды отключены delay_ms(ms); } //Задержка void P(void) t output_D(0); //Включаем все светодиоды delay_ms(5); //Короткая задержка Pause (5); } //Пауза с погасшими светодиодами void D(void) { output_D(0); delay__ms (20) ; //Включаем все * светодиоды //Длинная задержка Pause (5); } //Пауза с погасшими светодиодами int main (void) t set_tris_D(OxFF); // Настройка порта D для вывода while(1) //Бесконечный цикл Р(); Р(); Р(); //. . . DO; D(); D(); Р(); Р(); Р(); // //. . . Pause(100) ; ) } ПРИМЕЧАНИЕ Программные элементы мы пока рассматривать не будем, поскольку это — материал сле- дующих глав. Этот пример используется только для изучения среды программирования. Файл SOS. с можно также скопировать с прилагаемого к книге компакт-диска из папки Pro- ject s\CCS-PICC\SOS.
Создание проектов CCS-PICC с помощью PIC Wizard 265 Создание проектов CCS-PICC с помощью PIC Wizard Для запуска мастера PIC Wizard следует выполнить соответствующую команду меню Project, а затем указать размещение и имя главного файла проекта. В резуль- тате откроется окно мастера, состоящее из семнадцати разделов с параметрами про- екта (рис. 11.5). Рис. 11.5. Раздел General мастера PIC Wizard Внешний вид окна мастера может отличаться в зависимости от версии компилятора CCS- PICC и выбранного типа микроконтроллера. В разделе General выбирается целевой микроконтроллер (раскрывающийся спи- сок Device), его рабочая частота (поле Oscillator Frequency), а также настраиваются общие параметры, наподобие разрядов предохранения, типа источника системной синхронизации, порогового напряжения для сброса и др. Для просмотра программного кода, который будет сгенерирован и добавлен в исходный файл в соответствии с параметрами на текущей вкладке, следует вы- брать вкладку Code (рис. 11.6). В разделе Communications (рис. 11.7) настраиваются параметры ввода/вывода для интерфейсов RS232 и 12С (скорость обмена данными, соответствующие линии портов ввода/вывода, проверка ошибок, режим Master/Slave и т.д.), а также активи- зируется/отключается аппаратный порт PSP. В разделе SPI and LCD (рис. 11.8) пользователь может активизировать аппарат- ный интерфейс SPI и настроить соответствующие параметры обмена данными (ре- жим Master/Slave, активный фронт тактового импульса, коэффициент деления час-
266 Глава 11. Компилятор CCS-PICC тоты системной синхронизации, использование вывода /SS), а также использование жидкокристаллического дисплея (LCD), если он доступен. Рис. 11.6. Предварительный просмотр кода, генерируемого мастером PIC Wizard для текущего раздела Рис. 11.7. Раздел Communications мастера PIC Wizard
Создание проектов CCS-PICC с помощью PIC Wizard 267 Рис. 11.8. Раздел SPI and LCD мастера PIC Wizard В разделе Timers (рис. 11.9) настраиваются параметры таймеров, включая сто- рожевой. Значение некоторых параметров: • Not used — для включения сторожевого таймера этот флажок следует сбросить; • WDT Reset — период между сигналами сброса от сторожевого таймера; • Source — выбор источника тактирования таймера TMR0: внутренний или вйешний (по нарастающему или ниспадающему фронту сигнала); • Frequency — установка частоты в случае выбора внешнего источника тактиро- вания таймера TMR0; • Resolution — разрешение таймера, влияющее на период между переполнениями счетного регистра (для таймеров TMR0 и TMR1 вычисляется автоматически и отображается в поле Overflow); • Interrupt Period — период между запросами на прерывание от таймера TMR2. ПРИМЕЧАНИЕ Если выбранный микроконтроллер предоставляет дополнительные таймеры, их параметры настраиваются в разделе PCH Timers мастера PIC Wizard. Раздел Analog (рис. 11.10) служит для настройки встроенного АЦП (конфигура- ция аналоговых входов, частота и разрядность преобразования). В разделе Other (рис. 11.11) активизируется модуль ССР и настраивается режим его работы, а также выбирается конфигурация входов компараторов напряжений. Раздел Interrupts (рис. 11.12) позволяет с помощью набора флажков разрешить или запретить то или иное прерывание, доступное для выбранного устройства.
268 Глава 11. Компилятор CCS-PICC Рис. 11.9. Раздел Timers мастера PIC Wizard Рис. 11.10. Раздел Analog мастера PIC Wizard
Создание проектов CCS-PICC с помощью PIC Wizard 269 Рис. 11.11. Раздел Other мастера PIC Wizard Рис. 11.12. Раздел Interrupts мастера PIC Wizard
270 Глава 11. Компилятор CCS-PICC Для каждого выбранного прерывания в глав- ную процедуру программы main() добавляется вызов соответствующей подпрограммы обработки прерывания enable_interrupts (), а тело самой подпрограммы размещается выше main() (при- мер— рис. 11.13). В разделе Drivers содержится список програм- мных драйверов, доступных для выбранного мик- роконтроллера в компиляторе CCS-PICC. Выбор конкретного драйвера приводит к тому, что в про- ект включается соответствующий заголовочный файл, и вызывается подпрограмма для инициали- зации этого драйвера (по умолчанию размещены в папке \Program Files\PICC\Drivers). Конфигурация выводов портов микроконтрол- лера настраивается в разделе I/O Pins (рис. 11.14). При этом для каждого вывода возможны значения Options Code | Inserted into .c file before main(): #int_RTCC void RTCC isr(void) { } Inserted into .c file in main(): enable_interrupts(l N T_R T CC); enable_interrupts(G L0 BAL); Рис. 11.13. Пример программного кода, сгенерированного PIC Wizard в разделе Interrupts Input (вход), Output (выход), Input/Output (вход/выход), Analog (аналоговый) и Not used (не используется). Каждому выводу в программе будут соответствовать иден- тификаторы, указанные через запятую в столбце Identifiers. Если установить флажбк Enable Pullups on port В, то выводы порта В будут сконфигурированы с подтягиваю- щим сопротивлением. Рис. 11.14. Раздел I/O Pins мастера PIC Wizard В разделе мастера PIC Wizard Header Files — с помощью флажков можно вклю- чить в проект дополнительные заголовочные файлы, используемые, например, для работы со сроками или с числами с плавающей запятой.
Создание проектов CCS-PICC с помощью PIC24 Wizard 271 Остальные разделы мастера служат для настройки различных аппаратных функций и интерфейсов, которые во многих микроконтроллерах PIC отсутствуют: • High/Low Voltage — обнаружение повышений и падений уровня рабочего напря- жения; • Intr Oscillator Configuration — конфигурация внутреннего осциллятора; • CAN BUS — параметры шины CAN; • LCD options — параметры интерфейса для подключения ЖК-дисплея; • MOD BUS — параметры шины Mod; • BOOT LOADER — активизация и параметры размещения загрузчика. После настройки всех необходимых параметров, в окне мастера можно нажать кнопку ОК, и в одной папке с изначально заданным проектным файлом будет создан файл . с с тем же именем, а также — все необходимые включаемые файлы . h. Создание проектов CCS-PICC с помощью PIC24 Wizard В состав среды CCS-PICC PCW 4.102 входит мастер создания проектов для 16- разрядных микроконтроллеров PIC24 (см. главу 9). Для его вызова служит команда меню Project ► 24 bit Wizard. Внешне данный мастер напоминает обычный PIC Wiz- ard (рис. 11.15). Отличие заключается лишь в наборе разделов и параметров конфи- гурирования аппаратных средств. Рис. 11.15. Мастер PIC24 Wizard Поскольку правила работы с этим мастером аналогичны рассмотренным ранее для PIC Wizard, останавливаться на них подробно мы не будем.
272 Глава 11. Компилятор CCS-PICC Открытие и добавление в проект файлов с исходным кодом В качестве примера создайте новый проект на ос- нове файла sos.с (см. листинг 11.1). По умолчанию в окне PCW открывается только главный исходный файл .с. Для того чтобы увидеть структуру проекта, разместите указатель мыши над кнопкой Files, распо- ложенной у левого края рабочей области. В результате отобразится панель Files (рис. 11.16), в которой видно, что проект SOS состоит из файлов SOS. с и 18F458. h. sosx 1 1Ш31ШИИВ' ПРИМЕЧАНИЕ k sos.c 18F458.h 3 Output =- Documentation B Q? Source j Й SOI J Если кнопка отображения панели Files отсутствует, выберите пункт меню View и установите флажок Projfect Files в подме- ню Windows. Рис. 11.16. Панель Files СОВЕТ Как только указатель мыши выйдет за пределы панели Files (или любой другой панели, для отображения которой служат кнопки, расположенные у левого края окна PCW), она автомати- чески свернется. Для того чтобы зафиксировать такую панель, в ней необходимо щелкнуть мышью на маленькой пиктограмме с изображением канцелярской кнопки. В результате заго- ловок панели примет вид, позволяющий перетаскивать ее мышью в любую позицию экрана. Для того чтобы открыть тот или иной файл с исходным кодом, уже сущест- вующим в проекте, следует дважды щелкнуть мышью на соответствующем элемен- те в разделе Source. Можно также быстро открыть все файлы, перечисленные в этом разделе, выбрав команду меню Project ► Open All Files. Для добавления в проект нового файла с исходным кодом служит кнопка Q Add Unit панели Files, а для удаления выбранного в разделе Sources файла (кро- на ме главного) — кнопка Remove Unit ' “ Каждому файлу в окне среды разработки соответствует отдельная вкладка. Для того чтобы закрыть текущую вкладку, на ней следует щелкнуть правой кнопкой мыши и выбрать в контекстном меню команду Close или нажать комбинацию кла- виш <Ctrl+F4>. Для того чтобы полностью закрыть проект, следует выполнить ко- манду меню Project ► Close Project. Компиляция проекта Для компиляции текущего проекта можно выполнить команду меню Compile ► Compile или нажать клавишу <F9>. ПРИМЕЧАНИЕ Перед компиляцией следует выбрать корректное значение серии микроконтроллеров PIC в раскрывающемся списке, расположенном в подменю Compile ► Compile слева от кнопки Clean. Для того чтобы точно выяснить, к какой серии относится то или иное устройство (РСМ, РСН или PCD) следует нажать расположенную ниже кнопку Lookup Part (Проверить модель), и выбрать целевое устройство в диалоговом окне Select Target Chip. Корректное обозначе- ние серии микроконтроллеров отобразится в поле Compiler. В результате компиляции в папке размещения исходных файлов будут созданы еще несколько файлов с тем же именем, но другими расширениями:
Компиляция проекта 273 • .cof — файл, используемый в среде отладки; • . err — файл с перечнем ошибок (если были обнаружены); кроме того, первая обнаруженная ошибка будет выделена в исходном тексте программы, а ее опи- сание — отображено на красном фоне в строке состояния; • . hex — объектный файл для загрузки в микроконтроллер; • .1st — файл листинга, в котором отображены соответствия между оператора- ми на языке С и ассемблерными наборами команд; • . sta — файл статистики по результатам последней компиляции; • . sym — файл символов, содержащий адреса переменных в памяти RAM; • .tre — дерево вызовов подпрограмм. Для просмотра содержимого одного из этих файлов можно дважды щелкнуть мышью на соответствующем элементе в разделе Output панели Files или выбрать одну из команд в подменю Compile ► View Output Files. Формат некоторых из выходных файлов можно выбрать в разделе Output Files уже знакомого нам диалогового окна Project Options, которое открывается по коман- де меню Options ► Project Options (рис. 11.17). Рис. 11.17. Настройка формата выходных файлов Формат отладочного файла выбирают с помощью группы переключателей De- bug File; объектного файла — Object File (восьми- или 16-тибитный .hex или двоич- ный); файла с перечнем ошибок — Error File, файла листинга — List File. С помощью флажков в группе Other Files можно отменить создание файлов . sta и . tre. "7"Т” .. • ...... Для отладки программ в среде MPLAB, которая рассматривается в следующей главе, в груп- пе Debug File до компиляции необходимо выбрать переключатель Standard .COD или Expan- ded .COD. В группе Compile Window Up настраиваются параметры отображения окна с ре- зультатами компиляции (рис. 11.18). В раскрывающемся списке No Errors устанав- ливается значение задержки окна результатов на экране (в секундах) в случае отсут- ствия ошибок компиляции. Варианту Hold Up соответствует постоянное отображе- ние, пока пользователь сам не закроет окно результатов. Список On Error имеет тот же смысл, но для случая, когда были обнаружены ошибки: No — окно результатов
274 Глава 11. Компилятор CCS-PICC компиляции не отображается; As above — задержка отображения как в случае от- сутствия ошибок. Меню Tools Меню Tools содержит команды доступа к различным полезным утилитам. Рас- смотрим назначение некоторых из них: • Device Editor — доступ к базе данных свойств каждого под держиваемого микро- контроллера PIC; • Device Selector — выбор целевого микроконтроллера и его свойств; • File Compare — утилита сравнения файлов (исходных кодов или листингов) — если выбрано сравнение исходных файлов, то выполняется обычное построчное сравнение, если же выбрано сравнение листингов, то его можно настроить та- ким образом, чтобы адреса памяти не учитывались; • Numeric Converter — средство преобразования целых и вещественных чисел в десятичном представлении в шестнадцатеричное и наоборот; • Serial Port Monitor — монитор последовательного порта для отладки встроенных систем, предназначенных для обмена через интерфейс RS-232, RS-442, RS-485; • MPLAB — отладчик MPLAB. Рис. 11.18. Результаты работы компилятора CCS-PICC
Глава 12 Эмуляция и отладка программ в среде MPLAB Рассмотренный в предыдущей главе компилятор CCS-PICC спроектирован для работы совместно с отладчиком Microchip MPLAB, представляющий собой про- граммный имитатор микроконтроллеров PIC. Средство MPLAB можно бесплатно загрузить с Web-сайта компании Microchip (www. mi crochip. com). e Установочный пакет MPLAB версии 8.50 также можно найти на прилагаемом к книге компакт- диске в папке Software\PIC\MPLAB. В среде MPLAB используются файлы .cod, которое создаются, в том числе, и компилятором CCS-PICC (см. предыдущую главу). Для сопряжения среды CCS- PICC с MPLAB требуется установить два дополнения, которые можно загрузить с Web-сайта www. ccsinfо. com. • Соответствующие файлы setup_mplab_plugin. ехе и setup_mctools . ехе так- же находятся на прилагаемом к книге компакт-диске в папке Sof tware\PIC\CCS-PICC. Среда CCS-PICC позволяет выполнять внутрисхемную отладку, не переходя в MPLAB. Для этого необходимо выбрать команду меню Debug, щелкнуть мышью на направленной вниз стрелки справа от пиктограммы Enable Debugger и выбрать требуемый отладчик (рис. 12.1). Если к компьютеру по соответствующему последовательному интерфейсу подключены аппаратные отла- дочные средства с микроконтроллером, то активизируется ре- жим отладки. В этом режиме открыта панель Debug, позволяю- щая просматривать состояние памяти и регистров целевого уст- ройства, а управление процессом отладки осуществляется с по- мощью команд подменю Debug ► Debugger Control (рис. 12.2). Теперь для выхода из режима отладки следует выбрать команду Debug ► Disable. Рис. 12.1. Переход в режим внутрисхемной отладки Рис. 12.2. Команды для управления режимом отладки в среде CCS-PICC Если говорить о рассмотренной ранее среде CCS-PICC, то для запуска MPLAB достаточно выполнить команду меню Tools ► MPLAB. В любом случае, MPLAB за- пускается с помощью соответствующего ярлыка на Рабочем столе Windows или по команде меню Пуск ► Все программы ► Microchip ► MPLAB IDE v8.50 ► MPLAB IDE.
276 Глава 12. Эмуляция и отладка программ в среде MPLAB Рабочая область и проект MPLAB Для того чтобы перейти в режим имитации или отладки программы в среде MPLAB, для нее необходимо создать рабочую область и проект. Для этого лучше всего воспользоваться специальным мастером, который запускается в среде MPLAB по команде меню Project ► Project Wizard. В первом окне мастера следует только на- жать кнопку Далее, после чего откроется окно выбора типа микроконтроллера для имитации. На следующем этапе (рис. 12.3) выбирают программную среду, используемую для разработки отлаживаемых программ. Для случая с CCS-PICC в раскрывающем- ся списке Active Toolsuite следует выбрать элемент CCS С Compiler for Р1С10/12/14/16/ 18/24ldsPIC30/dsPIC33, и удостовериться, что в поле Location указан корректный путь к файлу ccsc. ехе. Рис. 12.3. Выбор средства разработки программ На следующем шаге указывается имя MPLAB-проекта и выбирается каталог его размещения, а в следующем окне мастера необходимо добавить в проект сущест- вующие файлы с исходным кодом С-проекта (рис. 12.4). Для этого требуемые фай- лы следует выделить в списке, расположенном слева, и нажать кнопку Add. Доба- вим, к примеру, созданный ранее файл sos. с. Рис. 12.4. Выбор файла с исходным кодом программы
Компиляция под управлением MPLAB 277 В последнем окне мастера достаточно нажать кнопку Готово. Окно MPLAB с загруженным для отладки файлом SOS. с показано на рис. 12.5. Рис. 12.5. Окно MPLAB 8.50 Для сохранения проекта используют команду меню Project ► Save Project или Project ► Save Project As, а для сохранения рабочей области — команду File ► Save Workspace и File ► Save Workspace As. Компиляция под управлением MPLAB Проект можно откомпилировать с помощью подключенного компилятора (на- пример, CCS-P1CC) непосредственно в среде MPLAB. Для этого служит команда меню Projects Make (клавиша <F10>). Окно состояния компилятора откроется на период компиляции, а затем исчезнет. Для сбора данных, необходимых при эмуля- ции и отладке MPLAB требуется файл .cod или .cof. При вызове компилятора CCS-PICC из MPLAB для него, по умолчанию, выходной файл — .cof, однако при подобном вызове он не создается. Вместо этого должен генерироваться файл . cod. Для того чтобы выбрать этот формат, следует в среде MPLAB выполнить ко- манду меню Project ► Build Options ► Project, в диалоговом окне Build Options перей- ти на вкладку CCS С Compiler, в группе параметров Debug выбрать переключатель Expanded COD Format (рис. 12.6) и нажать кнопку ОК. Теперь по завершению компиляции эмулятор MPLAB будет автоматически за- гружать файл . cod, созданный компилятором. Настройка режима отладки/эмуляции , Микроконтроллер для программной эмуляции выбирается на этапе создания проекта MPLAB, но этот выбор можно изменить позже, выполнив команду меню Configure ► Select Device и указав требуемое значение в поле Device диалогового ок- на Select Device (рис. 12.7). Для перевода MPLAB в режим программной эмуляции, необходимо выполнить пункт меню Debugger ► Select Tool ► MPLAB SIM. В результате отобразится панель инструментов Debug с кнопками, используемыми для отладки.
278 Глава 12. Эмуляция и отладка программ в среде MPLAB Рис. 12.6. Диалоговое окно Build Options Рис. 12.7. Выбор микроконтроллера для программной эмуляции Для настройки параметров эмуляции следует выполнить команду меню Debug- ger ► Settings. В открывшемся диалоговом окне Simulator Settings особый интерес представляют вкладки Osc/Trace и Animation / Realtime Updates (рис. 12.8). На вкладке Osc/Trace можно выбрать частоту осциллятора, а на вкладке Animati- on/Realtime Updates задать период анимационного прохода (выполнение программы с обновлением окон отладчика через строго определенные промежутки времени) и период обновления окон при выполнении в реальном режиме времени. Если тре- буется, чтобы обновления окон происходили таким образом, чтобы отражать ин- формацию реалистично, значения этих периодов не следует выбирать большими.
Работа в режиме отладки/эмуляции 279 Рис. 12.8. Параметры эмуляции Если не установить флажок Enable Realtime watch updates, то при запуске программы в ре- жиме реального времени окна отладчика вообще не будут обновляться. ПРИМЕЧАНИЕ Как и в случае с AVR Studio (см. главу 4), при эмуляции программ в среде MPLAB следует учитывать, что задержки при работе с реальным микроконтроллером намного меньше. С помощью параметров, расположенных в диалоговом окне Simulator Settings на вкладке Break Options можно управлять моментами останова эмуляции, включая ос- танов по сигналу от сторожевого таймера (WDT) и останов по переполнению стека. Работа в режиме отладки/эмуляции Команды, используемые в режиме отладки, находятся в меню Debugger. Как и в AVR Studio, в MPLAB используются точки прерывания, обозначаемые красным кружком с символом “В” слева от строки исходного кода, в которых они установле- ны. Для установки/удаления точки прерывания следует дважды щелкнуть мышью на сером поле слева от сроки или выполнить команду контекстного меню Set Break- point. Для отключения/активизации и удаления точек прерывания используется диа- логовое окно Breakpoints, которое открывается по команде меню Debugger ► Break- points (клавиша <F2>), или же команды Disable Breakpoint (отключение), Enable Breakpoint (активизация) и Remove Breakpoint (удаление) контекстного меню. Для отключения, активизации или удаления всех расставленных точек прерывания мож- но воспользоваться тем же диалоговым окном Breakpoints или командами подменю Breakpoints контекстного меню. Для перехода в режим отладки используются команды меню Debugger или соот- ветствующие кнопки панели инструментов Debug: • Run (клавиша <F9>) — выполнение программы в режиме реального вре- м мени; переход в режим отладки происходит, если встречается точка пре- пн рывания; • Animate — выполнение программы с периодическим обновлением окон МД отладчика; • Step Into (клавиша <F7>) — выполняет текущую команду с заходом рд в подпрограммы (все окна обновляются); ИВ
280 Глава 12. Эмуляция и отладка программ в среде MPLAB • Step Over (клавиша <F8>) — выполняет текущую команду без захода в подпрограммы (все окна обновляются); • Step Out — запускает программу и выполняет ее до тех пор, пока не ветре- CS тится окончание текущей подпрограммы; если ход выполнения находится - в области основной программы, то программа будет выполняться до тех пор, пока не будет остановлена пользователем командой Halt или не встретит точку прерывания; • Halt (клавиша <F5>) — принудительный останов работы программы. | ВВ Для эмуляции сброса используются команды подменю Debugger ► Reset, а также кнопка Reset панели инструментов Debug (клавиша <F6>). —- Еще одна возможность — выполнение программы до строки, в которой в дан- ный момент установлен курсор. Для этого используется команда контекстного ме- ню Run to Cursor. Окна отладчика Вызов окон отладчика реализован с помощью команд меню View. Прежде всего, интерес представляют окна Watch, File Registers и Special Function Registers. Типич- ное для отладчиков окно Watch (рис. 12.9) позволяет просматривать значения пере- менных и содержимое регистров управления во время выполнения программы. Рис. 12.9. Окно Watch С помощью кнопки Add SFR и расположенного справа от нее раскрывающегося списка можно создать элемент для просмотра содержимого какого-либо регистра управления (в примере на рис. 12.9 — регистра данных порта D). Аналогичное на- значение, но для переменных, имеет кнопка Add Symbol и расположенное справа по- ле. Для того чтобы изменить формат отображения значения некоторого элемента просмотра, на нем следует щелкнуть правой кнопкой мыши, выбрать в контекстном меню команду Properties и задать требуемый формат на вкладке Watch Properties. Для удаления текущего элемента просмотра достаточно нажать клавишу <De- lete> или же воспользоваться командой Delete контекстного меню. Следующее окно отладчика, представляющее интерес, — File Registers. Оно отображает содержимое регистрового файла. Содержимое этого вида памяти можно просмотреть в виде шестнадцатеричного дампа (вкладка Hex) или же последова- тельного списка ячеек с отображением их содержимого в различных форматах (вкладка Symbolic) (рис. 12.10). Значения, измененные в процессе выполнения про- граммы, выделяются в окне File Registers красным цветом. Окно File Registers позволяет редактировать расположенные в памяти перемен- ные непосредственно или с помощью специального окна, которое открывается по команде контекстного меню Fill Registers (рис. 12.11). В окне Fill Registers можно указать начальный и конечный адрес области памяти, занимаемой переменной,
Окна отладчика 281 в поле Data вести требуемые данные в шестнадцатеричной или десятичной форме (это определяется с помощью переключателей Data Radix) и нажать кнопку Write. Для выхода без выполнения записи используется кнопка Close. Рис. 12.10. Вкладки Hex и Symbolic окна File Registers Наконец, последнее окно отладчика, которое мы рас- смотрим, — это Special Function Registers (рис. 12.12). Как понятно из его названия, оно используется для просмотра и модификации содержимого регистров управления различ- ными устройствами микроконтроллера (таймеры, порты ввода/вывода, последовательные интерфейсы и т.д.). К при- меру, рассмотренная выше программа SOS. с изменяет со- держимое регистров PORTD (адрес $0F83), LATD (адрес $0F8C) и TRISD (адрес S0F95). Значения, измененные в процессе выполнения про- граммы, выделяются в окне Special Function Registers крас- ным цветом. Так же как и в окне File Registers, в этом окне можно изменять содержимое регистров прямо в процессе выполне- ния программы (в режиме отладки). Еддавс: ж; *1 SlartAdduJM: |охООО1| EndAd-1 ем: |oxOFFF Da»a |oxO5 Da1 a Radix Hex Decsnal : Use Dale Ar C «Value Sequence Start C Randoms e Data Г~ Rdati Address Range Wntft | Clote | Рис. 12.11. Диалоговое окно Fill Registers Рис. 12.12. Окно Special Function Registers
Глава 13 Компилятор mikroC Компилятор mikroC, разработанный компанией MikroElektronica, как и рас- смотренные ранее средства программирования, предоставляет интегрированную среду разработки (IDE) и возможность выполнять эмуляцию программ. Бесплатную версию этого компилятора, поддерживающую программы размером до 2 Кбайт, можно загрузить с сайта www.mikroe.com. Для получения полнофункциональной версии без каких-либо ограничений следует приобрести соответствующую лицен- зию. • Установочный файл ограниченной версии компилятора mikroC версии 7.0.0.3 можно также най- ти на прилагаемом к книге компакт-диске в папке Sof tware\PIC\mikroC. По умолчанию, после установки mikroC на Рабочем столе Windows будет раз- мещен ярлык mikroC, который и используется для запуска среды разработки. В лю- бом случае, IDE mikroC можно запустить по команде меню Пуск ► Все программы ► Mikroelektronika ► mikroC ► mikroC. Окно среды разработки mikroC при первом запуске показано на рис. 13.1. Рис. 13.1. Окно среды разработки mikroC при первом запуске
Создание проекта mikroC 283 Как видим, рабочая среда разделена на четыре части: • редактор исходного кода, в котором по умолчанию открывается пример про- граммы, реализующей мигание светодиодов, подключенных к порту С (подоб- ные примеры устанавливаются вместе с компилятором в папку \Program Files\Mikroelektronika\Examples); • панель Code Explorer, отображающая иерархию всех структурных элементов программы (переменные, функции); ПРИМЕЧАНИЕ С панелью Code Explorer совмещены еще две полезные панели: QHelp — перечень всех встроенных и библиотечных функций, позволяющий быстро открыть соответствующую стра- ницу интерактивной справки; Keyboard — перечень всех клавиатурных эквивалентов команд, используемых в интегрированной среде разработки mikroC. • панель Project Setup, позволяющая установить для проекта тип микроконтрол- лера, его тактовую частоту и способ отладки (программный имитатор или внут- рисхемный отладчик mikroICD); • панель, содержащая вкладки Messages (сообщения среды разработки об ошиб- ках и предупреждения), Find (сведения о строках в файлах проекта, в которых найдена интересующая информация с помощью команды меню Edit ► Find in Files) и QConverter (средство преобразования чисел из одной системы счисления в другую). Создание проекта mikroC По умолчанию имя проектного файла mikroC имеет расширение .ррс. Он со- держит информацию о файлах с исходным кбдом, целевом микроконтроллере, кон- фигурационных флагах и тактовой частоте. Для создания нового проекта в интегри- рованной среде разработки следует выбрать команду меню Project ► New Project или нажать кнопку New Project панели инструментов. В результате откроется диа- лотовое окно, показанное на рис. 13.2. Рис. 13.2. Диалоговое окно New Project
284 Глава 13. Компилятор mikroC В этом окне следует указать имя проекта (поле Project Name), папку размещения его файлов (поле Project Path), дать строку описания (поле Description), указать тип микроконтроллера (раскрывающийся список Device) и его тактовую частоту (поле Clock), а также задать с помощью флажков конфигурацию разрядов предохранения (список Device Flags). ПРИМЕЧАНИЕ Для обнуления всех конфигурационных разрядов можно нажать кнопку Clear АП, а для уста- новки конфигурации по умолчанию — кнопку Default. После того как все установки выполнены, в диалоговом окне New Project следу- ет нажать кнопку ОК. В результате будет создан новый проект, и в окне редактора откроется пу