Глава 4 МИКРОКОНТРОЛЛЕРЫ 68HC12 И HCS12: АРХИТЕКТУРА И ПРОГРАММИРОВАНИЕ

ПОСЛЕ ИЗУЧЕНИЯ ГЛАВЫ ВЫ СМОЖЕТЕ:

• Описать структуру и определить основные отличительные особенности МК семейства 68НС12;

• Описать различные режимы работы МК 68HC12;

• Описать, какие действия выполняются над аппаратными средствами МК в состоянии сброса;

• Объяснить необходимость подсистемы прерывания в составе МК;

• Объяснить последовательность действий на аппаратном и программном уровне, которые выполняются при обработке запроса на прерывание в МК;

• Описать работу модуля тактирования в составе МК 68HC12;

• Описать структуру и режимы работы модуля таймера TIM, счетчика внешних событий и модуля меток реального времени, привести примеры программирования всех перечисленных подсистем реального времени;

• Разъяснить термины, которые используются при описании обмена данными в последовательном коде;

• Описать структуру аппаратных средств и привести примеры программирования контроллера асинхронного последовательного обмена SCI в составе МК 68HC12;

• Составить программу для обмена в последовательном коде c заданными параметрами для модуля SCI;

• Описать структуру аппаратных средств и привести примеры программирования контроллера синхронного последовательного обмена SPI в составе МК 68HC12;

• Разъяснить физический смысл процессов и терминов, связанных с аналого цифровым преобразованием, таких, как квантование по времени и по уровню, кодирование информации, частота выборки, разрешающая способность, скорость потока данных оцифровки;

• Грамотно рассчитать параметры процесса аналого цифрового преобразования для сигнала с заданной частотой и формой;

• Описать модуль аналого цифрового преобразователя ATD в составе МК 68HC12;

• Разработать программу для выполнения нескольких преобразований модулем ATD по заданному сценарию;

• Подробно описать усовершенствования модуля АЦП в составе МК HCS12 по сравнению с модулем ATD в составе 68HC12;

• Составить программу и использовать модуль широтно-импульсного модулятора PWM в составе МК 68HC12B32 для управления электрическими двигателями.

Знакомясь с оглавлением, Вы должны были заметить, что эта глава — самая длинная в книге. В ней мы с достаточной степенью подробности изучим структуру и режимы работы всех подсистем микроконтроллеров семейства 68HC12 и HCS12. Для определенности рассмотрение будем вести на примере двух моделей МК: MC68HC912B32 и MC9S12DP256. Далее с целью удобства восприятия будем называть эти модели просто B32 и DP256. Периферийные модули в составе МК 68HC12 и HCS12 очень похожи друг на друга. Поэтому мы сначала будем рассматривать модули МК 68HC12, а затем остановимся на отличиях конкретного модуля в составе семейства HCS12 от его прототипа в составе 68HC12. Изучению каждого периферийного модуля будет предшествовать краткая теоретическая справка, затем будут рассмотрены структура аппаратных средств и регистры специальных функций модуля. В завершение для каждого модуля приведены несколько примеров его программного обслуживания.

Очень важно, чтобы Вы достаточно глубоко поняли особенности подсистем в составе МК 68HC12 перед тем, как перейти к примерам практической реализации достаточно сложных систем на основе этих МК. Если Вы уже знакомы с МК семейства 68HC12, то у Вас возникнет желание пропустить главу 4. Однако мы советуем Вам все же ознакомиться с примерами программ управления из этой главы, поскольку последние используются в приложениях главы 7. Заметим также, что примеры этой главы могут использоваться Вами для получения навыков отладки программного обеспечения с использованием платы отладки M68EVB912B32 или каких либо других отладочных средств.

4.1. Аппаратные средства микроконтроллеров семейства 68HC12

На рис. 4.1. представлена структура микроконтроллера MC68HC912B32 или в сокращенном виде B32. Мы уже использовали этот рисунок в гл. 1, однако обратились к нему снова, для более подробного рассмотрения технических характеристик МК B32.

Рис. 4.1. Структура микроконтроллера MC68HC912B32


Все МК семейства 68HC12 обладают 16-разрядным процессорным ядром. Семейство объединяет ряд моделей, в том числе ранее упомянутый МК 68HC812A4 (A4) и рассматриваемый в данной главе МК 68HC912B32 (B32). Отдельные модели в составе семейства различаются набором периферийных модулей, которые подключаются к внутренней межмодульной магистрали. Основные отличия между отдельными представителями семейства состоят в типе и объеме размещенной на кристалле резидентной памяти, количестве параллельных портов и контроллеров последовательных интерфейсов. В настоящей главе будет подробно рассмотрен МК модели 68HC912B32, который был выбран по причине наличия в нем всех типовых периферийных модулей. Подробное изучение предложенного МК позволит читателю с минимальными затратами адаптироваться к проектированию приложений на основе других моделей семейства 68HC12 и HCS12.

МК 68HC912B32 характеризуются следующими отличительными особенностями:

Низкое энергопотребление. Микроконтроллеры семейства 68HC12 производятся на основе CMOS технологии (CMOS — Complementary Metal oxide semiconductor). Эта технология позволяет создать транзисторные структуры с относительно низкими потерями энергии при работе в ключевых режимах. Поэтому МК семейства 68HC12 характеризуются малым потреблением энергии, что позволяет рекомендовать их для использования в изделиях с автономным питанием (от аккумуляторов или батареек). Однако не следует забывать, что потребляемая энергия для полупроводниковых CMOS структур прямо пропорциональна частоте переключения. Поэтому для достижения оптимальных энергетических характеристик следует выбирать частоту тактирования центрального процессора микроконтроллеров 68HC12 минимально возможной для конкретного применения. Микроконтроллеры 68HC12 имеют специальные режимы пониженного энергопотребления, которые также позволяют оптимизировать энергетические характеристики проектируемого изделия.

Высокопроизводительное 16 разрядное процессорное ядро. Центральный процессор семейства 68HC12 выполняет действия над 16-разрядными операндами, поэтому время выполнения алгоритмов над переменными, разрядность которых превышает байт, существенно сокращается по сравнению с 8 разрядными МК. Максимальная частота тактирования процессорного ядра fBUS для микроконтроллеров семейства 68HC12 составляет 8 МГц. Однако частота внешнего генератора или кварцевого резонатора должна составлять 16 МГц, поскольку внутренние цепи микроконтроллера делят эту частоту на два для получения fBUS.

Резидентное ОЗУ объемом 1024 байта (1Кб). Встроенное в кристалл микроконтроллера ОЗУ используется для хранения промежуточных результатов вычислений. Число ячеек, равное 1К, достаточно для большинства прогнозируемых для семейства 68HC12 применений.

Резидентная энергонезависимая память данных типа EEPROM объемом 768 б. Этот тип энергонезависимой памяти (энергонезависимая память сохраняет содержимое после отключения питания) обычно используют для сохранения изменяемых констант прикладной программы. Например, в области EEPROM могут храниться коды доступа к данной модели устройства, или на основе ячеек EEPROM могут быть организованы счетчики аварий исполнительного механизма, которым управляет микропроцессорный контроллер. Энергонезависимая память типа EEPROM позволяет выполнять операции записи и перезаписи содержимого ячеек памяти в течение сеанса работы микропроцессорного устройства под управлением прикладной программы, а также чтение ячеек памяти в произвольном порядке.

Резидентная память программ типа Flash объемом 32 Кб. Этот тип памяти предназначен для хранения прикладной программы, которая функционально завершена, прошла отладку и тестирование на реальном объекте. Объем памяти программ МК B32 составляет 32 Кб, что позволяет разместить в ней достаточно большие программы. В процессе работы над примерами из нашей книги Вы почувствуете, какой алгоритм может быть реализован программным кодом объемом 32 Кб. Использование Flash памяти в качестве памяти программ позволяет реализовать технологию программирования в системе ISP (In System Programming). Эта технология обеспечивает выполнение операций стирания и записи новых кодов в резидентное ПЗУ программ микроконтроллера без демонтажа МК с платы конечного изделия. Учитывая, что наиболее надежным способом монтажа МК на плату встраиваемой системы в настоящее время является пайка, читатель должен оценить, сколь полезна технология ISP. Если Вы собрались использовать технологию ISP на плате отладки MC68HC912B32EVB, то следует помнить, что программа монитора отладки D-Bug12, которая в том числе необходима для реализации этой технологии, располагается в области Flash памяти. Поскольку любой операции записи во Flash ПЗУ предшествует операция стирания Flash памяти, необходимо соблюдать осторожность, чтобы не стереть коды монитора отладки. Необходимые для этого сведения Вы найдете в разделе 7.8.

Мультиплексированная шина адрес/данные для адресации внешней памяти и периферийных устройств. Число выводов корпуса, в котором размещается полупроводниковый кристалл микроконтроллера, ограничено. Причиной тому — стремление разработчика выпускать миниатюрные и относительно недорогие МК, в то время, как увеличение числа выводов корпуса увеличивает его размеры и стоимость. Одним из способов сокращения числа выводов корпуса МК при сохранении функций этих выводов является мультиплексирование линий магистралей адреса и данных для сопряжения МК с внешней памятью. При мультиплексировании одни и те же выводы МК на протяжении одного временного интервала используются для передачи информации об адресе внешней ячейки памяти, а в течение другого временного интервала — для обмена данными с этой ячейкой. В микроконтроллере B32 функции мультиплексированных во времени магистралей адрес/данные выполняют линии портов Port A и Port B (рис. 4.1).

Многофункциональный таймер. Подсистема реального времени МК семейства 68HC12 включает несколько модулей, но основным является таймер с 16-разрядным счетчиком временной базы, программируемым делителем частоты тактирования и 8 каналами входного захвата IC (Input Capture) или выходного сравнения OC (Output Compare). Эти каналы могут быть сконфигурированы произвольно: любое число каналов из 8 настраивается на реализацию функции входного захвата IC, оставшиеся каналы — на функцию выходного сравнения OC. При этом возможны конфигурации, когда все каналы находятся в режиме IC или в режиме OC. Такая организация модуля таймера позволяет производить точные измерения временных характеристик входных сигналов МК, и генерировать многоканальные импульсные последовательности на его выходах.

Независимый 16 разрядный счетчик внешних событий. Этот модуль также принадлежит к подсистеме реального времени. Он предназначен для подсчета так называемых внешних событий, каждое из которых представляется импульсом на одном из входов МК. Например, в главе 7 мы будем рассматривать пример системы управления скоростью вращения электрического двигателя. Этот двигатель оснащен оптическим датчиком скорости, который генерирует 60 импульсов на один оборот двигателя. С помощью счетчика внешних событий эти импульсы могут быть подсчитаны на определенном временном интервале, после чего МК рассчитает число оборотов двигателя в мин.

Таймер меток реального времени. Этот модуль также относится к подсистеме реального времени. Он позволяет организовать прерывания основной программы МК для выполнения некоторых других «неотложных функций». Например, эта подсистема может быть использована для регулярного, один раз в 15 мин, опроса напряжения питающей систему батарейки с целью исключения потери информации при ее разряде. В главе 8 мы покажем использование таймера меток реального времени для обеспечения работы в микроконтроллере операционной системы реального времени.

Модули контроллеров последовательных интерфейсов SPI (Serial Peripheral Interface) и SCI (Serial Communication Interface). Микроконтроллеры семейства 68HC12 обладают достаточно мощными аппаратными средствами для обмена с другими устройствами в последовательном коде. Модуль контроллера SPI реализует обмен в синхронном режиме, в то время как модуль SCI предназначен для асинхронного последовательного обмена. Синхронный режим обмена в стандарте SPI характеризуется более высокими скоростями обмена по сравнению с стандартным асинхронным протоколом. Однако расстояние между взаимодействующими устройствами ограничено 20…30 см. Интерфейс в стандарте SPI часто используется для подключения к МК дополнительных интерфейсных компонентов, установленных на плате с МК. Например, МК семейства 68HC12 не имеют в своем составе цифро аналоговых преобразователей (ЦАП). Поэтому система с МК может быть дополнена внешней ИС ЦАП, подключенной к микроконтроллеру с использованием встроенного модуля контроллера SPI. Интерфейс асинхронного обмена SCI часто используется для обмена данными между двумя и более контроллерами, т.к на его основе созданы интерфейсы, сигналы которых могут передаваться на значительные расстояния.

Модуль аналого-цифрового преобразователя ATD (Analog To Digital conversion system). Большинство сигналов в системах, которыми управляют микроконтроллеры, имеют аналоговую природу. Например, температура и давление воздуха окружающей среды изменяются плавно, а не скачкообразно. Для работы с аналоговыми сигналами в микропроцессорной системе, эти сигналы должны быть предварительно преобразованы в цифровую форму. В русскоязычной литературе говорят, что эти сигналы должны быть оцифрованы. Для этой цели в составе МК B32 имеется модуль аналого-цифрового преобразователя. Модуль имеет 8 входов для одновременного подключения восьми измеряемых аналоговых сигналов. Однако оцифровка этих сигналов будет производиться последовательно. Измеряемые аналоговые сигналы будут подключаться ко входу одного аналого цифрового преобразователя (АЦП) посредством встроенного в модуль ATD мультиплексора. Оцифрованный сигнал представляется в 8-и или 10-разрядном прямом коде без знака. Два дополнительных бита кода представления результата позволяют увеличить чувствительность АЦП с 19.53 до 4.88 мВ.

Модуль сторожевого таймера COP (Computer Operating Properly). Встраиваемая микропроцессорная система должна обладать высокой надежностью. Одним из путей повышения этой надежности является свойство самовосстановления системы при возникающих некатострофических отказах. Такими отказами являются нарушения исполнения прикладной программы, вызванные помехами, и не сопровождаемые отказом аппаратных средств МК. Для восстановления правильного хода исполнения прикладной программы используется механизм сторожевого таймера. Если программа исполняется без нарушений, то сторожевой таймер регулярно обнуляется (сбрасывается) под управлением этой программы. Если же ход исполнения программы нарушен, то своевременный сброс может не произойти, и сторожевой таймер переполнится. Переполнение вызовет состояние внутреннего сброса МК, в результате исполнение прикладной программы будет начато заново, т.е. правильный ход исполнения программы будет восстановлен. В главе 5 мы обсудим возможные источники помех и шумов, которые могут вызвать сбой в исполнении программы. В главе 6 поговорим о дополнительных программных мерах, которые следует предпринять для предупреждения подобных отказов.

Модуль широтно-импульсного модулятора PWM (Pulse Width Modulation). Широтно-импульсная модуляция (ШИМ) — один из способов формирования импульсного сигнала с регулируемыми временными характеристиками. Способ широтно-импульсной модуляции часто используется для регулирования скорости вращения двигателей постоянного тока, а также для управления электрическими двигателями других типов. Для генерации ШИМ-сигнала в МК B32 могут быть использованы аппаратные средства модуля многофункционального таймера TIM. Однако МК B32 оснащен специальным модулем ШИМ. Этот модуль позволяет генерировать четыре независимых импульсных последовательности с 8 разрядным разрешением для задания коэффициента заполнения, или две импульсные последовательности с 16-разрядным заданием коэффициента заполнения. Допускается комбинация этих режимов. Например, ШИМ сигнал используется для управления двигателем рулевого управления в игрушечных радиоуправляемых машинках. Для того, чтобы машинка повернула направо или налево, она должна получить импульсный сигнал, у которого частота следования импульсов постоянная, а длительность импульсов изменяется, как показано на рис. 4.2. Отношение длительности импульса к длительности периода сигнала называется коэффициентом заполнения. Машинка повернет налево, если коэффициент заполнения менее 50% , или направо, если коэффициент заполнения превышает 50%. Модуль PWM микроконтроллера B32 позволяет организовать импульсную последовательность с требуемыми значениями периода следования и коэффициента заполнения при использовании минимального числа команд прикладной программы.

а) Временные диаграммы ШИМ-сигналов с различными коэффициентами заполнения

б) Регулировочная характеристика

Рис. 4.2. Широтно-импульсная модуляция


Модуль контроллера последовательного обмена BDLC (Byte Data Link Communication) поддерживает коммуникационный протокол SAE J1850, который является действующим стандартом бортовой информационной сети в автомобилях североамериканского производства.

Модуль контроллера CAN интерфейса msCAN12 (Motorola Scalable Controller Area Network) содержит в себе набор аппаратных средств для поддержки коммуникационного протокола промышленных сетей в стандарте CAN 2.0 A/B. Этого модуля нет в составе МК модели B32, однако он присутствует во многих других моделях семейства HC12 и HCS12. Пример работы с этим модулем приведен в главе 9.

Для более полного восприятия структуры МК B32 мы дополним приведенные технические характеристики небольшим примером применения.

На рис. 4.3. представлена микропроцессорная система регулирования скорости электрического двигателя на основе МК семейства 68HC12. Желаемая скорость вращения двигателя (число оборотов в секунду — об/с) задается посредством шестнадцатикнопочной клавиатуры. МК 68HC12 осуществляет преобразование вводимых с клавиатуры кодов в ШИМ сигнал для управления двигателем. Информация о скорости вращения двигателя снимается с выхода оптического импульсного датчика, установленного на валу двигателя. Измеренное значение скорости используется для вычисления коэффициента заполнения ШИМ сигнала, который управляет подключением силового напряжения к обмотке двигателя. Регулирование коэффициента заполнения ШИМ сигнала позволяет поддерживать скорость вращения двигателя на заданном уровне. Текущая скорость двигателя отображается на жидкокристаллическом (ЖК) индикаторе.

Рис. 4.3. Система управления электрическим двигателем на основе МК 68HC12


Вопрос: какие подсистемы МК семейства 68HC12 используются для реализации рассмотренной системы регулирования скорости вращения двигателя?

Ответ:

• Параллельный порт задействован для ввода сигналов с клавиатуры.

• Модуль ШИМ используется для генерации широтно-модулированного сигнала управления силовым ключом IRF530. Этот ключ коммутирует силовое напряжение к обмотке двигателя. Если в примере использовать МК семейства 68HC12, который не имеет в своем составе модуля ШИМ, например A4, то этот же сигнал может быть сгенерирован одним из каналов многофункционального таймера в режиме выходного сравнения OC.

• Выход оптического импульсного датчика подключается на вход счетчика внешних событий PA. Внешний датчик и встроенный в МК счетчик вместе образуют цепь обратной связи системы управления скоростью вращения двигателя.

• Модуль меток реального времени RTI реализует периодические прерывания для считывания накопленного в счетчике внешних событий числа импульсов. Это значение используется для вычисления реальной скорости вращения двигателя.

• Параллельный порт и несколько дополнительных линий другого порта используются для вывода информации на ЖК индикатор.

4.2. Аппаратные средства МК семейства HCS12

Новое семейство МК HCS12 унаследовало архитектуру процессорного ядра и большинства периферийных модулей от своего предшественника, семейства 68HC12. Каковы основные отличия МК нового семейства HCS12 от изученных представителей 68HC12?

• Напряжение питания большинства моделей МК семейства HCS12 равно 5,0 В, что позволяет обеспечить электромагнитную совместимость в автомобильных и общепромышленных применениях.

• Повышенна производительность процессорного ядра. Частота тактирования центрального процессора и межмодульных магистралей МК семейства HCS12 составляет 25 МГц против 8 МГц у HC12;

• Увеличен объем резидентной памяти. Объем встроенного в МК семейства HCS12 ОЗУ достигает 12 Кб, объем Flash ПЗУ — 512 Кб. Кроме того, в составе большинства моделей МК имеется значительная область EEPROM (до 4 Кб) для хранения перепрограммируемых констант пользователя;

• Большое число интегрированных на кристалл разнообразных контроллеров последовательных интерфейсов, т.к. МК семейства предназначены для работы в качестве интеллектуальных узлов распределенных систем управления.

Семейство HCS12 объединяет ряд моделей МК с одинаковым процессорным ядром CPU HCS12. Отдельные представители семейства различаются объемом встроенной памяти и количеством и типом интегрированных на кристалл МК периферийных модулей. Однако каждый МК из семейства HCS12 имеет в своем составе следующие функциональные модули:

• Память трех типов: FLASH память программ, энергонезависимая память EEPROM для хранения изменяемых констант пользователя и статическое ОЗУ для размещения промежуточных переменных прикладной программы управления;

• Многофункциональный 16-разрядный таймер с 8 каналами IC/OC;

• Многоканальный аналого-цифровой преобразователь;

• Контроллеры последовательного обмена нескольких стандартов;

• Модуль ШИМ общего назначения, ряд моделей оснащен специализированным модулем ШИМ для управления автономными вентильными преобразователями.

Структурная схема одного из представителей семейства HCS12 — микроконтроллера MC9S12DP256B представлена на рис. 4.4. Обратите внимание, что большая часть модулей этого МК уже рассматривалась Вами в составе МК MC68HC912B32 (рис. 4.1). Однако на кристалле MC9S12DP256B размещены уже два 8-канальных АЦП, добавлены 5 модулей контроллеров CAN и новый модуль PPAGE для аппаратной поддержки режима страничной адресации внешней памяти. Также претерпел изменения модуль таймера ECT, который стал именоваться «усовершенствованным таймером с функцией фиксации» (Enhanced Capture Timer).

Рис. 4.4. Структура микроконтроллера MC9S12DP256B


Мы надеемся, что читатель получил общее представление о МК семейства 68HC12/HCS12, и следует перейти к подробному изучению их технических особенностей. Далее на протяжении этой главы мы рассмотрим аппаратную реализацию и регистровые модели отдельных модулей в составе МК семейства 68HC12/HCS12. Также будут рассмотрены примеры программного обслуживания каждого модуля. В последующих главах мы объединим полученные навыки программирования периферии МК при создании микропроцессорных устройств различного назначения.

4.3. Режимы работы МК семейства 68HC12/HCS12

Микроконтроллеры семейства 68HC12/HCS12 функционируют в одном из восьми режимов, которые делят на две группы: рабочие режимы и специальные режимы. Рабочие режимы позволяют создать различную аппаратную реализацию встраиваемого контроллера, в то время как специальные режимы работы предназначены для проведения тестовых испытаний и диагностики МК в процессе производства. Поэтому инженерам по применению микроконтроллеров важно изучить лишь группу рабочих режимов.

BKGD MODB MODA Режим работы PORTA PORTB
000 Специальный однокристальный PORTA PORTB
001 Специальный расширенный с 8-разрядной внешней шиной ADDR [15...8] DATA [7...0] ADDR [7...0]
010 Специальный периферийный ADDR, DATA ADDR, DATA
011 Специальный расширенный с 16-разрядной внешней шиной ADDR, DATA ADDR, DATA
100 Нормальный однокристальный PORTA PORTB
101 Нормальный расширенный с 8 разрядной внешней шиной ADDR [15...8] DATA [7...0] ADDR [7...0]
110 Резервный (периферийный)
111 Нормальный расширенный с 16 разрядной внешней шиной ADDR, DATA ADDR, DATA

Рис. 4.5. Режимы работы микроконтроллеров семейства 68HC12


Каждый режим из группы рабочих задает собственное распределение адресного пространства МК и конфигурацию магистралей для подключения внешней памяти. Режим работы МК назначается посредством комбинации логических сигналов на входах BKGD, MODB, MODA микроконтроллера в состоянии начального запуска МК. Состояние начального запуска именуют также состоянием сброса (Reset). Сразу после выхода из состояния сброса МК запоминает кодовую комбинацию на перечисленных входах и переходит в соответствующий режим работы. Полный перечень режимов работы МК 68HC12/HCS12 представлен на рис. 4.5. Там же указаны альтернативные функции линий портов PORT A и PORT B, которые они приобретают в каждом из режимов работы.

4.3.1. Рабочие режимы

В большинстве проектируемых устройств Вы будете использовать МК 68HC12/HCS12 в одном из трех рабочих режимов:

• Однокристальном или автономном режиме;

• Расширенном режиме с 16-разрядной внешней шиной;

• Расширенном режиме с 8-разрядной внешней шиной.

Расширенные режимы работы предоставляют возможность подключения к МК внешней памяти и внешних периферийных ИС с использованием параллельных магистралей адреса и данных. Сигналы магистралей формируются на линиях портов PORTA и PORTB, поэтому использование соответствующих выводов МК в качестве линий ввода/вывода общего назначения в расширенных режимах работы становится невозможным.

Краткое описание рабочих режимов:

Однокристальный режим работы (BKGD: 1, MODB: 0, MODA: 0) обеспечивает функционирование МК с использованием только внутренней памяти. Поэтому коды прикладной программы управления и ее переменные должны размещаться только во внутреннем ПЗУ и ОЗУ МК. Порты PORTA и PORTB используются в качестве обычных двунаправленных портов ввода/вывода. Подключение внешних периферийных ИС должно производиться с использованием последовательных интерфейсов или с программной поддержкой временной диаграммы обмена на линиях портов ввода/вывода.

Расширенный режим с 16 разрядной системной шиной (BKGD: 1, MODB: 1, MODA: 1) обеспечивает функционирование МК с использованием как внутренней, так и внешней памяти. Для подключения внешней памяти предназначена 16-разрядная мультиплексированная магистраль адрес/данные ADDR15–0/DATA15–0. При этом старший байт мультиплексированной во времени магистрали ADDR15–8/DATA15–8 формируется на линиях PORTA, младший байт ADDR7–0/DATA7–0 — на линиях PORTB.

Расширенный режим с 8 разрядной системной шиной (BKGD: 1, MODB: 0, MODA: 1) также реализует работу МК с использованием внутренней и внешней памяти. Но для подключения внешней памяти предназначены 16-разрядная магистраль адреса ADDR15–0 и 8-разрядная магистраль данных DATA7–0. Старший байт магистрали адреса ADDR15–8 выводится на PORTA, младший байт ADDR7–0 — на PORTB. Двунаправленная 8-разрядная магистраль данных DATA7–0 использует линии порта PORTA в мультиплексированном со старшими разрядами магистрали адреса режиме. В обоих расширенных режимах некоторые линии порта PORTE используются для передачи сигналов управления обменом по шине.

4.3.2. Режимы работы отладочной платы M68EVB912B32

В данном параграфе мы рассмотрим режимы отладки, которыми может воспользоваться начинающий разработчик микропроцессорных систем, используя для своих экспериментов специальную плату отладки M68912B32EVB. Установленный на плате МК MC68HC912B32 работает в однокристальном режиме. Возможен перевод МК в расширенный режим работы. Для этого на плате имеются переключатели и разъемы системной шины для подключения внешних элементов. Однако в процессе выполнения учебных задач эта операция вряд ли будет необходима. Объем учебных примеров таков, что программы могут быть размещены во внутренней памяти МК отладочной платы.

Плата отладки M68912B32EVB позволяет реализовать четыре различных режима отладки, каждый из которых назначается посредством определенной конфигурации переключателей режимов:

Режим EVB. В этом режиме реализуется работа под управлением резидентного монитора отладки D-Bug12. Аппаратные средства отладочной платы выполнены таким образом, что сразу после включения запустится программа, которая размещается во Flash ПЗУ МК. В заводском исполнении в эту область памяти помещается программа монитора отладки D-Bug12. Если же пользователь вместо программы монитора записал коды программы пользователя, то начнет исполняться последняя. Однако чтобы не потерять коды программы монитора, неопытному пользователю не следует перепрограммировать область Flash ПЗУ. Записанный в памяти МК монитор отладки D-Bug12 содержит в себе простую, но полнофункциональную среду отладки, которая позволяет загрузить в память МК небольшие программы и протестировать их работоспособность.

Режим JUMP EE. В этом режиме исполняется программа, загруженная с адреса $D000 в область памяти EEPROM. Поскольку область памяти EEPROM ограничена 768 байтами, то исполняемый в реальном времени фрагмент программы должен быть очень коротким. Такой режим пригоден для лабораторных испытаний функционирования в реальном времени отдельных фрагментов разрабатываемой прикладной программы.

Режим POD. В этом режиме аппаратные средства отладочной платы M68912B32EVB используются в качестве интерфейса между последовательным портом персонального компьютера и отладочным портом модуля отладки BDM другого микроконтроллера, установленного на другой отладочной плате (можно использовать вторую плату M68912B32EVB, как показано в гл.3), или на плате собственной разработки. При этом этот другой МК будет находиться в режиме внутрисхемной отладки под управлением встроенного в МК модуля BDM. В этом внутрисхемной отладки возможно реализовать все этапы отладки, начиная с записи программы во Flash память МК (программирование) и заканчивая испытаниями прикладной программы в реальном времени на объекте управления. Для взаимодействия с отлаживаемым МК следует использовать один из пакетов программного обеспечения, рассмотренных в гл. 3.

Режим BOOTLOAD. Этот режим предназначен для занесения программы во Flash или EEPROM память микроконтроллера MC68HC912B32, установленного на отладочной плате.

4.4. Назначение выводов МК

Так же, как и любая другая современная ИС, один и тот же микроконтроллер семейства 68HC12/HCS12 может быть доступен в нескольких типах корпусов. Мы рассмотрим МК MC68HC912B32 в 80 и выводном корпусе типа QFP (Quart Flat Pack). Назначение выводов корпуса приведено на рис. 4.6. При инсталляции МК в конкретное устройство и при проектировании аппаратных средств, все множество выводов МК может быть разделено на три группы:

Рис. 4.6. Цоколевка корпуса микроконтроллера MC68HC912B32


• Выводы для подключения напряжения питания и опорного напряжения модуля АЦП. Имена выводов этой группы начинаются с буквы V. Например: VDD, VSS и т.д.

• Выводы портов ввода/вывода. Имена выводов этой группы начинаются с буквы P. Например: PA0, PB5 и т.д. Следующие за буквой P символы обозначают имя и номер линии порта: PORTA, линия 0 и PORTB, линия 5.

• Дополнительные выводы. Эти выводы используются для подключения дополнительных логических и нелогических сигналов, которые обеспечивают функционирование аппаратных средств микроконтроллера. Например, выводы XTAL и EXTAL используются для активизации системы тактирования МК.

Многие из выводов МК могут обладать второй, и даже третьей, так называемой альтернативной функцией. О том, как активизировать эти дополнительные функции, мы поговорим во второй части данной главы.

4.5. Регистры специальных функций МК

Представьте себе пульт управления большим технологическим комплексом, состоящим из многих технологических установок. Это может быть завод по производству молочных продуктов или цех раскройки одежды. Каждая технологическая установка этого комплекса, которая выполняет свойственную только ей функцию, может быть запущена в работу или остановлена посредством переключателей на панели управления. Пульт управления позволяет также увидеть текущее состояние каждой технологической установки посредством лампочек на его панели.

Рис. 4.7. «Пульт» управления МК семейства HC12


Блок регистров специальных функций микроконтроллера по реализуемым функциям очень похож на пульт управления. Каждый регистр осуществляет управление или отображает состояние того периферийного модуля МК, к которому он отнесен в техническом описании. Часть битов регистров специальных функций может быть сопоставлена с переключателями: установка бита в 1 разрешает реализацию какой либо функции периферийного модуля, сброс в 0 — прекращает исполнение этой функции. Другая часть битов регистров аналогична индикаторам состояния: установка 1 свидетельствует о завершении выполнения назначенной функции, пребывание в 0 свидетельствует о том, что процесс еще не завершился.

Регистры специальных функций МК семейства 68HC12/HCS12 объединены в блок, который размещается в адресном пространстве памяти МК. Доступ к каждому из 512 регистров блока осуществляется теми же командами центрального процессора, что и к ячейкам памяти. Никакого различия с точки зрения программного обслуживания между регистрами специальных функций и ячейками ОЗУ не существует. Исключение составляют лишь регистры конфигурации и другие, так называемые защищенные регистры, состояние которых невозможно изменить в произвольный момент исполнения прикладной программы.

В момент начального запуска, когда МК находится в состоянии сброса, в каждый регистр специальных функций записывается определенное в техническом описании значение. Начальные состояния регистров специальных функций обычно таковы, что функции соответствующего периферийного модуля отключены. Это очень удобно как с точки зрения потребления энергии микроконтроллером, так и с точки зрения программиста, составляющего прикладную программу управления. Если при запуске большинство периферийных модулей не работает, то МК потребляет минимальную энергию. Далее будут активизированы только те модули, которые потребуются для выполнения управляющего алгоритма. Остальные модули останутся не задействованными, что обеспечит минимизацию энергии потребления в процессе функционирования конечного устройства. При составлении программы управления МК сначала предстает перед разработчиком в минимальной конфигурации, когда большинство периферийных модулей как бы не существует. Таким МК легко управлять, поэтому ошибок в прикладной программе будет меньше. По мере реализации программы управления разработчик активизирует работу только тех модулей, которые ему потребуются. Поэтому ему не придется думать о программном обслуживании не задействованных при реализации алгоритма периферийных модулей.

Каждый регистр специальных функций имеет свой собственный адрес в карте памяти МК. При программировании на ассемблере изменение значений регистров специальных функций и считывание их состояния может быть произведено командами загрузки и пересылки данных, такими как LDAA, STAA, MOV, а также командами битовых операций BSET, BCLR. Для того чтобы избавить программиста от запоминания физических адресов регистров специальных функций, следует использовать псевдокоманду операции присваивания EQU языка Ассемблер. Эта псевдокоманда назначит символьному имени регистра, которое одинаково для всех моделей МК семейства 68HC12/HCS12, абсолютный адрес. И при записи исходного текста программы можно будет использовать только символьные имена регистров специальных функций. Использование символьных имен также полезно при переносе прикладной программы с одной модели МК на другую. В этом случае следует заменить только абсолютные адреса в псевдокомандах, в то время, как исходный текст программы останется неизменным.

При написании программы на Си с последующим использованием пакета ICC12 компании ImageCraft (см. гл. 3) для этих же целей следует использовать оператор присваивания «=». При программировании на Си установление соответствия между символьными именами регистров специальных функций и их абсолютными адресами в памяти МК наиболее часто производится с использованием директивы препроцессора #define. Для того чтобы освободить программиста от непроизводительного труда, каждая интегрированная среда разработки ПО для МК снабжена файлами заголовков (header file), которые содержат в себе полный набор директив #define для всех регистров специальных функций конкретной модели микроконтроллера. Этот файл включается в исходный текст прикладной программы директивой «include». После этого программист может обращаться к любому регистру специальных функций МК, называя символьное имя регистра. Более того, некоторые заголовочные файлы содержат определения для наиболее часто употребимых битов в составе регистров специальных функций МК, что позволяет устанавливать и сбрасывать эти биты в ходе программы, также используя их символьные имена. Применяя заголовочные файлы при программировании, необходимо помнить, что используемое в тексте программы символьное имя какого либо регистра должно в точности совпадать с именем, назначенным для него в заголовочном файле. Однако последнее не всегда совпадает с именем, приведенном в техническом описании МК.

Рассмотрим пример записи в заголовочном файле:

#define ATDCTL2 *(unsigned char volatile *) (IO_BASE + 0x62)

Разберем, что означает эта запись. Как было отмечено в гл. 3, директива #define используется препроцессором компилятора языка Си для присвоения численных значений символьным константам программы, или, как в нашем случае, определения абсолютного адреса для ячейки памяти или регистра с названным именем. После записи приведенной выше строки препроцессор будет заменять имя ATDCTL2 на указанное в директиве абсолютное значение.

Каково это значение? Оно определено в круглых скобках как сумма символьной константы IO_BASE и шестнадцатеричного числа 0x62. Константа IO_BASE — это начальный адрес блока регистров специальных функций в выбранной модели МК. Для МК B32 начальный адрес блока регистров равен 0x0000. Тогда адрес регистра ATDCTL2 будет равен 0x0062. Использованная форма записи адреса (IO_BASE + 0x62) не случайна, поскольку аппаратные средства 68HC12 позволяют программно изменять начальный адрес блока регистров (см. 4.5.1), сохраняя при этом порядок расположения регистров в памяти.

Каково назначение остальных символов рассматриваемой записи? Переменной ATDCTL2 назначается формат представления данных unsigned char, т.е 8-разрядный без знака. Определение volatile, которое следует за объявление формата, информирует компилятор о том, что изменение значения переменной ATDCTL2 может происходить не только в результате действия программы, но и на аппаратном уровне. Когда переменная сопровождается определением volatile, компилятор не использует по отношению к ней оптимизацию. Знак * после определения volatile указывает на то, что в следующих скобках заключено значение адреса переменной, а не значение этой переменной.

Пример.

Регистр ATDCTL2, расположенный в памяти МК по адресу 0x0062, управляет работой модуля аналого-цифрового преобразователя ATD. Бит 7 этого регистра разрешает (1) или запрещает (0) работу модуля. Этот бит, обозначенный в техническом описании как ATPU (ATD Powerup Bit), устанавливается в 0 в состоянии сброса МК. Для включения модуля ATD в работу необходимо программно установить этот бит в 1. На языке Ассемблера это действие может быть произведено следующим фрагментом программы:

;

;MAIN PROGRAMM

;

ATDCTL2 EQU  $0062   ;определить адрес регистра в МК

ATD_INI EQU  $80    ;определить значение слова

            ;инициализации для включения АЦП

     LDAA #ATD_INI ;загрузить слово инициализации в ACC

     STAA ATDCTL2  ;записать значение инициализации в

            ;регистр управления АЦП

            ;

Первые две строки программы содержат директивы присвоения EQU языка Ассемблер, которые информируют программу о том, что вместо имени ATDCTL2 в кодах программы следует использовать значение $0062, а вместо ATD_INI — $80 или 10000000 в двоичном коде. Команда LDAA использует непосредственную адресацию, в результате ее выполнения число $80 загрузится в аккумулятор ACC. Команда STAA с прямой адресацией пересылает содержимое ACC в ячейку с адресом ATDCTL2. В результате, код в регистре управления ATDCTL2 будет равен 10000000, т.е. установленный в 1 бит 7 вызовет включение модуля АЦП. На языке Си аналогичное действие выполняет следующий программный фрагмент:

/*--------------------------*/

/*MAIN PROGRAMM       */

/*--------------------------*/

#include <912b32.h>


void main(void) {

 unsigned char ATD_INI = 0x80;

 ATDCTL2 = ATD_INI;

}

/*---------------------------*/

Как видите, Вам не пришлось указывать в программе физический адрес регистра ATDCTL2, т.к. он уже определен в заголовочном файле 912b32.h.

4.5.1. Виртуальный адрес блока регистров

Все регистры специальных функций МК семейства 68HC12/HCS12 объединены в блок, который занимает 512 ячеек памяти в адресном пространстве МК. Регистры располагаются в памяти, начиная с некоторого начального адреса, который принято в программном коде обозначать как IO_BASE. Адреса регистров следуют последовательно друг за другом, поэтому адрес каждого регистра можно представить, как (IO_BASE + код смещения). Численное значение кода смещения каждого регистра определено в карте памяти конкретной модели МК в составе семейства 68HC12/HCS12 и может быть получено из технического описания этого МК. Так в примере предыдущего параграфа код смещения регистра ATDCTL2 в составе МК B32 был равен $0062.

После выхода МК из состояния сброса блок регистров специальных функций располагается в адресном пространстве МК, начиная с адреса IO_BASE = $0000. Такое расположение блока наиболее часто сохраняется при использовании МК семейства 68HC12/HCS12 в однокристальном режиме работы, поскольку для обращения к регистрам могут быть использованы команды с прямой адресацией, которые имеют двухбайтовый формат и экономно расходуют память программ МК. Однако аппаратные средства МК семейства 68HC12/HCS12 позволяют переопределить значение базового адреса блока регистров IO_BASE = $0000 на любое другое кратное 2 Кб в пределах адресного пространства в 64Кб. Для этого достаточно записать соответствующее значение в один из регистров специальных функций МК с именем INITRG. После изменения базового адреса блок регистров будет «располагаться» в первых 512 ячейках выбранной области памяти объемом 2 Кб. Причем порядок расположения регистров, а значит и значения кодов смещения, в пределах этой области памяти останутся неизменными. Так если блок регистров назначен в область памяти с базовым адресом $1000, то регистр ATDCTL2 будет иметь новый виртуальный (т.е. кажущийся) адрес, равный $1000 + $0062. Заметим, что при использовании виртуальной адресации регистров программисту придется только переопределить базовый адрес IO_BASE, в то время как указанные в заголовочном файле коды смещения останутся прежними.

Зачем нужна система виртуальной адресации? Дело в том, что при работе МК в одном из расширенных режимов расположение блока регистров с адреса $0000 может вызвать неудобства при проектировании схемы подключения внешней памяти. А изменение базового адреса значительно упростит эту схемотехнику.

4.6. Порты ввода/вывода

Все МК семейства 68HC12 имеют некоторое количество линий ввода/вывода данных. Линии объединены в 8 разрядные параллельные порты данных: Port A, Port B, Port E, PORT AD и т.д.

За редким исключением, все линии ввода/вывода двунаправленные. Направление передачи линий ввода/вывода настраивается программно путем записи управляющего слова в регистр направления передачи соответствующего порта. Возможно изменение направления передачи в ходе выполнения программы посредством перепрограммирования этих регистров. Сигнал сброса устанавливает все двунаправленные линии в режим ввода. Следует особо подчеркнуть, что направление передачи каждой линии может быть выбрано разработчиком произвольно, независимо от других линий, принадлежащих к одному и тому же порту ввода/вывода. Исключение составляют лишь линии однонаправленной передачи, которые изначально специализированы на ввод или на вывод (см. 4.6.1).

Часть линий ввода/вывода имеют так называемую альтернативную функцию, т.е. обеспечивают связь встроенных периферийных модулей МК с «внешним миром». Так линии порта PORT AD используются для подключения к встроенному АЦП измеряемых напряжений, линии порта PORT S служат входами и выходами контроллеров последовательного обмена. Если соответствующий периферийный модуль МК не используется, то его выводы можно задействовать как обычные линии ввода/вывода.

Если линии порта двунаправленные, то для его обслуживания такого порта предусмотрены два типа регистров:

PORTx — регистр данных порта x, где x — имя порта ввода/вывода;

DDRx — регистр направления передачи порта x.

Например, порт PORT A обслуживается регистрами PORTA и DDRA, а порт PORT B — регистрами PORTB и DDRB.

Если порт имеет схемотехнику с программно подключаемым «подтягивающим» резистором (R pull up), то для обслуживания такого порта предусмотрен дополнительный регистр входного сопротивления порта.

Ниже приведен фрагмент текста программы, которая конфигурирует PORT T для вывода данных, а затем записывает в порт число $62. Для того, чтобы все линии порта PORT T стали линиями вывода, необходимо записать в регистр направления передачи DDRT код $FF.

/*----------------------------------------------*/

/* МAIN PROGRAМ:                 */

/*                        */

/*подключаемые файлы*/

#include <912b32.h>


void main{void) {

 unsigned char DDRT_INI = 0xFF;

 DDRT = DDRT_INI; //установить порт PORT T на вывод

 PORTT = 0x62;

}

/*                       */

4.6.1. Спецификация портов ввода/вывода

Подсистема параллельного ввода/вывода МК B32 состоит из 8 портов, причем линии многих портов обладают альтернативной функцией. Мы рассмотрим эти порты в порядке их расположения на рис. 4.1. по часовой стрелке.

• PORT A. В однокристальном режиме работы — 8-разрядный порт ввода/вывода общего назначения. Направление передачи каждой линии порта определяется соответствующим битом регистра DDRA. В расширенном режиме работы на линиях порта формируются сигналы старшего байта мультиплексированной магистрали адрес/данные ADDR15–8/DATA15–8. В расширенном режиме с 8 разрядной шиной линии порта представляют собой мультиплексированную магистраль ADDR15–8/DATA7–0.

• PORT B. В однокристальном режиме работы — 8-разрядный порт ввода/вывода общего назначения. Направление передачи каждой линии порта определяется соответствующим битом регистра DDRB. В расширенном режиме работы на линиях порта формируются сигналы младшего байта мультиплексированной магистрали адрес/данные ADDR7–0/DATA7–0. В расширенном режиме с 8-разрядной шиной линии порта представляют собой немультиплексированную магистраль ADDR7-0.

• PORT E. 8-разрядный порт ввода/вывода общего назначения. Две линии порта PE0 и PE1 — однонаправленные и работают только на ввод. Остальные линии порта — двунаправленные, направление передачи линий PE2–PE7 определяется соответствующими битами регистра DDRE. Все линии порта имеют альтернативную функцию. Линии PE1 и PE0 могут использоваться как входы внешних прерываний и . Остальные линии служат для задания режимов работы МК (MOD A и MOD B) и в качестве сигналов управления внешней шиной при работе МК в расширенном режиме.

• PORT AD. Однонаправленный 8-разрядный порт ввода. Все линии имеют альтернативную функцию. Если работа модуля аналого-цифрового преобразователя ATD разрешена, то линии порта используются для подключения измеряемых аналоговых сигналов.

• PORT T. Двунаправленный 8-разрядный порт ввода/вывода общего назначения. Направление передачи каждой линии порта определяется соответствующим битом регистра DDRT. Альтернативная функция линий порта PORT T — обслуживание модуля таймера. Если работа таймера разрешена, то линии используются в качестве входов входного захвата IC или выходов выходного сравнения OC.

• PORT S. Двунаправленный 8-разрядный порт ввода/вывода общего назначения. Направление передачи каждой линии порта определяется соответствующим битом регистра DDRS. Альтернативная функция линий порта PORT S — обслуживание модулей последовательного обмена SCI и SPI.

• PORT P. Двунаправленный 8-разрядный порт ввода/вывода общего назначения. Направление передачи каждой линии порта определяется соответствующим битом регистра DDRP. Четыре линии порта PORT P могут использоваться в качестве выходов модуля генератора ШИМ-сигнала (модуль PWM), если работа последнего программно разрешена.

• PORT DLC. Двунаправленный 8-разрядный порт ввода/вывода общего назначения. Направление передачи каждой линии порта определяется соответствующим битом регистра DDRDLC. Альтернативная функция двух линий порта PORT DLC — обслуживание модуля последовательного обмена в стандарте BDLC.

Регистры управления портами

В МК семейства 68HC12/HCS12 каждый двунаправленный порт ввода/вывода общего назначения обслуживается двумя регистрами специальных функций. Это регистр данных порта и регистр направления передачи DDRx (вместо буквы «x» следует подставить буквенное обозначение порта). Если линии порта общего назначения настроены на ввод, то операция чтения регистра данных возвращает состояние выводов корпуса МК, с которыми связан порт. Если порт настроен на вывод, то операция записи в регистр данных устанавливает на выводах корпуса МК, связанных с портом, соответствующие логические уровни. Регистр DDRx определяет направления передачи каждой линии порта независимо от других линий этого же порта. Если какой либо бит регистра DDRx равен 0, то соответствующая линия настраивается на ввод, если 1 — то на вывод. Возможны решения, при которых часть линий одного и того же порта настроена на ввод, а часть на вывод. Например, при значении DDRx=10110010 линии D6, D3, D2 и D0 развернуты на ввод, а линии D7, D5, D4 и D1 — на вывод. В состоянии сброса МК все биты регистров направления передачи DDRx сбрасываются, поэтому сразу после включения питания все линии портов МК сконфигурированы как входы с высоким входным сопротивлением.

Часть портов ввода/вывода обслуживается дополнительными регистрами управления:

• PUCR (Pull Up Control Register) — регистр разрешения схемотехники подтягивающих резисторов. Формат регистра представлен на рис. 4.8. Если соответствующие биты регистра установлены, то в портах PORT A, PORT B и Port E при конфигурировании какой либо линии порта на ввод автоматически подключается встроенный подтягивающий к напряжению питания резистор. Если же эта линия настраивается на вывод, то встроенный резистор автоматически отключается. В расширенных режимах работы МК, когда названные порты используются для формирования сигналов внешних магистралей адреса, данных и управления, встроенные резисторы также автоматически отключаются.

Рис. 4.8. Формат регистров PUCR, RDRIV, PEAR


• RDRIV (Reduced DRIVe Register) — регистр выбора режима работы выходных каскадов с пониженными выходными токами. Формат регистра также представлен на рис. 4.8. Как следует из рис. 4.8, в МК B32 этот режим также доступен только для портов PORT A, PORT B и PORT E. В МК иных моделей этой функцией могут обладать также и другие порты. Если функция для порта разрешена установкой разряда RDPx в 1, то при конфигурировании какой либо линии порта на вывод ее выходной ток снижается с 0,6 мА до 0,3 мА.

• PEAR (Port E Assignment Register) — регистр выбора назначения линий порта Port E. Отдельные биты этого регистра (рис. 4.8) позволяют назначить линии альтернативную функцию или функцию линии ввода/вывода общего назначения.

Вопросы для самопроверки

1. Сколько портов ввода/вывода в МК B32?

Ответ: МК B32 имеет в своем составе восемь 8 разрядных портов (A, B, E, AD, T, S, P, DLC).

2. Какие альтернативные функции реализуют порты AD, T, S, P, DLC?

Ответ: Линии порта AD служат аналоговыми входами встроенного АЦП, порт T используется модулей таймера, на выходах порта P формируются ШИМ сигналы, порт S обслуживает контроллера последовательного ввода/вывода SCI и SPI.

3. Каково назначение регистра направления передачи порта?

Ответ: Каждый разряд этого порта определяет направление передачи соответствующей линии порта.

4. В какое состояние устанавливается регистр направления передачи во время сброса МК?

Ответ: Сбрасывается, т.е. устанавливается в 0. При этом все линии портов конфигурируются на ввод.

Пример применения

В этом примере мы подключили в порту PORTA группу зеленых и красных светодиодов. Схема подключения показана на рис. 4.9. Мы обсудим эту схему подробно в гл.5. А сейчас лишь договоримся, что если на линии порта установлена 1, то будет гореть зеленый светодиод, если логический 0 — то красный светодиод. А если линия порта переведена в состояние ввода, т.е. она представляется для цепи светодиодов нагрузкой с высоким входным сопротивлением, то оба светодиода окажутся погашенными. На рис. 4.10 приведена блок-схема алгоритма программы, которая зажигает на 30 мс зеленым цветом светодиоды с четными номерами и одновременно красным цветом светодиоды с нечетными номерами. Следующие 30 мс светодиоды «меняются цветами», далее этот процесс продолжается до бесконечности. Ниже приведен текст программы на языке Си, который реализует этот алгоритм.

Рис. 4.9. Схема отображения состояния порта PORTA


Схема содержит 8 идентичных светодиодных индикаторов для логических выходов с тремя состояниями. Индикатор каждого разряда состоит из двух светодиодов: зеленого и красного. Если на выходе порта PORTA[i] логическая 1,то светится зеленый светодиод, если логический 0 — то красный. Если линия порта PORTA[i] настроена на ввод, то ни один из светодиодов этого разряда порта не светится.

Рис. 4.10. Блок схема алгоритма управления светодиодами


/*----------------------------------------------------------------------*/

/* МAIN PROGRAМ: Эта программа зажигает на выходах порта PORTA      */

/* 30 мс зеленым цветом горят светодиоды на выходах порта с четными   */

/* номерами, красным цветом –светодиоды на выходах порта с нечетными  */

/* номерами. Следующие 30 мс на месте зеленых горят красные, и наоборот */

/*----------------------------------------------------------------------*/

/*подключаемые файлы*/

#include <912b32.h>


/*используемые функции*/

void delay_100us(void);

void delay_30ms(void);


void main{void) {

 DDRA = 0xFF; //установить порт PORTA на вывод

 while(1) {

  PORTA = 0x55;

  delay_30ms();

  PORTA = 0xAA;

  delay_30ms();

 }

}


/*-----------------------------------------------------------------------*/

/* Функция delay_30ms формирует задержку в 30 мс, частота тактирования  */

/* межмодульных магистралей МК составляет 8 МГц              */

/*-----------------------------------------------------------------------*/

void delay_30ms(void) {

 int i;

 for (i=0; i<=299; i++) delay_100us();

}


/*-----------------------------------------------------------------------*/

/* Функция delay_100us формирует задержку в 100 мкс, частота тактирования*/

/* межмодульных магистралей МК составляет 8 МГц              */

/*-----------------------------------------------------------------------*/

void delay_100us(void) {

 int j;

 for (j=0; j<50; j++) {

  asm("nop\n");

 }

}

/*-----------------------------------------------------------------------*/

Обратите внимание, что функция задержки на 30 мс использует вложенную функцию задержки на 100 мкс. В приведенном тексте программы для формирования задержки на 100 мкс используются 50 циклов повторения операторов функции delay_100us. Выбор числа повторений производился из предположения, что данная программа будет исполняться микроконтроллером, частота внутренней шины которого составляет 8 МГц. По результатам рассмотрения файла в формате *.lst было установлено, что команды ассемблера, соответствующие одному повторению цикла функции delay_100us , реализуются за 16 машинных циклов. При частоте шины в 8 МГц для формирования временного интервала в 100 мкс потребуется 800 машинных циклов. Поэтому число повторений цикла функции delay_100us должно составлять 800/16 = 50. Если бы эта программа исполнялась бы микроконтроллером DP256, частота внутренней шины которого составляет 25 МГц, то число циклов функции delay_100us должно было бы быть увеличено до 156.

4.7. Подсистема памяти МК B32

Подсистема памяти МК семейства 68HC12/HCS12 включает четыре различных модуля памяти: энергонезависимая Flash-память программ, энергонезависимая EEPROM память данных, статическое ОЗУ и блок регистров специальных функций для управления режимами работы периферийных модулей. Расположение различных модулей памяти в адресном пространстве МК принято отражать на так называемой карте памяти. Карта памяти МК B32 представлена на рис. 4.11. Указанные на ней адреса будут действительны при выходе МК из состояния сброса. В ходе исполнения прикладной программы адресное пространство для каждого модуля памяти может быть изменено (см. 4.5.1.). Тогда для обращения к ячейкам памяти будут использоваться не указанные на рис. 4.11 физические адреса, а измененные виртуальные адреса.

Рис. 4.11. Карта памяти МК B32 в составе отладочной платы MC68HC912B32EVB


Микроконтроллер B32 предназначен для использования преимущественно в однокристальном режиме работы. Он содержит в себе 32Кб ПЗУ программ, 768 байт памяти типа EEPROM, 1Кб статического ОЗУ и 512 регистров управления.

Строго говоря, аббревиатура EEPROM (Electrically Erasable Programmable ROM) обозначает энергонезависимую память с электрическим программированием и электрическим стиранием. Поэтому и резидентная память программ, выполненная на основе технологии FLASH, и энергонезависимая память данных должны быть характеризованы как EEPROM. Однако энергонезависимая память программ и энергонезависимая память данных отличаются по своим свойствам не только на уровне технологии изготовления, но и на уровне разработчика встраиваемых систем. Память типа Flash допускает выполнение операции стирания только над некоторым множеством ячеек, что неудобно при необходимости замены только одного байта информации. Энергонезависимая память данных позволяет стереть и потом запрограммировать один байт информации. Однако ячейки памяти с подобным свойством занимают значительную площадь полупроводникового кристалла МК, поэтому на их основе не может быть выполнена память программ большого объема. Во избежание путаницы у российских разработчиков принято использовать аббревиатуру EEPROM только для памяти с побайтным стиранием и побайтным программированием. А память со стиранием блоками обозначают как Flash, хотя и эта память по своим свойствам относится к EEPROM.

Используя МК от Freescale Semiconductor, в частности семейство 68HC12/HCS12 следует знать, что гарантированное число циклов стирания/программирования для МК HCS12 составляет 10000, а для МК 68HC12 — всего 100. Именно поэтому во многих отладочных средствах на основе МК 68HC12 рекомендуется промежуточные версии программы записывать и исполнять из ОЗУ. Поскольку резидентное ОЗУ у микроконтроллеров обладает недостаточным объемом для размещения программы, то многие отладочные платформы используют расширенный режим работы МК с подключением внешнего ОЗУ. В МК семейства HCS12 для целей отладки обычно используется внутреннее Flash ПЗУ программ, т.к. 10000 циклов перезаписи обычно достаточно для внесения всех исправлений в процессе отладки.

Пример применения

В процессе эксплуатации память типа EEPROM часто используют для создания счетчиков аварийных ситуаций на объекте. Возможные аварии предварительно классифицируются, в системе устанавливаются датчики, которые позволяют микроконтроллеру отнести возникшую аварийную ситуацию к тому или иному типу. Если тип аварии диагностирован, то МК увеличивает соответствующий счетчик и запоминает его новое состояние в энергонезависимой памяти данных типа EEPROM. Такое решение позволяет сохранить информацию об авариях даже при отключении системы питания.

4.7.1. Карта памяти МК B32

Карта памяти МК определяет, по каким адресам в конкретной модели МК расположены блоки памяти. Процессорное ядро HC12 позволяет линейно адресовать 64К слов памяти. Поскольку МК 68HC12 используют однобайтовые ячейки памяти, то получается, что при линейной адресации в МК семейства 68HC12 адресуют 64 Кб памяти. Определение «линейная адресация» означает, что в любой момент времени без применения дополнительных команд МК может обратиться к ячейке памяти с любым адресом из диапазона $0000…$FFFF.

Карта памяти МК B32 приведена на рис. 4.11. Резидентная память (т.е. память, расположенная на кристалле МК) включает четыре блока памяти: 512 байт регистров специальных функций для управления периферийными модулями, 1 Кб оперативного запоминающего устройства для хранения промежуточных результатов вычислений, 768 байт энергонезависимой памяти типа EEPROM с побайтным стиранием и побайтным программирования для хранения уставок программы пользователя, 32 Кб энергонезависимой Flash памяти для размещения прикладной программы пользователя. На рис. 4.11 карта памяти учитывает особенности размещения резидентной программы отладки D-Bug12 при работе МК в составе платы отладки MC68HC912B32EVB:

• $8000…$F600 — код программы отладчика D-Bug12;

• $F680…$F6BF — область пользователя;

• $F6C0…$F6FF — область D-Bug12;

• $F700…$F77F — код запуска D-Bug12;

• $F780…$F7FF — таблица векторов для режима отладки;

• $F800…$FBFF — зарезервированная разработчиком область;

• $FC00…$FFBF — код программы загрузчика в EEPROM;

• $FFC0…$FFFF — вектора сброса и прерывания.

Из представленного распределения адресного пространства МК в составе платы отладки видно, что код программы отладчика занимает практически всю область Flash ПЗУ, которая в реальных проектах предназначается для прикладной программы управления. А где же предполагается размещать отлаживаемую программу? Ответ на этот вопрос Вы найдете в параграфе 4.3.1.

4.7.2. Изменение адресов в карте памяти МК

Внимательно проанализировав распределение адресного пространства в карте памяти МК, можно заметить, что часть доступного адресного пространства не используется резидентной памятью микроконтроллера. Так в МК B32 (рис. 4.11) в диапазоне адресов $01FF…$0800, $0BFF…$0D00 и $0FFF…$8000 память отсутствует. Именно это незанятое адресное пространство может быть использовано для подключения внешней памяти в расширенных режимах работы МК. В процессе подключения внешней памяти может оказаться, что отдельные блоки внутренней памяти МК желательно «переместить» в пределах адресного пространства МК. Тогда схемотехника подключения внешней памяти упростится. Для назначения новых, виртуальных адресов блоков резидентной памяти МК предназначены три регистра специальных функций:

• INITRG — регистр базового адреса блока регистров специальных функций;

• INITRM — регистр базового адреса блока ОЗУ;

• INITEE — регистр базового адреса блока EEPROM.

В состоянии сброса МК эти регистры указывают на реальные, физические адреса перечисленных блоков памяти. Назначение виртуальных адресов блоков обычно происходит на начальном этапе выполнения программы в секции инициализации.

4.8. Подсистема памяти МК DP256

Карта памяти для МК DP256 приведена на рис. 4.12. Расположение различных модулей памяти в адресном пространстве МК чрезвычайно похоже на рассмотренный ранее МК B32. Основное отличие подсистемы памяти DP256 от B32 — это наличие системы страничной адресации, которая позволяет обращаться к более чем 64 Кб памяти с использованием 16 разрядной магистрали адреса. Объем резидентной памяти МК DP256 составляет 256 Кб. Модули резидентного ОЗУ, EEPROM и регистры специальных функций доступны, как и ранее, с использованием обычной адресации в пределах 64 Кб (см. рис. 4.12). Основная часть ПЗУ программ разделена на страницы по 16 Кб, причем каждая из страниц может отображаться на одном и том же адресном пространстве $8000–$BFFF. Выбор конкретной страницы осуществляется занесением под управлением программы ее кода в специальный регистр. Поэтому частое переключение между страницами программной памяти замедляет исполнение программы.

Рис. 4.12. Карта памяти МК семейства HCS12 DP256


Вопросы для самопроверки

1. Каков объем Flash памяти программ МК B32?

Ответ: 32 Кб.

2. Как занести программу пользователя во Flash-память МК B32, установленного на отладочной плате M68EVB912B32?

Ответ: Для этого может быть использована программа загрузчика, которая поместит программу пользователя в область EEPROM, начиная с адреса $D000, или в область Flash ПЗУ начиная с адреса $8000. Однако в последнем случае программа монитора отладки D-Bug12 будет потеряна.

3. Сколько раз можно перепрограммировать резидентное Flash ПЗУ программ МК?

Ответ: 100 раз в МК семейства 68HC12 и 10000 раз в МК семейства HCS12.

4. Сколько раз можно перезаписать данные в энергонезависимой памяти данных типа EEPROM?

Ответ: гарантированное число циклов стирания/программирования резидентной энергонезависимой памяти данных равно 10000. На практике это число значительно больше.

4.9. Состояния сброса и прерывания МК

В процессе исполнения прикладной программы МК реализует монотонную многократно повторяющуюся последовательность действий:

• Выборку кода команды из памяти программ в регистр команды центрального процессора;

• Дешифрацию кода команды;

• Выборку из памяти следующих байтов команды;

• Исполнение команды;

• Сохранение в памяти результатов исполнения команды.

Если исполняется линейная последовательность команд, то содержимое счетчика PC центрального процессора постоянно увеличивается на 1, обеспечивая выборку из памяти следующих команд прикладной программы. Линейная последовательность исполняемых команд может быть изменена под управлением самой программы, например инструкциями «jmp» или «branch». При этом в счетчик команд под управлением программы будет записано новое число, и начнется исполнение следующего линейного фрагмента программы из другого сегмента памяти программ. Несмотря на явные различия механизмов формирования следующего за исполнением текущей операции значения счетчика команд PC, в обоих рассмотренных случаях это следующее значение PC определяется ходом вычислительного процесса и предсказывается программистом в ходе написания прикладной программы.

В противоположность только что рассмотренному полностью предсказуемому потоку событий, который формируется самой микропроцессорной системой, существует еще поток внешних событий, очередность и моменты возникновения которых не синхронизированы с исполнением центральным процессором тех или иных команд прикладной программы. Однако МК должен реагировать на эти события, для чего необходимо изменить последовательность исполнения операторов программы в произвольный, непредсказуемый с точки зрения устройства управления центральным процессором момент времени. Такое изменение реализуется принудительной записью нового значения в счетчик команд PC под управлением специальных аппаратных средств микроконтроллера, которые реагируют на внешние события. Включение в работу механизма принудительного изменения текущего значения счетчика команд нельзя считать аварийным состоянием микропроцессорной системы. Это лишь специальное состояние, которое позволяет организовать эффективное распределение ресурса одного центрального процессора для обслуживания нескольких устройств, генерирующих в реальном времени несвязанные между собой внешние события.

Встроенный в МК механизм реагирования на внешние события авторы данной книги именуют исключениями, поскольку внешние события нарушают нормальную, назначенную программистом последовательность исполнения команд. По способу обработки микроконтроллером исключения подразделяются на прерывания и сброс. В русскоязычной литературе термин «исключение» обычно не используется, и говорят просто о состоянии прерывания или о состоянии сброса микроконтроллера (примечание переводчика). Сохраняя оригинальный стиль авторов, далее в книге будем использовать термин «исключение».

4.9.1. Реакция МК на внешние события

Рассматривая далее технические особенности подсистемы прерывания МК семейства 68HC12/HCS12, мы должны обсудить общие для всех микропроцессорных систем алгоритмы обработки прерываний:

• Каждое событие, на которое микропроцессорная система должна реагировать с использованием механизма прерывания, называется запросом на прерывание. Последовательность команд, которая должна быть исполнена при возникновении запроса на прерывание, называется подпрограммой прерывания ISR (Interrupt Service Routing). При возникновении запроса на прерывание текущая исполняемая программа, которую в русскоязычной литературе называют фоновой, должна быть приостановлена для выполнения подпрограммы прерывания ISR. По завершении последней исполнение фоновой программы должно быть продолжено.

• В момент приостанова исполнения фоновой программы, содержимое всех регистров центрального процессора должно быть сохранено в специальной области ОЗУ, которая называется «стек». В составе центрального процессора обязательно имеется регистр «указатель стека SP», который содержит адрес области памяти, в которой сохранили значения остальных регистров центрального процессора. По завершении исполнения подпрограммы прерывания этот адрес будет использован для восстановления значений регистров центрального процессора из стека, чтобы далее продолжить исполнение фоновой программы.

• Аппаратный флаг, который был установлен внешним событием для генерации запроса на прерывание, должен быть обязательно сброшен до завершения исполнения подпрограммы прерывания ISR. Если этого не будет сделано, то МК снова перейдет к исполнению подпрограммы прерывания. Таким образом, реакция МК на один и тот же запрос может получиться многократной, что не предусматривается алгоритмом управления.

• После завершения выполнения подпрограммы прерывания, содержимое счетчика команд и всех регистров центрального процессора восстанавливается из стека. В результате, исполнение фоновой программы возобновляется с того оператора, на котором она была приостановлена.

• Сразу после начального запуска МК должен выполнить процедуры инициализации (начальной установки), которые позволят настроить подсистему прерывания микроконтроллера необходимым образом. И лишь после этого можно разрешать обработку прерываний в микроконтроллере.

Отметив эти общие свойства подсистемы прерывания, обратимся к более подробному рассмотрению последней в МК семейства 68HC12/HCS12.

4.10. Состояния сброса и прерывания в МК 68HC12

МК семейства 68HC12/HCS12 обладают мощной системой обработки исключений. По способу реакции микроконтроллера на возмущающие события исключения делятся на прерывание и на сброс. В русскоязычной литературе используют следующие словосочетания с терминами «прерывание» и «сброс» (прим. переводчика):

• МК реализует прерывание или МК находится в состоянии прерывания;

• МК находится в состоянии сброса или в состоянии начального запуска.

Прерывания в свою очередь делятся на маскируемые и немаскируемые. Полный список источников исключений в МК семейства 68HC12/HCS12 с указанием способа обработки исключения по каждому источнику события приведен на рис. 4.13. В следующих параграфах мы обсудим особенности работы внутренних ресурсов МК в процессе обработки каждого упомянутого на рис. 4.13 исключения.

Рис. 4.13. Классификация исключений 68HC12

4.10.1. Состояние сброса МК

Микроконтроллер семейства 68HC12/HCS12 переходит в состояние сброса по внешнему сигналу или в при наступлении определенных внутренних событий. В состоянии сброса программный счетчик и часть битов регистра состояния центрального процессора, а также определенные в техническом описании регистры специальных функций периферийных модулей устанавливаются в начальное состояние. Это состояние однозначно определяет аппаратную конфигурацию микроконтроллера, с которого он начнет работу после включения питания. Поэтому второе название состояния сброса — состояние начального запуска. Состояние сброса МК использует также для восстановления работоспособного состояния после обнаружения внутренней аварийной ситуации.

Различают четыре источника событий, которые переводят МК в состояние сброса:

Внешний сброс (External reset). Все МК семейства 68HC12/HCS12 имеют специальный вывод корпуса RESET для подачи сигнала внешнего сброса. Активный уровень сигнала – логический 0. Пока на входе RESET удерживается низкий уровень сигнала, МК будет находиться в состоянии сброса. После перевода линии RESET в состояние логической 1 МК перейдет в активный режим работы по истечении задержки, которая составляет 4096 периодов системной магистрали МК.

Внутренний сброс по нарастанию напряжения питания (Power on reset — POR). Нарастание напряжения на входе VDD микроконтроллера вызывает состояние сброса. Таким образом реализуется начальный запуск МК с однозначно определенной аппаратной конфигурацией и с известным начальным адресом запускаемой на исполнение программы.

Внутренний сброс по сторожевому таймеру (Computer Operating Properly reset — COP). Логика работы сторожевого таймера позволяет микроконтроллеру выявлять перемежающиеся ошибки в исполнении прикладной программы, которые могут возникнуть в результате электромагнитных помех или при колебаниях напряжения питания микропроцессорной системы. В процессе отладки работа сторожевого таймера запрещена. Работа модуля сторожевого таймера разрешается в конечном варианте прикладной программы, который используется при работе МК в системе. Сторожевой таймер — это счетчик, коэффициент счета которого настраивается пользователем при инициализации системы. Счетчик начинает счет внутренних тактовых импульсов в момент начала исполнения программы. Если счетчик переполнится, то МК перейдет в состояние сброса. Правильно исполняемая прикладная программа, в которой очередность исполнения операторов совпадает с предусмотренной программистом очередностью, должна постоянно сбрасывать сторожевой таймер. Тогда внутреннего сброса от него случаться не будет. Для сброса сторожевого таймера в МК семейства 68HC12/HCS12 необходимо в регистр COPRST записать сначала код $55, а затем код $AA. При создании конечного кода прикладной программы разработчик должен разместить операции записи приведенной последовательности кодов так, чтобы исполнение программы по любому возможному пути обеспечивало бы выполнение команд сброса через меньшие интервалы времени, чем период переполнения сторожевого таймера.

Внутренний сброс по отклонению частоты тактовых импульсов МК (Clock Monitor reset). МК переводится в состояние сброса, когда модуль встроенного генератора тактирования обнаруживает выход частоты тактирования за заданные пределы или просто останов системы тактирования. После перехода в состояние сброса в счетчик команд центрального процессора автоматически загружается так называемый вектор сброса. Вектор сброса — это адрес ячейки памяти, в которой расположен первый оператор исполняемой программы. После загрузки начального адреса программа запускается на исполнение. Два источника сброса: сторожевой таймер и монитор частоты тактирования — обладают собственными векторами сброса (см. рис. 4.17).

Период переполнения сторожевого таймера

CR[2:0] Делитель Период переполнения сторожевого таймера
4 МГц 8 МГц
000 Не используется нет нет
001 213 2,048 мс 1,024 мс
010 215 8,192 мс 4,096 мс
011 217 32,768 мс 16,384 мс
100 219 131,072 мс 65,536 мс
101 221 524,288 мс 262,144 мс
110 222 1,048 с 524,288 с
111 223 2,097 с 1,048576 с

Рис. 4.14. Формат регистров COPCTL, COPRST


Регистры сторожевого таймера и монитора тактирования

Два регистра специальных функций используются МК семейства 68HC12/HCS12 для управления генерацией сигналов сброса от сторожевого таймера и монитора тактирования:

• COPCTL — регистр управления сторожевого таймера.

• COPRST — регистр сброса сторожевого таймера.

Формат обоих регистров представлен на рис. 4.14. Отдельные биты регистра COPCTL разрешают или запрещают сброс от сторожевого таймера и от монитора питания, задают период переполнения сторожевого таймера, а также позволяют генерировать сигнал сброса под управлением программы.

Назначение битов регистра COPCTL:

• CME — разрешает (CME=1) или запрещает (CME=0) работу монитора тактирования.

• FCME — разрешает работу монитора тактирования (FCME=1) независимо от значения бита CME.

• FCM — установка под управлением программы этого бита в 1 генерирует внутренний сброс по монитору тактирования.

• FCOP — установка под управлением программы этого бита в 1 генерирует внутренний сброс по переполнению сторожевого таймера.

• DISR — запрещает (при DISR=1) или запрещает (при DISR=0) перезапуск МК по установленным битам FCM и FCOP.

• CR2…CR0 задают коэффициент счета сторожевого таймера. Численные значения периода переполнения сторожевого таймера для некоторых частот системной шины МК приведены на рис. 4.14.

Регистр COPRST предназначен для сброса сторожевого таймера. В этот регистр под управлением программы должна быть записана последовательность кодов: сначала $55, затем $AA. И сторожевой таймер будет сброшен.

4.10.2. Прерывания

Мы рассмотрели один из способов реализации исключений в микроконтроллерах — это сброс МК. Другой способ принудительного изменения содержимого программного счетчика центрального процессора — это прерывания, которые в МК семейства 68HC12/HCS12 делятся на маскируемые и немаскируемые.

Программно логическая модель центрального процессора содержит регистр признаков CCR, формат которого представлен на рис. 4.15. Особенностью всех семейств МК от компании Freescale Semiconductor является наличие в регистре признаков не только флагов результатов операции, но и дополнительных битов управления подсистемой прерывания. В составе регистра признаков МК 68HC12/HCS12 — два таких бита. Бит I — глобальная маска прерываний — используется для управления маскируемыми прерываниями. Бит X — бит запрета немаскируемых прерываний — управляет немаскируемыми прерываниями. Оба этих бита устанавливаются в 1 в состоянии сброса МК. Обратите внимание, в МК 68HC12/HCS12 установка битов I и X запрещает соответствующие прерывания.

Рис. 4.15. Формат регистра состояния CCR


Немаскируемые прерывания

В соответствие со своим названием немаскируемые прерывания не могут быть отключены пользователем. Однако в предыдущем абзаце было упомянуто, что установка бита X в 1 запрещает немаскируемые прерывания. Значение бита X действительно равно 1 в состоянии сброса МК. Однако далее он может быть установлен в 0 под управлением программы инициализации, разрешая тем самым немаскируемые прерывания. Далее этот бит не может быть изменен под управлением программы, и в этом его отличие от бита глобальной маски прерываний I.

Три типа немаскируемых прерываний реализуются в МК 68HC12/HCS12:

Прерывание по внешнему запросу . Все МК 68HC12/HCS12 имеют вывод внешнего немаскируемого прерывания . Активный уровень сигнала для генерации запроса на прерывание — логический 0.

Прерывание по несуществующему коду команды. Каждая инструкция языка ассемблер МК имеет собственный код. В МК 68HC12/HCS12 коды операций могут быть однобайтовыми и двухбайтовыми. Но не все теоретически возможные коды использованы для кодирования реальных команд процессорного ядра CPU12. Если на этапе выборки кода команды из памяти произошло считывание несуществующего кода команды, то генерируется запрос на немаскируемое прерывание.

Программное прерывание — инструкция SWI. Система команд МК 68HC12/HCS12 имеет инструкцию программного прерывания, которая позволяет перейти к исполнению подпрограммы прерывания из прикладной программы.

Маскируемые прерывания

Прерывание по внешнему запросу . Все МК 68HC12/HCS12 имеют вывод внешнего маскируемого прерывания . Активный уровень сигнала для генерации запроса на прерывание — логический 0. В некоторых приложениях требуется принять запросы от нескольких внешних источников сигналов. Для таких случаев следует использовать дополнительный логический элемент, который объединяет запросы от всех источников по логике ИЛИ (рис. 4.16). Если запрос на вход поступил, и МК перешел к выполнению подпрограммы прерывания, то в этой подпрограмме следует опросить линии порта для того, чтобы установить, какой из источников вызвал прерывание. Обработка нескольких объединенных по ИЛИ запросов с программным поиском установившего запрос источника называется поллингом.

Рис. 4.16. Внешняя цепь для подключения сигналов нескольких внешних запросов на прерывание


Прерывание по таймеру меток реального времени RTI. Таймер меток реального времени генерирует последовательность равноотстоящих во времени запросов на прерывание. Период повторения запросов настраивается программистом. Эти прерывания могут быть использованы для регулярного выполнения микроконтроллером некоторой задачи. Например, для измерения напряжения аккумуляторной батареи каждые три мин, чтобы сигнализировать о необходимости ее замены. Мы рассмотрим особенности прерываний RTI в главе 7 на примере управления скоростью вращения электрическим двигателем.

Прерывание по событию канала захвата/сравнения (IC/OC) таймера. Восемь одинаковых блоков в составе модуля таймера, которые именуют «каналами», предназначены для контроля за уровнем сигнала на входе канала или для изменения в строго определенный момент времени логического уровня на выходе канала. Заданное программистом изменение входного или выходного сигнала канала рассматривается как событие, которое генерирует запрос на прерывание. Например, если канал настроен на слежение за перепадом входного сигнала из 1 в 0, то когда такое изменение произойдет, будет выставлен запрос на прерывание.

Прерывание по переполнению таймера. Основным блоком модуля таймера является 16 разрядный счетчик временной базы. Этот счетчик невозможно остановить. Также невозможно изменить его коэффициент счета, который составляет 216 = 65536. Поэтому регулярно счетчик временной базы изменяет свой код с $FFFF на $0000. Такое изменение кода называют переполнением счетчика. В момент переполнения по желанию программиста может генерироваться запрос на прерывание, в то время как счетчик продолжает считать дальше. Такие прерывания особенно удобны при необходимости измерения очень больших временных интервалов. Для этого в микроконтроллере производят подсчет, сколько переполнений счетчика произошло за этот временной интервал, и, зная период счета счетчика, определяют длительность исследуемого временного интервала.

Прерывание по переполнению счетчика внешних событий. Когда счетчик внешних событий переполняется, то может генерироваться запрос на прерывание точно так же, как и для счетчика временной базы.

Прерывание по событию на входе счетчика внешних событий. Этот запрос на прерывание формируется, если сигнал на входе счетчика внешних событий изменил свое значение. Характер изменения, т.е. перепад из 0 в 1, или из 1 в 0, или любое изменение логического уровня, определяется программистом.

Прерывание от модулей контроллеров последовательного ввода/вывода SCI и SPI. Каждый модуль последовательного ввода/вывода формирует целую группу запросов на прерывание: при завершении передачи слова, при приеме слова, при обнаружении различного рода нарушений в протоколе передачи информации.

Прерывание от модуля АЦП. Модуль аналого-цифрового преобразователя формирует запрос на прерывание, когда процесс оцифровки очередного сигнала завершен, и двоичный код сигнала может быть считан в память МК.

Прерывание при выходе МК из энергосберегающих режимов. Это прерывание позволяет вывести МК из состояния STOP или WAIT, в котором он находился с целью снижения потребляемой энергии. Такие прерывания очень полезны при объединении нескольких МК в информационную сеть. Мы рассмотрим этот тип прерывания более подробно в следующем параграфе.

Вопросы для самопроверки

1. Каковы различия между прерыванием и сбросом?

Ответ: И прерывание, и сброс МК вызывают принудительный останов выполнения текущей прикладной программы. Поэтому эти два состояния МК характеризуют общим термином «исключение». Сброс МК обычно вызывается нарушениями в работе узлов МК или ошибках при исполнении прикладной программы. Когда такие неисправности возникают, состояние сброса переводит МК в некоторое начальное состояние, из которого и аппаратные средства и программа могут начать правильное функционирование. Таким образом, возникшая не фатальная неисправность будет устранена. В отличие от сброса, запросы на прерывание генерируются при штатной работе микропроцессорной системы. Они используются для организации работы системы в реальном времени. Запросы могут генерироваться встроенными в МК периферийными модулями или внешними сигналами. В отличие от сброса, при обслуживании запроса на прерывание выполняется специальная подпрограмма прерывания.

2. Каково различие между маскируемыми и немаскируемыми прерываниями?

Ответ: Немаскируемое прерывание не может быть запрещено программистом. Напротив, маскируемое прерывание может быть многократно разрешено и запрещено в ходе исполнения прикладной программы.

3. Каково различие между прерываниями по входам и ?

Ответ: И , и являются входами МК для подключения внешних источников запросов на прерывания. Но прерывания по входу — маскируемые, а по входу — немаскируемые.

4. Как организовать подсистему прерывания с несколькими внешними запросами для МК семейства 68HC12/HCS12, используя лишь один вход внешнего прерывания .

Ответ: Вход внешнего прерывания обладает низким активным уровнем сигнала. Это означает, что если сигнал на этом входе изменил свое значение с 1 на 0, то в МК генерируется запрос на прерывание. Множество сигналов запросов на прерывание следует объединить по И. Кроме того, каждый из этих сигналов следует подключить к отдельному входу порта МК. Тогда, если все сигналы запросов находятся в неактивном состоянии, на выходе элемента формируется И высокий логический уровень, и вход также в находится в неактивном состоянии. Если же на одном из входов запросов устанавливается низкий логический уровень, то на входе формируется активный уровень запроса, в результате по истечении некоторого времени МК переходит к выполнению подпрограммы прерывания. В этой подпрограмме МК опрашивает последовательно все линии порта, к которым подключены сигналы внешних запросов с целью определения, какой из сигналов вызвал прерывание. Далее МК переходит на подпрограмму обслуживания именно этого запроса. Схема подключения сигналов запросов к МК по предложенному способу приведена на рис. 4.16.

4.10.3. Вектора исключений

При переходе микроконтроллера в состояние прерывания или сброса должна реализовываться некоторая внутренняя последовательность действий, которая приведет к изменению текущего состояния счетчика команд центрального процессора, т.е. к исключению. Последнее вызовет исполнение подпрограммы прерывания или программного фрагмента начального запуска МК. Причем и подпрограмма прерывания, и программный фрагмент начального запуска должны быть разными и соответствовать тому событию, которое вызвало конкретное исключение. Другими словами, МК должен обладать аппаратными средствами, которые позволят ему начать программу с адреса, который определяется источником исключения.

В МК семейства 68HC12/HCS12 начальные адреса подпрограмм прерывания и начального запуска располагаются в специальной области памяти, которая называется таблицей векторов прерывания. Таблица векторов прерывания размещается в последних 128 ячейках резидентной линейно адресуемой Flash памяти программ. Это означает, что независимо от того, каким реальным объемом резидентного ПЗУ обладает конкретная модель МК, имеет или не имеет этот МК страничную адресацию памяти программ, таблица векторов прерывания будет помещена в адресном пространстве $FF80…$FFFF. Причем, не все 128 ячеек памяти могут быть заняты векторами исключений. Объем таблицы векторов определяется числом источников прерываний и сброса в конкретной модели МК.

Адреса вектора Источник исключения Глобальная маска в регистре CCR Биты разрешения прерывания в регистрах специальных функций Значение регистра HPRIO для установления наивысшего уровня приоритета
Регистр Бит
$FFFE, $FFFF Внешний сброс нет нет нет
$FFFC, $FFFD Сброс от системы тактирования нет COPCTL CME, FCME
$FFFA, $FFFB COP нет нет COP rate selected
$FFF8, $FFF9 Сброс по несуществующему коду команды нет нет нет
$FFF6, $FFF7 Программное прерывание SWI нет нет нет
$FFF4, $FFF5 Внешнее прерывание XIRQ X нет нет
$FFF2, $FFF3 Внешнее прерывание IRQ I INTCR IRQEN $F2
$FFF0, $FFF1 Метки реального времени RTI I RTICTL RTIE $F0
$FFEE, $FFEF Канал 0 таймера I TMSK1 C0I $EE
$FFEC, $FFED Канал 1 таймера I TMSK1 C1I $EC
$FFEA, $FFEB Канал 2 таймера I TMSK1 C2I $EA
$FFE8, $FFE9 Канал 3 таймера I TMSK1 C3I $E8
$FFE6, $FFE7 Канал 4 таймера I TMSK1 C4I $E6
$FFE4, $FFE5 Канал 5 таймера I TMSK1 C5I $E4
$FFE2, $FFE3 Канал 6 таймера I TMSK1 C6I $E2
$FFE0, $FFE1 Канал 7 таймера I TMSK1 C7I $E0
$FFDE, $FFDF Переполнение счетчика таймера I TMSK1 TOI $DE
$FFDC, $FFDD Переполнение счетчика внешних событий I PACTL PAOVI $DC
$FFDA, $FFDB Событие на входе счетчика внешних событий I PACTL PAI $DA
$FFD8, $FFD9 Контроллер SPI I SP0CR1 SPIE $D8
$FFD6, $FFD7 Контроллер SCI I SP0CR2 TIE, TCIE, RIE, ILIE $D6
$FFD4, $FFD5 зарезервирован I $D4
$FFD2, $FFD3 Модуль ATD I ATDCTL2 ASCIE $D2
$FFD0, $FFD1 Модуль BDLC I BCR1 IE $D0
$FF80, $FFC1 зарезервирован I $80–$C0
$FFC2, $FFC9 зарезервирован I $C2–$C8
$FFCA, $FFCB Переполнение счетчика внешних событий B I PBCTL PBOVI $CA
$FFCC, $FFCD Переполнение счетчика I MCCTL MCZI $CC
$FFCE, $FFCF зарезервирован I $CE

Рис. 4.17. Таблица векторов сброса и прерывания для МК MC68HC912B32


На рис. 4.17 приведен формат таблицы векторов прерываний для МК B32. В первой колонке приведены адреса двух ячеек памяти, в которых должен располагаться двухбайтовый адрес начала подпрограммы прерывания или сброса. Во второй колонке указан источник события исключения, подпрограмма обслуживания которого должна начинаться с адреса, записанного в соответствующих ячейках памяти. Если, например, на входе внешнего запроса будет установлен низкий логический уровень, и МК перейдет к обслуживанию прерывания поэтому запросу, то аппаратные средства МК считают 16-разрядный код из ячеек памяти с адресами $FFF2, $FFF3 и передадут его в счетчик адреса PC центрального процессора. Так начнет исполняться подпрограмма прерывания по внешнему запросу . В третьей колонке таблицы рис. 4.17 указан бит глобальной маски для каждого источника исключения. Обратите внимание, что все источники сброса и программное прерывание по команде SWI невозможно запретить под управлением программы. Остальные прерывания могут быть запрещены либо X–, либо I-битом в регистре признаков CCR центрального процессора. Причем установленный в 1 бит I запрещает сразу все прерывания, напротив которых он упомянут в таблице. Поэтому этот бит и носит название глобальной маски прерывания. В колонках 4 и 5 приведены имена регистров специальных функций и битов этих регистров, которые являются битами разрешения для соответствующих запросов на прерывание. Эти биты позволяют разрешить или запретить прерывание только от одного источника запроса. Для того чтобы запрос на прерывание поступил в центральный процессор, необходимо, чтобы глобальная маска прерывания I была сброшена, и бит разрешения соответствующего прерывания был установлен в 1. Например, с помощью таблицы рис. 4.17 можно получить справку о том, что прерывание по внешнему запросу будет разрешено, если бит разрешения внешнего прерывания IRQEN в регистре управления прерываниями INTCR будет установлен в 1, а бит глобальной маски прерывания I в 0. Формат регистра управления внешним прерыванием INTCR приведен на рис. 4.18. Последняя колонка таблицы рис. 4.17 содержит шестнадцатеричный код, который необходимо загрузить в регистр HPRIO для того, чтобы назначить соответствующему запросу наивысший уровень приоритета.

Рис. 4.18. Формат регистра INTCR


Внимательный читатель должен был заметить, что адреса ячеек памяти, в которых располагаются вектора исключений, находятся в защищенной области памяти. Эту область памяти невозможно стереть и затем занести в нее новые вектора. Для того чтобы программист в процессе отладки все-таки имел возможность использования подсистемы прерывания с произвольными векторами входа в подпрограммы, в отладочном режиме работы МК семейства 68HC12/HCS12 используют дополнительную таблицу векторов, которая располагается в незащищенной области памяти. Соответствие адресов таблиц векторов прерывания в отладочном и пользовательском режиме работы приведено на рис. 4.19. На рис. 4.19 представлены альтернативные адреса размещения векторов прерываний для МК MC68HC912B32. В других моделях МК альтернативная таблица может располагаться в области ОЗУ, поскольку она предназначена только для целей отладки.

Адреса вектора Источник исключения Адрес передачи управления
$FFC0–$FFCF зарезервирован $F7C0–$F7CF
$FFD0 Модуль BDLC $F7D0
$FFD2 Модуль ATD $F7D2
$FFD4 зарезервирован $F7D4
$FFD6 Контроллер SCI $F7D6
$FFD8 Контроллер SPI $F7D8
$FFDA Событие на входе счетчика внешних событий $F7DA
$FFDC Переполнение счетчика внешних событий $F7DC
$FFDE Переполнение счетчика таймера $F7DE
$FFE0 Канал 7 таймера $F7E0
$FFE2 Канал 6 таймера $F7E2
$FFE4 Канал 5 таймера $F7E4
$FFE6 Канал 4 таймера $F7E6
$FFE8 Канал 3 таймера $F7E8
$FFEA Канал 2 таймера $F7EA
$FFEC Канал 1 таймера $F7EC
$FFEE Канал 0 таймера $F7EE
$FFF0 Метки реального времени RTI $F7F0
$FFF2 Внешнее прерывание IRQ $F7F2
$FFF4 Внешнее прерывание XIRQ $F7F4
$FFF6 Программное прерывание SWI $F7F6
$FFF8 Сброс по несуществующему коду команды $F7F8
$FFFA COP $F7FA
$FFFC Сброс от системы тактирования $F7FC
$FFFE Внешний сброс $F7FE

Рис. 4.19. Таблица адресов, которым передается управление исключениями в пользовательском и отладочном режимах работы МК

4.10.4. Система приоритетов для исключений

Среди представленного множества событий, которые могут вызвать исключения, ряд событий обладают большей значимостью для системы, чем другие. В микропроцессорной технике значимость события характеризуют термином «приоритет». События большей значимости обладают более высоким приоритетом. Рассматривая множество исключений для 68HC12/HCS12, можно отметить, что все немаскируемые источники исключений по умолчанию наделены более высоким приоритетом, нежели маскируемые. Поэтому, если в один и тот же момент времени поступят два запроса, то первым будет обслужен немаскируемый запрос, который обладает более высоким приоритетом. Затем будет выполнена подпрограмма обслуживания запроса с низшим приоритетом, в нашем случае этот запрос маскируемый.

Немаскируемые запросы исключений также ранжируются по приоритету. В приведенном ниже списке приоритет событий снижается с увеличением номера записи:

1. Внешний сброс по входу или сброс по нарастанию напряжения питания POR;

2. Сброс по монитору системы тактирования;

3. Сброс по переполнению сторожевого таймера COP;

4. Программное прерывание SWI;

5. Немаскируемое прерывание по входу .

Очередность приоритетов маскируемых прерываний отображена на рис. 4.17. Чем выше строка источника события в таблице векторов, тем выше его приоритет. Однако приоритет маскируемого прерывания может быть повышен посредством записи соответствующей комбинации битов в регистр уровня приоритета HPRIO. Код, который следует записать в регистр HPRIO для назначения выбранному источнику запросов наивысшего приоритета среди маскируемых прерываний, приведен в последней колонке таблицы рис. 4.17. Следует помнить, что изменение кода в регистре HPRIO возможно только при единичном значении глобальной маски прерываний I, т.е. когда маскируемые прерывания запрещены. После повышения уровня прерывания какого либо запроса остальные источники запросов сохраняют приведенное в таблице векторов прерываний рис. 4.17 распределение приоритетов.

Вопросы для самопроверки

1. Какой код должен быть записан в регистр HPRIO, чтобы приоритет прерывания от аналого-цифрового преобразователя стал наивысшим среди маскируемых прерываний?

Ответ: Код $D2 следует записать в регистр уровня приоритета HPRIO.

2. Приведите запись выражения на Си, которое реализует действие вопроса 1.

Ответ: HPRIO = 0xD2

3. Как изменятся приоритеты немаскируемых и маскируемых исключений после изменения приоритета прерывания от модуля АЦП в результате действий вопроса 1 или 2?

Ответ: Приоритеты немаскируемых исключений останутся без изменения. Приоритеты все маскируемых прерываний, кроме АЦП, понизятся на один уровень, но при этом по отношению друг к другу их приоритеты не изменятся.

4. Какие действия должен предпринять программист, чтобы после начального запуска МК присвоить входу наивысший приоритет среди маскируемых прерываний?

Ответ: Никаких. В соответствие с таблицей приоритетов на рис. 4.17 вход автоматически имеет наивысший приоритет среди маскируемых запросов.

4.10.5. Регистры подсистемы прерывания

Два регистра специальных функций используются для задания режимов подсистемы прерывания:

• INTCR — регистр управления внешним прерыванием по входу ;

• HPRIO — регистр уровня приоритета.

Формат регистра INTCR приведен на рис. 4.18. Для того чтобы разрешить прерывание по входу , необходимо командой CLI сбросить глобальную маску прерывания I в регистре признаков CCR центрального процессора и установить в 1 бит разрешения внешнего прерывания IRQEN в регистре INTCR (бит 6). Бит 7 регистра INTCR, именуемый IRQE, конфигурирует линию на прием запроса при низком уровне сигнала (при IRQE = 0) или только по перепаду сигнала с 1 на 0 (при IRQE = 1). В первом случае, если активный низкий уровень на входе установлен и поддерживается внешним устройством после завершения исполнения подпрограммы прерывания, МК воспримет такую ситуацию как новый запрос и снова перейдет к исполнению подпрограммы прерывания. Так будет продолжаться до тех пор, пока на входе внешнего прерывания не установится логическая 1. Во втором случае, когда внешнее событие фиксируется только по перепаду сигнала из 1 в 0, в аналогичных условиях будет распознан только один запрос на прерывание, соответственно и подпрограмма прерывания будет исполнена только один раз.

Рис. 4.20. Формат регистра HPRIO


Регистр уровня приоритета HPRIO предназначается для изменения уровня приоритета одного из источников маскируемых прерываний. Формат регистра HPRIO приведен на рис. 4.20. Если в регистр записать число, которое указано в правой колонке таблицы рис. 4.17, то соответствующий запрос получит наивысший приоритет среди группы маскируемых прерываний. В состоянии сброса МК регистр HPRIO устанавливается в $F2, что соответствует наивысшему уровню приоритета для запроса от внешнего устройства по входу , что и отражено в таблице векторов рис. 4.17.

4.11. Процесс перехода к подпрограмме прерывания

На рис. 4.12 показана последовательность действий МК семейства 68HC12/HCS12 по обработке запроса на прерывание, начиная с момента поступления запроса и заканчивая возвратом из подпрограммы прерывания к продолжению исполнения основной программы. При изучении механизма перехода к подпрограмме прерывания и возврата из нее Вам следует обратить внимание на то, какие действия совершаются аппаратными средствами МК, т.е. автоматически, а какие требуют программной поддержки, т.е. должны сопровождаться написанием специального программного кода.

Первый шаг при разработке прикладной программы, которая будет содержать подпрограммы прерывания, — создание в памяти таблицы векторов прерываний. Для этого в ячейки памяти с указанными в техническом описании МК адресами должны быть помещены адреса начала соответствующих подпрограмм прерывания. При написании исходного текста программы начальные адреса подпрограмм прерывания могут быть указаны в абсолютных значениях, т.е. в численном виде. Однако это неудобно при отладке программы, когда в результате исправления ошибок эти адреса будут изменяться. Поэтому более грамотно указывать в таблице векторов прерывания символьные имена подпрограмм прерывания. При программировании на ассемблере для этой цели обычно используется псевдокоманда Ассемблера «DW».

Второй шаг при разработке программы с прерываниями — инициализация начального значения указателя стека SP. Область стека используется микроконтроллером для хранения значений регистров центрального процессора во время исполнения подпрограммы прерывания. В МК семейства 68HC12/HCS12 при пересылке данных в память указатель стека сначала уменьшается на единицу, и только затем содержимое какого либо регистра загружается в память по новому адресу из SP. Поэтому начальное значение указателя стека должно быть равно увеличенному на единицу адресу последней ячейки в области стека. При программировании на Си программист обязан указать диапазон адресов области стека в опциях конфигурирования компилятора. Старший адрес этого диапазона будет загружен в указатель стека при исполнении файла Start.с.

Третий шаг — разрешить прерывания по выбранным источникам запросов. Это действие выполняется в два этапа. Сначала следует установить биты разрешения прерывания от каждого выбранного источника в соответствующем регистре специальных функций. Например, для прерывания от АЦП, должен быть установлен бит IRQEN в регистре INTCR. На втором этапе необходимо сбросить глобальную маску прерывания I в регистре признаков CCR. При программировании на ассемблере следует использовать команду «CLI».

После того, как указатель стека инициализирован и прерывания разрешены, пишется текст основной программы, которая будет являться фоновой программой. Поступление запроса на прерывание во время исполнения фоновой программы вызывает в микроконтроллере определенную последовательность действий (рис. 4.21), которую принято называть процессом перехода к подпрограмме прерывания.

Рис. 4.21. Последовательность действий МК при обслуживании запроса на прерывание


Наиболее вероятно, что запрос поступит в момент, когда центральный процессор уже начал, но еще не завершил исполнение очередной команды. В большинстве случаев исполнение текущей команды будет завершено, в счетчике PC будет сформирован адрес следующей команды основной программы, и только затем МК начнет процедуру перехода к подпрограмме прерывания. В отличие о других, МК семейства 68HC12/HCS12 обладают рядом специфических команд, время исполнения которых значительно превышает время исполнения традиционных команд ассемблера. К таким командам относятся инструкции нечеткой логики REV, REVW, WAV, которые могут потребовать для своего выполнения несколько сот циклов центрального процессора. Поэтому, при возникновении запроса, исполнение этих команд будет прервано с сохранением промежуточных результатов. Завершение исполнения инструкции произойдет после выполнения подпрограммы прерывания. Центральный процессор МК семейства 68HC12/HCS12 оснащен двухступенчатым конвейером команд. Это означает, что во время исполнения текущей команды регистры конвейера команд хранят выбранные из памяти коды двух следующих команд. Когда запрос на прерывание поступает, нормальный порядок исполнения команд фоновой программы нарушается. Поэтому хранящиеся в конвейере команд коды становятся бесполезными, и конвейер автоматически очищается. После этого в счетчике команд автоматически восстанавливается адрес первой не исполненной команды фоновой программы, к которой МК должен будет вернуться после прерывания. Далее содержимое программного счетчика PC и других регистров центрального процессора сохраняется в стеке. Последовательность загрузки в стек следующая (рис. 4.22): старший байт счетчика команд PCH, младший байт счетчика команд PCL, старший YH и младший YL байты индексного регистра Y, старший XH и младший XL байты индексного регистра X, аккумулятор B, аккумулятор A, регистр признаков CCR. Важно, что это сохранение выполняется микроконтроллером автоматически, никаких команд в подпрограмме прерывания для этого не требуется.

Адрес ячейки памяти Содержимое ячейки стека
Указатель стека – 2 Старший байт адреса возврата; младший байт адреса возврата
Указатель стека – 4 Старший байт регистра Y; младший байт регистра Y
Указатель стека – 6 Старший байт регистра X; младший байт регистра X
Указатель стека – 8 Аккумулятор B; Аккумулятор A
Указатель стека – 9 Регистр состояния CCR

Рис. 4.22. Последовательность загрузки регистров центрального процессора в стек


После того, как регистры будут сохранены в стеке, МК автоматически устанавливает глобальную маску прерывания I в 1, запрещая тем самым другие маскируемые прерывания. Бит маски внешнего прерывания по входу также устанавливается в 1.

Поэтому подпрограмма прерывания не может быть прервана даже немаскируемым внешним прерыванием. Далее в программный счетчик центрального процессора автоматически загружается адрес начала подпрограммы прерывания. Этот адрес извлекается из ячеек памяти таблицы векторов прерывания. Выбор необходимого адреса внутри таблицы векторов осуществляется аппаратными средствами микроконтроллера. Этот адрес соответствует источнику обрабатываемого прерывания.

По завершении исполнения подпрограммы прерывания, МК восстанавливает регистры центрального процессора из стека, включая программный счетчик PC, сбрасывает биты масок I и X в регистре CCR. Таким образом, в МК восстанавливается состояние центрального процессора, которое было до исполнения подпрограммы прерывания. И процесс выполнения фоновой программы возобновляется. В исходном тексте подпрограммы прерывания для ее корректного завершения записывается команда возврата из прерывания RTI. Именно эта команда реализует действия по восстановлению регистров из стека и сбросу масок прерывания. Обратите внимание, в начале подпрограммы прерывания для выгрузки регистров в стек и установки масок I и X не требуется команд. А для выполнения обратных действий программист должен воспользоваться командой RTI. При написании программы на Си подпрограмма прерывания оформляется как функция. При этом если объявлено, что функция является подпрограммой прерывания, то команда ассемблера RTI подставляется в исходный текст автоматически. Мы рассмотрим процесс составления исходного текста программы с прерываниями на Си в следующем параграфе.

Вопросы для самопроверки

1. В приведенном списке перечислены действия МК в процессе перехода к подпрограмме прерывания. Укажите, какие действия выполняются аппаратными средствами МК, а какие требуют написания соответствующего кода в управляющей программе.

• Инициализация таблицы векторов прерываний (программист);

• Инициализация указателя стека (программист);

• Разрешение прерываний в системе (программист);

• Завершение выполнения текущей команды (МК);

• Обнуление регистров конвейера команд (МК);

• Вычисление адреса возврата в основную программу (МК);

• Запоминание состояния регистров в стеке (МК);

• Установка в 1 бита I (МК);

• Загрузка из памяти вектора прерывания с максимальным приоритетом (МК);

• Передача управления подпрограмме прерывания (МК);

• Сброс сигнала запроса обслуживаемого прерывания (программист или МК, в зависимости от источника прерывания);

• Восстановление регистров центрального процессора из стека (программист командой RTI);

• Сброс маски I (МК);

• Возврат к исполнению основной программы (МК).

2. Каким образом МК семейства 68HC12/HCS12 определяет приоритет обслуживаемого запроса на прерывание?

Ответ: Последовательность расположения источников запросов в таблице векторов прерывания определяет их приоритет.

3. Часто в основной программе, которая содержит подпрограммы прерывания, одной из первых команд является команда SEI. Объясните почему?

Ответ: Простановка команды запрета маскируемых прерываний SEI в начале программы — своеобразный «хороший тон» при программировании. Эта команда запрещает прерывания во время инициализации периферии МК, т.е. когда МК находится в процессе создания своей внутренней структуры для решения конкретной задачи. Когда инициализация будет завершена, программист разрешит прерывания командой CLI.

4. Зачем МК семейства 68HC12/HCS12 очищает конвейер команд при прерываниях?

Ответ: При переходе на подпрограмму прерывания инструкции, коды которых хранятся в регистрах конвейера команд, будут отложены для исполнения. Поэтому их коды не сохраняются, и конвейер команд начинает выборку следующих за первой команд подпрограммы прерывания.

4.12. Оформление подпрограммы прерывания на Си

В данном параграфе мы рассмотрим основные особенности формирования исходного текста программы с прерываниями на Си. Конкретные примеры последуют позднее при рассмотрении конкретных устройств управления. На протяжении всех этих примеров мы будем использовать синтаксис компилятора ImageCraft ICC12. При использовании других компиляторов Вы встретитесь с теми же особенностями программирования. Возможно, что их реализация будет сопровождаться некоторыми другими правилами записи (синтаксиса) исходного текста программы.

При программировании на Си Вы должны обязательно реализовать следующие этапы записи исходного текста:

1. При написании программы обработки прерывания на Си, имя подпрограммы обработки прерывания должно быть объявлено с использованием специальной директивы препроцессора. В компиляторе ImageCraft ICC12 для этой цели следует использовать директиву #pragma:

#pragma interrupt_handler 

В поле следует записать имя подпрограммы прерывания, которое Вы будете далее использовать в тексте программы. Приведенная запись информирует компилятор о том, что функция с названным именем является подпрограммой прерывания.

2. Далее по тексту подпрограмма прерывания оформляется как обычная функция. Компилятор в процессе перевода исходного текста этой функции на Си в инструкции ассемблера автоматически подставит в конце подпрограммы команду возврата из прерывания RTI, потому что эта функция была объявлена подпрограммой прерывания (директива #pragma на этапе 1).

3. Для правильного функционирования МК в процессе прерывания необходимо инициализировать указатель стека. Его значение должно быть равно старшему адресу области оперативной памяти МК, увеличенному на единицу. Поскольку диапазоны памяти пользователя (как постоянной, так и оперативной) являются необходимыми установками в конфигурации компилятора, то функция инициализации указателя стека выполняется компилятором автоматически. Поэтому программист не должен записывать какой либо текст в программе для инициализации указателя стека. Зато следует проверить карту памяти в установках компилятора, которая обязательно должна совпадать с реальной проектируемой системой.

4. Подсистема прерывания будет функционировать корректно, если для нее сформирована таблица векторов прерывания. Мы уже обсуждали, что таблица векторов прерывания в МК B32 находится в области Flash-памяти, которая защищена от перезаписи информации. Для того, чтобы пользователь имел возможность записать собственную таблицу векторов сброса и прерывания, в эту нестираемую область памяти записаны фиксированные вектора, которые передают управление по известным адресам в области перезаписываемой EEPROM памяти (см. рис. 4.19). По этим адресам программист должен вписать команду безусловного перехода JMP с адресом соответствующей подпрограммы обработки прерывания.

5. Каждый маскируемый источник запроса на прерывание должен быть разрешен установкой соответствующего бита в регистре управления периферийного модуля. Мы рассмотрим, как это записать на Си в последующих примерах.

6. После установки всех индивидуальных битов на разрешение прерывания, необходимо сбросить глобальную маску прерывания I. На ассемблере для этого используют команду CLI. При программировании на Си мы также воспользуемся этой командой, посредством следующих макросов:

#define CLI() asm("cli\n"); //разрешить маскируемые прерывания

#define SEI() asm("sei\n"); //запретить маскируемые прерывания

Далее по тексту программы, если необходимо разрешить прерывания, то следует ввести CLI().

Ниже приведен пример инициализации подсистемы прерывания. Полную запись исходного текста программы с прерываниями мы рассмотрим после обсуждения модуля таймера.


//объявление функции в модуле

void toggle_isr(void);


//директива #pragma для указания, что функция является подпрограммой 

//обслуживания прерывания

#pragma interrupt_handler toggle_isr


//инициализация соответствующего вектора в таблице векторов прерываний

#pragma abs_address: 0xF7EA 


//В32 RAМ based vector address

void (*Timer_Channel_2_interrupt_vector[])()={toggle_isr}; 

#pragma end_abs_address

4.13. Система тактирования

Микроконтроллеры семейства 68HC12/HCS12 имеют в своем составе модуль генератора CGM (Clock Generation Module), который генерирует импульсные последовательности для тактирования центрального процессора, межмодульных магистралей, периферийных модулей в составе МК, а также внешние периферийные интегральные схемы. Структурная схема модуля CGM представлена на рис. 4.23.

Рис. 4.23. Структура модуля тактирования CGM


Микроконтроллеры семейства 68HC12/HCS12 используют три внутренних сигнала тактирования: TCLK, ECLK и PCLK. Эти сигналы образуются путем деления эталонной импульсной последовательности внутреннего генератора с внешним кварцевым резонатором. Сигнал TCLK предназначен для тактирования центрального процессора, импульсные последовательности ECLK и PCLK используются для тактирования межмодульных магистралей и различных периферийных модулей (рис. 4.23). Модуль тактирования CGM микроконтроллера B32 оснащен также дополнительным делителем, который позволяет существенно снизить частоту одной из импульсных последовательностей тактирования. Низкая частота тактирования таймерных модулей в некоторых применениях позволяет значительно упростить управляющую программу.

4.13.1.Система тактирования отладочной платы MC68HC912B32EVB

Микроконтроллер в составе платы отладки MC68HC912B32EVB тактируется от внешнего кварцевого резонатора с частотой 16 МГц. В модуле генератора CGM эта частота делится на 2, образуя импульсную последовательность для тактирования центрального процессора и межмодульных магистралей микроконтроллера с частотой 8 МГц. Эта же импульсная последовательность используется для тактирования всех периферийных модулей микроконтроллера: таймера, контроллеров последовательного обмена, АЦП. Многие периферийные модули обладают собственным делителем частоты. Этот делитель позволяет создать собственную внутреннюю частоту тактирования модуля, которая может не коррелироваться с частотами других модулей. Это удобно при проектировании.

Кварцевый резонатор может быть отключен от входа МК посредством переключателей на плате MC68HC912B32EVB. Вместо кварцевого резонатора для тактирования МК может быть использован внешний генератор или керамический резонатор. Последний обладает меньшей, чем кварцевый резонатор, стабильностью частоты, однако он является более дешевым компонентом. Мы не будем вносить каких-либо изменений в схемотехнику платы MC68HC912B32EVB. Поэтому далее на протяжении всей книги частота внутренней шины и центрального процессора МК будет составлять 8 МГц. Частота внутренней шины МК может быть понижена дополнительным делителем модуля CGM (рис. 4.23). Его коэффициент деления назначается под управлением программы и может составлять 1, 2, 4, …, 128. Для выбора желаемого коэффициента деления необходимо записать соответствующий таблице рис. 4.24 код в разряды SLDV2…SLDV0 регистра управления дополнительным делителем SLOW. Формат этого регистра приведен на рис. 4.24.

Выбор пониженной частоты межмодульных магистралей МК

SLDV[2:0] Коэффициент деления 2х При частоте внешнего кварцевого резонатора
16 МГц 8 МГц 4 МГц
000 1 8 МГц 4 МГц 2 МГц
001 2 4 МГц 2 МГц 1 МГц
010 4 2 МГц 1 МГц 500 кГц
011 8 1 МГц 500 кГц 250 кГц
100 16 500 кГц 250 кГц 125 кГц
101 32 250 кГц 125 кГц 62,5 кГц
110 64 125 кГц 62,5 кГц 31,2 кГц
111 128 62,5 кГц 31,2 кГц 15,6 кГц

Рис. 4.24. Формат регистра SLOW


Вы можете заинтересоваться, а зачем понижать частоту тактирования МК? Ведь тогда снизится его вычислительная производительность. Дело в том, что энергия потребления МК пропорциональна частоте его тактирования. Поэтому для достаточно медленных приложений, которые не требуют большой вычислительной производительности, частоту тактирования можно снизить ради экономии энергопотребления устройства управления. Понижение частоты тактирования возможно также для формирования таймерами необходимых временных интервалов. Например, если снизить частоту тактирования до 62,5 КГц (SLDV2…SLDV0 = 111), то период переполнения счетчика временной базы будет составлять около 1 с.

4.14. Подсистема реального времени — модуль таймера

Подсистема реального времени МК семейства 68HC12/HCS12 включает основной таймерный модуль, который имеет две модификации — TIM и ECT, и отдельный таймер меток реального времени.

Структура модуля таймера TIM (Timer Interface Module) ориентирована на реализацию трех основных функций:

Входного захвата (IC — Input Capture). Функция входного захвата позволяет производить измерения временных параметров сразу нескольких импульсных сигналов на входах МК. Подсистема входного захвата может быть настроена на измерение длительности единичного или нулевого состояния на входе порта (рис. 4.25, а), а также периода, коэффициента заполнения или частоты периодического импульсного сигнала (рис. 4.25, б).

(а)

(б)

Рис. 4.25. Временные характеристики ШИМ сигнала


Выходного сравнения (OC — Output Compare). Функция выходного сравнения позволяет МК генерировать на нескольких выходах импульсные последовательности с заданными временными характеристиками, такими, как период и коэффициент заполнения для повторяющихся сигналов, длительность единичного или нулевого состояния для неповторяющихся сигналов.

Счетчика внешних событий (PA — Pulse Accumulator). Основная функция этого счетчика — подсчет импульсов (внешних событий) на одном из входов МК. Он также может быть использован для измерения временных параметров внешнего импульсного сигнала большой длительности.

Для реализации функций входного захвата/выходного сравнения (IC/OC) модуль таймера TIM использует восемь идентичных аппаратных блоков, которые принято называть каналами. Каждый из каналов посредством программных установок настраивается на реализацию режима входного захвата или выходного сравнения независимо от режима работы других каналов модуля таймера. Каждый из каналов использует общий счетчик временной базы для фиксации моментов наступления событий. Параллельная работа всех восьми каналов с одним счетчиком временной базы не вносит погрешностей в формируемые или измеряемые временные интервалы, поскольку фиксация этих интервалов реализуется на аппаратном уровне с последующим программным обслуживанием каналов по прерываниям. Каждый канал связан с одной из линий порта PORT Т. Счетчик событий PA в составе модуля TIM также связан с линией 7 порта PORT T. Поэтому линии 0…6 порта PORT T в подсистеме таймера могут использоваться или как входы IC, или как выходы OC, в то время как линия 7 порта PORT T кроме этих двух функций IC/OC может также использоваться как вход тактовых импульсов для счетчика внешних событий.

4.14.1. Структура модуля таймера

Структурная схема модуля таймера представлена на рис. 4.26. При ее первичном рассмотрении она кажется запутанной и сложной. Для облегчения понимания мы выделим в составе таймера три блока: блок счетчика временной базы (1), восемь каналов с функциями IC/OC (2), блок счетчика внешних событий (3). Далее мы рассмотрим каждый из этих блоков отдельно, и для каждого из них приведем более понятные структурные схемы.

Рис. 4.26. Структура модуля таймера

4.14.2. Счетчик временной базы

Основным блоком модуля таймера TIM является 16 разрядный счетчик временной базы TCNT, структурная схема которого представлена на рис. 4.27. Текущий код счетчика используется всеми каналами захвата/сравнения в качестве отсчета момента реального времени. Именно поэтому этот счетчик и называют счетчиком временной базы. Этот счетчик также называют свободно считающим счетчиком. Определение «свободно считающий» отражает следующую особенность работы счетчика. Если работа модуля таймера разрешена, то счетчик временной базы производит непрерывный счет, начиная с минимального кода $0000 до максимального кода $FFFF. При поступлении следующего тактового импульса код счетчика изменяется с $FFFF на $0000. Далее счет продолжается в порядке нарастания кода. Невозможно остановить счетчик под управлением программы, так же как и изменить коэффициент счета счетчика, равный 216. Текущее состояние счетчика отображается в двух 8-разрядных регистрах: TCNTH — старший байт счетчика, TCNTL — младший байт счетчика. В карте памяти МК эти регистры располагаются по следующим адресам: $0084 — TCNTH, $0085 — TCNTL. Вместе оба этих регистра составляют 16-разрядный регистр текущего состояния счетчика временной базы TCNT. Имя TCNT обычно объявляется в заголовочном файле.

Рис. 4.27. Структура и регистры управления счетчика временной базы модуля таймера


Особенности счетчика временной базы

Счетчик временной базы тактируется импульсной последовательностью с выхода мультиплексора MUX. Ко входам мультиплексора подключены четыре источника тактирования: основная импульсная последовательность с выхода делителя частоты и дополнительные сигналы PACLK, PACLK/256, PACLK/65536. На вход программируемого делителя частоты подключен сигнал PCLK с выхода подсистемы тактирования. Частота следования импульсов на линии PCLK равна частоте тактирования межмодульных магистралей МК. Коэффициент деления программируемого делителя частоты определяется разрядами PR2…PR0 регистра масок таймера 2 (TMSK2). Формат регистра TMSK2 приведен на рис. 4.27. Таблица соответствия численного значения коэффициента деления двоичной комбинации разрядов PR2…PR0 представлена на рис. 4.28.

PR[2:1:0] Коэффициент деления
000 1
001 2
010 4
011 8
100 16
101 32
110 зарезервирован
111 зарезервирован

Рис. 4.28. Выбор коэффициента программируемого делителя для счетчика временной базы


Величина коэффициента деления определяет длительность периода переполнения счетчика временной базы. Поскольку разрядность счетчика равна 16, то коэффициент счета этого двоичного счетчика равен 216 или 65356. Минимальный период переполнения счетчика составляет 8169 мс (216 импульсов × 1/8 МГц), поскольку максимальная частота импульсной последовательности PCLK, равная частоте тактирования межмодульных магистралей, составляет 8 МГц. Однако при задании максимального коэффициента деления, равного 32 (см. таблицу рис. 4.28), период переполнения счетчика составит уже 262424 мс (216 импульсов × 32/8 МГц).

В некоторых приложениях необходимо формировать временные интервалы, значительно превышающие приведенные расчетные значения. Этого можно достигнуть путем снижения частоты тактирования счетчика временной базы.

Однако уменьшение частоты импульсной последовательности PCLK связано со снижением производительности процессорного ядра. Поэтому для счетчика временной базы предусмотрены три альтернативных источника тактирования PACLK, PACLK/256, PACLK/65536. Выбор одного из четырех источников тактирования осуществляется двухразрядным кодом CLK1:CLK0 в регистре управления счетчиком внешних событий PACL. Формат регистра PACL представлен на рис. 4.27.

Флаг переполнения счетчика

Если длительность измеряемых или формируемых микроконтроллером временных интервалов превышает период переполнения счетчика временной базы, то возникает необходимость в подсчете числа периодов переполнения этого счетчика. При достижении максимального кода $FFFF счетчик не останавливается, он продолжает считать дальше. Поэтому при поступлении следующего тактового импульса в счетчике установится код $0000. Такое изменение кода называется событием переполнения счетчика и фиксируется установкой бита TOF в регистре управления счетчиком TFLG2 (рис. 4.27). Триггер TOF называют триггером переполнения счетчика. Этот триггер может быть считан под управлением программы, или, если прерывания по событию переполнения счетчика разрешены, то установленный в 1 триггер TOF генерирует запрос на прерывание. Прерывание по переполнению счетчика временной базы имеет свой собственный вектор и собственный бит разрешения прерывания TOI в регистре TMSK2 (рис. 4.27).

Если код счетчика временной базы изменился с $FFFF на $0000, то триггер TOF устанавливается в 1. При использовании этого флага для вызова прерываний следует позаботиться о том, чтобы флаг был сброшен под управлением подпрограммы прерывания до наступления следующего переполнения таймера. Для сброса (установки в 0) флага TOF следует записать 1 в бит 7 регистра TMSK2, т.е. выполнить любую команду установки в 1 этого флага. Вышесказанное не ошибка! Большинство флагов регистров специальных функций МК семейства 68HC12/HCS12, генерирующих разнообразные запросы на прерывание, сбрасываются в 0 посредством записи 1 в находящийся в состоянии 1 бит флага. Мы обсудим ниже варианты программного кода, которые могут быть использованы для сброса различных флагов, в том числе и флага переполнения счетчика временной базы.

Если в прикладной задаче необходимо измерить временной интервал, значительно превышающий по длительности период переполнения счетчика временной базы, то следует организовать дополнительный счетчик в одной из ячеек памяти. Содержимое этого счетчика будет инкрементироваться подпрограммой прерывания при каждом переполнении счетчика.

Определение длительности временных интервалов

Во многих приложениях возникает необходимость определения длительности временного интервала между двумя изменениями сигнала на одной из линий порта. Эта задача может быть решена двумя способами.

При первом способе счетчик временной базы сбрасывается в момент первого изменения сигнала. Обнуление счетчика можно произвести в подпрограмме прерывания по событию входного захвата, которое соответствует первому изменению исследуемого сигнала. В этой же подпрограмме подсистема входного захвата перепрограммируется на детектирование второго события в исследуемом сигнале. Счетчик временной базы продолжает наращивать код. В момент второго изменения сигнала, которое фиксирует подсистема входного захвата, текущий код счетчика запоминается в специальном двухбайтовом регистре. Если в процессе слежения за сигналом переполнений счетчика временной базы не было, то запомненный код и есть искомая длительность временного интервала, выраженная в числе периодов частоты тактирования счетчика временной базы.

При втором способе счетчик временной базы считает непрерывно, он никогда принудительно не обнуляется. В момент первого изменения сигнала подсистема входного захвата запоминает текущее значение кода счетчика временной базы в регистре и генерирует запрос на прерывание. В подпрограмме прерывания по событию входного захвата этот двухбайтовый код программно считывается и запоминается в оперативной памяти МК под именем Start. В этой же подпрограмме подсистема входного захвата перенастраивается на детектирование второго изменения сигнала. Когда это событие происходит, подсистема входного захвата опять запоминает новое текущее значение кода счетчика временной базы и генерирует запрос на прерывание. В подпрограмме прерывания новый код счетчика запоминается под именем Stop. Если в процессе слежения за сигналом переполнений счетчика временной базы не было, то искомая длительность временного интервала, выраженная в числе периодов частоты тактирования счетчика временной базы, определяется как (Stop – Start).

а) Вариант 1: Код Stop > Код Start, переполнений счетчика временной базы за время измерения не было

б) Вариант 2: Код Start > Код Stop, за время измерения было одно переполнение счетчика временной базы

в) Вариант 3: Код Stop > Код Start, за время измерения было N переполнений счетчика временной базы

г) Вариант 4: Код Start > Код Stop, за время измерения было N переполнений счетчика временной базы

д) Вариант 5: Код Start = Код Stop, за время измерения было N переполнений счетчика временной базы

Рис. 4.29. Диаграммы, поясняющие преобразования кодов для расчета длительности измеряемого временного интервала


Опытный разработчик всегда использует второй способ. По отношению к первому способу он обладает двумя преимуществами:

• Необходимое в первом способе обнуление счетчика может вызвать нарушение правильной работы других каналов таймера, которые также используют для отсчета временных интервалов код счетчика временной базы. Второй способ не нарушает естественный порядок счета счетчика временной базы, и, следовательно, создает «комфортные» условия для работы оставшихся семи каналов модуля таймера.

• Второй способ обладает большей точностью. При первом способе момент первого изменения сигнала отмечается нулевым кодом счетчика, который будет установлен только после перехода к подпрограмме прерывания. Этот процесс может занять от 10 до 20 тактов fBUS. При втором способе аппаратные средства подсистемы входного захвата фиксируют первое изменение сигнала аппаратно, и ошибка не будет составлять более одного такта fBUS.

Рассмотрим более подробно вычисление реальной длительности измеряемого сигнала по второму способу. На рис. 4.29 показаны пять возможных ситуаций, в которых подсистемой входного захвата зафиксированы совершенно одинаковые коды начала и конца измеряемого временного интервала. В первом случае (рис. 4.29,а) код Stop превышает код Start, и переполнений счетчика временной базы не было. Тогда очевидно, что измеряемая длительность временного интервала TIME = Stop – Start. Во втором случае (рис. 4.29,б) код Stop меньше, чем код Start, и между изменениями сигнала было всего одно переполнение счетчика временной базы:

TIME = (216Start) + Stop = 216 + (Stop Start)

Рассмотрев остальные случаи (рис. 4.29, в,г,д), можно убедиться, что в каждом из случаев расчет искомого временного интервала следует вести по формуле:

TIME = 216 × n + (Stop Start),

где n — число переполнений счетчика временной базы, которое случилось между двумя событиями фиксации изменения сигнала подсистемой входного захвата.

Код TIME отражает длительность временного интервала в периодах частоты тактирования счетчика временной базы. Во многих прикладных задачах вычисление реальной длительности в миллисекундах или секундах не производится. Если же это необходимо, то МК должен выполнить дополнительную операцию умножения:

tIZM = TIME × (TCNTclock),

где TCNTclock — период частоты тактирования счетчика временной базы.

Сброс счетчика временной базы

Как было отмечено выше, сброс счетчика временной базы крайне нежелателен, поскольку он нарушает естественный порядок счета и может привести к ошибкам в работе подсистем входного захвата или выходного сравнения IC/OC, которые в момент сброса реализуют предназначенные им функции с использованием изменяющегося кода счетчика временной базы. Однако если сброс все таки необходим, то его можно реализовать следующим образом:

• Установить в 1 бит разрешения сброса счетчика TCRE (бит 3) в регистре управления TMSK2;

• Установить в $0000 регистр данных канала 7 модуля таймера. Комбинация этих двух состояний будет удерживать счетчик временной базы в нулевом состоянии.

Вопросы для самопроверки

1. Какова частота тактирования МК на отладочной плате MC68HC912B32EVB?

Ответ: Микроконтроллер B32, установленный на плате MC68HC912B32EVB тактируется от кварцевого резонатора с частотой 16 МГц. Эта частота делится внутренними средствами МК на 2, поэтому частота межмодульных магистралей составляет 8 МГц.

2. С какой целью Вам может понадобиться тактировать МК на с иной, отличной от fBUS = 8 МГц частотой?

Ответ: Энергия потребления МК в процессе работы пропорциональна частоте тактирования. Поэтому снижение частоты тактирования целесообразно с точки зрения уменьшения энергетических потерь. Ряд применений, связанных с электромеханическими нагрузками, не требует предельного быстродействия МК, поэтому частота тактирования может быть снижена.

3. Подсистема входного захвата зафиксировала два различных события в моменты времени, соответствующие кодам $0105 и $EC20 счетчика временной базы. Чему равен интервал времени между этими событиями? Интервал следует указать в единицах счета счетчика, число должно быть представлено в десятичном коде.

Ответ: $EC20 – $0105 = $EB1B = 60187 тактов счетчика

4. Если в предыдущем примере частота на входе программируемого делителя составляет 2 МГц, и биты PR2…PR0 регистра TMSK2 установлены в 000, то каков интервал времени между событиями в мс?

Ответ: Интервал составляет: 60187 1/(2МГц) = 30093,5 мс.

5. Повторите расчет предыдущего вопроса, но при измененных значениях битов PR2…PR0 = 100.

Ответ: В предыдущем случае коэффициент деления программируемого делителя был равен 1. При указанных в данном примере значениях битов PR2…PR0 коэффициент деления составляет 16. Следовательно, интервал времени между событиями составит 30093,5 мс × 16 = 481496 мс.

6. Назовите три основных режима работы модуля таймера TIM?

Ответ: режим входного захвата IC, режим выходного сравнения OC и режим счетчика внешних событий PA.

7. Почему необходимо следить за флагом переполнения счетчика временной базы?

Ответ: При использовании модуля таймера для измерения временных интервалов необходимо знать, сколько раз в процессе измерения переполнился счетчик. В противном случае подсчитанный код будет неверным.

8. Почему разработчик должен быть крайне осторожен при обнулении счетчика временной базы таймера?

Ответ: Сама по себе операция обнуления не представляет сложности. Однако к работающему счетчику временной базы могут быть «привязаны» другие каналы IC/OC. И изменение естественного порядка счета счетчика может привести к неправильной работе этих каналов. Поскольку каналов в модуле таймера восемь, то достаточно трудно предугадать все возможные комбинации их функционирования в реальной задаче. Поэтому во избежание сбоев в работе целесообразно отказаться от обнуления счетчика временной базы.

4.14.3. Регистры для управления счетчиком временной базы

В данном параграфе мы рассмотрим регистры специальных функций модуля таймера, которые используются для управления и определения текущего состояния счетчика временной базы.

Регистр управления модулем таймера

Регистр управления модулем таймера TSCR (Timer System Control Register) располагается в памяти МК по адресу $0086. Формат регистра представлен на рис. 4.30. Старший бит регистра TEN разрешает (при TEN=1) или запрещает (при TEN=0) функционирование модуля таймера. Этот бит используется разработчиками для включения или отключения модуля таймера в процессе работы устройства. Отключение модуля полезно с точки зрения снижения потребления энергии, если функции таймера не используются в алгоритме управления. Обратите внимание, что после сброса МК модуль таймера выключен, т.к. бит TEN автоматически устанавливается в 0 в состоянии сброса МК.

Рис. 4.30. Формат регистра TCSR


Бит TFFCA управляет механизмом сброса флагов событий модуля таймера. К этим флагам относятся флаг переполнения таймера TOF, флаги событий в каналах захвата/сравнения IC/OC и флаг переполнения счетчика внешних событий. Если бит TFFCA установлен в 0, то для сброса перечисленных флагов следует использовать обычную процедуру, когда в бит установленного флага под управлением программы записывается 1 (см. раздел 4.14.2, флаг переполнения счетчика). Попытка записи 0 в бит установленного флага оставит флаг без изменения. Если бит TFFCA установлен в 1, то вводится в действие дополнительный механизм сброса рассматриваемых флагов событий:

• Флаг переполнения счетчика временной базы TOF в регистре TFLG2 будет сброшен автоматически при выполнении операции чтения регистра текущего кода счетчика TCNT;

• Флаг события канала захвата/сравнения CnF (n — номер канала) в регистре TFLG1 будет сброшен автоматически при выполнении операции чтения или записи в регистр данных этого канала;

• Флаги PAONF и PAIF счетчика внешних событий в регистре PAFLG будут сброшены автоматически при чтении или записи в регистр PACNT.

Приведенный ниже программный фрагмент демонстрирует код для разрешения работы модуля таймера.

/*-----------------------------------------------------------------*/

/* MAIN PROGRAMM                           */

/*-----------------------------------------------------------------*/

#include <912b32.h>


void main(void) {

 unsigned char TSCR_MASK = 0x80; /*разрешение работы модуля таймера*/

 TSCR = TSCR_MASK;

}

/*------------------------------------------------------------------*/

Регистр счетчика временной базы

Если работа модуля таймера разрешена, то счетчик временной базы изменяет свое состояние в порядке естественного счета. Число разрядов счетчика временной базы равно 16, поэтому коэффициент счета счетчика составляет 216. Изменение коэффициента счета не предусмотрено. Счетчик временной базы не возможно остановить, однако его состояние в любой момент времени может быть считано под управлением программы из регистра текущего состояния TCNT (Timer CouNTer register). Регистр TCNT — 16 разрядный, в памяти МК он занимает две ячейки. По адресу $0084 располагается старший байт регистра TCNTH, по адресу $0085 — младший байт регистра TCNTL. Формат регистра представлен на рис. 4.31.

Рис. 4.31. Формат регистра TCNT


Считывание регистра текущего состояния счетчика временной базы следует производить только в 16 разрядном формате, поскольку побайтное чтение может дать неверный результат. Дело в том, что счетчик временной базы может тактироваться максимальной частотой, которая равна fBUS. Каждая операция чтения занимает несколько тактов fBUS, следовательно, две последовательных операции чтения приведут к тому, что старший и младший байты счетчика будут считаны при разных состояниях этого счетчика и вместе составят неверное его состояние (если режим «чтение на лету» не задействован). Приведенный ниже программный фрагмент демонстрирует, как правильно считать состояние счетчика с использованием двухбайтовых переменных.

/*-------------------------------------------------*/

/* MAIN PROGRAMM                  */

/*-------------------------------------------------*/

#include<912b32.h>


void main(void) {

 unsigned int start_time; /*время начала процесса*/

 unsigned int stop_time; /*время окончания процесса*/

 start_time=TCNT;

 stop_time=TCNT;

}

/*-------------------------------------------------*/

Регистр масок таймера 2

Регистр масок таймера TMSK2 (Timer MaSK register 2) располагается в памяти МК по адресу $008D. Формат регистра представлен на рис. 4.32. В данном параграфе мы рассмотрим лишь некоторые биты этого регистра. Бит TCRE разрешает сброс счетчика временной базы таймера (см. раздел 4.14.2, сброс счетчика временной базы). Биты PR2:PR1:PR0 устанавливают коэффициент деления программируемого делителя на входе счетчика временной базы в соответствие с табл. рис. 4.28. Обратите внимание, что минимальный коэффициент деления равен 1, т.е. максимальная частота тактирования счетчика равна fBUS. Максимальный коэффициент деления составляет 32. Биты PUPT и TDRB предназначены для управления схемотехникой входных и выходных буферов линий порта PORT T.

Рис. 4.32. Формат регистра TMSK2

4.14.4. Каналы захвата/сравнения

Модуль таймера TIM содержит в себе восемь идентичных блоков захвата/сравнения, которые в микропроцессорной технике принято именовать каналами захвата/сравнения. Структурная схема аппаратных средств одного канала захвата/сравнения в составе модуля таймера МК семейства 68HC12/HCS12 представлена на рис. 4.33.

Рис. 4.33. Структура одного канала сравнения/захвата таймера и регистр выбора режима работы каналов TIOS


Каждый из восьми каналов захвата/сравнения подключен к выводу IOSn, где n — номер канала, n = 0, 1, 2…7. Если канал с номером n конфигурирован как канал захвата, то вывод IOSn автоматически подключается к одноименной линии PTn порта T. Работа в качестве входов подсистемы входного захвата или выходов подсистемы выходного сравнения является альтернативной функцией порта T. Регистр данных порта T расположен по адресу $00AE.

Реализуемая каналом n модуля таймера функция (входной захват или выходное сравнение) определяется битом IOCn регистра TIOC. Регистр расположен по адресу $0080, формат регистра представлен на рис. 4.33. Если бит IOCn установлен в 1, то канал n работает в режиме выходного сравнения. Если же бит IOCn равен 0, то канал n работает в режиме входного захвата.

Аппаратные средства каждого состоят из 16 разрядного регистра данных канала TCn, 16 разрядных регистра защелки и цифрового компаратора, детектора события, формирователя выходного уровня и триггера события канала (рис. 4.33). Каждый канал использует в качестве эталона реального времени общий для всех каналов счетчик временной базы.

Режим входного захвата

Структура аппаратных средств подсистемы входного захвата IC, которая образуется в результате конфигурирования универсального канала модуля таймера на режим захвата, представлена на рис. 4.34. Подсистема входного захвата запоминает код счетчика временной базы в момент изменения логического сигнала на входе IOSn (n — номер канала). Изменение логического сигнала распознается детектором события, который может быть программно настроен на один из четырех режимов работы:

• Распознавание изменения сигнала с 0 на 1 — положительный фронт;

• Распознавание изменения сигнала с 1 на 0 — отрицательный фронт;

• Распознавание любого изменения уровня сигнала;

• Соответствующий вывод МК не подключен к каналу входного захвата и является выводом порта T.

Рис. 4.34. Структура одного канала таймера в режиме входного захвата и регистры управления каналом TCTL3 и TCTL4


Если детектор определил заданное изменение входного сигнала, то говорят, что наступило событие входного захвата. В момент наступления события код счетчика временной базы запоминается в регистре защелке, одновременно устанавливается триггер события канал CnF (рис. 4.34). Триггер может быть считан программно, или генерируется запрос на прерывание, если прерывания от канала n модуля таймера разрешены.

Для настройки детектора события каждого канала на один из трех перечисленных режимов используются биты EDGnB:EDGnA в регистрах TCTL3 ($008A) и TCTL4 ($008B). Формат этих регистров представлен на рис. 4.34. Таблица рис. 4.35 устанавливает соответствие между режимом работы детектора события и кодом инициализации в разрядах EDGnB:EDGnA.

EDGnB: EDGnA Режим детектора событий
00 Входной захват не реализуется
01 Мониторинг нарастающего фронта
10 Мониторинг спадающего фронта
11 Мониторинг изменения уровня

Рис. 4.35. Выбор режима работы детектора события


Подсистема входного захвата IC используемся в микропроцессорной технике для измерения различных временных характеристик импульсных сигналов, таких как период следования, коэффициент заполнения, длительность нулевого или единичного состояния. Так для того, чтобы измерить период импульсной последовательности, необходимо запомнить состояние счетчика временной базы в моменты двух соседних изменений сигнала с 0 на 1 (положительный фронт) или с 1 на 0 (отрицательный фронт). Разность этих значений и составит период повторения импульсного сигнала, выраженный в числе периодов частоты тактирования счетчика временной базы. Таким образом будет произведено измерение в относительных единицах конкретной микропроцессорной системы. Если измерение производится с целью управления, то представление временного параметра в относительных единицах обычно является достаточным. Однако, если измеренный параметр должен быть отображен на дисплее, то он должен быть представлен в универсальных единицах измерения, т.е. в микросекундах, миллисекундах и т.д. Для получения численного значения последнего необходимо полученное число относительных единиц умножить на длительность периода частоты тактирования счетчика временной базы. При программировании на Си операция умножения реализуется с использованием стандартной библиотеки. При программировании на ассемблере Вам потребуются дополнительные знания, поскольку операцию умножения необходимо будет исполнять над двухбайтовыми числами.

Если детектор события распознал изменение входного сигнала, которое указано в его текущей конфигурации, то аппаратные средства канала входного захвата автоматически совершают следующие действия:

1. Текущее состояние 16-разрядного счетчика временной базы запоминается в регистре-защелке канала и сразу копируется в 16-разрядный регистр данных канала TCn (n — номер канала). Поскольку данные в регистре TCn не изменяются, то они могут быть считаны побайтно (TCnH — старший байт регистра данных канала, TCnL — младший байт регистра данных), или в двухбайтовом формате. При программировании на Си рекомендуется использовать двухбайтовый формат, используя для этого переменную в формате unsigned integer.

2. Устанавливается флаг события канала CnF. Этот флаг «сообщает» основной программе о том, что событие произошло, и регистр данных канала TCn должен быть считан программой.

3. Если прерывания по флагу события CnF разрешены (бит CnI установлен), то генерируется запрос на прерывание.

Подсистема входного захвата может быть настроена для реализации разнообразных функций. Рассмотрим пример измерения длительности единичного состояния входного сигнала, т.е. импульса положительной полярности. Предположим, что длительность импульса не превышает периода переполнения счетчика временной базы таймера, исследуемая импульсная последовательность поступает на вход канала 2 модуля таймера, который предварительно настроен в режим входного захвата. Тогда для измерения длительности импульса должна быть реализована следующая последовательность действий:

1. Управляющая программа устанавливает режим работы детектора событий канала 2. Должен быть выбран режим мониторинга нарастающего фронта входного сигнала. Для этого следует установить биты EDG2B:EDG2A в регистрах TCTL3:TCTL4 в состояние 01.

2. Управляющая программа контролирует состояние триггера события C2F.

3. Если триггер C2F установился в 1, то контролируемый сигнал на линии PT2 изменился с 0 на 1. В момент изменения код счетчика временной базы был автоматически переписан в регистр защелку канала 2. Теперь этот код доступен для чтения из регистра данных TC2.

4. Управляющая программа обнаруживает, что триггер C2F установился. Тогда программа считывает двухбайтовый код из регистра данных канала TC2 и записывает его в двухбайтовую беззнаковую переменную rising_edge.

5. Управляющая программа сбрасывает триггер события C2F посредством записи в бит C2F единицы.

6. Управляющая программа изменяет режим работы детектора событий канала 2. Должен быть выбран режим мониторинга отрицательного фронта входного сигнала. Для этого следует установить биты EDG2B:EDG2A в регистрах TCTL3:TCTL4 в состояние 10.

7. Управляющая программа контролирует состояние триггера события C2F.

8. Если триггер C2F установился в 1, то сигнал на линии PT2 изменился с 1 на 0. В момент изменения код счетчика временной базы был опять автоматически переписан в регистр защелку канала 2.

9. Управляющая программа обнаруживает установленный триггер C2F, считывает двухбайтовый код из регистра данных канала TC2 и записывает его в двухбайтовую беззнаковую переменную falling_edge.

10. Управляющая программа сбрасывает триггер события C2F посредством записи в бит C2F единицы.

11. Управляющая программа вычисляет число периодов частоты тактирования счетчика временной базы между положительным и отрицательным фронтами исследуемого сигнала: TIME = falling_edge – rising_edge. Это число и есть искомая длительность импульса положительной полярности сигнала на входе PT2, выраженная числом периодов частоты тактирования счетчика временной базы.

12. При необходимости длительность импульса может быть представлена в общепринятых единицах измерения времени. Для этого управляющая программа должна выполнить операцию умножения числа TIME на длительность единицы измерения времени таймера, т.е. на длительность периода частоты тактирования счетчика временной базы: tIZM = TIME×1/fBASE.

Регистры специальных функций, связанные с подсистемой входного захвата, мы обсудим позже, после рассмотрения подсистемы выходного сравнения.

Вопросы для самопроверки

1. Какие изменения необходимо внести в рассмотренную выше последовательность действий, чтобы произвести измерение длительности нулевого состояния сигнала на входе PT2?

Ответ: В п.1. следует изменить инициализацию режима работы детектора событий. Должен быть выбран режим мониторинга отрицательного фронта входного сигнала. Также следует внести изменение в п. 6, в котором для детектора событий следует выбрать режим мониторинга нарастающего фронта входного сигнала.

2. Какие изменения необходимо внести для измерения периода повторяемости импульсного сигнала на входе PT2?

Ответ: Рассматриваем изменения исходной последовательности действий, которая приведена в предыдущем параграфе. Пункт 6 последовательности необходимо исключить. Тогда триггер события C2F будет в обоих случаях устанавливаться по положительному фронту исследуемого сигнала. Следовательно, в п.п. 11 и 12 будет вычисляться интервал времени между соседними положительным фронтами сигнала, т.е. период повторяемости этого сигнала.

3. Какие дополнительные изменения по отношению к вопросу 2 необходимо внести для измерения периода повторяемости импульсного сигнала, длительность которого превышает период переполнения счетчика временной базы?

Ответ: Необходимо организовать программный счетчик и вести наблюдение не только за состоянием триггера события канала входного захвата, но и триггера переполнения счетчика временной базы. Если триггер TOF установился. То следует программно инкрементировать программный счетчик. Также следует изменить формулу для подсчета длительности периода.

Режим выходного сравнения

Подсистема выходного сравнения OC используемся в микропроцессорной технике для генерации на выводах МК импульсных сигналов с заданными временными характеристиками. Например, средствами подсистемы выходного сравнения может быть сформирован одиночный импульс предварительно вычисленной длительности, или импульсная последовательность определенной частоты с регулируемым по результатам расчетов в МК коэффициентом заполнения. Структура аппаратных средств подсистемы выходного сравнения OC, которая образуется после конфигурирования универсального канала модуля таймера на режим сравнения, представлена на рис. 4.36.

Рис. 4.36. Структура одного канала таймера в режиме выходного сравнения и регистры управления каналом TCTL1 и TCTL2


Цифровой компаратор подсистемы выходного сравнения непрерывно сравнивает код счетчика временной базы с 16 разрядным кодом в регистре данных канала TCn (n — номер канала). Момент равенства кодов в микропроцессорной технике называют событием выходного сравнения. Если цифровой компаратор определил равенство кодов, то аппаратные средства канала выходного сравнения автоматически совершают следующие действия:

1. Устанавливается флаг события канала CnF. Обратите внимание, события входного захвата и выходного сравнения отмечаются одним и тем же флагом. Это флаг события канала CnF. Смысловое значение флага (IC или OC) определяется ранее выбранным в процессе инициализации режимом работы канала. Флаг CnF «сообщает» основной программе о том, что событие выходного сравнения произошло, и в регистр данных канала TCn следует записать новое значение кода для сравнения.

2. Если прерывания по флагу события CnF разрешены (бит CnI установлен), то генерируется запрос на прерывание.

3. Формирователь уровня генерирует на выводе канала IOSn предварительно заданный логический уровень. Формирователь уровня в процессе инициализации может быть программно настроен на один из четырех режимов работы:

• Установка вывода в 1;

• Установка вывода в 0;

• Инвертирование уровня сигнала на выводе;

• Соответствующий вывод МК не подключен к каналу выходного сравнения и является выводом порта T.

OMn: OLn Режим формирователя уровня
00 Выход формирователя не соединен с выводом IOSn
01 Инвертирует сигнал на выходе
10 Устанавливает выход в 0
11 Устанавливает выход в 1

Рис. 4.37. Выбор режима работы формирователя уровня


Для настройки формирователя уровня каждого канала на один из трех перечисленных режимов работы используются биты OMn:OLn в регистрах TCTL1 ($0088) и TCTL2 ($0089). Формат этих регистров представлен на рис. 4.36. Таблица рис. 4.37 устанавливает соответствие между режимом работы формирователя уровня и кодом инициализации в разрядах OMn:OLn.

Рассмотрим последовательность действий, которая должна быть реализована для генерации средствами подсистемы выходного сравнения «отрицательного» импульса заданной длительности. Под «отрицательным» импульсом мы будем понимать низкий логический уровень сигнала с последующим его изменением на высокий логический уровень.

1. Управляющая программа считывает текущее состояние счетчика временной базы из двухбайтового регистра TCNT.

2. Управляющая программа устанавливает выход используемого канала в 0.

3. Управляющая программа вычисляет длительность временного интервала, в течение которого на выходе должен удерживаться низкий логический уровень. Обратите внимание, полученная длительность временного интервала должна быть представлена в числе периодов тактирования счетчика временной базы.

4. Управляющая программа производит сложение ранее считанного кода счетчика и полученного кода длительности временного интервала. Полученное значение записывается в регистр данных канала выходного сравнения.

5. Управляющая программа задает режим работы формирователя уровня канала. Целесообразно выбрать режим установки выхода в 1, для чего необходимо записать в разряды OMn:OLn регистров TCTL1: TCTL2 комбинацию 11 (см. рис. 4.37).

6. Когда значение кода регистра данных совпадет с кодом счетчика временной базы, на выходе канала выходного сравнения автоматически, без участия программ установится 1.

Канал 7 в режиме выходного сравнения

До настоящего параграфа мы рассматривали все восемь каналов модуля таймера TIM, как полностью идентичные. Однако на самом деле полностью идентичными, работающими или в режиме входного захвата или в режиме выходного сравнения, являются лишь каналы 0…6. Канал 7 в режиме выходного сравнения обладает дополнительными возможностями. При этом рассмотренные режимы захвата/сравнения, совпадающие с режимами каналов 0…6, при соответствующей инициализации им полностью поддерживаются.

Если канал 7 находится в режиме выходного сравнения и его дополнительная функция разрешена, то в момент события в канале 7 устанавливается в назначенное состояние не только выход канала 7, но и любая комбинация выходов каналов 0…6. При этом выбранные для принудительной установки каналы также должны работать в режиме выходного сравнения. Два регистра специальных функций OC7M и OC7D используются для управления режимом принудительной установки по событию в канале 7. Каждый из битов регистра OC7M разрешает (при OC7Mn = 1) режим принудительной установки для одноименного (с номером n) канала. Соответствующий бит в регистре OC7D задает значение, которое должно быть установлено на выходе канала в момент принудительной установки. Например, если в регистре OC7M записан двоичный код 10110001, а в регистре OC7D – 01010101, то с каналом 7 в режиме принудительной установки будут связаны каналы 0, 4, 5. Тогда в момент события выходного сравнения на выходе канала 0 установится 1, на выходе канала 4 установится также 1, на выходе канала 5 установится 0 и на выходе канала 7 — тоже 0. На остальные каналы событие выходного сравнения в канале 7 влияния не окажет.

Свойство принудительной установки позволяет два раза за период работы счетчика временной базы изменять состояние на выходах каналов 0…6. Один раз по собственному событию выходного сравнения канала, второй раз — по событию в канале 7.

Регистры для управления каналами захвата/сравнения

В данном разделе мы рассмотрим регистры специальных функций, которые используются для управления режимами работы универсальных каналов захвата/сравнения. Формат регистров управления счетчиком временной базы в составе модуля таймера был рассмотрены ранее.

Регистр режимов каналов захвата/сравнения

Регистр режимов каналов захвата/сравнения TIOS (Timer Input capture/Output compare Register) располагается в памяти МК по адресу $0080. Формат регистра представлен на рис. 4.38. Каждый из битов регистра IOSn определяет режим работы канала с номером n. Если бит установлен в 1, то канал работает в режиме выходного сравнения. Если бит равен 0, то канал настроен на режим входного захвата.

Рис. 4.38. Формат дополнительных регистров управления таймером: TIOS, CFORC, OC7M, OC7D


Регистр принудительного события выходного сравнения

Регистр принудительного события выходного сравнения CFORC (Timer Compare Force Register) располагается в памяти МК по адресу $0081. Формат регистра представлен на рис. 4.38. Установка бита FOCn в 1 немедленно вызывает событие выходного сравнения в канале с номером n, независимо от текущего состояния счетчика временной базы и регистра данных канала. Функция принудительной установки очень удобна для задания начального уровня выхода канала выходного сравнения.

Регистр разрешения работы под управлением канала 7

Регистр разрешения работы под управлением канала 7 OC7M (Timer Output Compare 7 Mask Register) располагается в памяти МК по адресу $0082. Формат регистра представлен на рис. 4.38. Каждый из битов регистра OC7M разрешает (при OC7Mn = 1) режим принудительной установки для одноименного (с номером n) канала по событию в канале выходного сравнения 7. Если бит OC7Mn = 0, то канал с номером n работает в автономном режиме.

Регистр установки данных под управлением канала 7

Регистр установки данных под управлением канала 7 OC7D (Timer Output Compare 7 Data Register) располагается в памяти МК по адресу $0083. Формат регистра представлен на рис. 4.38. Каждый из битов регистра OC7Dn задает значение, которое должно быть установлено на выходе канала с номером n в момент в момент события выходного сравнения в канале 7. При этом необходимо предварительно разрешить работу желаемых каналов под управлением канала 7 установкой соответствующих битов в регистре OC7M.

Регистры управления таймером 1 и 2

Регистры управления таймером TCTL1 и TCTL2 (Timer Control Register) располагаются в памяти МК по адресам $0088 и $0089. Форматы регистров приведены на рис. 4.39. Каждому каналу таймера поставлены в соответствие два бита OMn:OLn регистров TCTL1 и TCTL2. Биты OMn:OLn определяют один из четырех режимов работы формирователя уровня канала, если этот канал работает в режиме выходного сравнения. Комбинации кодов для битов OMn:OLn приведены на рис. 4.37.

Рис. 4.39. Формат основных регистров управления таймером:TCTL1, TCTL2, TCTL3, TCTL4

Регистры управления таймером 3 и 4

Регистры управления таймером TCTL3 и TCTL4 (Timer Control Register) располагаются в памяти МК по адресам $008A и $008B. Форматы регистров приведены на рис. 4.39. Каждому каналу таймера поставлены в соответствие два бита EDGnB:EDGnA регистров TCTL3 и TCTL4. Биты EDGnB:EDGnA определяют один из четырех режимов работы детектора события канала, если этот канал работает в режиме входного захвата. Комбинации кодов для битов EDGnB:EDGnA приведены на рис. 4.35.

Регистр масок таймера 1

Регистр масок таймера TMSK1 (Timer Mask Register 1) располагается в памяти МК по адресу $008C. Формат регистра приведен на рис. 4.40. Каждый бит этого регистра CnI разрешает или запрещает прерывания по событию в одноименном (с номером n) канале таймера. Если бит CnI равен 1, то прерывания разрешены. При CnI = 0 прерывания по событию в канале запрещены.

Рис. 4.40. Формат регистров масок таймера:TMSK1, TMSK2


Регистр масок таймера 2

Регистр масок таймера TMSK2 (Timer Mask Register 2) располагается в памяти МК по адресу $008D. Формат регистра приведен на рис. 4.40. Бит TOI разрешает прерывания по флагу переполнения счетчика временной базы TOF. Бит TCRE разрешает сброс счетчика временной базы (см. раздел 4.14.2, сброс счетчика временной базы). Биты PR2:PR1:PR0 устанавливают коэффициент деления программируемого делителя на входе счетчика временной базы в соответствие с табл. рис. 4.28.

Регистр флагов таймера 1

Регистр флагов таймера TFLG1 (Timer Flag Register 1) располагается в памяти МК по адресу $008E. Формат регистра представлен на рис. 4.41. Каждому каналу таймера поставлен в соответствие флаг события CnF. Флаг CnF устанавливается в 1 автоматически, если в канале произошло событие входного захвата или выходного сравнения, в зависимости от текущего режима работы канала. Установленный бит события CnF вызовет прерывание, если в регистре TMSK1 установлен одноименный бит разрешения прерывания. Флаг события CnF должен быть сброшен под управлением программы, для чего в бит CnF должна быть записана 1. Существует альтернативный способ для сброса флагов события CnF. Если бит TFFCA в регистре TSCR установлен, то чтение или запись в регистр данных канала автоматически сбрасывает бит события этого канала.

Рис. 4.41. Формат регистров флагов таймера:TFLG1, TFLG2


Регистр флагов таймера 2

Регистр флагов таймера TFLG2 (Timer Flag Register 2) располагается в памяти МК по адресу $008F. Формат регистра представлен на рис. 4.41. В регистре присутствует всего один флаг — флаг переполнения счетчика временной базы TOF. Этот флаг сбрасывается посредством записи 1 в уже установленный бит TOF.

Регистры данных каналов захвата/сравнения

Регистры данных каналов захвата/сравнения TCn — 16 разрядные. В памяти каждый регистр представлен двумя 8 разрядными регистрами: TCnH — старший байт регистра данных канала с номером n, TCnL — младший байт регистра данных канала с номером n. Если канал настроен на режим входного захвата, то в регистре данных TCn содержится код счетчика временной базы в момент последнего события входного захвата. Если же канал настроен на режим выходного сравнения, то в регистр данных TCn под управлением программы записывается код момента сравнения. Формат и адреса расположения в памяти восьми регистров данных каналов TC0…TC7 приведены на рис. 4.42.

Регистр данных канала 0: TC0H:TC0L Адрес: $0090–0091
Регистр данных канала 1: TC1H:TC1L Адрес: $0092–0093
Регистр данных канала 2: TC2H:TC2L Адрес: $0094–0095
Регистр данных канала 3: TC3H:TC3L Адрес: $0096–0097
Регистр данных канала 4: TC4H:TC4L Адрес: $0098–0099
Регистр данных канала 5: TC5H:TC5L Адрес: $009A–009B
Регистр данных канала 6: TC6H:TC6L Адрес: $009C–009D
Регистр данных канала 7: TC7H:TC7L Адрес: $009E–009FФормат регистров данных таймера:TCnH, TCnL

Рис. 4.42.


Вопросы для самопроверки

1. Опишите два возможных способа для сброса флага события в регистре TFLG1.

Ответ: По первому способу биты флагов событий в каналах захвата/сравнения CnF в регистре TFLG1 сбрасываются посредством записи 1 в тот разряд регистра TFLG1В, который подлежит сбросу. Попытка записи 0 в разряд, который установлен в 1, не даст желаемого результата. п.1. По второму способу чтение или запись в регистр данных канала автоматически сбрасывает бит события этого канала, если в регистре TSCR установлен бит TFFCA.

2. Какой код должен быть записан в регистр режимов каналов захвата/сравнения TIOS, чтобы каналы с четными номерами работали в режиме входного захвата, а каналы с нечетными номерами в режиме выходного сравнения?

Ответ: $AA.

3. Какой код и в какие разряды регистра TCTL1 должен быть записан, чтобы настроить формирователь уровня канала 7 в режим установки 1?

Ответ: Код 11 в разряды OM7:OL7.

4. Какой код и в какие разряды регистра TCTL4 должен быть записан, чтобы настроить детектор события канала 1 в режим мониторинга за любым изменением уровня сигнала на входе канала 1?

Ответ: Код 11 в разряды EDG1B:EDG1A.

Примеры работы с таймером

Познакомившись с основными подсистемами модуля таймера, мы рассмотрим несколько примеров применения. В первом примере мы будем использовать подсистему входного захвата для измерения частоты и периода следования импульсов некоторого логического сигнала. Во втором примере мы будем формировать на одном из выходов МК импульсную последовательность, используя для этого подсистему выходного сравнения и подсистему прерывания МК.

Измерение частоты и периода логического сигнала

Для того чтобы воспользоваться аппаратными средствами универсального канала таймера для измерения частоты и периода следования импульсов, необходимо установить этот канал в режим входного захвата, а также выполнить ряд дополнительных установок конфигурации для счетчика временной базы, детектора события канала и подсистемы прерывания. Полное описание регистров специальных функций модуля таймера было приведено выше. В нашем примере мы будем использовать следующие биты и регистры управления:

• Бит разрешения работы модуля таймера TEN (регистр управления модулем таймера TSCR);

• Бит разрешения прерывания по переполнению счетчика временной базы TOI и биты выбора коэффициента деления программируемого делителя частоты на входе счетчика временной базы PR2:PR1:PR0 (регистр масок таймера TMSK2);

• Бит выбора режима работы канала IOSn (регистр режимов каналов захвата/сравнения TIOS). Если бит IOSn установлен в 1, то канал работает в режиме выходного сравнения. Если бит IOSn равен 0, то канал настроен на режим входного захвата;

• Биты выбора режима работы детектора события канала входного захвата EDGnB:EDGnA (регистры управления таймером TCTL3 и TCTL4);

• Бит события в канале CnF (регистр флагов таймера TFLG1);

• Бит разрешения прерывания по событию в канале CnI (регистр масок таймера TMSK1);

• Регистр данных канала TCn, в который автоматически записывается код счетчика временной базы в момент события входного захвата.

Предположим, что период исследуемого сигнала не превышает длительности периода переполнения счетчика временной базы. Тогда, для измерения частоты и периода следования импульсов логического сигнала, необходимо реализовать в микроконтроллере следующую последовательность действий:

1. Разрешить работу модуля таймера;

2. Выбрать частоту тактирования счетчика временной базы, для чего установить желаемый коэффициент деления программируемого делителя частоты на входе счетчика временной базы;

3. Установить один из каналов в режим входного захвата по нарастающему фронту импульса;

4. Сохранить в памяти МК код счетчика временной базы в момент появления первого фронта импульса;

5. Сохранить в памяти МК код счетчика временной базы в момент появления второго фронта импульса;

6. Взять разность полученных кодов, которая будет равна периоду исследуемого сигнала. Воспользовавшись операцией деления, вычислить частоту исследуемого сигнала. На рис. 4.43 приведена блок схема рассмотренного алгоритма. Ниже приведен программный фрагмент (timer1.c), который реализует этот алгоритм. В программе применен метод программного опроса триггера события входного захвата C2F. Когда программа «обнаруживает» установленный в 1 триггер события первый раз, она копирует регистр данных канала в переменную rising_1, сбрасывает триггер и ожидает следующей установки триггера события. Когда триггер события установится второй раз, программа копирует регистр данных канала в переменную rising_2. Разность двух зафиксированных в регистре данных канала входного захвата значений позволит вычислить период, а затем и частоту исследуемого импульсного сигнала.

Рис. 4.43. Блок схема алгоритма измерения периода и частоты исследуемого сигнала


Отметим три момента в стиле написания исходного текста представленного программного фрагмента для измерения периода и частоты импульсного сигнала:

• Основная программа «main» содержит вызовы трех функций, каждая из которых выполняет отдельную смысловую задачу;

• Имена функций и переменных выбраны в соответствии с их смысловым назначением;

• Представленный исходный текст программы достаточно полно документирован посредством комментариев перед записью каждой функции.

/*-------------------------------------------------------------------*/

/* filename: timer1.c                         */

/* МAIN PROGRAМ: Эта программа измеряет период и частоту импульсного */

/* сигнала. Сигнал подключается на вход 2 подсистемы таймера (IC2).  */

/*-------------------------------------------------------------------*/

/*подключаемые файлы*/

#include <912b32.h>

#include 

#include 


/*используемые функции*/

void timer_init(void);

void measure_wave(void);

void period_freq(void);


/*глобальные переменные*/

unsigned long int rising_1;

unsigned long int rising_2;


void main(void) {

 timer_init(); /*инициализация таймера*/

 measure_wave(); /*определение времени двух фронтов сигнала*/

 period_freq(); /*вычисление периода и частоты*/

}


/*----------------------------------------------------------------------*/

/* Функция timer_init производит инициализацию модуля таймера      */

/* Канал 2 таймера настраивается на режим входного захвата по переднему */

/* фронту сигнала                            */

/* Частота тактирования счетчика временной базы устанавливается 2 МГц.  */

/*----------------------------------------------------------------------*/

void timer_init(void) {

 TMSK1 = 0x00; /*запретить прерывания от каналов таймера*/

 TMSK2 = 0x02; /*назначить коэффициент деления 4*/

 TIOS = 0х00; /*установить канал 2 в режим входного захвата*/

 TSCR = 0х80; /*разрешить работу таймера*/

 TCTL4 = 0х10; /*назначить режим детектора событий по*/

        /*положительному фронту*/

 TFLG1 = 0xFF; /*очистить флаги событий*/

}


/*-------------------------------------------------------------------*/

/* Функция measure_wave запоминает два последовательных момента    */

/* нарастающего фронта исследуемого сигнала. Значения запоминаются с */

/* использованием глобальных переменных                */

/*-------------------------------------------------------------------*/

void measure_wave(void) {

 while((TFLG1 & 0х04) == 0) {

 /*ожидать нарастающего фронта*/

  ;

 }

 rising_1 = TCNT; /*запомнить код счетчика временной базы*/

          /*в переменной rising_1*/

 TFLG1 = 0х04; /*сброс триггера события канала 2*/

 while((TFLG1 & 0х04) == 0) {

 /*ожидать нарастающего фронта*/

  ;

 }

 rising_2 = TCNT; /*запомнить код счетчика временной базы*/

          /*в переменной rising_2*/

 TFLG1 = 0х04; /*сброс триггера события канала 2*/

}


/*------------------------------------------------------------------------*/

/* Функция period_freq вычисляет период и частоту исследуемого импульсного*/

/* сигнала и отображает полученные значения на экране           */

/*------------------------------------------------------------------------*/

void period_freq(void) {

 unsigned long int new_rising;

 unsigned long int new_falling;

 float frequency;

 float period;

 unsigned int int_period;

 unsigned int int_freq, freq_tenths;

 if(rising_2 < rising_1) /*вычисление периода*/

 {

  new_rising = rising_2 + 0xFFFF;

  period = ((float)new_rising (float)rising_l)*0.0000005;

 } else {

  period = ((float)rising_2 (float)rising_l)*0.0000005;

 }

 frequency = 1.0/period; /*вычисление частоты*/

 int_freq = (int)(frequency/l000.0);

 freq_tenths = (int)((frequency –(float) int_freq*1000)/100.0);

 /*вывод результатов*/

 printf("Frequency = %d.%d kHz \n\n" int_freq, freq_tenths);

 int_period = (int) (1000000*period);

 printf("Period = %d μs\n\n", int_period);

 printf{"Period = %f ms\n\n", (period*1000))};

}

/*------------------------------------------------------------------------*/

Приведенная программа выдаст ошибочный результат для сигналов, период которых превышает период переполнения счетчика внешних событий. В одном из домашних заданий в конце данной главы мы попросим Вас изменить исходный текст программы так, чтобы измерение более «медленных» сигналов также стало возможным. Какие изменения в программу следует внести? Вы должны будете контролировать, сколько раз переполнился счетчик временной базы между двумя соседними событиями в канале входного захвата. Для этого следует организовать программный счетчик, который будет инкрементироваться каждый раз, когда счетчик переполнится. Переполнение счетчика Вы будете фиксировать по установленному флагу TOF. Этот флаг может программно считываться с последующим сбросом, или по флагу могут быть разрешены прерывания. В подпрограмме прерывания будет инкрементироваться программный счетчик. После того, как второй нарастающий фронт зафиксирован, программа должна выполнить вычисления, используя формулу:

Period = 216×n + (rising_2rising_1)

Рассматриваемая программа имеет также ограничение по измерению сигналов с достаточно высокой частотой. Как узнать максимальную частоту, которая может быть измерена? Для этого следует вспомнить, что в нашем учебном примере частота внутренней шины МК составляет 8 МГц. Вы должны просмотреть ассемблерный код функции измерения частоты measure_wave и определить, сколько машинных тактов необходимо для распознавания установленного в 1 флага события и считывания кода первого события из регистра данных канала. Именно этот интервал является минимальным периодом сигнала, который может быть измерен.

Генерация импульсной последовательности

Для того, чтобы сформировать последовательность импульсов на одном из выходов МК, следует воспользоваться подсистемой выходного сравнения. В данном примере мы рассмотрим технику использования одного из каналов таймера в режиме выходного сравнения для генерации импульсной последовательности с заданной частотой и коэффициентом заполнения. В примере мы будем использовать следующие биты и регистры управления:

• Бит разрешения работы модуля таймера TEN (регистр управления модулем таймера TSCR);

• Бит разрешения прерывания по переполнению счетчика временной базы TOI и биты выбора коэффициента деления программируемого делителя частоты на входе счетчика временной базы PR2:PR1:PR0 (регистр масок таймера TMSK2);

• Бит выбора режима работы канала IOSn (регистр режимов каналов захвата/сравнения TIOS). Если бит IOSn установлен в 1, то канал работает в режиме выходного сравнения. Если бит IOSn равен 0, то канал настроен на режим входного захвата;

• Биты выбора режима работы формирователя уровня канала выходного сравнения OMn:OLn (регистры управления таймером TCTL1 и TCTL2);

• Бит события в канала CnF (регистр флагов таймера TFLG1);

• Бит разрешения прерывания по событию в канале выходного сравнения CnI (регистр масок таймера TMSK1);

• Регистр данных канала TCn, код которого автоматически сравнивается с кодом счетчика временной базы. Момент равенства кодов и является событием выходного сравнения.

В нашем примере мы будем формировать импульсную последовательность, параметры которой определяются числом и годом рождения разработчика. Допустим, Вы родились 19 мая 1977 года. Тогда частота генерируемого сигнала будет равна 519 Гц, коэффициент заполнения будет равен 77%. Для задания численных констант, определяющих частоту и коэффициент заполнения генерируемого импульсного сигнала, проведем следующие несложные расчеты:

1. Назначим в качестве источника тактирования для счетчика временной базы программируемый делитель, на вход которого подается fBUS=8 МГц;

2. Установим коэффициент деления программируемого делителя частоты на входе счетчика временной базы, равный 4. Тогда частота тактирования счетчика будет равна 2 МГц, что соответствует разрешающей способности счетчика 0,5 мкс. Выбранная таким образом разрешающая способность должна быть достаточна для формирования периода следования и длительности импульса;

3. По условию задачи частота формируемого сигнала составляет 519 Гц, что соответствует периоду следования Т = 1/519 = 0.0019268 с;

4. Вычислим длительность высокого и низкого уровня сигнала на интервале периода. По условию задачи коэффициент заполнения равен 77%. Длительность искомых временных интервалов составляет:

Длительность_1 = 0.77*(0.0019268) = 0.001484 с

Длительность_0 = 0.23*(0.0019268) = 0.0004432 с

5. Преобразуем полученные временные интервалы в целое число периодов частоты тактирования счетчика временной базы:

Код_1 = 0.001484 с/0.5 мкс = 2968 тактов

Код_0 = 0.0004432 с /0.5 мкс = 886 тактов

На рис. 4.44 приведена упрощенная блок схема алгоритма генерации импульсной последовательности. Ниже представлен исходный текст программы на Си (timer2.c), в котором используется метод программного опроса триггера события в канале выходного сравнения.

Рис. 4.44. Блок схема алгоритма генерации импульсной последовательности с заданными временными параметрами


/*------------------------------------------------------------------------*/

/* filename: timer2.c                           */

/* МAIN PROGRAМ: Эта программа генерирует импульсную последовательность  */

/* с частотой 519 Гц и коэффициентом заполнения 77%. Сигнал формируется на*/

/* выходе 2 подсистемы таймера (IC2)                    */

/*------------------------------------------------------------------------*/

/*подключаемые файлы*/

#include <912b32.h>


/*используемые функции*/

void timer_init(void);

void half_cycle(unsigned int time);


void main(void) {

 unsigned int high_time = 2968; /*число тактов высокого уровня*/

 unsigned int low_time = 886; /*число тактов низкого уровня*/

 timer_init();

 half_cycle(low_time); /*генерация низкого уровня*/

 while(1) {

  half_cycle(high_time); /*генерация высокого уровня*/

  half_cycle(low_time); /*генерация низкого уровня*/

 }

}


/*--------------------------------------------------------------------*/

/* Функция timer_init производит инициализацию модуля таймера.     */

/* Канал 2 таймера настраивается на режим выходного сравнения.     */

/* Частота тактирования счетчика временной базы устанавливается 2 МГц.*/

/*--------------------------------------------------------------------*/

void timer_init(void) {

 TMSK1 = 0x00; /*запретить прерывания от каналов таймера*/

 TMSK2 = 0x02; /*назначить коэффициент деления 4*/

 TIOS = 0х04; /*установить канал 2 в режим выходного сравнения*/

 TSCR = 0х80; /*разрешить работу таймера*/

 TCTL2 = 0х10; /*назначить режим формирователя уровня */

        /*"инвертирование"*/

 TFLG1 = 0x04; /*очистить флаг события канала 2*/

 TC2 = TCNT; /*записать в регистр данных канала 2 текущее*/

       /*состояние счетчика временной базы*/

}


/*------------------------------------------------------------------------*/

/* Функция half_cycle генерирует временной интервал заданной длительности */

/* Число тактов для отсчета должно быть определено вне функции       */

/*------------------------------------------------------------------------*/

void half_cycle(unsigned int time) {

 ТС2 += time; /*задать код сравнения в регистр данных канала*/

 while ((TFLG1 & 0x04) == 0) /*ожидать события выходного сравнения*/

 {

  ;

 }

 TFLG1 = 0x04; /*очистить флаг события канала 2*/

}

/*------------------------------------------------------------------------*/

Предложенный к рассмотрению программный фрагмент (timer2.c) отличается своей простотой и легкостью отладки. Это объясняется использованным методом программного опроса триггера события канала. Однако такой способ генерации импульсного сигнала становится непригодным, если по условию задачи управления необходимо формировать сразу несколько импульсных сигналов, и в каждом из них должны быть точно реализованы их временные параметры. Поэтому рассмотрим способ генерации импульсного сигнала с использованием подсистемы выходного сравнения таймера и подсистемы прерывания.

Генерация импульсной последовательности с использованием прерывания

Цель рассматриваемого примера (timer3.c) — познакомить читателя с техникой генерации импульсных сигналов с использованием подсистемы выходного сравнения, перезагрузка регистра данных которой реализуется в подпрограмме прерывания по очередному событию в канале выходного сравнения. Ниже перечислены биты и регистры управления, которые используются в данном примере:

• Бит разрешения работы модуля таймера TEN (регистр управления модулем таймера TSCR);

• Бит разрешения прерывания по переполнению счетчика временной базы TOI и биты выбора коэффициента деления программируемого делителя частоты на входе счетчика временной базы PR2:PR1:PR0 (регистр масок таймера TMSK2);

• Бит выбора режима работы канала IOSn (регистр режимов каналов захвата/сравнения TIOS). Если бит IOSn установлен в 1, то канал работает в режиме выходного сравнения;

• Биты выбора режима работы формирователя уровня канала выходного сравнения OMn:OLn (регистры управления таймером TCTL1 и TCTL2);

• Бит события в канала CnF (регистр флагов таймера TFLG1);

• Бит разрешения прерывания по событию в канале выходного сравнения CnI (регистр масок таймера TMSK1);

• Регистр данных канала TCn, код которого автоматически сравнивается с кодом счетчика временной базы. Момент равенства кодов и является событием выходного сравнения.

В тексте примера timer3.c мы будем генерировать импульсный сигнал с произвольной частотой и коэффициентом заполнения. Проанализировав текст программа Вы объясните, какую форму и какие временные параметры будет иметь формируемый сигнал.

Прежде, чем знакомиться с текстом программы timer3.c, вспомним, как оформляются подпрограммы прерывания при программировании на Си. Сначала следует убедиться, что Ваш заголовочный файл содержит определения макросов, которые позволят Вам использовать одноименные с командами ассемблера функции для запрета и разрешения прерываний в системе (см. раздел 4.12):

#define CLI() asm("cli\n"); //разрешить маскируемые прерывания

#define SEI() asm("sei\n"); //запретить маскируемые прерывания

Также следует отметить, что специфика записи подпрограммы прерывания частично определяется типом используемого компилятора. В соответствии с предварительной договоренностью, в текстах примеров этой книги используется компилятор ICC12 компании ImageСraft.

/*----------------------------------------------------------------------*/

/* filename: timer3.c                          */

/* МAIN PROGRAМ: Эта программа генерирует импульсную последовательность */

/* в форме меандра с использованием таймера и подсистемы прерывания   */

/* Сигнал формируется на выходе 2 таймера (IC2)             */

/*----------------------------------------------------------------------*/

/*подключаемые файлы*/

#include <912b32.h>


/*используемые функции*/

void initialize(void); /*функция инициализации*/

void toggle_isr(void); /*подпрограмма прерывания toggle_isr*/


//объявление функции обслуживания прерывания 

#pragma interrupt_handler toggle_isr

//инициализация вектора прерывания 

#pragma abs_address: 0xF7EA 

void (*Timer_Channel_2_interrupt_vector[]) () = {toggle_isr}; 

#pragma end_abs address


/*глобальные переменные*/ 

int с;


void main(void) {

 с = 100;

 initialize(); /*инициализация подсистемы таймера*/

 TMSK1 = 0х04; /*разрешение прерывания по событию в канале 2*/

 TFLG1 = 0xFF; /*сброс всех флагов событий от каналов*/

 CLI(); /*разрешить прерывания*/

 while(1) {

  /*ожидание прерывания*/

  ;

 }

}


/*-------------------------------------------------------------*/

/* Функция initialize задает начальные установки модуля таймера*/

/*-------------------------------------------------------------*/

void initialize(void) {

 TMSK2 = 0x02; /*назначить коэффициент деления 4*/

 TIOS = 0х04; /*установить канал 2 в режим выходного сравнения*/

 TSCR = 0х80; /*разрешить работу таймера*/

 TCTL2 = 0х10; /*назначить режим формирователя уровня */

        /*инвертирование*/

}


/*----------------------------------------------*/

/* Функция toggle_isr – подпрограмма прерывания */

/*----------------------------------------------*/

void toggle_isr(void) {

 TFLG1 = 0xFF;

 /*сброс всех флагов событий от каналов*/

 ТС2 = TC2 + c;

 /*задать код сравнения в регистр данных канала*/

 c = c + 100;

 /*вычислить новое значение c*/

}

/*-----------------------------------------------*/

Проанализируйте функцию toggle_isr. Генерацию какого импульсного сигнала она обеспечивает?


В следующем примере timer4.c показаны потенциальные возможности подсистемы выходного сравнения, обслуживаемой по прерываниям. В примере генерируются сразу две импульсные последовательности с разными частотами и коэффициентами заполнения. Нетрудно видеть, что число одновременного генерируемых импульсных сигналов может быть увеличено.

/*------------------------------------------------------------------------*/

/*filename: timer4.c                            */

/*МAIN PROGRAМ: Эта программа генерирует две импульсных последовательности*/

/* с использованием таймера и двух каналов подсистемы прерывания      */

/* Сигналы формируются на выходах 2 и 3 таймера.              */

/*------------------------------------------------------------------------*/


/*подключаемые файлы*/

#include <912b32.h>


/*используемые функции*/

void initialize(void); /*функция инициализации*/

void toggle1_isr(void); /*подпрограмма прерывания toggle1_isr*/

void toggle2_isr(void); /*подпрограмма прерывания toggle2_isr*/


//объявление функции обслуживания прерывания 

#pragma interrupt_handler toggle1_isr

#pragma interrupt_handler toggle2_isr

//инициализация векторов прерывания 

#pragma abs_address: 0xF7E8 

void (*Timer_Channel_3_interrupt_vector[]) () = {toggle2_isr};

void (*Timer_Channel_2_interrupt_vector[]) () = {toggle1_isr}; 

#pragma end_abs address


void main(void) { 

 initialize(); /*инициализация подсистемы таймера*/

 TMSK1 = 0х0C; /*разрешение прерывания по событию в каналах 2 и 3*/

 TFLG1 = 0xFF; /*сброс всех флагов событий от каналов*/

 CLI(); /*разрешить прерывания*/

 while(l) {

  /*ожидание прерывания*/

 ;

 }

}


/*-------------------------------------------------------------*/

/* Функция initialize задает начальные установки модуля таймера*/

/*-------------------------------------------------------------*/

void initialize(void) {

 TMSK2 = 0x02; /*назначить коэффициент деления 4*/

 TIOS = 0х0C; /*установить каналы 2 и 3 в режим выходного*/

        /*сравнения*/

 TSCR = 0х80; /*разрешить работу таймера*/

 TCTL2 = 0х50; /*назначить режим формирователя уровня */

        /*инвертирование для обоих каналов*/

}


/*------------------------------------------------------------------*/

/* Функция toggle1_isr подпрограмма прерывания по событию в канале 2*/

/*------------------------------------------------------------------*/

void toggle1_isr(void) {

 TFLG1 = 0x04; /*сброс флага события канала 2*/

 ТС2 += 9091; /*задать код сравнения в регистр данных канала*/

}

/*------------------------------------------------------------------*/


/*-------------------------------------------------------------------*/

/* Функция toggle2_isr подпрограмма прерывания по событию в канале 3 */

/*-------------------------------------------------------------------*/

void toggle2_isr(void) {

 TFLG1 = 0x08; /*сброс флага события канала 3*/

 ТС2 += 4854; /*задать код сравнения в регистр данных канала*/

}

/*-------------------------------------------------------------------*/

Проанализируйте функции toggle1_isr и toggle2_isr. Генерацию каких импульсных последовательностей они обеспечивают?

4.14.5. Счетчик событий

Счетчик событий или аккумулятор импульсов (Pulse Accumulator) — это подсистема модуля таймера, которая разработана специально для подсчета импульсов. Основной элемент счетчика событий — 16 разрядный счетчик, который может работать в двух режимах:

Счетчик внешних событий. В этом режиме счетчик PACNT подсчитывает число событий, которое детектируется его аппаратными средствам на входе PAI. Тип события (только нарастающий или только спадающий фронт сигнала) определяется посредством программных установок.

Стробируемый таймер. В этом режиме счетчик PACNT тактируется внутренними импульсами с частотой fBUS/64, а сигналы на входе PAI разрешают или запрещают счет.

Режимы работы счетчика

Структурная схема подсистемы счетчика событий представлена на рис. 4.45. Изучив ее, вы увидите, что счетчик событий в качестве входа PAI, на который должны поступать внешние импульсы, использует линию PT7 порта PORT T. Таким образом, обслуживание подсистемы счетчика событий альтернативная функция линии 7 порта PORT T. Однако линия PT7 обладает еще одной альтернативной функцией. Она используется как вход или как выход канала 7 подсистемы захвата/сравнения модуля таймера. Какие программные установки в регистрах управления таймера необходимо выполнить, чтобы конфигурировать линию PT7 как вход PAI счетчика событий?

• Сбросить бит IOS7 в регистре TIOS ($0080), тогда в канале 7 будет запрещен режим выходного сравнения;

• Сбросить биты OM7:OL7 регистра TCNTL1($0088),тогда линия PT7 окажется отсоединенной от аппаратных средств канала 7;

• Сбросить бит OC7M7 в регистре OC7M ($0082).

Рис. 4.45. Структура и регистры управления счетчика вешних событий


Если все эти установки выполнены, то сигнал с лиги PT7 будет поступать на вход детектора событий подсистемы счетчика событий. В каждом из режимов работы счетчика детектор выполняет разные функции, однако в обоих режимах работы детектор становится активным при установке бита PAEN регистра управления счетчиком PACTL (рис. 4.45) в 1.

Если подсистема находится в режиме счетчика внешних событий, бит PEDGE определяет: по какому фронту сигнала, нарастающему (при PEDGE = 1) или спадающему (при PEDGE = 0) будет переключаться счетчик. Если детектор фиксирует на входе PAI заданное битом PEDGE изменение входного сигнала, то устанавливается флаг события PAIF.

Если подсистема работает в режиме стробируемого таймера, то бит PEDGE определяет уровень сигнала на входе PAI, при котором будет разрешен счет для внутреннего счетчика PACNT. Если бит PEDGE = 1, то счет разрешен при низком логическом уровне на входе PAI. При этом по нарастающему фронту сигнала на входе PAI будет устанавливаться флаг событий PAIF. Если же бит PEDGE = 0, счет разрешается при высоком уровне PAI, флаг PAIF устанавливается по спадающему фронту PAI.

Если работы подсистемы счетчика событий разрешена, то 16 разрядный счетчик начинает считать с нулевого значения. Текущий код счетчика может быть считан из 16-разрядного регистра текущего состояния счетчика PACNT, который в памяти размещается в двух ячейках памяти: PACNTH — старший байт счетчика событий, PACNTL — младший байт счетчика событий (рис. 4.45). Каждое переполнение 16-разрядного счетчика событий фиксируется установкой триггера переполнения PAOVF. Этот триггер сбрасывается посредством записи в установленный разряд PAOVF единичного значения.

Оба рассмотренных флага: флаг переполнения счетчика PAOVF и флаг события на входе счетчика PAIF, — способны генерировать запросы прерывания. Прерывания от указанных флагов разрешаются битами PAOVI и PAI соответственно. Биты PAOVI и PAI располагаются в регистре флагов счетчика событий PAFLG (рис. 4.45).

Регистры управления счетчиком событий

В данном разделе мы рассмотрим регистры специальных функций, которые используются для управления режимами работы счетчика событий.

Регистр управления счетчиком событий

Регистр управления счетчиком событий PACTL (Pulse Accumulator Control Register) располагается в памяти МК по адресу $00A0. Формат регистра представлен на рис. 4.45. Регистр PACTL используется для задания режима работы счетчика событий, для назначения режима работы его детектора событий, для разрешения прерываний от подсистемы счетчика событий, а также для выбора источника тактирования счетчика временной базы модуля таймера.

Бит PTAE разрешает работу подсистемы счетчика событий. При PTAE = 1 работа подсистемы разрешена, при PTAE = 0 подсистема счетчика находится в неактивном состоянии. Бит PAMOD служит для выбора режима работы. При PAMOD = 0 подсистема работает в режиме счетчика внешних событий, при PAMOD = 1 для подсистемы назначается режим стробируемого таймера.

Бит PEDGE управляет режимом работы детектора событий подсистемы счетчика. Если счетчик работает в режиме счетчика внешних событий (PAMOD = 0), то при PEDGE = 1 детектор события настраивается на распознавание положительного фронта сигнала, при PEDGE = 0 — отрицательного фронта. При работе в режиме стробируемого таймера (PAMOD = 1) бит PEDGE определяет вид сигнала, разрешающего переключение счетчика таймера. Если PEDGE = 1, то счет разрешается при подаче 1 на вход PAI, при этом флаг PAI устанавливается по отрицательному фронту входного сигнала. Если же PEDGE = 0, то счет разрешается при подаче 0 на вход PAI, при этом флаг PAI устанавливается по положительному фронту входного сигнала.

Биты CLK1:CLK0 назначают источник тактирования для счетчика временной базы модуля таймера (см. рис. 4.27).

Биты PAOVI и PAI (не путать с одноименным входом) разрешают прерывания по событию переполнения счетчика (флаг PAOVF) и по событию на входе PAI (флаг PAIF), тип которого определяется режимом работы и значением бита PEDGE.

Регистр флагов счетчика событий

Регистр флагов счетчика событий PAFLG (Pulse Accumulator Flag Register) располагается в памяти МК по адресу $00A1 и содержит всего два значимых бита (рис. 4.45). Флаг переполнения счетчика устанавливается, когда 16-разрядный счетчик подсистемы изменяет свое значение с $FFFF на $0000. Флаг события подсистемы PAIF устанавливается в 1 при каждом перепаде потенциала на входе PAI, который указан битом PEDGE и режимом работы счетчика. Оба этих бита сбрасываются посредством записи в установленный бит 1.

Регистр текущего состояния счетчика событий

Регистр счетчика PACNT (Pulse Accumulator Counter Register) содержит текущий код 16-разрядного счетчика подсистемы. Поэтому он располагается в двух ячейках памяти: старший байт PACNTH — по адресу $00A2, младший байт PACNTL — по адресу $00A3. Поскольку изменение кода счетчика может произойти в произвольный момент времени, рекомендуется производить его чтение в двухбайтовом формата с использованием типа LDD или LDX/LDY.

Пример использования счетчика событий

Мы рассмотрим пример определения скорости движения велосипеда по сигналам датчика Холла, который установлен на колесе велосипеда. Датчики Холла доступны в различных модификациях. Обобщая сведения о датчиках Холла, можно выделить следующие три типа датчиков:

• Линейные датчики, напряжение на выходе которых пропорционально напряженности магнитного поля, в которое помещен датчик;

• Биполярные датчики, формируют выходной сигнал, находясь вблизи южного магнитного полюса, сбрасываются в 0, находясь вблизи северного магнитного полюса;

• Однополярные датчики, формируют выходной сигнал, находясь вблизи южного магнитного полюса, сбрасываются в 0 при отсутствии магнитного поля.

В нашем примере мы поместим магнит на спицу вращающегося колеса. Однополярный датчик Холла установим на вилке колеса, выход датчика соединим со входом (PT7) счетчика внешних событий МК семейства 68HC12 (рис. 4.46). Тогда на выходе датчика будет генерироваться один импульс при каждом полном обороте колеса. Если мы подсчитаем число импульсов с выхода датчика на известном временном интервале, мы сможем определить скорость движения и расстояние, которое было преодолено за время измерения.

Рис. 4.46. Колесо велосипеда с датчиком Холла


Читателю предлагается самостоятельно написать программу расчета скорости и преодоленного расстояния, используя следующие подсказки:

• В первую очередь определите связь между одним оборотом колеса и пройденной дистанцией пути. Предположите, что диаметр колеса равен 66,04 см (26 дюймов).

• Произведите инициализацию подсистемы счетчика внешних событий:

a. Подсистема счетчика событий использует вход PT7 для подключения внешнего импульсного сигнала. Для конфигурирования линии PT7 на ввод установите бит 7 регистра TIOS в 0, также в 0 должны быть установлены биты 6 и 7 регистра PCTL1.

b. Запрограммируйте на выбранный режим регистр управления счетчиком событий PACTL. Определите необходимое состояние каждого бита самостоятельно.

• Считайте под управлением программы текущее состояние счетчика внешних событий, используя регистр PACNT.

• Сформируйте временной интервал, длительность которого должна быть достаточна накопления в счетчике событий нескольких десятков отсчетов. Тогда точность измерения скорости будет приемлемой (несколько единиц %).

• Считайте под управлением программы новое текущее состояние счетчика событий.

• Получите разность кодов и вычислите скорость и пройденное расстояние. Приведенный ниже программный фрагмент поможет Вам выполнить инициализацию подсистемы счетчика событий.

/*------------------------------------------------------------------------------*/

/* Функция initialize_PA задает начальные установки подсистемы счетчика событий */

/*------------------------------------------------------------------------------*/

void initialize_PA(void) {

 TIOS = 0x00; /*конфигурировать вход PT7 для работы */

 TCTL1 = 0х00; /*в качестве источника сигналов для счетчика*/

 OC7M = 0x00 /*внешних событий – 3 команды*/

 TSCR = 0х80; /*разрешить работу всего модуля таймера*/

 PACTL = 0х70; /*разрешить работу в режиме счетчика внешних*/

        /*событий по положительному фронту сигнала*/

}

/*-------------------------------------------------------------------------------*/

4.15. Модуль меток реального времени

Многие применения требуют организации выполнения одного и того же фрагмента программы через равные интервалы времени. Для удобства разработчиков МК семейства 68HC12/HCS12 оснащены специальным модулем меток реального времени RTI (Real Time Interrupt), который генерирует равноотстоящие во времени запросы на прерывание (рис. 4.47). Тогда фрагмент программы, которые должен исполняться через равные интервалы времени, может быть оформлен как подпрограмма прерывания по запросу RTI. И желаемый алгоритм функционирования устройства будет реализован.

Рис. 4.47. Временная диаграмма, поясняющая принцип действия модуля меток реального времени, и регистры управления модулем


Модуль меток реального времени RTI использует два регистра специальных функций: регистр управления RTICTL (Real Time Interrupt Control Register) и регистр флагов RTIFLG (Real Time Interrupt Flag Register).

Бит RTIE в регистре управления RTICTL (рис. 4.47) разрешает работу подсистемы меток реального времени. При RTIE = 1 подсистема находится в активном состоянии, при RTIE = 0 работа системы запрещена. Биты RTR2:RTR1:RTR0 определяют период следования меток реального времени. Таблица рис. 4.47 устанавливает соответствие между кодовой комбинацией битов RTR2:RTR1:RTR0 и временным интервалом между двумя соседними метками модуля RTI. Последний именуют периодом RTI.

Выбор периода генерации меток реального времени

RTR[2:0] Коэффициент деления 2х При частоте внутренней системной шины
4 МГц 8 МГц
000 зарезервирован нет нет
001 13 2,048 мс 1,024 мс
010 14 4,096 мс 2,048 мс
011 15 8,192 мс 4,096 мс
100 16 16,384 мс 8,192 мс
101 17 32,768 мс 16,384 мс
110 18 65,536 мс 32,768 мс
111 19 131,072 мс 65,536 мс

Рис. 4.47. Временная диаграмма, поясняющая принцип действия модуля меток реального времени, и регистры управления модулем


Рис. 4.48. Блок-схема алгоритма часов реального времени


Регистр флагов RTIFLG (рис. 4.47) содержит всего один флаг RTIF. Этот флаг устанавливается, когда модуль закончил отсчет очередного периода RTI.

Счетчик подсистемы меток реального времени тактируется импульсной последовательностью с частотой fBUS. В модуле меток реального времени эта частота делится. Коэффициент деления, устанавливаемый разрядами RTR2:RTR1:RTR0, можно выбрать по таблице рис. 4.47. Проанализировав данные таблицы, можно установить, что для МК с частотой внутренней шины 8 МГц максимальный период меток реального времени составляет примерно 65 мс.

Пример использования модуля меток реального времени

Ниже приведен исходный текст программы realtime.c для реализации часов реального времени на основе отсчетов модуля RTI с интервалами 8,196 мс. В подпрограмме прерывания программный счетчик накапливает 122 отсчета RTI (рис.4.48), которые составляют временной интервал длительностью 1 с. По прошествии каждой секунды инкрементируется программный счетчик sec_ctr, по прошествии каждой минуты — счетчик mins_ctr и т.д. вплоть до счетчика дней.

При желании функции программы можно расширить, введя подсчет дня недели, месяца и года.

/*-----------------------------------------------------------------------*/

/* filename: realtime.c                          */

/* МAIN PROGRAМ: Эта программа генерирует две импульсных         */

/* последовательности с использованием таймера и двух каналов подсистемы */

/* прерывания.Сигналы формируются на выходах 2 и 3 таймера.        */

/*-----------------------------------------------------------------------*/

/*подключаемые файлы*/

#include <912b32.h>


/*используемые функции*/

void RTI_isr{void); /*подпрограмма прерывания по RTI*/


/* interrupt pragma */

#pragma interrupt_handler RTI_isr

/*инициализация таблицы векторов прерывания*/

#pragma abs_address: 0xF7F0

void (*RTI_interrupt_vector[]) ()={RTI_isr};

#pragma end_abs_address


/*глобальные переменные*/

unsigned int ms_ctr, sec_ctr, mins_ctr, hrs_ctr, days_ctr;


void main{void) {

 ms_ctr = 0; /*инициализация переменных*/

 sec_ctr = 0;

 mins_ctr = 0;

 hrs_ctr = 0;

 days_ctr = 0;

 RTICTL = 0х84; /*разрешить прерывания от модуля RTI, выбрать*/

 CLI();     /*период RTI 8,196 мс*/

 while(1) /*ожидать прерывание*/

 {

  ;

 }

}


/*---------------------------------------------------------*/

/* Функция RTI_isr подпрограмма прерывания каждые 8,196 мс */

/*---------------------------------------------------------*/

void RTI_isr(void) {

 RTIFLG = 0х80; /*сброс флага события RTI*/

 ms_ctr = ms_ctr+1; /*обновить счетчик миллисекунд*/

 if (ms_ctr == 122) /*обновить счетчик секунд*/

 {

  ms_ctr = 0;

  sec_ctr = sec_ctr + 1;

 }

 if (sec_ctr == 60) /*обновить счетчик минут*/

 {

  sec_ctr = 0;

  mins_ctr = mins_ctr + 1;

 }

 if (mins_ctr == 60) /*обновить счетчик часов*/

 {

  mins_ctr = 0;

  hrs_ctr = hrs_ctr + 1;

 }

 if (hrs_ctr == 24) /*обновить счетчик дней*/

 {

  hrs_ctr = 0;

  days_ctr = days_ctr + 1;

 }

}

/*---------------------------------------------------------*/

4.16. Модуль таймера ECT в составе МК МC68HC12BE32 и HCS12

Все микроконтроллеры семейства HCS12 и всего одна модель MC68HC12BE32 семейства 68HC12 оснащены более совершенным модулем таймера ECT (Enhanced Capture Timer). Модуль таймера EST унаследовал основные технические решения от своего предшественника — модуля таймера TIM. Поэтому, так же как в модуле TIM, основу таймера EST составляют 16-разрядный счетчик временной базы и восемь универсальных каналов захвата/сравнения.

Однако в модуле EST четыре канала из восьми в режиме входного захвата обладают дополнительным регистром. Такое решение позволяет в режиме входного захвата зафиксировать два момента изменения сигнала на входе канала прежде, чем будет установлен триггер события в канале CnF. Рассматриваемые каналы называют буферированными, они могут работать как в режиме временного хранения, так и в режиме очереди. Четыре оставшихся канала называют небуферированными. Правила функционирования этих каналов в режиме входного захвата полностью соответствуют аналогичным для модуля TIM. Полный набор функций каналов захвата/сравнения модуля таймера EST приведен на рис. 4.49.

Рис. 4.49. Усовершенствованный модуль таймера ECT


Второе отличие модуля EST от модуля TIM состоит в том, что модуль EST имеет в своем составе четыре 8-разрядных счетчика события (PACN3…PACN0). Эти счетчики могут быть объединены парами для получения двух 16-разрядных счетчиков событий: (PACN3:PACN2) и (PACN1:PACN0).

Обратимся далее к более подробному рассмотрению дополнительных режимов работы модуля EST.

4.16.1. Небуферированные каналы входного захвата

Алгоритм функционирования небуферированных каналов входного захвата полностью аналогичен функционированию в аналогичном режиме каналов модуля TIM. Однако небуферированные каналы модуля EST снабжены дополнительной функцией управления режимом. Регистр управления порядком перезаписи ICOVW (Input Control Overwrite Register) содержит восемь битов NOVWn (рис. 4.49). Если бит NOVWn установлен в 1, то регистр данных небуферированного канала с номером n не может быть перезаписан под действием аппаратных средств, пока этот регистр не будет считан программой. Если бит NOVWn = 0, то функция блокировки записи для небуферированного канала снимается.

4.16.2. Буферированные каналы входного захвата

Четыре буферированных канала входного захвата оснащены вторым регистром данных. В результате, канал может запомнить два момента времени, которые соответствуют двум последовательным событиям на входе канала. Флаг события канала устанавливается после того, как оба регистра данных канала будут заполнены кодами событий.

В приложении к буферированным каналам входного захвата принято использовать следующую терминологию. Первый регистр данных канала считается очищенным, если его значение переписано во второй регистр данных или считано программой. Второй регистр данных канала считается очищенным, если его значение прочитано программой.

Буферированные каналы входного захвата могут работать или в режиме временного хранения, или в режиме очереди. Режим работы назначается битом LATQ в регистре управления режимом входного захвата ICSYS. Если бит LATQ установлен в 1, то буферированные каналы работают в режиме временного хранения. Если же бит LATQ = 0, то для буферированных каналов назначается режим очереди.

В режиме временного хранения (LATQ = 1) текущий код счетчика временной базы запоминается в первом регистре данных при изменении входного сигнала, на которое настроен детектор события. Далее этот код автоматически переписывается во второй регистр данных при наступлении одного из трех событий:

• Код 16-разрядного вычитающего счетчика MCCNT достиг $0000;

• В счетчик MCCNT под управлением программы вписан код $0000;

• Бит ICLAT в регистре управления вычитающим счетчиком MCCTL (рис. 4.50) программно установлен в 1.

Рис. 4.50. Аппаратные средства буферированного канала входного захвата — режим временного хранения


В режиме временного хранения биты управления NOVWn действуют также, как и небуферированных каналах (см. 14.6.1)

В режиме очереди (LATQ = 0) и при NOVWn = 0 событие входного захвата вызывает автоматическую перезапись содержимого первого регистра данных канала во второй регистр данных, а в первый регистр данных загружается текущий код счетчика временной базы (рис. 4.51). Если буферированный канал работает в режиме очереди и бит NOVWn = 1, то и первый и второй регистры данных не запоминают момента наступления события, если они не очищены, т.е. не были считаны программой до наступления события.

Рис. 4.51. Аппаратные средства буферированного канала входного захвата — режим очереди

4.16.3. Особенности счетчиков событий

Модуль таймера EST оснащен четырьмя 8-разрядными счетчиками событий (рис. 4.52). Счетчики событий могут быть объединены попарно, тогда они образуют два 16-разрядных счетчика события. Так же, как и каналы захвата, счетчики событий могут работать или в режиме временного хранения, или в режиме очереди (рис. 4.52).

Рис. 4.52. Аппаратные средства счетчика внешних событий в составе таймера ECT

4.16.4. Регистры управления модуля EST

На рис. 4.53 приведен формат регистров модуля таймера EST, которые отсутствуют в рассмотренном ранее модуле TIM. Адреса регистров указаны как для МК BE32 семейства 68HC12, так и для микроконтроллеров семейства HCS12. Приведенные адреса можно рассматривать как абсолютный адрес, если в проекте используется настоящий физический адрес начала блока регистров $0000. Если же блок регистров перемещен в другое, виртуальное адресное пространство, то указанные адреса следует рассматривать как смещение адреса регистра относительно адреса начала регистрового блока.

Рис. 4.53. Формат регистров модуля ECT


Регистр управления порядком перезаписи

Регистр управления порядком перезаписи ICOVW (Input Control Overwrite Register) располагается в памяти МК по адресу $00AA/$002A. Формат регистра представлен на рис. 4.53. Регистр содержит восемь битов NOVWn (n — номер канала). Если бит NOVWn = 0, то первый и второй регистры данных канала входного захвата с номером n могут быть автоматически перезаписаны при наступлении очередного события входного захвата. Если же бит NOVWn = 1, то регистры данных канала не могут быть перезаписаны, если они предварительно не были очищены, т.е. считаны под управлением программы.

Регистр управления режимом входного захвата

Регистр управления режимом входного захвата ICSYS (Input Control System Control Register) содержит бит разрешения буферированного режима в каналах BUFEN и бит выбора режима работы буферированных каналов LATQ (временного хранения или очереди). Если бит BUFEN установлен, то работа второго регистра данных и буферного регистра счетчика событий буферированных каналов модуля таймера разрешена. Если бит LATQ равен 1, то буферированные каналы входного захвата работают в режиме временного хранения, при LATQ = 0 эти каналы работают в режиме очереди.

Регистр управления счетчиком задержки

Регистр управления счетчиком задержки DLYCT (Delay Counter Control Register) разрешает вставку регулируемого временного интервала между моментом распознавания детектором события изменения входного сигнала и интерпретацией этого изменения как события входного захвата со всеми последующими действиями аппаратных средств канала таймера. Событие входного захвата будет распознано, если логический уровень сигнала по истечении временной задержки будет противоположен уровню сигнала перед запуском счетчика задержки. Такое решение позволяет повысить устойчивость входов к шумам на фронтах переключения. Длительность задержки определяется битами DLY1:DLY0. При DLY1:DLY0 = 00 задержка не вставляется. При DLY1:DLY0 = 01 задержка равна 256 периодам сигнала P clock системы тактирования, при DLY1:DLY0 = 10 задержка составляет 512 периодов, при DLY1:DLY0 = 11 — 1024 периода того же сигнала.

Регистр управления 16-разрядным вычитающим счетчиком

Регистр управления вычитающим счетчиком MCCTL (Modulus Down-Counter Control Register) предназначен для задания режима работы 16-разрядным вычитающим счетчиком с изменяемым коэффициентом счета. Если бит MODMC установлен в 0, то счетчик уменьшает код, начиная с предварительно записанного значения до 0, затем останавливается. Если бит MODMC равен 1, счетчик считает непрерывно. При достижении кода $0000, он автоматически перезагружается кодом, записанным в регистр коэффициента счета MCCNT.

Регистр коэффициента счета вычитающего счетчика

Регистр коэффициента счета вычитающего счетчика MCCNT (Modulus Down-Counter Register) содержит изменяемый программно коэффициент счета 16-разрядного вычитающего счетчика.

Регистр флагов вычитающего счетчика

Регистр флагов вычитающего счетчика MCFLG (Modulus Down-Counter Flag Register) содержит флаг обнуления счетчика MCZF. Этот флаг устанавливается в 1, когда код счетчика становится равным $0000. Флаг MCZF сбрасывается посредством записи в его разряд 1.

4.17. Обмен информацией в последовательном коде: многофункциональный последовательный интерфейс

Обмен данными в последовательном коде — эффективный с точки зрения аппаратной реализации способ связи между двумя интеллектуальными устройствами. Всего одна линия потребуется для передачи цифровых кодов от одного микропроцессорного устройства к другому. Данные по этой линии передаются последовательно во времени так, что в каждый момент времени происходит передача только одного бита данных. Обмен в параллельном коде значительно превышает по скорости обмен в последовательном коде. Однако он требует множества линий связи между устройствами, что увеличивает энергию потребления и размеры изделия.

В МК семейства 68HC12/HCS12 обмен в последовательном коде обеспечивает модуль многофункционального последовательного интерфейса (MSI — Multiple Serial Interface). Этот модуль содержит в себе две независимых подсистемы последовательного обмена: контроллер асинхронного обмена SCI (Serial Communication Interface) и контроллер синхронного обмена SPI (Serial Peripheral Interface). Каждый из контроллеров обслуживают линии порта S, для которых эта функция является альтернативной.

Рис. 4.54. Два наиболее распространенных типа последовательных интерфейсов


Контроллер SCI поддерживает полнодуплексный обмен в асинхронном режиме с форматом кадра, который совместим с последовательным интерфейсом персонального компьютера RS-232. Термин полнодуплексный означает, что в один и тот же момент времени один и тот же контроллер SCI может как принимать, так и передавать информацию. Термин асинхронный характеризует способ передачи данных, при котором дополнительный сигнал синхронизации, подтверждающий наличие очередного бита данных на линии, не используется. Следовательно, синхронизация между обменивающимися устройствами отсутствует. Для однонаправленной асинхронной передачи информации между двумя устройствами потребуется всего линия связи, что отражено на рис. 4.54.

Синхронный интерфейс SPI поддерживает синхронный последовательный обмен между МК и другими ИС, установленными на плате изделия. Эти интегральные схемы дополняют функции периферии микропроцессорной системы, которые не могут быть реализованы средствами встроенных модулей МК. Именно поэтому в названии этого интерфейса присутствует термин «периферийный». Интерфейс SPI также используют для связи двух МК, однако такое решение встречается в разработках не столь часто, как обмен с периферийными ИС.

Рис. 4.55. Сопряжение МК с ЦАП по параллельному и последовательному интерфейсу


При обмене в синхронном режиме в одном направлении (рис. 4.54) используются две линии связи между устройствами. По одной линии передаются данные, на другой в это время формируются сигналы синхронизации. То устройство, которое формирует импульсы синхронизации, называется ведущим или «master», а то устройство, которое использует эти сигналы синхронизации — ведомым или «slave».

Теоретически скорость обмена в синхронном режиме значительно превышает скорость обмена в асинхронном режиме.

При обмене между двумя устройствами информация передается порциями, которые в терминологии последовательного обмена принято называть кадрами. Каждый кадр содержит определенное число бит данных и дополнительные биты, которые используются для установления надежной связи между передающим и принимающим устройствами. Одной из задач по обеспечению надежной связи является задача синхронизации обмена. Принимающее устройство должно по определенной комбинации сигналов на линиях связи распознать начало каждого нового кадра. В противном случае одна ошибка при передаче какого-либо кадра вызовет нарушение приема всех последующих кадров сеанса связи.

Интерфейсы последовательного обмена используют различные способы синхронизации обмена. Формат кадра асинхронного обмена представлен на рис. 4.56. В асинхронном режиме с использованием интерфейса SCI данные передаются байтами в стандартном американском коде ASCII (American Standard Code for Information Interchange). Кроме восьми битов данных кадр обмена содержит также стартовый и стоповый биты, отмечающие начало и конец кадра, и необязательный бит паритета. Стартовый и стоповый биты участвуют в процессе синхронизации между передатчиком и приемником, бит паритета (если он присутствует в кадре) используется для контроля на стороне приемника за наличием ошибок в принятом байте данных.

Рис. 4.56. Форма кадра асинхронного обмена


Контроллер интерфейса SCI в составе МК 68HC12 обслуживают две линии ввода/вывода: TxD — выход передатчика контроллера SCI, RxD — вход приемника контроллера SCI. При использовании асинхронного интерфейса SCI взаимодействующие устройства перед сеансом обмена должны обязательно «договориться» о скорости передачи данных. Если передатчик находится в неактивном состоянии (Idle), то на его выходе устанавливается сигнал высокого логического уровня (рис. 4.56). В это время приемник аналогичного контроллера SCI на другом конце линии постоянно сканирует уровень сигнала на входе RxD. Если приемник обнаруживает, что сигнал на линии изменил состояние с 1 на 0, то он производит несколько контрольных выборок сигнала, чтобы убедиться в наличии на линии низкого логического уровня. Если низкий уровень присутствует на линии в течение времени, равного интервалу передачи одного бита для установленной скорости обмена, то приемник распознает такое состояние как старт-бит (рис. 4.56) и начинает прием последующих бит данных. В процессе приема аппаратные средства приемника формируют метки времени, которые должны соответствовать середине интервала присутствия на линии каждого бита. По каждой метке производятся три выборки уровня сигнала на линии. По результатам выборки методом мажоритарной логики определяется значение очередного принятого бита информации. Если все три значения равны, то прием бита полностью успешный. Если значения разные, то аппаратные средства приемника устанавливают бит звона на линии, который затем может быть использован программистом при оценке надежности приема. После приема восьми (при использовании бита паритета девяти) бит данных приемник контролирует наличие на линии логической 1. Это стоп-бит, который завершает прием одного кадра. Если аппаратные средства приемника не обнаружили на линии стоп-бита, будет установлен бит ошибки формата кадра. Тогда весь кадр должен быть воспринят программой как ошибочный.

В синхронных последовательных интерфейсах передача по линии каждого бита сопровождается сигналом подтверждения по другой вспомогательной линии. Эту линию в интерфейсе SPI обозначают как SCK (Shift Clock). Такой способ передачи данных позволяет достичь очень высоких скоростей обмена. Именно он и используется в контроллерах SPI в составе МК 68HC12.

4.17.1. Термины последовательного обмена

На рис. 4.57 представлена обобщенная временная диаграмма обмена в последовательном коде. Эта диаграмма позволит нам познакомиться с терминами, которые принято использовать при описании последовательного обмена.

Рис. 4.57. Временные диаграммы синхронного последовательного обмена


Синхронизация (clock): Сигнал, который определяет скорость обмена данными в последовательных синхронных интерфейсах. Как следует из рис. 4.57, каждый бит передаваемых данных сопровождается одним импульсом синхронизации.

Скорость обмена (bit rate): Число бит, которые передаются по линии в одну секунду (бит/с). Скорость обмена в бит/с равна частоте сигнала синхронизации в Гц.

Скорость обмена (baud rate): Число бит, которые передаются по линии в одну секунду, выраженная в бодах. 1 бод = 1 бит/с.

Время передачи одного бита (bit time): Определяет временной интервал, в течение которого по линии передается один бит информации. Вычисляется как 1/(скорость обмена).

Кодирование информации для передачи одного бита (line code): Способ представления одного бита информации при передаче линиям связи.

Микроконтроллеры 68HC12 используют NRZ-кодирование (NonReturn to Zero — код с невозвращением к нулю). Этот способ кодирования предполагает, что при передаче единицы на линию выставляется высокий логический уровень, при передаче 0 — низкий логический уровень.

Рис. 4.58. Временные диаграммы передачи данных в коде с невозвращением к нулю


Стандартный американский код ASCII (American Standard Code for Information Interchange): Принятый всеми производителями вычислительной техники способ кодирования букв и цифр, а также знаков пунктуации. Каждый из перечисленных символов представляется одним байтом. При кодировании букв латинского алфавита используются только 7 младших битов, старший бит байта остается нулевым. В этот бит может быть помещен бит паритета. Таблица кодов представления символов латинского алфавита приведена на рис. 4.59.

Старший полубайт
$0_ $1_ $2_ $3_ $4_ $5_ $6_ $7_
Младший полубайт $_0 NUL DLE SP 0 @ P ` p
$_1 SON DC1 ! 1 A Q a q
$_2 STX DC2 2 B R b r
$_3 ETX DC3 # 3 C S c s
$_4 EOT DC4 $ 4 D T d t
$_5 ENQ NAK % 5 E U e u
$_6 ACK SYN & 6 F V f v
$_7 BEL ETB ' 7 G W g w
$_8 BS CAN ( 8 H X h x
$_9 HT EM ) 9 I Y i y
$_A LF SUB * : J Z j z
$_B VT ESC + ; K [ k {
$_C FF FS , < L \ l |
$_D CR GS - = M ] m }
$_E SO RS . > N ^ n ~
$_F SI US / ? O _ o DEL

Рис. 4.59. Коды символов в ASCII


Бит паритета (parity bit): Бит паритета используется для выявления одиночных ошибок при передаче одного байта информации. При использовании четного паритета значение бита равно 0, если число единичных бит в передаваемом байте является числом четным. Иначе бит паритета устанавливается равным 1, так, чтобы число единиц в байте стало четным. При использовании нечетного паритета значение бита равно 0, если число единичных бит в передаваемом байте является числом нечетным. Иначе бит паритета устанавливается равным 1, так, чтобы число единиц в байте стало нечетным.

Симплексный обмен: При симплексном режиме обмена возможна лишь однонаправленная передача информации от одного устройства к другому.

Полудуплексный обмен: При полудуплексном режиме обмена в каждый момент времени возможна лишь однонаправленная передача информации от одного устройства к другому. Но в другой момент времени направление передави может быть изменено на противоположное.

Дуплексный обмен: При дуплексном режиме обмена в каждый момент времени осуществляет двунаправленная передача информации между двумя устройствами.

Вопросы для самопроверки

1. Приведите коды ASCII для выражения «B32-VB». Для ответа воспользуйтесь таблицей рис. 4.59.

Ответ: $42 $33 $32 $2D $45 $56 $42

2. Если в задании предыдущего вопроса в старший бит каждого кода поставить значение бита паритета, то какой станет кодовая последовательность для выражения «B32-EVB». Для ответа используйте четный бит паритета.

Ответ: $42 $33 $B2 $2D $C5 $56 $42

3. В приведенной кодовой строке использован нечетный паритет. Бит паритета находится в разряде D7 кода. Какое слово зашифровано в строке $C1, $F7, $E5, $73, $EF, $6D, $E5, $A1?

Ответ: Awesome!

4. Сравните SCI и SPI интерфейсы.

Ответ: Интерфейсы SCI и SPI — это интерфейсы для последовательной передачи данных. Интерфейс SCI использует асинхронный способ передачи данных, при котором дополнительный сигнал синхронизации не используется. Вместо него применяются специальные биты синхронизации (старт- и стоп-бит). Напротив, интерфейс SPI использует дополнительную линию синхронизации.

4.18. Контроллер асинхронного обмена SCI

Различные модели МК семейства 68HC12 и HCS12 могут интегрировать на кристалле сразу несколько интерфейсов для последовательного асинхронного обмена. Однако увеличение портов асинхронного обмена не сопровождается изменением аппаратных средств контроллера SCI. На кристалле МК просто размещают несколько полностью идентичных одноканальных контроллеров SCI, различая их порядковыми номерами: SCI0, SCI1 и т.д.

Основные технические характеристики контроллера асинхронного обмена (модуля SCI) в составе МК семейства 68HC12:

• Обеспечивает полнодуплексный асинхронный режим обмена, при котором прием и передача данных могут происходить одновременно.

• Использует NRZ-кодирование, при котором для передачи единицы на линию выставляется высокий логический уровень, для передачи 0 — низкий логический уровень.

• Реализует широкий диапазон скоростей приема и передачи данных. Для задания скорости используются два регистра скорости обмена SCxBDH и SCxBDL (x — номер контроллера SCI в составе МК).

• Обеспечивает два стандартных кадра обмена в асинхронном режиме: 10-битовый (8 бит данных) и 11-битовый (9 бит данных) формат. Выбор формата кадра обмена определяет бит M в регистре управления.

• Обладает независимыми аппаратными средствами приемника (Transmitter) и передатчика (Receiver). Каждое из устройств имеет собственный бит разрешения работы: TE и RE соответственно.

• Приемник модуля SCI имеет специальный режим ожидания, который позволяет организовать локальную сеть в мультипроцессорных системах. В таких системах на основе асинхронного интерфейса одно устройство является ведущим, а все остальные — ведомыми. В каждый момент времени может происходить обмен между ведущим и одним из ведомых. Остальные ведомые при этом не должны воспринимать сигналы на общей линии связи. Это достигается путем перевода приемника контроллера SCI в состояние ожидания «Sleep Mode». Перевод приемника в это состояние осуществляется установкой бита RWU в регистре управления. Выход из состояния ожидания может происходить по двум сценариям. По первому сценарию аппаратные средства приемника должны распознать отсутствие обмена на линии связи (состояние Idle). Это состояние характеризуется наличием высокого логического уровня на линии в течение 10 или 11 интервалов передачи бита при назначенной скорости обмена. Если приемник обнаружил состояние Idle на линии, то это означает, что сеанс обмена с другим ведомым в сети окончен, ведущий может начать новый сеанс, поэтому ведомый должен стать активным, чтобы не пропустить обращение ведущего к нему. По второму сценарию ведущий посылает первый кадр обмена со специальным маркером, который информирует приемник о том, что в кадре указан адрес устройства, с которым ведущий будет производить сеанс связи. Аппаратные средства приемника реагируют на этот маркер в режиме ожидания, и при его поступлении переходят в активный режим работы. Бит WAKE в регистре управления модулем определяет выбор сценария для перевода приемника в активный режим работы.

• Аппаратные средства контроллера устанавливают четыре флага, которые могут генерировать запросы на прерывание от контроллера SCI.

1. TDRE — бит готовности буфера передатчика к приему новых данных. Устанавливается в момент, когда предварительно загруженные в регистр буфера передатчика данные автоматически переписываются в сдвиговый регистр передатчика.

2. TC — бит завершения передачи данных. Устанавливается, если данные для передачи в сдвиговом и буферном регистре данных передатчика отсутствуют. Бит TC информирует МК об отсутствии процесса передачи данных в текущий момент времени. В это время на линии TxD установлен высокий логический уровень сигнала (состояние IDLE).

3. RDRF — бит завершения приема байта данных. Устанавливается в момент, когда принятые по линии RxD данные автоматически переписываются в буферный регистр данных приемника.

4. IDLE — бит неактивного состояния линии связи. Устанавливается в 1, если на линии RxD диагностируются 10 или 11 (в зависимости от формата кадра) последовательных единиц.

• Аппаратные средства приемника диагностируют три типа ошибок:

1. Наличие шума на линии RxD. Диагностируется в случае, если при выборке очередного бита информационного кадра, включая стартовый и стоповый биты, не все три детектированные значения бита оказались равными. При обнаружении этого типа ошибки в регистре состояния устанавливается бит NF.

2. Нарушение формата принимаемого кадра. Диагностируется, если поступающая на вход RxD последовательность битов не соответствует меткам синхронизации, формируемым внутренним счетчиком приемника. Аппаратные средства приемника распознают состояние нарушения синхронизации по признаку наличия на линии нулевого логического уровня в то время, когда должен присутствовать стоповый бит с высоким логическим уровнем сигнала. При обнаружении этого типа ошибки в регистре состояния устанавливается бит FE.

3. Нарушение логики паритета кадра. Диагностируется, если функция паритета при обмене разрешена, и в принятом кадре значение бита паритета не удовлетворяет принятой логике формирования паритета: при назначенном нечетном паритете число единиц в слове четное, и наоборот. При обнаружении этого типа ошибки в регистре состояния устанавливается бит PF.

Теперь, когда Вы познакомились с общими характеристиками контроллера асинхронного обмена SCI, следует перейти к изучению его аппаратных средств и программно-логической модели. Это позволит Вам разрабатывать программы управления для контроллера SCI. А пока несколько вопросов.

Вопросы для самопроверки

1. Каково назначение бита паритета?

Ответ: Бит паритета используется для обнаружения ошибок передачи данных. При использовании всего одного бита паритета может быть обнаружена только однократная ошибка. Причем исправить эту ошибку на стороне принимающего устройства при помощи бита паритета невозможно. Однако существуют такие способы кодирования, при которых с помощью некоторого дополнительного числа бит возможно как обнаружить ошибку, так и исправить ее.

2. По какому правилу определяется значения бита паритета? Поясните разницу между четным и нечетным паритетом.

Ответ: Существенной разницы нет. Правило формирования бита паритета:

• В передаваемом слове данных подсчитывается число единиц;

• Если это число четное (при четном паритете) или нечетное (при нечетном паритете), то бит паритета устанавливается равным 0;

• Наоборот, если число нечетное (при четном паритете) или четное (при нечетном паритете), то бит паритета устанавливается равным 1.

4.18.1. Передатчик контроллера SCI

Функциональная схема передатчика в составе контроллера SCI представлена на рис. 4.60. Основным ее элементом является 11-разрядный сдвиговый регистр. Ранее, рассматривая временные диаграммы обмена, Вы могли заметить, что код символа ASCII содержит всего 7 бит. Зачем тогда передатчик использует 11-разрядный регистр? Дело в том, что в разряды этого регистра аппаратными средствами вписывается стартовый и стоповый биты. Кроме того, предусмотрена возможность обмена и 8-разрядными словами данных. В этом случае бит паритета уже невозможно будет поместить на место разряда D7, и для него предусмотрели разряд D8 сдвигового регистра. Аппаратные средства передатчика предусматривают возможность формирования как 10-разрядного кадра обмена (8 бит данных, старт и стоп-биты), так и 11-разрядного (9 бит данных, старт и стоп-биты). Выбор формата кадра обмена определяет бит M в регистре управления.

Рис. 4.60. Аппаратные средства блока передатчика в составе контроллера асинхронного обмена


Аппаратные средства передатчика модуля SCI в составе МК 68HC12 предусматривают возможность автоматического (без специальных команд программы) формирования бита паритета по содержимому передаваемого слова данных.

Блок управления формирует все необходимые сигналы для корректной работы аппаратных средств передатчика. Работа передатчика разрешается независимо от состояния приемника в составе этого же контроллера SCI. Если бит TE в регистре управления установлен, то работа передатчика активизируется, и соответствующий вывод порта PORT S конфигурируется как выход TxD. Блок управления также генерирует все запросы на прерывания, связанные с работой передатчика.

Скорость передачи данных определяется программируемым делителем, на вход которого поступает импульсная последовательность P_CLOCK системы тактирования МК. Коэффициент деления назначается битами SBR12…SBR0 регистра скорости обмена.

Байт данных, подлежащий передаче, должен быть записан с использованием любой команды пересылки в регистр данных контроллера SCI. Если сдвиговый регистр в момент записи не занят, то байт данных будет автоматически перемещен из регистра данных в сдвиговый регистр. При этом бит паритета, стартовый и стоповый биты будут подставлены автоматически. Далее без дополнительных команд программы управления начнется передача сформированного в сдвиговом регистре кадра обмена на выход TxD.

4.18.2. Приемник контроллера SCI

Функциональная схема приемника в составе контроллера SCI представлена на рис. 4.61. Так же, как и в приемнике, основным ее элементом является 11-разрядный сдвиговый регистр. Однако это уже собственный регистр приемника, поскольку контроллер SCI обеспечивает возможность обмена в двух направлениях одновременно. Напротив, программируемый делитель является общим для приемника и передатчика. Поэтому скорость приема и передачи данных для одного и того же контроллера SCI всегда одинакова.

Рис. 4.61. Аппаратные средства блока приемника в составе контроллера асинхронного обмена


Работа приемника разрешается установкой бита PE в регистре управления. Если приемник активирован, то соответствующая линия порта PORT S конфигурируется как вход RxD. Блок мажоритарной логики обрабатывает входной сигнал и формирует очередной младший бит сдвигового регистра приемника. В процессе приема каждый поступающий бит опрашивается три раза. Если все три выборки совпали (три 1 или три 0), то соответствующее значение передается в сдвиговый регистр. При несовпадении (два бита равны 1, третий — 0, или наоборот) значение бита формируется по логике «два из трех». Но одновременно устанавливается бит наличия шума на линии NF.

По завершении приема всех 10 или 11 бит кадра приемник автоматически переписывает принятую информацию в регистр данных контроллера SCI и устанавливает в 1 флаг RDRF, который информирует МК о необходимости считывания принятого байта в память МК.

4.18.3. Регистры контроллера SCI

Контроллер асинхронного обмена обслуживается несколькими группами регистров специальных функций:

• Регистры скорости обмена;

• Регистры управления;

• Регистры состояния;

• Регистры данных.

Далее мы рассмотрим формат и назначение битов каждого регистра модуля SCI.

Регистры скорости обмена SCxBDH и SCxBDL

Два 8-разрядных регистра SCxBDH и SCxBDL предназначены для управления скоростью обмена по последовательному интерфейсу SCI. Для назначения желаемой скорости используются разряды SBR12…SBR0 этих двух регистров (рис. 4.63). Число, которое следует записать в эти разряды может быть определено с использованием таблицы рис. 4.62 или рассчитано по формуле:

SBR = PCLOCK/(16×BAUD_RATE),

где SBR — десятичный эквивалент двоичного кода, который должен быть записан в разряды SBR12…SBR0 регистров SCxBDH и SCxBDL, PCLOCK — частота импульсной последовательности PCLK в Герцах, BAUD_RATE — частота обмена в бодах.

Желаемая скорость обмена (бод) Значение коэффициента при частоте внутренней системной шины
4 МГц 8 МГц
110 2273 4545
300 833 1667
600 417 833
1200 208 417
2400 104 208
4800 52 104
9600 26 52
14400 17 35
19200 13 26
38400 13

Рис. 4.62. Выбор коэффициента деления модуля SCI


Рис. 4.63. Формат регистра скорости обмена SCxBDH/SCxBDL


Пример

Необходимо настроить первый контроллер асинхронного обмена (SCI0) на скорость 9600 бод. Если частота импульсной последовательности PCLK равна 8 МГц, то коэффициент деления, который должен быть записан в регистры SC0BDH и SC0BDL, равен:

SBR0 = 8000000/(16×9600) = 52 = $34

Следующий программный фрагмент реализует инициализацию скорости обмена:

/*----------------------*/

/* filename: ini_SCI0.c */

/*----------------------*/

#include <912b32.h>


void main(void) {

 SC0BDH = 0х00;

 SC0BDL = 0х34;

}

/*----------------------*/

Регистры управления SCxCR1 и SCxCR2

Рис. 4.64. Формат регистра управления SCxCR1


Формат первого регистра управления контроллера SCI представлен на рис. 4.64. Биты этого регистра имеет следующее назначение:

LOOPS:

Бит разрешения «замкнутого» режима работы контроллера SCI. Установка в 1 бита LOOPS вызывает перекоммутацию входа приемника линии RxD, который внутренними средствами отсоединяется от вывода RxD и подсоединяется к выходу передатчика. В этом режиме возможен контроль передаваемой информации. Также режим может быть использован для тестирования работы программного обеспечения без использования устройства управления верхнего уровня. Для реализации «замкнутого» режима должна быть разрешена работа как передатчика, так и приемника.

1 — «замкнутый» режим работы разрешен;

0 — «замкнутый» режим работы запрещен.

WOMS:

Бит выбора режима открытого коллектора. Этот бит определяет состояние выходных буферов линий TxD и RxD.

1 — буферы переведены в режим открытого коллекторного выхода;

0 — буферы работают в режиме обычного двухстабильного логического выхода (TxD) и входа (RxD).

Перевод линий TxD и RxD в режим открытого коллектора позволяет соединить их по схеме «монтажное И», что делает возможным двусторонний обмен по одной линии. Кроме того, при такой конфигурации возможно создание системы с несколькими передающими устройствами.

RSRC:

Бит выбора внутренней схемотехники в «замкнутом» режиме работы. Если бит LOOPS = 1 и бит RSRC = 1 то вход приемника коммутируется непосредственно к выводу TxD микроконтроллера. При RSRC = 0 вход приемника подсоединяется к выходу передатчика внутри МК.

M:

Бит выбора формата кадра асинхронного обмена.

1 — 11-битовый формат кадра: 1 стартовый бит, 9 бит слова данных, 1 стоповый бит;

0 — 10-битовый формат кадра: 1 стартовый бит, 8 бит слова данных, 1 стоповый бит.

WAKE:

Бит выбора способа выхода приемника из неактивного состояния:

1 — установка маркера адреса (бит D7 при M=0 или бит D8 при M=1) ) переводит приемник в активный режим работы;

0 — состояние IDLE на линии переводит приемник в активное состояние.

После сброса МК бит устанавливается в 0.

ILT:

Бит выбора режима распознавания неактивного состояния линии RxD. Этот бит определяет момент начала отсчета для определения неактивного состояния линии RxD:

1 — отсчет начинается после идентификации стоп-бита;

0 — отсчет начинается после идентификации старт-бита.

После сброса МК бит устанавливается в 0.

PE:

Бит разрешения работы логики паритета.

1 — формирование бита паритета передатчиком и его анализ приемником реализуются;

0 — функция паритета отключена.

PT:

Бит выбора четного или нечетного паритета (Parity Bit)

1 — бит паритета формируется из условия нечетного числа 1 в слове;

0 — бит паритета формируется из условия четного числа 1 в слове.

Рис. 4.65. Формат регистра управления SCxCR2


Формат второго регистра управления контроллера SCI приведен на рис. 4.65. Четыре старших бита этого регистра (TIE, TCIE, RIE, ILIE) разрешают генерацию запросов на прерывания по разным событиям контроллера SCI. Назначение отдельных битов регистра SCxCR2 следующее:

TIE:

Бит разрешения прерывания от передатчика контроллера SCI. Этот бит разрешает генерацию запроса на прерывание при установке в 1 флага готовности буфера данных передатчика к приему от программы нового байта (бит TDRE).

1 — прерывания от передатчика по флагу SCDE разрешены;

0 — прерывания от передатчика по флагу SCDE запрещены.

TCIE:

Бит разрешения прерывания от передатчика контроллера SCI. Этот бит разрешает генерацию запроса на прерывание при установке в 1 флага завершения работы передатчика TC.

1 — прерывания от передатчика по флагу TC разрешены;

0 — прерывания от передатчика по флагу TC запрещены.

RIE:

Бит разрешения прерывания от приемника контроллера SCI. Этот бит разрешает генерацию запроса на прерывание при установке в 1 флага завершения приема очередного байта RDRF.

1 — прерывания от приемника по флагу SCRF разрешены;

0 — прерывания от приемника по флагу SCRF запрещены.

ILIE:

Бит разрешения прерывания от приемника по флагу IDLE. Этот бит разрешает генерацию запроса на прерывание при установке в 1 флага неактивного состояния линии RxD.

1 — прерывания при установленном флаге IDLE разрешены;

0 — прерывания по флагу IDLE запрещены.

TE:

Бит разрешения работы передатчика контроллера SCI. Если бит TE будет сброшен в процессе передачи, то передача текущего байта будет завершена.

1 — передача разрешена;

0 — передача запрещена.

RE:

Бит разрешения работы приемника контроллера SCI.

1 — прием разрешен;

0 — прием запрещен.

RWU:

Бит управления режимом ожидания приемника контроллера SCI. Установка бита RWU под управлением программы в 1 переводит приемник контроллера SCI в режим ожидания. Пока приемник находится в этом режиме, ни один из флагов, которые связаны с работой приемника (RDRF, IDLE, OR, NF, FE, PE), не может быть установлен. Однако те флаги, которые уже были установлены к моменту перевода приемника в режим ожидания, не сбрасываются в момент записи 1 в бит RWU. Способ перевода приемника в активный режим работы определяет бит WAKE в регистре SCxCR1.

SBK:

Бит управления сообщением «конец сеанса обмена». Если бит SBK установить под управлением программы в 1, то передатчик контроллера SCI генерирует в линию TxD последовательность из 10 (бит M=0) или 11 (бит M=1) нулевых битов и одного единичного бита.

Регистры состояния SCxSR1 и SCxSR2

Рис. 4.66. Формат регистра состояния SCxSR1


Формат первого регистра состояния контроллера SCI представлен на рис. 4.66. Старшие четыре бита регистра SCxSR1 содержат флаги событий, которые используются в штатных режимах работы приемника и передатчика. Младшие четыре бита отражают тип зафиксированной ошибки приема. Все флаги, связанные с работой приемника сбрасываются после выполнения операции чтения младшего байта регистра данных приемника. Назначение отдельных битов регистра SCxSR1 следующее:

TDRE:

Бит готовности буфера передатчика к приему новых данных. Устанавливается в момент, когда предварительно загруженные в регистр буфера передатчика данные автоматически переписываются в сдвиговый регистр передатчика.

TC:

Бит завершения передачи данных. Устанавливается, если данные для передачи в сдвиговом и буферном регистре данных передатчика отсутствуют, а также, если не реализуется режим передачи сообщения «конец сеанса обмена». Бит TC информирует МК об отсутствии процесса передачи данных в текущий момент времени. В это время на линии TxD установлен высокий логический уровень сигнала (состояние IDLE). Бит TC вызывает генерацию запроса на прерывание, если бит TCIE в регистре SCxCR2 установлен.

RDRF:

Бит завершения приема байта данных. Устанавливается в момент, когда принятые по линии RxD данные автоматически переписываются в буферный регистр данных приемника. Бит RDRF вызывает генерацию запроса на прерывание, если бит RIE в регистре SCxCR2 установлен.

IDLE:

Бит неактивного состояния линии RxD. Устанавливается в 1, если на линии RxD диагностируются 10 или 11 (в зависимости от формата кадра) последовательных единиц. Бит IDLE вызывает генерацию запроса на прерывание, если бит ILIE в регистре SCxCR2 установлен.

OR:

Бит ошибки приема. Устанавливается при попытке записи аппаратными средствами приемника очередного принятого байта из сдвигового регистра в буферный регистр данных в то время, как предыдущие данные из буферного регистра еще не считаны (бит RDRF установлен).

NF:

Бит наличия шума на линии приемника RxD. Устанавливается в случае, если при выборке очередного бита информационного кадра, включая стартовый и стоповый биты, не все три детектированные значения бита оказались равными. Бит NF устанавливается одновременно с битом завершения приема того байта, при передаче которого обнаружен шум.

FE:

Бит нарушения формата кадра. Устанавливается, если поступающая на вход RxD последовательность битов не соответствует меткам синхронизации, формируемым внутренним счетчиком приемника. Аппаратные средства приемника распознают состояние нарушения синхронизации по признаку наличия на линии нулевого логического уровня в то время, когда должен присутствовать стоповый бит с высоким логическим уровнем сигнала.

PF:

Бит нарушения паритета кадра. Устанавливается, если функция паритета при обмене разрешена, и в принятом кадре значение бита паритета не удовлетворяет принятой логике формирования паритета: при назначенном нечетном паритете число единиц в слове четное, и наоборот.

Формат второго регистра состояния контроллера SCI представлен на рис. 4.67. Регистр SCxSR2 содержит всего один бит RAF. Этот бит автоматически устанавливается в 1 в то время, когда в сдвиговом регистре приемника продолжается формирование очередного принимаемого байта данных.

Рис. 4.67. Формат регистра состояния SCxSR2


Регистры данных SCxDRH и SCxDRL

Формат двух 8-разрядных регистров данных контроллера SCI представлен на рис. 4.68. Регистр SCxDRL используется, если контроллер SCI настроен на обмен данными в 8-разрядном формате (10-битовый формат кадра). Тогда по адресу регистра SCxDRL записываются данные для передачи, и из этого же регистра считываются принятые данные. Если контроллер SCI настроен на обмен данными в 9-разрядном формате (11-битовый формат кадра), то старший бит для передачи записывается под управлением программы в разряд T8 регистра SCxDRH, а при приеме из разряда R8 считывается старший 9-ый бит принятого слова. Младшие восемь разрядов при передаче и при приеме, как и в случае 8-разрядного слова данных, находятся в регистре SCxDRL.

Рис. 4.68. Формат регистра данных SCxDRH/SCxDRL


Вопросы для самопроверки

1. Каково различие между битами TDRE и RDRF?

Ответ: Оба бита являются флагами, которые отражают состояние контроллера SCI. Флаг TDRE устанавливается в 1, когда регистр данных передатчика автоматически переписывается в сдвиговый регистр. В этом случае говорят, что регистр данных передатчика пуст. Флаг RDRF устанавливается в 1, когда процесс приема данных в сдвиговый регистр приемника закончен, и очередное слово данных готовы к считыванию.

2. Каково назначение флага PF? Почему он чрезвычайно важен при обмене информацией в последовательном коде?

Ответ: Флаг нарушения паритета кадра PF устанавливается, когда произошла ошибка в приеме одного или нескольких бит одного кадра. Прикладная программа контролирует бит PF, как индикатор неверного приема, и должна повторить обмен.

3. Опишите события, которые могут генерировать прерывания от модуля SCI.

Ответ: Четыре источника прерываний ассоциируются с модулем SCI:

• Прерывание по флагу TDRE, когда регистр данных приемника пуст. Это прерывание разрешается битом TIE в регистре управления SCxCR2;

• Прерывание по флагу TC, когда передача слова закончена. Это прерывание разрешается битом TCIE в регистре управления SCxCR2;

• Прерывание по флагу RDRF, когда прием очередного слова завершен. Это прерывание разрешается битом RIE в регистре управления SCxCR2;

• Прерывание по флагу IDLE, когда приемник находится в неактивном состоянии. Это прерывание разрешается битом ILIE в регистре управления SCxCR2.

4.18.4. Алгоритмы программного обслуживания контроллера SCI

Три относительно независимых последовательности действий должна выполнить прикладная программы в процессе использования контроллера асинхронного обмена SCI:

• Инициализацию приемника и передатчика контроллера;

• Управление процессом передачи информации;

• Управление процессом приема информации.

Обобщенные блок-схемы алгоритмов управления программно-доступными ресурсами контроллера SCI для каждого из перечисленных действий приведены на рис. 4.69.

Рис. 4.69. Блок-схемы алгоритмов программного обслуживания контроллера асинхронного обмена SCI


Инициализация контроллера SCI. Инициализацию контроллера SCI рекомендуется проводить в следующем порядке:

• Установить скорость обмена;

• Выбрать формат кадра обмена: 8 или 9 бит данных;

• Назначить параметры приема и передачи в регистрах управления SCxCR1 и SCxCR2;

• Очистить флаг TDRE. Для этого сначала считать регистр состояния SCxSR1, а затем выполнить операцию записи в регистр данных SCxRD.

Следует заметить, что аппаратные средства модуля SCI предполагают, что и прием, и передача информации могут происходить только с одинаковой скоростью, с одинаковым форматом кадра и одинаковой логикой паритета.

Управление процессом передачи информации. Для того чтобы передать один байт информации с использованием передатчика контроллера SCI, следует сначала проверить состояние флага TDRE. Если этот флаг установлен в 1, то регистр данных передатчика пуст, и в него может быть записан новый байт для передачи. Далее данные загружаются в один регистр данных SCxDRL, если обмен происходит в 8-разрядном формате, или в два регистра данных SCxDRH:SCxDRL, если обмен производится в 9-разрядном формате. Коды из регистра данных загружаются в сдвиговый регистр передатчика автоматически, после чего начинается собственно процесс передачи. О завершении передачи информирует бит TC, который установится в 1, когда все разряды регистра сдвига будут последовательно выданы на выход TxD. Флаги TDRE и TC могут генерировать запросы на прерывания, если соответствующие биты разрешения прерывания установлены.

Управление процессом приема информации. При приеме информации с использованием приемника контроллера SCI, следует постоянно контролировать состояние флага RDRF. Этот флаг устанавливается в 1, когда прием очередного байта закончен, и принятые данные доступны в регистре данных приемника. Бит может генерировать запрос на прерывание, при условии, что эти прерывания разрешены. Обнаружив в процессе мониторинга флага RDRF или прервавшись по его запросу, МК должен считать данные из регистров SCxDRH:SCxDRL.

4.18.5. Пример программирования контроллера SCI

Приведенный ниже программный фрагмент SCI.c иллюстрирует технику программного обслуживания асинхронного последовательного интерфейса МК семейства 68HC12.

Отладочная плата MC68HC912B32EVB предоставляет возможность использования только одного контроллера SCI с номером 0. Поэтому в именах регистров специальных функций символ «x» будет заменен нами на символ «0».

Ниже перечислены биты и регистры управления, которые используются в данном примере:

• SC0BDH:SC0BDL — регистры скорости обмена контроллера SCI. Записанное в него двоичное число определяет скорость передачи данных и скорость приема данных, которые для одного контроллера в соответствии с его принципом действия могут быть только равными;

• SC0CR1 — первый регистр управления контроллера SCI. Используется для выбора формата 8-ми или 9-ти разрядного представления слова в кадре обмена данными (бит M), для выбора режима работы с паритетом или без него (бит PE), для назначения четной или нечетной логики формирования паритета (бит PT);

• SC0CR2 — второй регистр управления контроллера SCI. Его биты разрешают работу передатчика (бит TE) и приемника (бит RE);

• SC0DRL — регистр данных контроллера SPI, младший байт. Используется для обмена данными в последовательном коде в 8-разрядном формате;

• SC0SR1 — первый регистр состояния контроллера SCI. Этот регистр содержит флаг готовности буфера передатчика к приему новых данных TDRE и флаг завершения приема очередного слова в буфер приемника RDRF.

В нашем примере задействован только передатчик контроллера SCI. Он будет непрерывно посылать по линии последовательной связи TxD (вывод PORTS0) код символа «S». Прерывания от контролера SCI в данном примере не используются.

Контроль за состоянием флага TDRE ведется методом полинга.

/*-------------------------------------------------------------------*/

/* filename: SCI.c                          */

/* МAIN PROGRAМ: Эта программа реализует непрерывную посылку кода   */

/* символа "S"с скоростью 9600 бод в 8-разрядном формате (кадр 10 бит)*/

/* с битом паритета                         */

/*-------------------------------------------------------------------*/

/*подключаемые файлы*/

#include <912b32.h>


/*используемые функции*/

void sci_init(void);

void sci_trans(void);


void main(void) {

 sci_init(); /*инициализация модуля SCI*/

 while(1) {

  sci_trans(); /*передавать данные непрерывно*/

 }

}


/*-------------------------------------------------------*/

/* Функция sci_init производит инициализацию модуля SCI. */

/*-------------------------------------------------------*/

void sci_init(void) {

 unsigned char clear;

 SC0BDL = 0x34; /*установить скорость 9600 бод*/

 SC0BDH = 0x00;

 SC0CR1 = 0х04; /*10-разрядный формат кадра 8 бит данных, с*/

        /*контролем паритета, логика паритета нечетная */

 clear = SC0SR1; /*операция для сброса флага TDRE*/

         /*флаг сбрасывается в два действия*/

         /*сначала читать регистр SC0SR1*/

         /*затем записать в регистр SC0DRL*/

}


/*-------------------------------------------------------------------*/

/* Функция sci_trans осуществляет непрерывную пересылку одного байта */

/*-------------------------------------------------------------------*/

void sci_trans(void) {

 SC0CR2 = 0x08; /*разрешить работу передатчика*/

 SC0DRL = 's'; /*загрузить в буфер передатчика код символа "S"*/

 while (SC0SR1 != 0x80) /*ожидать установления бита TDRE)

 {

  ;

 }

}

/*-------------------------------------------------------------------*/

Если соединить два микропроцессорных контроллера по последовательному интерфейсу так, что выход TxD первого МК будет соединен со входом RxD второго МК и наоборот, то можно будет организовать двусторонний обмен информацией.

Именно эту задачу Вам предстоит решить в домашнем задании №11, полный текст которого Вы найдете в конце главы.

4.19. Синхронный последовательный интерфейс SPI

Интерфейс SPI относится к группе синхронных последовательных интерфейсов. Принцип действия интерфейсов этого типа предполагает, что передача каждого бита данных по однопроводной линии сопровождается сигналом синхронизации, который передается по другой линии. Спецификация интерфейса SPI определяет число линий связи и временные диаграммы сигналов на этих линиях в процессе обмена данными.

4.19.1 Концепция интерфейса SPIФункциональная схема обмена между двумя контроллерами SPI

Рис. 4.70.


Функциональная схема организации обмена данными с использованием интерфейса SPI представлена на рис. 4.70. При описании режимов работы и линий связи интерфейса SPI приняты к использованию следующие термины и обозначения:

Master Mode — режим ведущего. Устройство, работающее в режиме ведущего, начинает сеанс обмена, генерирует передаваемые данные в ведомое устройство и формирует сигналы синхронизации, сопровождающие эти данные.

Slave Mode— режим ведомого. Устройство, работающее в режиме ведомого, получает сигналы синхронизации от ведущего. В момент поступления импульса синхронизации ведомое устройство запоминает очередной бит 8-разрядного слова, переданный ведущим по одной линии данных, и выставляет на другую линию данных очередной бит другого 8-разрядного слова, передаваемого от ведомого к ведущему.

MOSI (Master Output Slave Input) — линия передачи данных от ведущего к ведомому.

MISO (Master Input Slave Output) — линия передачи данных от ведомого к ведущему.

SCK (Serial Shift Clock) — линия сигнала синхронизации данных. По этой линии ведущее устройство «сообщает» ведомому о начале сеанса обмена с ним.

4.19.2. Алгоритмы работы контроллера SPI

В данном разделе мы рассмотрим организацию обмена данными с использованием аппаратных средств контроллера SPI в составе МК 68HC12. Мы также кратко остановимся на регистрах управления контроллера SPI. Более подробно эти регистры будут рассмотрены в следующем параграфе.

На рис. 4.71 представлена функциональная схема контроллера SPI. Остановимся сначала на системе синхронизации, которая располагается в левом верхнем углу рисунка. Модуль SPI использует в качестве источника тактирования импульсную последовательность PCLOCK, частота которой равна частоте ECLOCK (т.е. частоте системной шины МК). Частота PCLOCK делится делителем с программируемым коэффициентом. На выходе делителя формируется сигнал, частота которого определяет скорость обмена данными по SPI, если контроллер работает в ведущем режиме. Коэффициент деления назначается битами SPR2…SPR0 регистра скорости передачи SP0BR.

Рис. 4.71. Аппаратные средства контроллера синхронного обмена SPI


Данные, которые подлежат передаче, а также принятые от другого устройства данные, записываются в регистр данных SP0DR. Управление режимами работы контроллера осуществляется двумя регистрами управления SP0CR1 и SP0CR2. Текущее состояние процесса передачи данных отражает регистр состояния SP0SR. И, наконец, контроллер взаимодействует с внешним миром по четырем линиям порта S (сигналы MOSI, MISO, SCK и ).

Если два устройства связаны по SPI, то 8-разрядный регистр данных ведущего устройства и 8-разрядный регистр данных ведомого устройства образуют вместе 16-разрядный кольцевой сдвиговый регистр (рис. 4.70). В процессе передачи код 16-разрядного регистра сдвигается под действием импульсов синхронизации SCK. В ответ на каждый импульс SCK один двоичный разряд выдвигается из регистра данных ведущего на линию MOSI и запоминается в первом слева разряде регистра ведомого (см. рис. 4.70). В то же время крайний правый бит регистра данных ведомого выдвигается на линию MISO и запоминается в регистре ведущего. В результате, по прошествии восьми импульсов синхронизации SCK код 8-разрядного регистра данных ведущего переместится в регистр данных ведомого, а 8-разрядный код ведомого — в регистр данных ведущего. Таким образом, в процессе обмена ведущее и ведомое устройства поменяются содержимым их регистров данных.

Для того, чтобы начать обмен данными по SPI, необходимо выполнить некоторую последовательность действий по инициализации контроллера SPI. Во-первых, порт S должен быть конфигурирован соответствующим образом с использованием регистра направления передачи порта DDRS. Далее следует установить коэффициент деления частоты PCLOCK. Возможные значения коэффициента деления: 2, 4, 8, 16, 32, 64, 128 и 256. Желаемый коэффициент деления устанавливается разрядами SPR2…SPR0 регистра скорости передачи SP0BR. Для сигнала синхронизации SCK следует определить не только частоту, но и форму сигнала. По форме сигнала различают четыре типа сигналов синхронизации SCK, которые отличаются полярностью и сдвигом фазы по отношению к сигналам на линиях MOSI и MISO. Выбор формы сигнала SCK определяется комбинацией битов CPOL:CPHA в регистре управления SP0CR1.

Выбрав скорость обмена, следует определить значения битов управляющих регистров SP0CR1 и SP0CR2. Так бит MTSR регистра управления SP0CR1 ведущего должен быть установлен в 1, а такой же бит в регистре управления ведомого — в 0. Тогда первому контроллеру будет назначен режим ведущего, а второму — режим ведомого. И они составят пару для обмена. Кроме того, для организации обмена необходимо правильно установить уровни сигналов на входах обоих контроллеров. Если в системе всего два устройства связаны по шине SPI, то вход ведущего должен быть установлен в 1, а аналогичный вход ведомого в 0 (рис. 4.70). Если в системе к шине SPI подключено несколько ведомых устройств, то вход выбора ведомого каждого устройства должен устанавливаться в 0 ведущим только тогда, когда ведущий обменивается данными именно с этим устройством. Во время обмена данным с другими ведомыми устройствами вход неактивного ведомого должен находиться в 1.

После того, как все биты регистров управления SP0CR1 и SP0CR2 установлены в соответствии с выбранным режимом работы, следует разрешить работу контроллера SPI. Для этого предназначен бит SPE регистра SP0CR1. Разрешение работы ведущего контроллера SPI должно быть выполнено ранее ведомого.

Если все операции по инициализации модулей SPI ведущего и ведомого МК завершены, то можно приступить к непосредственно к обмену данными. Начало обмена инициирует ведущий. Для этого необходимо под управлением программы записать пересылаемый байт информации в регистр данных SP0DR модуля SPI. Если сдвиговый регистр модуля в момент записи оказался пустым, то данные немедленно автоматически перемещаются из регистра данных в сдвиговый регистр. Далее аппаратные средства контроллера SPI формируют восемь импульсов синхронизации SCK. Каждый импульс SCK сдвигает один двоичный разряд регистра данных ведущего по линии MOSI в регистр данных ведомого. Одновременно другой разряд регистра данных ведомого по линии MISO вдвигается в регистр данных ведущего. По истечении восьми импульсов SCK пересылка одного байта заканчивается, и устанавливаются флаги SPIF в регистре состояния обоих контроллеров. В ведущем МК флаг SPIF сигнализирует о завершении передачи одного байта, в то время, как в ведомом МК этот флаг информирует о завершении приема байта данных. Если пересылка следующих байтов не предполагается, то вход ведомого должен быть установлен в 1, что переводит контроллер SPI ведомого устройства в неактивное состояние. Рассмотренный способ обмена характеризуется одновременным перемещением данных от ведущего к ведомому и в обратном направлении. Такой способ обмена называют полнодуплексным.

Аппаратные средства контроллера SPI могут генерировать запросы на прерывание. Два источника запросов располагаются в регистре состояния SP0SR. Первый источник — триггер завершения обмена SPIF, второй источник — флаг нарушения режима MODF.

Оба прерывания разрешаются установкой в 1 бита SPIE в регистре управления SP0CR1.

Вопросы для самопроверки

1. Каковы различия между двумя режимами работы контроллера SPI: режимом ведущего и режимом ведомого?

Ответ: Контроллер SPI, работающий в режиме ведущего, начинает обмен и генерирует импульсы синхронизации SCK для обмена. Таким образом, ведущий контроллер управляет обменом. Ведомый контроллер SPI ожидает сигналов от ведущего, и под их управлением запоминает информацию с линии MOSI, а также генерирует информацию на линию MISO. Завершается обмен под управлением ведущего.

2. Каково назначение сигнала SCK?

Ответ: Сигнал SCK предназначается для синхронизации передачи информации между двумя устройствами. Частота этого сигнала определяет скорость передачи. В течение одного периода SCK два устройства обмениваются одним битом данных.

4.19.3. Регистры контроллера SPI

Подобно контроллеру асинхронного обмена контроллер SPI обслуживается несколькими регистрами специальных функций:

• Регистр скорости обмена;

• Регистры управления;

• Регистр состояния;

• Регистр данных.

Далее мы рассмотрим формат и назначение битов каждого регистра модуля SPI.

Регистр скорости обмена SPxBR

Регистр скорости обмена SPxBR позволяет выбрать частоту следования импульсов синхронизации SCK, а, следовательно, и скорость обмена по синхронному последовательному интерфейсу. Формат регистра SPxBR представлен на рис. 4.72. Три бита этого регистра SPR2…SPR0 определяют коэффициент деления импульсной последовательности ECLOCK, из которой образуется сигнал синхронизации SCK. Соответствие численных значений коэффициентов деления возможным комбинациям битов SPR2…SPR0 устанавливает таблица рис. 4.72. Внимательно проанализируйте данные этой таблицы. Вспомните, что при тех же частотах системной шины МК, максимальная скорость обмена в асинхронном режиме с использованием контроллера SCI составляла 38400 бод, что для SPI эквивалентно частоте SCK в 38,4 кГц. А для контроллера SPI максимальная частота синхронизации, а, следовательно, и максимальная скорость обмена составляет 4,0 МГц.

Выбор частоты обмена по SPI

SPR[2:0] Коэффициент деления При частоте внутренней системной шины
4 МГц 8 МГц
000 2 2,0 МГц 4,0 МГц
001 4 1,0 МГц 2,0 МГц
010 8 500 кГц 1,0 МГц
011 16 250 кГц 500 кГц
100 32 125 кГц 250 кГц
101 64 62,5 кГц 125 кГц
110 128 31,3 кГц 62,5 кГц
111 256 15,6 кГц 31,3 кГц Формат регистров управления контроллера SPI

Рис. 4.72.


Регистры управления SPxCR1 и SPxCR2

Формат первого регистра управления SPxCR1 контроллера SPI представлен на рис. 4.72. Биты этого регистра имеет следующее назначение:

SPIE:

Бит разрешения прерывания по запросу модуля SPI. Бит разрешает генерацию запросов на прерывание от модуля SPI. Запросы в модуле SPI могут генерироваться при установленном флаге SPIF, который свидетельствует о завершении приема или передачи одного байта информации, или при установленном флаге ошибки MODF.

1 — прерывания разрешены;

0 — прерывания по запросу приемника запрещены.

SPE:

Бит разрешения работы модуля SPI.

1 — контроллер SPI включен;

0 — контроллер SPI выключен.

SWOM:

Бит выбора режима открытого коллектора. Этот бит определяет состояние выходных буферов линий MOSI, MISO, SCK, если эти линии работают на вывод.

1 — буферы переведены в режим открытого коллекторного выхода;

0 — буферы работают в режиме двунаправленной передачи с возможностью установки в высокоимпедансное состояние.

Перевод линий MOSI и MISO в режим открытого коллектора позволяет соединить их по схеме «монтажное И».

MSTR:

Бит режима работы контроллера SPI.

1 — контроллер SPI работает в режиме ведущего (Master);

0 — контроллер SPI работает в режиме ведомого (Slave).

CPOL:

Бит выбора полярности сигнала синхронизации SCK.

Этот бит определяет состояние линии SCK между сеансами передачи данных. Бит CPOL вместе с битом CPHA задает один из четырех возможных режимов SPI интерфейса.

1 — SCK=1 между сеансами передачи данных

0 — SCK=0 между сеансами передачи данных

CPHA:

Бит выбора фазы сигнала синхронизации SCK. Этот бит определяет протокол обмена по SPI шине. Если CPHA=0, то начало обмена инициируется установкой сигнала выбора ведомого в активное состояние (режимы 0 и 1). Первый перепад сигнала синхронизации SCK используется принимающим устройством для запоминания очередного бита в сдвиговом регистре. Передающее устройство выставляет очередной бит посылки на линии MOSI по каждому четному фронту сигнала SCK. Сигнал на линии выбора ведущего должен быть возвращен в неактивное состояние после передачи каждого байта в любом направлении. Режимы 0 и 1 предпочтительно использовать в системах, которые имеют более одного ведомого устройства.

Если CPHA=1, то начало обмена определяет первое изменение уровня сигнала на линии SCK после установки сигнала выбора ведомого в активное состояние (режимы 2 и 3). Все нечетные перепады SCK вызывают выдвижение очередного бита посылки из сдвигового регистра передатчика на линию. Каждый четный перепад используется для записи этого бита в сдвиговый регистр приемника. Сигнал выбора ведомого может оставаться в активном состоянии = 0 в течение передачи нескольких байт информации. Режимы 2 и 3 рекомендуется использовать в системах с одним ведомым устройством.

SSOE:

Бит разрешения работы вывода в режиме ведущего. Если контроллер SPI работает в режиме ведущего, то при установке этого бита в 1 вывод может использоваться как вывод для формирования сигнала «выбор ведомого»

1 — функция выхода разрешена;

0 — функция выхода не реализуется.

LSBF:

Бит выбора очередности выдачи битов данных на линию MOSI. Если бит LSBF сброшен, то данные в процессе передачи выставляются на линию MOSI, начиная со старшего бита. Этот режим считается нормальным режимом обмена для интерфейса SPI. Если же бит LSBF установлен в 1, то при передаче первым на линию MOSI выдается младший бит. Некоторые периферийные ИС требуют такого режима обмена.

Формат второго регистра управления SPxCR2 контроллера SPI также приведен на рис. 4.72. Этот регистр содержит всего три бита управления:

PUPS:

Бит выбора схемотехники входных буферов порта S. Если этот бит равен 1, то все линии порта S, которые находятся в режиме ввода, переходят в состояние входа с внутренним подтягивающим к напряжению питания резистором.

RDS:

Бит выбора схемотехники выходных буферов порта S. Если этот бит равен 1, то все линии порта S, которые находятся в режиме вывода, переходят в состояние выхода с пониженной нагрузочной способностью.

SPCO:

Совместно с битом MSTR этот бит определяет конфигурацию входов/выходов контроллера SPI на выводы корпуса МК в соответствие с таблицей рис. 4.73.

Познакомившись с назначением отдельных битов регистров управления SPxCR1 и SPxCR2, можно сказать, что эти регистры определяют конфигурацию аппаратных средств контроллера SPI. Разъясним дополнительно функции битов MSTR регистра SPxCR1 и SPCO регистра SPxCR2. Возможные комбинации кодов этих двух битов и соответствующие им внутренние соединения линии ввода и линии вывода контроллера SPI показаны на рис. 4.73. Например, если значения рассматриваемых битов равны SPCO:MSTR = 01, то вывод MISO будет выполнять функцию ввода данных, а вывод MOSI — функцию вывода данных контроллера SPI, работающего в режиме ведущего. Линия SCK при этом значении кодовой комбинации битов SPCO:MSTR будет использоваться для выдачи импульсов синхронизации, а линия может быть дополнительно сконфигурирована на ввод или на вывод. Примечания 1–5 на рис 4.73 содержат дополнительную информацию по конфигурированию линий порта S для обслуживания контроллера SPI записи 0 или 1 в соответствующие разряды регистра направления передачи DDRS порта S. Мы рассмотрим эти рекомендации в примере программного обслуживания контроллера SPI (раздел 4.19.4).

На рис. 4.73 показано, что выходы контроллера SPI могут работать как в нормальном двухпроводном режиме (обмен одновременно идет по линиям SI и SO), так и в однопроводном режиме (обмен идет по одной линии).

Рис. 4.73. Выбор режима работы контроллера SPI


Формат регистра состояния SPxSR контроллера SCI представлен на рис. 4.74.

Рис. 4.74. Формат регистра состояния контроллера SPI


Регистр SPxSR содержит всего три бита флагов состояния:

SPIF:

Бит завершения обмена одним байтом данных. Устанавливается в момент, когда все восемь бит данных выставлены на линию последовательного обмена. Этот бит сигнализирует микроконтроллеру о том, что записанный ранее байт данных передан в линию и можно либо загружать новый байт для передачи, либо читать принятый в процессе передачи байт. Этот бит сбрасывается в результате выполнения двух последовательных операций. Сначала читают регистр состояния SPxSR, затем выполняют операцию чтения или записи регистра данных SP0DR.

WCOL:

Бит нарушения режима передачи данных. Этот бит устанавливается в 1, если МК пытается записать в регистр данных SPxDR новый байт для передачи в то время, когда предыдущий байт еще находится в процессе передачи.

MODF:

Бит нарушения режима контроллера SPI. Устанавливается, если на линию ведущего (MSTR = 1) подали сигнал низкого логического уровня. Бит MSTR = 1 назначает режим ведущего для контроллера SPI, а = 0 пытается перевести контроллер в режим ведомого. Такая ситуация является конфликтной, о чем и сигнализирует флаг MODF.

Регистр данных SPCxDR

Формат регистра данных контроллера SPI приведен на рис. 4.75. Особенностью этого регистра является то, что он одновременно является регистром для размещения как передаваемых, так и принимаемых данных. Эта особенность обусловлена рассмотренным ранее принципом обмена по интерфейсу SPI. В процессе обмена регистр данных передающего контроллера (этот контроллер ведущий) и регистр данных принимающего контроллера (этот контроллер ведомый) объединяются в 16-разрядный кольцевой сдвиговый регистр. По прошествии восьми импульсов синхронизации SCK 8-разрядное слово из ведущего контроллера сдвигается в регистр данных ведомого контроллера. При этом 8-разрядное слово регистра данных ведомого перемещается в регистр данных ведущего. Таким образом, независимо от того, желает программист передать данные из ведущего в ведомый или принять данные из ведомого в ведущий, в любом из этих случаев оба устройства одновременно принимают и передают данные. Поэтому до сеанса обмена регистр данных ведущего контроллера содержит подготовленные к передаче данные, а после сеанса обмена этот же регистр содержит принятые данные.

Рис. 4.76. Формат регистра данных и альтернативные функции линий порта PORTS


Регистр данных порта S

Порт S может работать в режиме порта ввода/вывода общего назначения. Работа каждой линии в режиме ввода или в режиме вывода определяется соответствующим разрядом регистра направления передачи DDRS. Если линия порта PSx установлена на ввод, то чтение регистра данных порта PORTS возвращает в разряде PORTSx значение сигнала на соответствующем выводе МК. Если линия PSx установлена на вывод, то запись в разряд PORTSx регистра данных PORTS 1 или 0 устанавливает на выводе МК сигнал с логическим уровнем 1 или 0. Альтернативной функцией порта S является обслуживание контроллеров асинхронного SCI и синхронного SPI последовательного обмена.

Регистр направления передачи порта S

Если порт S работает в режиме порта ввода/вывода общего назначения, то биты регистра направления передачи DDRS определяют режим ввода или режим вывода для каждой линии порта S. Если разряд DDRSx установлен в 0, то линия PSx работает в режиме ввода. При DDRSx = 1 линия PSx работает в режиме вывода.

Рис. 4.77. Формат регистра направления передачи порта PORTS


Если активизированы контроллеры последовательных интерфейсов, то значения битов регистра DDRS определяют режим работы линий порта S по следующим правилам:

DDRS2, DDRS0. Если контроллер SCI конфигурирован для работы в обычном двухпроводном режиме, то линии порта PS2 и PS0 будут выполнять функцию входов приемников двух модулей SCI независимо от значения битов DDR2 и DDR0.

DDRS3, DDRS1. Если контроллер SCI конфигурирован для работы в обычном двухпроводном режиме, то линии порта PS3 и PS1 будут выполнять функцию выходов передатчиков двух модулей SCI независимо от значения битов DDR3 и DDR1.

DDRS6…DDRS4. Если контроллер SPI активизирован и использует некоторые линии из PS6…PS4 для ввода данных, то эти линии будут работать в режиме ввода, независимо от значения соответствующих битов регистра DDRS. Если же по логике работы контроллера SPI некоторые линии из PS6…PS4 должны работать на вывод, то необходимо соответствующий бит регистра DDRS установить в 1.

DDRS7. Если контроллер SPI активизирован и работает в режиме ведомого, то линия PS7 будет выполнять функцию входа для выбора ведомого , независимо от значения разряда DDR7. Если же контроллер SPI работает в режиме ведущего, то значение бита DDR7 определяет направление передачи линии PS7, независимо от того, используется ли она контролером SPI, или работает как линия ввода/вывода общего назначения (см. таблицу рис. 4.73 и примечание к ней).

Вопросы для самопроверки

1. Какова минимальная частота сигнала синхронизации SCK, если частота импульсной последовательности ECLK составляет 8 МГц?

Ответ: При значении кодовой комбинации битов SPR2…SPR0 = 111 частота SCK составляет 31,2 кГц.

2. Какова максимальная частота сигнала синхронизации SCK, если частота импульсной последовательности ECLK составляет 4 МГц?

Ответ: При значении кодовой комбинации битов SPR2…SPR0 = 000 частота SCK составляет 2 МГц.

3. Напишите выражение на Си для установки минимальной частоты SCK.

Ответ: SP0BR = 0x07

4. Каково назначение флага SPIF?

Ответ: Этот флаг устанавливается, когда контроллер SPI завершил выдачу на линию восьми бит данных. Чтобы сбросить бит SPIF необходимо сначала прочитать регистр состояния SP0SR, а затем выполнить операцию записи в регистр данных SP0DR.

4.19.4. Алгоритмы программного обслуживания контроллера SPI

Ранее в данном параграфе мы обсудили действия, которые необходимо совершить, чтобы инициировать пересылку одного байта с использованием интерфейса SPI. Эти действия отражены в блок-схемах алгоритмов, которые представлены на рис. 4.78. Далее мы покажем, как записать эти действия на Си.

Рис. 4.78. Блок-схемы алгоритмов программного обслуживания контроллера асинхронного обмена SPI


Микроконтроллер и периферийные интегральные схемы. Одна из основных функций интерфейса SPI в микропроцессорных системах — обмен данными между МК и установленными на той же печатной плате интерфейсными ИС. Контроллер SPI в составе МК 68HC12 может быть инициализирован для работы как в режиме ведущего (мастера), так и в режиме ведомого (подчиненного). В процессе обмена с интерфейса SPI — дополнительная функция линий PS7..PS4 порта S. Сигналы SPI распределяются между линиями PS7..PS4 в следующем порядке:

• PS7 — сигнал . Когда линия установлена в 0, происходит передача данных из ведущего устройства SPI;

• PS6 — сигнал SCK;

• PS5 — сигнал MOSI. По этой линии передаются данные от ведущего устройства к ведомому;

• PS4 — сигнал MISO. По этой линии передаются данные от ведомого устройства к ведущему.


Регистры управления, используемый в примере. Ниже перечислены биты и регистры управления, которые используются в данном примере:

• DDRS — регистр направления передачи порта S. Разряды DDRS7…DDRS4 должны быть установлены соответствующим образом при работе контроллера SPI в режиме ведущего. Это необходимо для правильного формирования сигналов обмена на линиях порта S;

• SP0BR — регистр скорости передачи. Разряды SPR2…SPR0 этого регистра задают скорость обмена по шине SPI;

• SP0CR1 — регистр управления (первый). Задает режимы работы контроллера SPI;

• SP0CR2 — регистр управления (второй). Задает режимы работы контроллера SPI;

• SP0SR — регистр состояния. Отражает текущее состояние процесса передачи информации по шине SPI;

• SP0DR — регистр данных. В этот регистр записываются данные, подлежащие передаче в интерфейсную ИС.

Пример программирования контроллера SPI. В нашем примере мы будем использовать встроенный контроллер SPI в режиме ведущего. Контролер будет непрерывно посылать шестнадцатеричное число $F0 в «воображаемую» периферийную ИС. Работоспособность приведенного программного кода может быть проверена с помощью осциллографа. При желании Вы можете собрать простейшую периферийную ИС — последовательный регистр со светодиодами, подключенными к параллельным выходам (рис. 4.79). В примере не использованы прерывания, контроль за состоянием флага SPIF ведется методом полинга.

Рис. 4.79. Функциональная схема периферийного устройства для тестирования обмена по SPI


/*--------------------------------------------------------------------*/

/* filename: SPI.c                           */

/* МAIN PROGRAМ: Эта программа реализует непрерывную посылку кода   */

/* символа "S" с скоростью 9600 бод в 8-разрядном формате (кадр 10 бит)*/

/* с битом паритета                          */

/*--------------------------------------------------------------------*/

/*подключаемые файлы*/

#include <912b32.h>

#include 


/*используемые функции*/

void initialize_spi(void);

void send_data(unsigned int);


void main(void) {

 int i, j;

 unsigned int data;

 initialize_spi(); /*инициализация модуля SCI*/

 data = 0xF0;

 while(1) /*передавать данные непрерывно*/

 { 

  send_data(data); 

 } 

}


/* Функция initialize_spi производит инициализацию модуля SPI. */ 

void initialize_spi(void) {

 SP0BR = 0х04; /*установить скорость обмена*/ 

 SP0CR1 = 0x18; /*запретить прерывания от SPI, назначить режим*/ 

         /*ведущего, старшим битом вперед*/ 

 SP0DR = 0x00; /*очистить регистр данных */ 

 SP0SR = 0x00; /*очистить регистр состояния*/ 

 SP0CR1 = 0x58; /* разрешить SPI */ 

}


/* Функция send_data производит инициализацию модуля SPI. */ 

void send_data(unsigned int data) {

 unsigned int status; 

 SP0DR = data; /*задать число для пересылки*/ 

 while ((SP0SR & 0x80) == 0x00) /*ожидать флага завершения передачи*/ 

 { 

  ;

 } 

 status = SP0SR /*прочитать регистр состояния с целью сброса флага SPIF*/ 

}

В приведенном примере мы показали лишь технику программирования обмена для контроллера SPI, однако мы не останавливались на особенностях подчиненного устройства, с которым происходит обмен.

4.19.5 Периферийные ИС с интерфейсом SPI

Интерфейс SPI обычно используется для расширения функциональных возможностей однокристального МК. Многие производители полупроводниковых компонентов выпускают периферийные интегральные схемы с интерфейсом SPI. По функциональному назначению эти схемы принадлежат к следующим группам устройств:

• Память типа EEPROM или FLASH;

• Дополнительные порты ввода/вывода;

• Часы реального времени;

• АЦП высокого разрешения (число разрядов преобразования превышает 8 бит);

• Драйверы светодиодных и жидкокристаллических дисплеев;

• Многоканальные ЦАП;

• Схемы фазовой автоподстройки частоты.

4.20. Введение в теорию аналого-цифрового преобразования

Встраиваемые микропроцессорные системы на основе МК семейства 68HC12 часто предназначаются для управления реальными промышленными объектами, в которых входные сигналы имеют аналоговую природу. Это сигналы различных датчиков: тока, напряжения, температуры, давления, ускорения, освещенности, загрязненности воздуха и т.д. Управляя каким либо технологическим агрегатом, МК должен обработать выходные сигналы этих датчиков, рассчитать по их значениям требуемые управляющие воздействия и сформировать необходимые управляющие сигналы для исполнительных устройств. Однако МК по своей сути является цифровым устройством, он способен преобразовывать данные только в цифровом виде. Поэтому для взаимодействия с аналоговыми датчиками микропроцессорная система должна быть оснащена аналого-цифровым преобразователем, который позволит представить аналоговые сигналы в виде цифровых кодов.

Процесс преобразования изменяющегося во времени аналогового сигнала в последовательность цифровых кодов предполагает выборку (запоминание) величины измеряемого аналогового сигнала через равноотстоящие во времени интервалы с последующим преобразованием каждого такого отсчета в цифровой код (рис. 4.80).

Рис. 4.80. Временная диаграмма, поясняющая процесс преобразования аналогового сигнала в цифровой код.


Для представления некоторого изменяющего во времени аналогового сигнала в цифровом коде необходимо:

• Определить частоту дискретизации (выборки) аналогового сигнала;

• Определить необходимое число двоичных разрядов в кодовом представлении измеряемой аналоговой величины;

• Преобразовать напряжение входного сигнала в многоразрядный двоичный код.

Далее мы рассмотрим каждую из перечисленных задач более подробно.

4.20.1. Частота дискретизации сигнала

В процессе преобразования непрерывно изменяющийся аналоговый сигнал представляется конечным числом отсчетов этого сигнала, взятых в определенные моменты времени (рис. 4.80). Такой способ преобразования называют дискретизацией по времени.

Как правило, моменты взятия отсчетов сигнала следуют с равными интервалами во времени. Поэтому можно говорить о частоте дискретизации сигнала или частоте выборки. Какова должна быть эта частота, чтобы на основе дискретных по времени отсчетов сигнала можно было безошибочно восстановить исходный сигнал? Итоги исследований, выполненных по этому вопросу, сформулированы в критерии Найквиста:

Минимальная частота дискретизации сигнала равна удвоенной частоте высшей гармоники в представлении исследуемого сигнала:

fS2fh, где

fS — частота дискретизации, fh — частота высшей гармоники при разложении исследуемого сигнала в гармонический ряд.

Одновременно с американским ученым Найквистом аналогичный результат был получен русским ученым академиком В.А. Котельниковым, поэтому теорему о минимальном значении частоты дискретизации в России именуют теоремой Котельникова (прим. переводчика).

Частота дискретизации определяет максимальный интервал времени TS между соседними отсчетами (рис. 4.80):

TS = 1/fS

В соответствие с критерием Найквиста минимальная частота дискретизации чисто синусоидального сигнала должна быть в два раза выше частоты этого сигнала. Если исследуемый сигнал имеет более сложную форму, то следует провести гармонический анализ этого сигнала и определить частоты наивысшей значимой гармоники.

Пример. Верхняя граница частотного диапазона голоса человека примерно равна 4 кГц. Поэтому частота дискретизации в оборудовании телефонной компании должна составлять не менее 8 кГц.

На практике исследуемый сигнал перед оцифровкой должен быть преобразован фильтром низкой частоты, который устранит шумовую составляющую сигнала, а также нежелательные высокочастотные гармоники.

4.20.2. Представление аналоговой величины в цифровом коде

Полученные в процессе дискретизации по времени аналоговые отсчеты должны быть преобразованы в цифровой код. С технической точки зрения наиболее удобно преобразовывать в цифровой код сигналы в виде напряжения. Именно поэтому датчики различных физических величин по существу являются преобразователями типа ток-напряжение, температура–напряжение, давление–напряжение и т.д.

В процессе преобразования измеряемое напряжение соотносится с эталонным, которое называют опорным напряжением UREF. Опорное напряжение UREF формируется как разность потенциалов двух стабилизированных источников напряжения:источника с высоким уровнем UHL и источника с низким уровнем URL:

UREF = URH URL

Величина измеряемого напряжения UINP должна обязательно находиться в диапазоне URHURL. Диапазон возможных значений аналогового сигнала URHURL разбивается на некоторое число уровней, с которыми сравнивается измеряемое напряжение (рис. 4.81). При двоичном кодировании число уровней составляет 2n, где n — число разрядов двоичного кода в дискретном представлении промежуточных уровней напряжения для сравнения. Число n называют разрядностью аналого-цифрового преобразователя (АЦП). Чем больше n, тем большим числом уровней аналогового напряжения для сравнения с измеряемым напряжением обладает АЦП, и тем точнее будет отображена в цифровом представлении действительная величина измеряемого напряжения.

Рис. 4.81. Прямая идеальной точности для аналого-цифрового преобразования


Пример. Модуль АЦП в составе МК 68HC12 — 8-разрядный. Это означает, что любая величина входного аналогового напряжения преобразуется этим АЦП в 8-разрядный двоичный код без знака. Число различных уровней напряжения, с которыми в ходе аналого-цифрового преобразования сравнивается входное напряжение, составляет 28 = 256. МК B32 в составе семейства 68HC12 имеет дополнительный режим преобразования АЦП, в котором число разрядов цифрового кода равно 10. Измерение входного сигнала этим АЦП будет выполнено с большей точностью, поскольку его аппаратные средства образуют 210 = 1024 уровней сравнения напряжения.

4.20.3.Квантование по уровню и разрешающая способность

Преобразование величины напряжения аналогового отсчета в цифровой код называется дискретизацией или квантованием по уровню. Для получения цифрового кода, десятичный эквивалент которого прямопропорционален величине входного напряжения, АЦП сравнивает аналоговый сигнал с множеством эталонных аналоговых уровней, образованных его аппаратными средствами. Число этих уровней равно 2n. Однако для сравнения необходимо знать величину каждого из этих уровней. Ее можно вычислить, используя понятие разрешающей способности АЦП.

Для примера предположим, что к выводу высокого уровня опорного напряжения VHL подключен источник стабилизированного напряжения 5.0 В, а к выводу низкого уровня опорного напряжения VRL — источник напряжения 0 В. Если мы разделим разность этих напряжений на 256 уровней, то разность напряжений между любыми двумя соседними уровнями составит:

(5,0 – 0,0)/256 = 19,53 мВ

При этом величина напряжения первого уровня сравнения составит 0 В, десятого уровня — 175,78 мВ, 256-го уровня — 4,980 В. Если мы увеличим число промежуточных уровней сравнения напряжения, шаг между уровнями уменьшится, а разрешающая способность АЦП увеличится. В общем виде разрешающая способность АЦП равна:

(URH URL)/2n

Используя понятие разрешающей способности АЦП, измеряемое напряжение может быть вычислено по формуле:

UINP = URL + x(URH – URL)/2n,

где x — десятичный эквивалент двоичного кода результата преобразования.

Другой характеристикой АЦП является динамический диапазон измерения DR.

Его величина измеряется в децибелах (dB). Величина динамического диапазона информирует пользователя о том, во сколько раз максимальное значение входного сигнала может превышать его минимальное значение:

DR(dB) = 20 log 2n = 20 n (0,301) = 6,02 n

Пример. Чему равен динамический диапазон 8-разрядного АЦП?

DR (dB) = 6,02 n = 6,02×8 = 48,16 dB

4.20.4 Скорость потока данных оцифровки

Скорость потока данных оцифровки (d) отражает количество информации, которое поступает с выхода АЦП в единицу времени:

d = fS × n

Измеряется числом битов в секунду (бит/с).

Вопросы для самопроверки

1. Аналоговый сигнал содержит гармоники в диапазоне от 10 Гц до 4,2 кГц. Дискретные отсчеты сигнала производятся с частотой 10000 выборок в с. Достаточна ли частота выборки для полного восстановления исследуемого сигнала?

Ответ: Минимальное значение частоты дискретных отсчетов, достаточное для полного восстановления исследуемого сигнала, равно удвоенной частоте высшей гармонической составляющей этого сигнала:

fS2 fh = 2×4,2 = 8,4 кГц

Поэтому 10000 выборок в с, которые эквивалентны частоте 10 кГц, достаточно для достоверного восстановления сигнала.

2. Число разрядов преобразования модуля АЦП в составе МК семейства HC12 равно восьми. Чему равна разрешающая способность этого АЦП в мВ, если URH = 5,0 В, а URL = 0 В.

Ответ:

(URH – URL)/2n = (5,0 – 0,0)/256 = 19,53 мВ

3. Если модуль АЦП микроконтроллера 68HC12B32 установили в режим 10-разрядного преобразования. Чему равна его разрешающая способность при условии, что величина напряжения источников URH и URL осталась прежней?

Ответ:

(URH – URL)/2n = (5,0 – 0,0)/024 = 4,88 мВ

4. На вход АЦП поступает импульсный сигнал в форме меандра с частотой 2 кГц. Анализ амплитуд гармонических составляющих этого сигнала показал, что амплитуда 20-ой гармоники является значимой и должна быть учтена в цифровом представлении этого сигнала. Какой должна быть частота дискретизации в процессе измерения?

Ответ:

fS2 fh = 2×20 = 40 кГц

5. Сколько бит данных в секунду генерирует 8-разрядный АЦП при частоте выборке сигнала 40 кГц?

Ответ:

fS × n = 40000 × 8 = 320000 бит/с

6. Предположим, что частотный диапазон музыкального сигнала составляет от 20 Гц до 20 кГц. Этот сигнал должен быть записан на компакт диск с использованием 16-разрядного АЦП, частоту дискретизации предполагается установить 44 кГц. Правильно ли выбрана частота дискретизации? Чему равна скорость потока данных при воспроизведении диска?

Ответ:

В соответствии с критерием Найквиста частота дискретизации выбрана верно. Она должна составлять не менее 220 кГц = 40 кГц. Выбранное значение 44 кГц превышает минимально необходимое значение частоты дискретизации. Скорость потока данных составляет:

fS × n × (число каналов) = 44000 × 16 × 2 = 1,41 Мб/с

4.21. Принцип действия АЦП

Известно несколько различных способов преобразования аналогового сигнала в цифровой код. Для большинства способов сигнал, подлежащий оцифровке, должен оставаться постоянным в течение всего времени аналого-цифрового преобразования. Поэтому большинство АЦП в качестве входной цепи используют так называемое устройство выборки и хранения (УВХ). УВХ — это электронная цепь с накопительным конденсатором, которой до начала преобразования заряжается до уровня измеряемого напряжения, затем напряжение на конденсаторе остается неизменным в течение времени преобразования. По способу преобразования различают следующие типы АЦП:

• последовательного приближения;

• двойного интегрирования;

• прямого счета;

• параллельные АЦП.

Мы рассмотрим только способ последовательного приближения, поскольку именно этот способ используется в модуле аналого-цифрового преобразователя МК семейства 68HC12/HCS12. Если у читателя возникнет желание познакомиться с другими способами преобразования, то он может обратиться к книге авторов Pack и Barret [2002].

4.21.1. АЦП последовательного приближения

а) Функциональная схема

б) Диаграмма, поясняющая принцип действия АЦП последовательного приближения

Рис. 4.82. Аналого-цифровой преобразователь последовательного приближения


Структурная схема АЦП последовательного приближения представлена на рис. 4.82. Алгоритм функционирования АЦП последовательного приближения рассмотрим на примере. Предположим, что вывод низкого уровня опорного напряжения VRL нашего АЦП подключен к потенциалу 0 В, а вывод высокого уровня опорного напряжения VHL к потенциалу 5,0 В. АЦП формирует на выходе 8-разрядный двоичный код. Число различных кодов, которыми может быть представлен результат оцифровки, составляет 28 = 256. Разрешающая способность нашего АЦП составляет:

(5,0 – 0,0)/256 = 19,53 мВ

Процесс аналого-цифрового преобразования по способу последовательного приближения многотактный. Число тактов, необходимое для выполнения одного преобразования, равно числу двоичных разрядов в представлении результата. Таким образом, в нашем примере на выходе АЦП будет сформирован восьмиразрядный двоичный код результата после завершения восьмого такта преобразования. Процесс преобразования запускается по сигналу Start.

Диаграмма рис. 4.82 отражает процесс формирования цифрового кода в АЦП последовательного приближения. На каждом такте формируется один двоичный разряд результата: на первом такте — старший разряд D7, на втором такте — разряд D6 и т.д., заканчивая младшим разрядом D0 на восьмом такте.

На первом такте в регистре последовательного приближения устанавливается код K1=10000000b. Этот код поступает на вход цифро-аналогового преобразователя (ЦАП), опорное напряжение которого равно UREF=URH–URL=5,0 В.

На выходе ЦАП установится напряжение UDAC=UREF×K1/28=2,5 В. Аналоговый компаратор сравнивает измеряемое напряжение UINP с напряжением на выходе ЦАП UDAC. Если UINP>UDAC, то на выходе компаратора формируется логическая 1. Если UINP<UDAC, на выходе компаратора устанавливается логический 0. Сигнал с выхода компаратора поступает на вход регистра последовательного приближения. Его значение определяет код на выходе регистра последовательного приближения в следующем такте преобразования. Если на выходе компаратора 1, то во втором такте преобразования регистр сформирует код K2 = 11000000b, если 0, то K2 = 01000000b. Иными словами, значение формируемого в текущем такте преобразования двоичного разряда равно значению логического сигнала на выходе компаратора.

На рис. 4.82 показаны возможные уровни напряжения на выходе ЦАП во втором, третьем и четвертом тактах работы АЦП. Количество уровней увеличивается с ростом номера такта, так как увеличивается число возможных комбинаций кодов на выходе регистра последовательного приближения. Так во втором такте при значении кода K2 = 11000000b на выходе ЦАП будет сформировано напряжение 3,75 В, а при коде K2 = 01000000b — 1,25 В. На восьмом такте число возможных уровней на выходе ЦАП составит 256.

АЦП последовательного приближения имеют ряд достоинств и недостатков. К достоинствам следует отнести следующие свойства:

Время преобразования не зависит от амплитуды входного сигнала и определяется только частотой тактирования и числом двоичных разрядов результата. Постоянное время преобразования удобно в микропроцессорной технике, поскольку позволяет разработчику точно рассчитать время выполнения отдельных программных фрагментов.

При получении каждого цифрового отсчета аналого-цифровое преобразование выполняется полностью сначала, результат предыдущего преобразования не оказывает влияния на последующее преобразование. Это свойство чрезвычайно важно в многоканальных модулях АЦП микроконтроллеров. Так при последовательном подключении двух измеряемых сигналов мультиплексором к одному АЦП оба измерения будут за два цикла преобразования, каждый цикл равен восьми тактам. Никаких дополнительных циклов не потребуется.

В качестве недостатков АЦП последовательного приближения следует отметить их относительно низкую скорость преобразования и достаточно сложную структуру.

Вопросы для самопроверки

1. Какому напряжению на входе АЦП соответствует код код результата «все единицы». Равно ли это измеряемое напряжение напряжению полной шкалы, т.е. UREF=URH–URL?

Ответ: Максимальный код на выходе АЦП соответствует значениям напряжения входного сигнала UINP>UREF(1–2–n). Так для 12-разрядного преобразователя с напряжением опоры 10,0 В максимальный код на выходе, равный 1111 1111 1111b, будет соответствовать напряжению входного измеряемого сигнала UINP>UREF(1–2–n)=10,0(1–2–12)=9,99756 В. Поскольку полученное значение крайне близко к UREF, то часто говорят, что максимальный код соответствует напряжению полной шкалы UREF. Однако, как мы установили, максимальный код в действительности несколько меньше напряжения полной шкалы.

4.22. Подсистема аналого-цифрового преобразования МК 68HC12

В этом разделе мы рассмотрим подсистему аналого-цифрового преобразования в составе микроконтроллеров семейства 68HC12. Эту подсистему именуют модулем ATD (Analog-To-Digital). Структура модуля представлена на рис. 4.83.

Рис. 4.83. Структура модуля аналого-цифрового преобразователя ATD в составе МК 68HC12


Модуль ATD — восьмиканальный, он имеет восемь входов AN0…AN7 для подключения аналоговых сигналов. В каждый момент времени аналоговый мультиплексор коммутирует один из восьми сигналов AN0…AN7 ко входу АЦП модуля ATD. Для преобразования аналогового сигнала в 8-разрядный цифровой код АЦП использует способ последовательного приближения. Ошибка преобразования составляет ±1 младшего разряда, т.е. ±1/256 полной шкалы преобразования: ±1/256 UREF = ±1/256 (URHURL).

Модуль ATD может работать как в режиме однократного преобразования, так и в режиме многократного преобразования. При однократном преобразовании модуль выполняется одно преобразование сигнала с заданным номером канала, после чего модуль ожидает следующего программного запуска. При многократном преобразовании модуль ATD ведет непрерывную оцифровку входного сигнала с заданным номером. После завершения одного преобразования немедленно автоматически запускается следующее. Третий режим работы модуля ATD — режим измерительной сессии. В этом режиме в регистры управления модуля ATD записывается последовательность номеров каналов, которые подлежат оцифровке. После поступления от программы сигнала запуска сначала оцифровывается канал с первым указанным номером. Затем аналоговый мультиплексор автоматически подключает ко входу АЦП канал со вторым запрограммированным номером. Запускается следующее преобразование. И так до окончания запрограммированной последовательности каналов.

Для управления процессом оцифровки восьми аналоговых сигналов предназначены регистры специальных функций модуля ATD, которые объединены в массив из 32 однобайтовых ячеек памяти. Диапазон измерения может варьироваться разработчиком, поскольку выводы для подключения опорных напряжений VHL и VRL выведены на ножки корпуса МК.

4.22.1 Структура и порядок функционирования

Модуль ATD использует линии порта AD в качестве входов AN0…AN7 для подключения измеряемых аналоговых сигналов. Обслуживание модуля ATD — альтернативная функция линий PAD0…PAD7 порта AD. Поэтому на рисунках функциональной схемы МК и модуля ATD (рис. 4.83) эти линии обозначаются AN0/PAD0… AN7/PAD7.

Аналоговые сигналы поступают на вход аналогового мультиплексора. Мультиплексор коммутирует один из аналоговых сигналов на вход АЦП последовательного приближения. Номер коммутируемого канала выбирается программно посредством установки определенных битов в регистрах специальных функций модуля ATD.

Запуск АЦП на преобразование осуществляется программной установкой бита в регистре управления ATDCTL5. После завершения преобразования полученный код загружается в один из регистров результата ADR0H…ADR7H. Номер регистра результата для каждого преобразования выбирается в соответствии с номером измеряемого канала. После завершения преобразования также устанавливаются флаги в регистре состояния ATDSTAT.

АЦП тактируется импульсной последовательностью с выхода делителя частоты fBUS. Выводы VRH и VRL предназначены для подключения внешних источников прецизионного напряжения. Разность напряжений на этих входах URHURL определяет напряжение полной шкалы преобразования модуля ATD. Если напряжение входного аналогового сигнала UINPURL, то на выходе АЦП будет формироваться код $00. При UINPURH, результирующий код АЦП будет равняться $FF. Формат представления кода — прямой однобайтовый беззнаковый.

При изучении модуля ATD сначала может показаться, что процесс управления аналого-цифровым преобразованием достаточно сложен и состоит из многих операций. Мы покажем Вам, что это не так, и для этого проведем аналогию между изучаемым процессом и процессом выпечки пирожных. Для выпечки пирожных (или преобразования измеряемого напряжения в код) проделайте следующие действия:

• Включите духовку (для включения модуля ATD бит ADPU в регистре ATDCTL2 следует установить в 1);

• Прогрейте духовку в течение некоторого времени (после включения ATD следует организовать задержку на 100 мкс для завершения переходных процессов в аналоговых цепях и стабилизации системы тактирования АЦП);

• Определите, какую начинку Вы будете добавлять в пирожные: — грецкие орехи, мармелад и т.д. (определите, какой режим аналого-цифрового преобразования Вы будете использовать, и установите соответствующие биты регистров ATDCTL4 и ATDCTL5);

• Положите пирожные в духовку (установите биты регистра ATDCTL5). Они будут готовы через некоторое заранее установленное таймером время. Об окончании приготовления сообщит звуковой сигнал (В регистре ATDSTAT установится флаг SCF).

• Готовые пирожные выложите на блюдо (цифровой код буден помещен в регистры данных). Пирожные готовы для еды, а результат оцифровки для дальнейшего использования в расчетах.

4.22.2. Регистры управления модуля ATD

Ранее мы отметили, что все регистры специальных функций модуля ATD объединены в блок из шестнадцати 16-разрядных слов. Этот блок занимает в памяти 32 однобайтовых ячейки с последовательными адресами. По смысловому назначению все регистры можно разбить на четыре группы:

Регистры управления. Эти регистры используются для выбора режима работы модуля ATD, для указания номера подлежащего оцифровке канала, для запуска АЦП на преобразование.

Регистры состояния. Двухбайтовый регистр состояния содержит группу флагов, которые отражают текущее состояние модуля ATD: находится ли он в состоянии преобразования, какой канал преобразуется, или все преобразования уже завершены.

Регистры результата. Модуль ATD содержит восемь 8-разрядных регистров результата (по числу аналоговых входов модуля). После завершения очередного преобразования полученный код загружается в соответствующий номеру канала регистр результата ADR0H…ADR7H.

Тестовые регистры. Двухбайтовый регистр ATDTEST предназначен для специальных операций в процессе обязательного тестирования МК на фабрике-производителе. Доступ к этому регистру возможен только в специальном режиме работы МК. В обычном пользовательском режиме работы этот регистр для чтения и для записи недоступен.

Приступим теперь к более подробному рассмотрению формата регистров специальных функций модуля ATD.

Группа регистров управления

Эта группа регистров предназначена для управления режимами работы модуля аналого-цифрового преобразования. Группа объединяет шесть регистров управления ATDCTL0…ATDCTL5. Один из регистров (ATDCTL2) используется для включения модуля ATD в работу, поскольку аппаратные средства МК при выходе из состояния сброса отключают этот модуль для уменьшения энергии потребления. После того, как модуль ATD включили, следует выдержать паузу в 100 мкс, прежде чем подавать сигнал начала преобразования. Задержка в 100 мкс необходима, чтобы завершились переходные процессы включения в аналоговых цепях модуля. Регистры управления используются для выбора между режимами однократного или многократного преобразования, а также для назначения номера канала, подлежащего оцифровке. В режиме многократного преобразования может быть запрограммирована последовательность номеров каналов, которые будут оцифровываться друг за другом автоматически, без дополнительного вмешательства прикладной программы. Или многократные измерения могут проводиться для одного канала. Регистры управления 0, 1 и 3 по своему функциональному назначению используются достаточно редко, поэтому мы рассмотрим их кратко. Напротив, регистры 2, 4 и 5 активно используются в прикладных программах, поэтому будут рассмотрены подробно.

Регистры управления ATDCTL0 и ATDCTL1

Регистр управления ATDCTL0 располагается в памяти по адресу $0060. Этот регистр предназначен для принудительного останова аналого-цифрового преобразования, для чего в регистр под управлением программы должен быть записан определенный код. Этот режим крайне редко используется в прикладных программах. Не будем использовать его и мы в наших учебных примерах. Регистр управления ATDCTL1 располагается в памяти по адресу $0061. Он используется только в специальных случаях тестирования ИС МК.

Регистр управления ATDCTL2

Рис. 4.84. Формат регистра ATDCTL2


Регистр управления ATDCTL2 располагается в памяти по адресу $0062. Этот регистр в первую очередь используется для включения модуля ATD. Он также содержит флаг окончания преобразования и несколько битов разрешения режимов. Формат регистра приведен на рис. 4.84. Назначение отдельных битов регистра следующее:

ADPU:

Бит разрешения работы модуля ATD. После сброса бит ADPU установлен в 0, и модуль ATD отключен от системы питания. Для включения модуля следует установить бит ADPU в 1. Модуль ATD будет готов к работе через 100 мкс.

AFFC:

Бит выбора режима сброса флагов модуля ATD. Если этот бит установлен в 0, то все установленные флаги сбрасываются обычным способом, т.е. посредством записи 1 в разряд установленного флага. Если же бит установлен в 0, то для всех флагов модуля разрешается как обычный способ сброса, так и ускоренный. Ускоренный способ сброса для каждого флага будет рассмотрен несколько позже.

AWAI:

Бит разрешения работы модуля ATD, когда микроконтроллер находится в состоянии пониженного энергопотребления типа WAIT. Если бит установлен в 0, то модуль ATD продолжает свою работу в состоянии WAIT. При AWAI = 1 работа модуля ATD с состоянии WAIT приостанавливается для понижения энергопотребления.

ASCIE:

Бит разрешения прерывания по флагу окончания преобразования АЦП. Если этот бит установлен в 1, и флаг окончания преобразования ASCIF установился в 1, то генерируется запрос на прерывание. Если бит ASCIE = 0, то прерывания по флагу ASCIF запрещены и его состояние следует контролировать программно.

ASCIF:

Флаг окончания преобразования АЦП. Автоматически устанавливается в 1, если ранее начатое аналого-цифровое преобразование завершено, и полученный код загружен в один из регистров результата. Если прерывания по данному флагу разрешены (ASCIE = 1), то генерируется запрос на прерывание.

Генерация запроса на прерывание с собственным вектором особенно полезна при работе модуля ATD в режиме измерительной сессии. В этом режиме АЦП выполняет несколько последовательных преобразований после единственного запуска под управлением программы. При использовании прерывания МК в течение всего времени преобразования может исполнять другие действия прикладной программы управления. Когда многократное аналого-цифровое преобразование будет завершено, установится флаг окончания преобразования ASCIF, будет выставлен запрос на прерывание, и МК, исполняя подпрограмму прерывания, считает коды оцифровки из регистров результата в память МК. Альтернативой такой организации взаимодействия прикладной программы с модулем ATD является многократный опрос флага ASCIF после программного запуска АЦП. Когда программа обнаружит, что флаг установился, регистры результата как и в предыдущем случае будут считаны. Однако в течение всего времени преобразования МК будет занят обслуживанием АЦП и не сможет исполнять других фрагментов прикладной программы.

Регистр управления ATDCTL3

Регистр управления ATDCTL3 располагается в памяти по адресу $0063. Этот регистр содержит два бита FRZ1:FRZ0, которые используются для организации работы АЦП в отладочном режиме работы.

Регистр управления ATDCTL4Формат регистра ATDCTL4

Рис. 4.85.


Регистр управления ATDCTL4 располагается в памяти по адресу $0064. Формат регистра управления ATDCTL4 приведен на рис. 4.85. Этот регистр позволяет регулировать время выборки для устройства выборки и хранения на входе АЦП последовательного приближения. Полное время преобразования 8-разрядного АЦП в составе модуля ATD складывается из четырех интервалов:

• Интервал начального запуска, состоит из 2 периодов частоты тактирования модуля ATD;

• Неизменяемый интервал выборки аналогового сигнала, состоит из 4 периодов частоты тактирования модуля ATD;

• Регулируемый интервал выборки аналогового сигнала, его длительность программируется посредством установки битов SMP1:SMP0 в регистре управления ATDCTL4;

• Интервал преобразования напряжения на выходе устройства выборки и хранения аналого-цифровым преобразователем, состоит из 10 периодов частоты тактирования модуля ATD.

Рис. 4.86. Структура системы тактирования модуля ATD


Структурная схема подсистемы тактирования модуля ATD представлена на рис. 4.86. На вход подсистемы поступает импульсная последовательность PCLK с частотой fBUS. Эта импульсная последовательность поступает на вход программируемого делителя частоты.

Частота тактирования модуля аналого-цифрового преобразования ATDclock формируется из PCLK путем деления двумя делителями частоты. Коэффициент деления первого делителя переменный, определяется пятью битами PRS4…PRS0 регистра ATDCTL4. Численное значение коэффициента равно десятичному эквиваленту пятиразрядного двоичного кода PRS4…PRS0 плюс 1.

Например, если в разрядах PRS4…PRS0 записан код 00101b, то коэффициент деления равен шести (5+1). Коэффициент деления второго делителя равен двум. Поэтому в рассматриваемом примере частота тактирования модуля ATD составит fBUS/12.

Биты SMP1:SMP0 определяют регулируемый интервал выборки аналогового сигнала. Мы уже установили, что полное время одного аналого-цифрового преобразования равно 16 периодов частоты модуля ATD плюс регулируемый интервал выборки. На рис. 4.87 представлены четыре возможные комбинации кодов в разрядах SMP1:SMP0 и соответствующие им времена регулируемого интервала выборки и полного времени преобразования. Из рис. 4.87 следует, что минимальное время одного аналого-цифрового преобразования составляет 18 периодов, а максимальное — 32 периода частоты тактирования модуля ATD.

SMP1:SMP0 Время выборки (периоды ADTclock) Полное время 8-разрядного преобразования (периоды ADTclock)
00 2 18
01 4 20
10 8 24
11 16 32

Рис. 4.87. Выбор времени аналого-цифрового преобразования в модуле ATD


Бит S10BM определяет разрядность аналого-цифрового преобразования. При S10BM=0, АЦП в составе модуля формирует 8-разрядный код измеряемого сигнала, при S10BM=1 разрядность кода равна 10.

Регистр управления ATDCTL5

Рис. 4.88. Формат регистра ATDCTL5


Регистр управления ATDCTL5 используется для выбора режима работы модуля ATD, его биты определяют номер канала измеряемого сигнала, а также осуществляют запуск АЦП на преобразование. Регистр ATDCTL5 располагается в памяти по адресу $0065, его формат представлен на рис. 4.88. Назначение отдельных битов регистра следующее:

S8CM:

Этот бит определяет число аналого-цифровых преобразований в одной последовательности. При S8CM = 0 число преобразований равно 4, при S8CM = 1 число преобразований составляет 8.

SCAN:

Бит включения сканирования. При SCAN = 0 производятся четыре или восемь последовательных измерений (одна измерительная последовательность) и заполняются четыре/восемь регистров результата. При SCAN = 1 измерения производятся непрерывно, после завершения одной последовательности автоматически запускается следующая. Регистры результата заполняются по мере поступления новых данных.

MULT:

Бит выбора многоканального или одноканального режима работы. При MULT = 0 АЦП выполняет четыре/восемь последовательных измерений по одному каналу, выбранному в зависимости от комбинации битов CD…CA. При MULT = 1 измерения производятся последовательно для группы из четырех/восьми каналов, выбираемых в зависимости от комбинации битов CD:CC. При этом каждому каналу соответствует определенный регистр результата.

CD, CC, CB, CA:

Эти биты предназначены для выбора каналов, подключаемых к АЦП. Соответствие различных комбинаций битов CD…CA и номеров каналов, подлежащих оцифровке, устанавливает таблица рис. 4.89.

S8CM CD CC CB CA Номер канала Регистр результата при MULT=1
0 0 0 0 0 AN0 ADR0
0 1 AN1 ADR1
1 0 AN2 ADR2
1 1 AN3 ADR3
0 0 1 0 0 AN4 ADR0
0 1 AN5 ADR1
1 0 AN6 ADR2
1 1 AN7 ADR3
0 1 0 0 0 Зарезервирован ADR0
0 1 Зарезервирован ADR1
1 0 Зарезервирован ADR2
1 1 Зарезервирован ADR3
0 1 1 0 0 VRH ADR0
0 1 VRL ADR1
1 0 (VRH+VRL)/2 ADR2
1 1 Зарезервирован ADR3
1 0 0 0 0 AN0 ADR0
0 0 1 AN1 ADR1
0 1 0 AN2 ADR2
0 1 0 AN3 ADR3
1 0 0 AN4 ADR4
1 0 1 AN5 ADR5
1 1 0 AN6 ADR6
1 1 1 AN7 ADR7
1 1 0 0 0 Зарезервирован ADR0
0 0 1 Зарезервирован ADR1
0 1 0 Зарезервирован ADR2
0 1 1 Зарезервирован ADR3
1 0 0 VRH ADR4
1 0 1 VRL ADR5
1 1 0 (VRH + VRL)/2 ADR6
1 1 1 Зарезервирован ADR7

Рис. 4.89. Выбор номера канала для оцифровки


Анализируя таблицу рис. 4.89, обратите внимание, что выделенные цветом разряды не оказывают влияния на номер выбранного канала, если бит MULT установлен в 1. Таким образом, при MULT = 1 измерения проводятся для последовательности из четырех каналов, если S8CM = 0. Номера каналов определяются комбинацией битов CD:CC. Если S8CM = 1, то при MULT = 1 измерения проводятся для последовательности из восьми каналов. Номера каналов определяются значением бита CD.

Если бит MULT установлен в 0, то все CD…CA определяют номер канала, для которого будут произведены четыре (при S8CM = 0) или восемь (при S8CM = 1) последовательных преобразований.

Также обратите внимание, что при S8CM:CD = 01/10b ко входу АЦП подключаются сигналы линий VHL и VRL, что позволяет измерить текущее значение опорного напряжения и тем самым повысить точность аналого-цифрового преобразования.

Перед рассмотрением следующих групп регистров специальных функций модуля ATD, проверьте степень усвоения материала в процессе ответа на следующие вопросы.

Вопросы для самопроверки

1. Какой код должен быть записан в регистр управления ATDCTL2 для того, чтобы включить модуль ATD и назначить обычный способ сброса флагов событий в модуле?

Ответ: Для включения модуля флаг ADPU должен быть установлен в 1. Этот флаг располагается в разряде 7 регистра. Для назначения обычного способа сброса флагов событий модуля следует установить бит AFFC в 0. Бит AFFC располагается в разряде 6 регистра. Поэтому в регистр управления ATDCTL2, располагающийся по адресу $0062, должен быть записан код 10000000 b или $80.

2. Запишите выражение на Си для выполнения инициализации регистра ATDCTL2 кодом предыдущего вопроса.

Ответ:

ATDCTL2 = 0x80;

3. Какой код должен быть записан в регистр управления ATDCTL5 для того, чтобы назначить для модуля режим многократного преобразования, при этом измерительная последовательность должна производить оцифровку 8 входных сигналов.

Ответ: Для организации заказанного режима следует установить бит S8CM в 1 (бит 6 регистра ATDCTL5), бит SCAN также в 1 (бит 5), бит MULT в 1 (бит 4), бит CD в 0 (бит 3), остальные биты CC, CB и CA значения не имеют.

Обобщая, в регистр управления ATDCTL5, расположенный по адресу $0065, должен быть записан код 01110000 b или $70.

4. Запишите выражение на Си для выполнения инициализации регистра ATDCTL5 кодом предыдущего вопроса.

Ответ:

ATDCTL5 = 0x70;

5. Каковы преимущества использования АЦП в режиме преобразования с 10-разрядным выходным кодом относительно 8-разрядного кода оцифровки?

Ответ: При 10-разрядном выходном коде разрешающая способность АЦП выше. Она составляет 4,88 мВ по сравнению с 19,53 мВ для 8-разрядного кода. Численные значения разрешающей способности приведены для UREF=5,0 В.

Регистр состояния ATDSTAT

Рис. 4.90. Формат регистра состояния ATDSTAT


Регистр состояния ATDSTAT — это двухбайтовый регистр, который располагается в памяти по адресам $0066 и $0067. Регистр содержит в себе группу флагов, которые отражают текущее состояние аналого-цифрового преобразования в модуле ATD. Формат регистра представлен на рис. 4.90.

Флаг SCF (Sequence Complete Flag) автоматически устанавливается в 1, если все преобразования назначенной измерительной последовательности завершены. Если модуль находится в режиме однократного преобразования, то бит SCF установится после завершения исполнения измерительной последовательности из 4 или 8 преобразований. При работе модуля в режиме многократного преобразования, бит SCF установится после завершения первой измерительной последовательности.

Бит AFFC в регистре управления ATDCTL2 определяет способ сброса всех флагов в регистре состояния, в том числе и бита SCF. Если бит AFFC установлен в 0, то бит SCF обнуляется автоматически при выполнении операции записи в регистр управления ATDCTL5 для запуска новой измерительной последовательности. Если же бит AFFC установлен в 1, то бит SCF также сбрасывается автоматически при чтении одного из регистров результата.

Биты CC2…CC1 вместе составляют трехразрядный двоичный счетчик, который показывает номер текущего аналого-цифрового преобразования и, как следствие, номер регистра результата, в который будет занесен код очередного преобразования.

Каждый из восьми флагов завершения преобразования CCF7…CCF0 соответствует одноименному регистру результата ADR7H…ADR0H (бит CCF7 регистру ADR7H, бит CCF6 регистру ADR6H и т.д.). Биты CCF7…CCF0 устанавливаются автоматически, когда в процессе выполнения измерительной последовательности произошла запись в одноименный регистр результата. Если флаг AFFC установлен в 1, то биты CCF7…CCF0 сбрасываются автоматически при чтении одноименного регистра результата. При AFFC = 0 биты CCF7…CCF0 сбрасываются при чтении регистра состояния ATDSTAT, т.е. регистра с этими битами. Биты CCF7…CCF0 предназначаются для программного опроса с целью выяснения, завершилось или нет определенное аналого-цифровое преобразование в составе измерительной последовательности.

Регистр данных порта PORTAD

Обслуживание модуля ATD — альтернативная функция линий порта AD. Линии порта AD могут использоваться не только в качестве аналоговых входов модуля ATD, но и как линии порта ввода общего назначения. Каждый порт МК обладает регистром данных. Для порта AD 8-разрядный регистр данных PORTAD располагается в памяти по адресу $006F, формат этого регистра приведен на рис. 4.91. При выполнении операции чтения регистра данных порта логические сигналы на линиях AN7/PAD7…AN0/PAD0 отображаются в соответствующих разрядах регистра PORTAD.

Рис. 4.91. Формат регистра данных порта PORTAD


Регистры результата ADR0H…ADR7H

После завершения каждого преобразования в составе измерительной последовательности результат преобразования помещается в один из восьми регистров результата ADR0H…ADR7H. Номер регистра определяется режимом работы модуля ATD и разрядами CD…CA регистра управления ATDCTL5 (рис. 4.89). Регистры результата ADR0H…ADR7H восьмиразрядные, в памяти располагаются по адресам $0070…$007E. Формат регистров ADR0H…ADR7H приведен на рис. 4.92.

Рис. 4.92. Формат регистров результата модуля ATD


В регистрах ADR0H…ADR7H результат аналого-цифрового преобразования представляется в прямом коде без знака. Диапазон возможных значений кодов — 0…255. Для представления результата в абсолютных единицах необходимо код результата разделить на число единиц полной шкалы, а затем умножить на напряжение полной шкалы:

UIZM = KIZM/256×UREF

Вопросы для самопроверки

1. Код измеренного напряжения на выходе 8-разрядного АЦП равен 10001010b. Потенциалы на входах опорных напряжений АЦП составляют URH=5,0 В и URL=0 В. Каково значение измеренного напряжения в Вольтах?

Ответ: Десятичный эквивалент двоичного кода 10001010b равен 138. Поэтому измеренное напряжение равно:

UIZM = KIZM/256×UREF = (138/256) (5,0 – 0) = 2,69 В

Тестовый регистр ATDTEST

Двухбайтовый регистр ATDTEST располагается в памяти по адресам $0068 и $0069. Доступ к этому регистру возможен только в специальном режиме работы МК. В обычном пользовательском режиме работы этот регистр для чтения и для записи недоступен.

4.22.3. Пример программирования модуля ATD

Для того чтобы воспользоваться модулем аналого-цифрового преобразования ATD для измерения уровня напряжения на нескольких аналоговых входах МК, необходимо выполнить следующие действия:

• Подключить источники стабилизированного напряжения ко входам опорного напряжения VRF и VRL. Необходимо помнить, что напряжение на входе высокого уровня опорного напряжения VRF не должно превышать 5,0 В, а на входе низкого уровня VRL напряжение должно быть не менее 0 В. Кроме того, разность напряжений на входах VRF и VRL, равная напряжению полной шкалы АЦП UREF = URH–URL, не должна быть менее 2,5 В;

• Подключить источники измеряемых аналоговых сигналов ко входам AN0…AN7. Напряжение измеряемых сигналов должно находиться в диапазоне 0 В = USSUIZMUDD=5,0 В;

• Осуществить внутреннюю коммутацию напряжения питания к модулю ATD. Для этого записать 1 в бит ADPU регистра управления ATDCTL2. Адрес регистра — $0062;

• Выдержать паузу в 100 мкс для завершения переходных процессов в модуле ATD. В рассматриваемом ниже программном фрагменте мы покажем, как организовать такую задержку;

• Назначить режим работы модуля ATD посредством записи необходимых слов инициализации в управляющие регистры модуля;

• Запустить измерительную последовательность посредством записи в регистр управления ATDCTL5;

• Контролировать ход преобразования, используя флаги регистра состояния модуля ATDSTAT;

• Когда измерительная последовательность будет завершена, считать данные из регистров результата ADR0H…ADR7H в память МК;

• Если экономия энергии важна для Вашего применения, следует выключить модуль ATD, установив бит ADPU регистра ATDCTL2 в 0.

Мы рассмотрим программную реализацию действий по управлению модулем аналого-цифрового преобразования на примере простейшего цифрового вольтметра.

Цифровой вольтметр

Программный фрагмент voltmeter.c производит измерение аналогового сигнала на входе AN6. Измерительная последовательность состоит из четырех преобразований. Режим измерения однократный. Результаты четырех последовательных преобразований одного и того же сигнала располагаются в четырех регистрах результата ADR0H…ADR3H. Эти измерения усредняются, что позволяет снизить влияние шумов. Полученный 8-разрядный двоичный код преобразуется к истинному значению измеряемого напряжения, умноженному на 100 d. Умножение на нормирующий коэффициент (100 в десятичной системе счисления) необходимо, чтобы использовать в программе целочисленные форматы представления данных. Полученный результат содержит одну десятичную цифру целой части измеренного напряжения, это единицы Вольт. А также две цифры десятичной дробной части. Это десятые и сотые доли Вольт в представлении результата. Промежуточные результаты исполнения программы, а также измеренное напряжение выводятся на экран персонального компьютера.

/*------------------------------------------------------------------------*/

/* filename: voltmeter.c                          */

/* В этом примере реализован простейший цифровой вольтметр.        */

/* Программа выполняет одно измерение и выводит данные на экран      */

/* персонального компьютера. Для того, чтобы выполнить следующее измерение*/

/* следует перезапустить программу                     */

/*------------------------------------------------------------------------*/

/*подключаемые файлы*/

#include <912b32.h>

#include 

#define DECIMAL 0х2Е /*определить код точки на экране*/

#define V 0х56 /*определить код символа "V" для экрана*/


/*используемые функции*/

void delay_100us(void);

void ADC_convert(void);

void delay_5ms (void);


void main(void) {

 printf("HELLO\n"); /*вывести приветствие на экран*/

 ATDCTL2 = 0х80; /*включить питание модуля, запретить */

         /*прерывания от модуля*/

 printf("ADC\n");

 delay_100us(); /*задержка 100мкс*/

 printf("warmed up\n");

 ATDCTL3 = 0х00; /*обеспечить доступ к модулю в отладочном режиме*/

 ATDCTL4 = 0х01; /*установить 2 такта для времени выборки*/

         /*и коэффициент деления, равный 4*/

 printf("ready\n");

 ADC_convert(); /*реализовать цифровой вольтметр*/

}


/*---------------------------------------------------------------------*/

/* Функция ADC_convert 4 измерения, усредняет их, вычисляет абсолютное */

/* значение напряжения, а затем преобразует результат в коды ASCII для */

/* вывода на экран                           */

/*---------------------------------------------------------------------*/

void ADC_convert(void) {

 unsigned int sumadr;

 unsigned int avg_bin_voltage;

 unsigned int int_voltage;

 unsigned int ones_int;

 unsigned int tenths_int;

 unsigned int hundreths_int;

 char ones;

 char tenths;

 char hundreths;

 ATDCTL5 = 0х06; /*4 преобразования в последовательности, канал 6*/

 /* Ожидать завершения измерительной последовательности*/

 while((ATDSTAT & 0х8000) != 0х8000) {

  ;

 }

 /* Вывести коды преобразования на экран для контроля */

 printf("%x %x %х %х\n" , ADR0H, ADR1H, ADR2H, АDR3Н);

 /* Взять среднее от 4 измерений для устранения шума*/

 sumadr = ADR0H + ADR1H + ADR2H + ADR3H;

 avg_bin_voltage = sumadr/4;

 /*Преобразовать результат из двоичного кода к абсолютному значению,*/

 /* умноженному на 100 D, получится число в диапазоне от 0 до 500 D*/

 int_voltage = (100*avg_bin_voltage/255) * 5;

 /*Выделить старший разряд результата и преобразовать в код ASCII */

 /* Правило преобразования: десятичная цифра +48*/

 ones_int = int_voltage/100;

 ones = (char) (ones_int + 48);

 /*Выделить второй разряд результата (десятые доли) и преобразовать в

  код*/

 /* ASCII */

 tenths_int = (int_voltage ones_int*100)/10;

 tenths = (char) (tenths_int + 48);

 /*Выделить третий разряд результата (сотые доли) и преобразовать в

  код*/

 /* ASCII */

 hundreths_int = (int_voltage ones_int*100 tenths_int*10) / 1;

 hundreths = (char) (hundreths_int + 48);

 /*Вывести значение измеренного напряжения на экран */

 printf("%c.%c%cV\n", ones, tenths, hundreths);

}


/*-----------------------------------------------------------------------*/

/* Функция delay_100us формирует задержку в 100 мкс, частота тактирования*/

/* межмодульных магистралей МК составляет 8 МГц              */

/*-----------------------------------------------------------------------*/

void delay_100us(void) {

 int i;

 for (i=0; i<50; i++) {

  asm("nop");

 }

}


/*------------------------------------------------------------------*/

/* Функция delay_5ms формирует задержку в 5мс, частота тактирования */

/* межмодульных магистралей МК составляет 8 МГц           */

/*------------------------------------------------------------------*/

void delay_5ms(void) {

 int i;

 for (i=0; i<50; i++) {

  delay_100us();

 }

}

/*------------------------------------------------------------------*/

4.22.4. Обслуживание прерываний от модуля ATD

В рассмотренном примере использовался метод программного опроса триггера завершения измерительной последовательности SCF в регистре состояния ATDSTAT. В этом же регистре располагаются флаги CCF7…CCF0, которые устанавливаются автоматически, когда в процессе выполнения измерительной последовательности произошла запись в одноименный регистр результата. Флаги CCF7…CCF0 могут быть программно опрошены с целью выяснения, завершилось или нет определенное аналого-цифровое преобразование в составе измерительной последовательности. В относительно медленных приложениях такая необходимость отсутствует, поскольку малое быстродействие объекта управления позволяет прикладной программе дождаться окончания всей измерительной последовательности, и лишь затем начать выборку из регистров модуля ATD кодов результатов для проведения дальнейших расчетов.

Если же прикладная программа обслуживает достаточно динамичный объект, то может возникнуть необходимость выборки из регистров результата данных в процессе исполнения измерительной последовательности. Именно тогда и следует воспользоваться флагами завершения преобразования в отдельных каналах CCF7…CCF0. Прикладная программа должна запустить измерительную последовательность на исполнение, а затем контролировать состояние флага первого преобразуемого канала. Когда флаг установится, соответствующий регистр результата может быть считан. При этом во время выборки из памяти первого результата, будет продолжаться аналого-цифровое преобразование следующего сигнала. И так до завершения всей измерительной последовательности.

Программный опрос или поллинг (в англоязычной терминологии) — не единственный способ взаимодействия прикладной программы с модулем аналого-цифрового преобразования. Модуль ATD способен генерировать запросы на прерывание по завершению исполнения измерительной последовательности. Прерывания разрешаются посредством установки бита ASCIE регистра ATDCTL2 в 1. При этом запрос на прерывание генерируется, если устанавливается бит ASCIF в том же регистре. Этот же бит следует сбросить в подпрограмме прерывания, чтобы по завершению следующей измерительной последовательности был сгенерирован новый запрос. Обратите внимание на некоторую особенность битов состояния модуля ATD. Существует два бита завершения исполнения измерительной последовательности: бит ASCIF в регистре управления ATDCTL2 и бит SCF в регистре состояния ATDSTAT. При этом первый бит используется в прерываниях, а второй при программном опросе.

4.23. Особенности модуля ATD в составе МК семейства HCS12

Модуль ATD в составе МК семейства HCS12 по своей архитектуре и исполняемым функциям крайне близок к рассмотренному модулю аналого-цифрового преобразования микроконтроллеров семейства 68HC12. Однако он имеет ряд отличий, которые позволили улучшить его функциональные характеристики:

• Программируемая разрядность аналого-цифрового преобразования: 8 или 10 бит;

• Несколько способов представления результата преобразования: в формате со знаком и без знака, со сдвигом кода 10-разрядного кода в старшие или младшие разряды 16-разрядного регистра результата;

• Возможность запуска измерительной последовательности от внешнего сигнала;

• Программируемое от 1 до 8 число преобразований в одной измерительной последовательности;

• В некоторых моделях МК число аналоговых входов увеличено до 16.

Далее мы кратко остановимся на каждом из этих дополнительных свойств модуля ATD в составе МК HCS12.

4.23.1. Выбор разрядности АЦП

Бит SRES8 в регистре управления ATDCTL4 (рис. 4.93) определяет число разрядов кода аналого-цифрового преобразования, которое выполняет встроенный АЦП модуля ATD. Использование 10-разрядного кода в представлении результата позволяет повысить разрешающую способность АЦП с 19,53 мВ до 4,88 мВ.

Рис. 4.93. Формат регистров модуля ATD в составе HCS12

4.23.2. Представление результата измерения

Результат аналого-цифрового преобразования модуля ATD может быть представлен в формате без знака или со знаком. Бит DSGN регистра ATDCTL5 (рис. 4.93) осуществляет выбор между представлением без знака (при DSGN = 0) или со знаком (при DSGN = 1). Код результата может размещаться со сдвигом влево, т.е. в старшие разряды 16-разрядного регистра результата (бит DJM = 0), или со сдвигом вправо, т.е. в младшие разряды регистра результата (бит DJM = 1).

4.23.3. Запуск измерительной последовательности от внешнего сигнала

Аппаратные средства модуля аналого-цифрового преобразования в составе МК HCS12 позволяют производить запуск измерительной последовательности по изменению внешнего сигнала, который подключается на вход AN7/ETRIG/PAD7 модуля. Такой режим чрезвычайно полезен для синхронизации проводимых измерений с режимами работы объекта управления. Режим внешнего запуска разрешается установкой бита ETRIGE регистра ATDCTL2 в 1. При ETRIGE = 0 реализуется обычный программный режим запуска.

Параметры внешнего сигнала запуска настраиваются посредством задания кодовой комбинации двух битов управления в регистре ATDCTL2. Бит ETRIGLE назначает запуск по уровню или по перепаду внешнего сигнала, бит ETRIGP определяет активный уровень сигнала запуска (логический 0 или 1). Формат обновленного регистра управления ATDCTL2 с перечисленными битами представлен на рис. 4.93. При ETRIGLE:ETRIGP = 00 реализуется запуск измерительной последовательности по спадающему фронту внешнего сигнала, при ETRIGLE:ETRIGP = 01 — по нарастающему фронту, при ETRIGLE:ETRIGP = 10 запуск осуществляется при низком логическом уровне внешнего сигнала, при ETRIGLE:ETRIGP = 11 — при высоком уровне сигнала.

4.23.4. Программируемое число преобразований в измерительной последовательности

Рассмотренный ранее модуль ATD в составе МК 68HC12 мог исполнять измерительные последовательности, состоящие из 4 или из 8 преобразований. В МК HCS12 число измерений в последовательности может быть любым в диапазоне от 1 до 8. Если бит MULT регистра управления ATDCTL5 установлен в 0, то все измерения в последовательности выполняются для одного канала. При этом номер канала определяют биты CC:CB:CA регистра ATDCTL5, а число измерений в последовательности – биты S8C:S4C:S2C:S1C. Например, если MULT = 0, CC:CB:CA = 010b, а S8C:S4C:S2C:S1C = 0101b, то измерительная последовательность будет состоять из 5 преобразований сигнала канала 2. Обратите внимание, что формат регистра ATDCTL5 в модуле аналого-цифрового преобразования HCS12 изменен (рис. 4.93).

Если бит MULT установлен в 1, то в измерительной последовательности будет производиться оцифровка сигналов разных каналов. При этом биты CC:CB:CA будут определять номер первого канала в последовательности, а биты S8C:S4C:S2C:S1C — число измерений в последовательности. Например, MULT = 1, CC:CB:CA = 010 b, а S8C:S4C:S2C:S1C = 011 b. Измерительная последовательность будет состоять из трех преобразований, последовательно будут измерены напряжения в каналах 2, 3, 4.

Дополнительные возможности по выборке данных из регистров результата модуля ADT HCS12 предоставляет режим FIFO (First In First Out — первым пришел, первым вышел). Если бит FIFO в регистре ATDCTL3 равен 0, то реализуется ранее рассмотренный порядок записи кодов преобразования в регистры результатов. При FIFO = 1 регистры результата образуют накопительный банк, который хранит 8 последних измерений. При каждом следующем преобразовании, результат преобразования записывается в банк, при этом первое из 8 хранящихся в банке измерений теряется.

4.23.5. Увеличение числа аналоговых входов

Увеличение числа аналоговых входов для подключения измеряемых сигналов в МК семейства HCS12 ведется не путем изменения структуры модуля ATD, который имеет 8 аналоговых входов, а путем увеличения числа модулей аналого-цифрового преобразования в составе отдельных моделей МК. Так МК MC9S12DP256B имеет в своем составе два модуля аналого-цифрового преобразования (ATD0 и ATD1).

4.23.6. Регистры модуля ATD HCS12

На рис. 4.93 приведены форматы новых, дополнительных по сравнению с ранее рассмотренной версией модуля ATD регистров специальных функций ATDSTAT0, ATDSTAT1, ATDDIEN, а также тех регистров, которые, сохранив прежнее имя, претерпели изменение формата.

Регистр состояния ATDSTAT0

Регистр состояния ATDSTAT0 — это однобайтовый регистр. Флаг завершения измерительной последовательности SCF этого регистра устанавливается в 1, если все преобразования назначенной измерительной последовательности завершены.

Флаг SCF может быть сброшен тремя способами:

• Программной установкой бита SCF в 1 (обычный способ);

• Программным запуском новой измерительной последовательности посредством записи в регистр ATDCTL5;

• Чтением регистра результата при установленном флаге разрешения режима быстрого сброса AFFC в регистре ATDCTL2.

Регистр состояния ATDSTAT1

Регистр состояния ATDSTAT1 — также однобайтовый регистр состояния. Содержит биты CCF7…CCF0, которые устанавливаются, когда в процессе выполнения измерительной последовательности произошла запись в одноименный регистр результата.

Регистр разрешения цифрового входа порта ATDDIEN

Регистр ATDDIEN содержит восемь битов IENn (n — номер канала). Если бит IENn равен 1, то соответствующая линия порта AD работает в режиме обычной линии ввода (цифровой ввод), при IENn = 0 линия порта AD с номером n работает в режиме аналогового ввода.

4.24. Подсистема широтно-импульсной модуляции

Микроконтроллер 68HC912B32 и все МК семейства HCS12 имеют в своем составе модуль широтно-импульсного модулятора PWM (Pulse Width Modulation). Широтно-импульсная модуляция (ШИМ) — это способ регулирования скорости вращения двигателя постоянного тока посредством изменения среднего значения напряжения, приложенного к обмоткам двигателя. ШИМ-сигнал может также использоваться для изменения направления движения радиоуправляемой модели автомобиля.

Среднее значение напряжения на обмотках двигателя определяется отношением длительности импульса напряжения (состояние «on» на рис. 4.94) к длительности периода следования импульсов. Это отношение называют коэффициентом заполнения γ, который является величиной безразмерной. Например, если коэффициент заполнения равен 80%, то длительность импульса напряжения (состояние «on») составляет 80%, а длительность паузы (состояние «off») — 20% от длительности периода следования импульсов. На рис. 4.94 показана форма напряжения на обмотках двигателя постоянного тока при двух значениях коэффициента заполнения γ = 20% и γ = 80%.

а) Коэффициент заполнения — 20%

б) Коэффициент заполнения — 80%

Рис. 4.94. Временные диаграммы ШИМ-сигналов с различными коэффициентами заполнения


Рисунок 4.95 иллюстрирует способ управления двигателем постоянного тока с использованием ШИМ. Если коэффициент заполнения γ = 80%, то к обмоткам двигателя будет приложено среднее напряжение, равное 80% от напряжения сети постоянного тока Udc. Если коэффициент заполнения равен 100%, то это означает, что полупроводниковые ключи, используемые для коммутации напряжения к обмоткам двигателя, включены постоянно, и напряжение на обмотках двигателя не имеет импульсной формы. Отметим, что предельная нагрузочная способность выходов МК 68HC12/HCS12 недостаточна для коммутации токов и напряжений обмоток двигателя постоянного тока. Поэтому на выходах МК может быть воспроизведен только маломощный ШИМ-сигнал для управления двигателем, который затем должен быть усилен посредством специального полупроводникового коммутатора. Пример такого коммутатора будет рассмотрен в главе 5.

Рис. 4.95. Управление электрическим двигателем методом ШИМ


Широтно-импульсная модуляция используется не только для управления двигателем. Она имеет множество применений в технике управления различного рода исполнительными механизмами, в том числе в параграфе 4.24.5 будет рассмотрен пример формирования сигнала управления для серводвигателя, который приводит в движение рулевой механизм радиоуправляемой модели автомобиля.

Рис. 4.96. Использование ШИМ для поворота рулевого колеса радиоуправляемой модели автомобиля.

4.24.1. Структура модуля PWM

Для генерации модулированных по длительности импульсных сигналов средствами модуля PWM необходимо рассчитать временные параметры этих сигналов в относительных единицах. Единицей измерения времени для модуля PWM служит период следования импульсов сигнала E_CLOCK, который является первичным сигналом тактирования программируемых делителей частоты и счетчиков в составе модуля PWM. Частота импульсной последовательности E_CLOCK равна частоте системной шины МК. Поскольку частота системной шины МК для каждого нового проекта выбирается разработчиком по совокупности технических требований к изделию, то для каждого проектируемого изделия длительность кванта времени модуля PWM может оказаться различной.

После того, как временные параметры генерируемых сигналов, выраженные в числе периодов E_CLOCK, подсчитаны, следует загрузить их в регистры периода PWPERx и регистры коэффициента заполнения PWDTYx (x — номер канала модуля PWM, x = 0…3).

Модуль PWM имеет в своем составе четыре канала, которые могут генерировать на своих выходах ШИМ-сигналы с независимыми временными параметрами. Каждый канал состоит из двоичного 8-разрядного счетчика PWCNTx с системой предварительных делителей, двух схем сравнения и двух программно доступных регистров PWPERx и PWDTYx. Если работа канала разрешена, то счетчик канала PWCNTx считает непрерывно. Код в счетчике PWCNTx нарастает с $00 до значения, которое записано в регистр периода PWPERx. В момент сравнения счетчик автоматически сбрасывается, и счет продолжается, начиная с кода $00. Код счетчика PWCNTx непрерывно сравнивается с кодом регистра коэффициента заполнения PWDTYx. Если код в регистре PWDTYx превышает текущий код счетчика PWCNTx, то на выходе канала формируется логический сигнал высокого уровня. В момент, когда код счетчика превысит код в регистре коэффициента заполнения, на выходе установится низкий логический уровень (рис. 4.97).

Рис. 4.97. Временная диаграмма, поясняющая формирование ШИМ-сигнала в модуле PWM.


Импульсная последовательность E_CLOCK, частота которой равна частоте системной шины, является базовой для тактирования всех каналов модуля PWM. Система тактирования модуля состоит из нескольких программируемых делителей, которые позволяют расширить диапазон частот генерируемых ШИМ-сигналов. Включение дополнительных делителей частоты между входом E_CLOCK модуля и счетчиком текущего кода канала PWCNTx приведет к изменению единицы измерения временных интервалов для данного канала. Поэтому коды периода следования и коэффициента заполнения должны быть пересчитаны в соответствии с суммарным коэффициентом деления программируемых делителей.

Как было отмечено ранее, модуль PWM в составе МК B32 имеет четыре 8-разрядных канала. Допускается объединение каналов попарно с целью получения 16-разрядного канала, способного генерировать ШИМ-сигнал с 16-разрядным разрешением по коэффициенту заполнения и периоду следования импульсов. Используя программно устанавливаемые опции конфигурации, на основе модуля PWM с четырьмя каналами могут быть получены следующие структуры:

• Четыре независимых 8-разрядных генератора ШИМ-сигнала (HCS12: восемь 8-разрядных);

• Два независимых 16-разрядных генератора ШИМ-сигнала (HCS12: четыре 16-разрядных);

• Два 8-разрядных и один 16-разрядный генератор ШИМ-сигнала.

В 8-разрядных каналах значения коэффициента заполнения и кода периода могут изменяться от 0 до 255 (28–1). Для 16-разрядных каналов эти же параметры могут принимать значения от 0 до 65535 (216–1). Если задать код коэффициента заполнения равным коду периода, то выходной сигнал будет постоянным (без переключений между 1 и 0).

Объединенный 16-разрядный канал обладает всеми теми же свойствами, что и 8-разрядный. Он допускает регулирование периода и коэффициента заполнения, но отличается большей разрешающей способностью временной сетки в процессе регулирования. Например, минимальное значение коэффициента заполнения для 8-разрядного канала равно 1/256, в то время, как для 16-разрядного — 1/65536. Однако в 8-разрядном режиме достижимы большие частоты ШИМ-сигнала при той же базовой частоте тактирования канала.

4.24.2. Режимы центрированной и фронтовой ШИМ

Каждый из каналов может работать в режиме фронтовой ШИМ или в режиме центрированной ШИМ. В режиме фронтовой ШИМ счетчик текущего кода канала работает только в режиме инкрементирования. Его код изменяется от $00 до кода в регистре периода PWPERx. Далее счетчик сбрасывается, и процесс счета повторяется с кода $00.

В режиме центрированной ШИМ счетчик сначала считает от $00 до кода регистра периода, далее направление счета изменяется, и в вычитающем режиме код счетчика доходит до $00. Далее процесс повторяется.

Логика работы компараторов, которые участвуют в формировании импульса, длительность которого пропорциональна коду регистра коэффициента заполнения, полностью аналогична рассмотренной ранее. В результате, при фронтовой ШИМ импульс будет сформирован в начале периода сигнала, начиная с кода счетчика $00 (рис. 4.98). При центрированной ШИМ импульс с регулируемой длительностью будет формироваться в начале и в конце периода сигнала, в то время как в середине периода на выходе будет формироваться низкий логический уровень (рис. 4.99).

Рис. 4.98. Модуль PWM в режиме фронтовой ШИМ


Рис. 4.99. Модуль PWM в режиме центрированной ШИМ


Для каждого из режимов работы (фронтовая или центрированная ШИМ) имеется возможность выбора активного уровня модулированного по длительности импульса ШИМ-сигнала. Длительность импульса с высоким логическим уровнем пропорциональна коду в регистре коэффициента заполнения PWDTYx при PPOL = 1. При PPOL = 0 аналогичным образом регулируется длительность временного интервала с низким логическим уровнем, как показано на рис. 4.98 и 4.99.

При одинаковой частоте тактирования и одинаковых кодах в регистрах периода и коэффициента заполнения длительность импульса и период формируемого сигнала для фронтовой и центрированной ШИМ будут различаться.

Для фронтовой ШИМ (CENTR = 0) расчет временных параметров выходного сигнала следует производить по следующим формулам:

• Период ШИМ-сигнала равен

TPWM = (PWPERx + 1)/fx

• Длительность импульса с высоким активным уровнем при PPOLx = 1 равна

TIMP = (PWDTYx + 1) / [(PWPERx + 1) × fx]

Коэффициент заполнения в этом же режиме равен

γ =(PWPERx – PWDTYx)/[(PWPERx + 1) × fx] × 100%

• Длительность импульса с высоким активным уровнем при PPOLx = 0 равна

TIMP =(PWPERx – PWDTYx) / [(PWPERx + 1) × fx]

Коэффициент заполнения в этом же режиме равен

γ = (PWDTYx + 1)/[(PWPERx + 1) × fx] × 100%,

где PWPERx — десятичный эквивалент кода в регистре периода PWPERx, PWDTYx — десятичный эквивалент кода в регистре коэффициента заполнения PWDTYx, PPOLx — бит выбора полярности сигнала канала в регистре конфигурации PWPOL, CENTR — бит выбора формы сигнала в регистре управления PWCTL, fx — частота тактирования счетчика канала с номером «x».

Для центрированной ШИМ (CENTR = 1) расчет временных параметров выходного сигнала следует производить по формулам:

• Период ШИМ–сигнала равен

TPWM = 2 × (PWPERx + 1)/fx

• Длительность импульса с высоким активным уровнем при PPOLx = 1 равна

TIMP = 2 × (PWDTYx + 1) / [(PWPERx + 1) × fx]

Коэффициент заполнения в этом же режиме равен

γ = (PWPERx – PWDTYx)/[(PWPERx + 1) × fx] × 100%

• Длительность импульса с высоким активным уровнем при PPOLx = 0 равна

TIMP = 2 × (PWPERx – PWDTYx) / [(PWPERx + 1) × fx]

Коэффициент заполнения в этом же режиме равен

γ = [(PWDTYx + 1)/(PWPERx + 1)] × 100%,

Обратите внимание, что при одинаковой частоте тактирования и одинаковых кодах в регистрах периода и коэффициента заполнения длительность импульса и период формируемого сигнала центрированной ШИМ будет в два раза больше, чем при фронтовой ШИМ. А коэффициент заполнения при этом остается одинаковым, поскольку является величиной относительной.

4.24.3. Система тактирования

Структурная схема системы тактирования модуля PWM представлена на рис. 4.100. Первичным генератором для тактирования счетчиков каналов модуля PWM служит импульсная последовательность E_CLOСK. На выходе программируемого делителя формируются две импульсные последовательности CLOСK_A и CLOСK_B. Причем сигнал CLOСK_A используется для тактирования каналов 0 и 1, а CLOСK_B — каналов 2 и 3. Коэффициенты деления для последовательностей CLOСK_A и CLOСK_B задаются битами PCKA[2:0] и PCKB[2:0] регистра конфигурации PWCLK. Возможные значения коэффициентов деления приведены в таблице рис. 4.101.

Рис. 4.100. Структурная схема системы тактирования модуля PWM


PCKA2 (PCKB2) PCKA1 (PCKB1) PCKA0 (PCKB0) Частота CLOСK_A, CLOСK_B
0 0 0 E
0 0 1 E + 2
0 1 0 E + 4
0 1 1 E + 8
1 0 0 E + 16
1 0 1 E + 32
1 1 0 E + 64
1 1 1 E + 128

Рис. 4.101. Выбор частоты тактирования счетчиков каналов модуля PWM


При необходимости коэффициент деления может быть увеличен посредством подключения дополнительного делителя на входе каждой пары каналов. Делитель 0 обслуживает каналы 0 и 1 (рис. 4.100), он формирует свой выходной сигнал из импульсной последовательности CLOСK_A. Делитель 1 обслуживает каналы 2 и 3 (рис. 4.100) и формирует выходной сигнал из последовательности CLOСK_B. Коэффициент деления каждого из этих делителей определяет код в регистрах PWSCAL0 и PWSCAL1.

4.24.4. Регистры модуля PWM

Множество регистров специальных функций, которые обслуживают модуль PWM, можно разделить на следующие группы:

• Регистры конфигурации;

• Регистр разрешения работы каналов;

• Регистр дополнительного делителя;

• Регистры делителей 0 и 1;

• Регистры счетчика каналов;

• Регистры периода каналов;

• Регистры коэффициента заполнения каналов;

• Регистр управления;

• Регистр специальных режимов модуля;

• Регистры работы с портом P.

Рассмотрим перечисленные регистры более подробно.

Регистр конфигурации PWCLK

Регистр конфигурации PWCLK выполняет две функции. Во-первых, его биты определяют, будут ли каналы модуля использоваться в 8-разрядном режиме, или эти каналы объединят попарно для работы в 16-разрядном режиме. Во-вторых, биты регистра назначают два коэффициента деления частоты для образования из импульсной последовательности E_CLOСK сигнала тактирования каналов 0 и 1 (CLOСK_A) и сигнала тактирования каналов 2 и 3 (CLOСK_B).

Формат регистра PWCLK представлен на рис. 4.102. Биты CON23 и CON01 определяют режимы работы пар каналов 2:3 и 0:1 соответственно. Если значение бита CON23 равно 0, то каналы 2 и 3 работают независимо друг от друга с 8-разрядным разрешением. При CON23 = 1 каналы 2 и 3 объединяются в один 16-разрядный генератор ШИМ-сигнала. Действие бита CON01 по отношению к каналам 0 и 1 аналогично.

Рис. 4.102. Формат регистра конфигурации PWCLK


Если каналы объединены в пару, то ШИМ-сигнал пары 0:1 формируется на линии 0 порта PORT P, пары 2:3 — на линии 2 порта PORT P. Однако управление полярностью выходных сигналов 16-разрядных ШИМ-генераторов осуществляется битами PPOL1 для пары 0:1 и PPOL3 для пары 2:3. Биты управления полярностью PPOLx располагаются в регистре PWPOL.

Регистр конфигурации PWPOL

Регистр конфигурации PWPOL предназначен для задания активного уровня выходного сигнала каждого из четырех ШИМ-генераторов, а также для разрешения включения дополнительного делителя частоты для сигналов тактирования CLOСK_A и CLOСK_B. Формат регистра PWPOL приведен на рис. 4.103.

Рис. 4.103. Формат регистра конфигурации PWPOL


Каждому каналу поставлен в соответствие бит полярности сигнала PPOLx и бит выбора источника тактирования канала PCLKx (x — номер канала). Если бит PPOLx=1, то активный уровень ШИМ-сигнала — высокий логический (рис. 4.98). При PPOLx = 0 на выходе канала формируется ШИМ-сигнал с низким логическим уровнем на интервале γT (рис. 4.98).

Если бит PCLKx равен 0, то для соответствующего канала в качестве источника тактирования назначается импульсная последовательность CLOСK_A (каналы 0 и 1) или CLOСK_B (каналы 2 и 3). При PCLKx = 0 соответствующий канал тактируется от дополнительного делителя частоты, который конфигурируется битами регистров PWSCNT0/PWSCNT1 и PWSCAL0/PWSCAL1.

Регистр разрешения работы каналов PWEN

Отдельные биты регистра конфигурации PWEN используются для активизации каналов модуля PWM. Формат регистра PWEN представлен на рис. 4.104. Если бит PWENx установлен в 1, то канал с номером «x» генерирует импульсную последовательность на соответствующем выводе порта PORT P. При PWENx = 0 канал находится в неактивном режиме, соответствующая линия порта PORT P может использоваться как линия ввода/вывода общего назначения.

Рис. 4.104. Формат регистра разрешения работы каналов PWEN


Регистр дополнительного делителя PWPRES

Этот регистр используется только в специальных режимах работы МК. Его формат представлен на рис. 4.105. Более подробно мы не будем его рассматривать.

Рис. 4.105. Формат регистра дополнительного делителя PWPRES


Прежде, чем приступить к рассмотрению двух следующих регистров, возвратимся к рис. 4.100 и вспомним, как организована система тактирования отдельных каналов модуля PWM. Источником тактирования каналов является импульсная последовательность E_CLOСK. Два программируемых делителя образуют из E_CLOСK сигналы тактирования CLOСK_A для каналов 0 и 1 и CLOСK_B для каналов 2 и 3. Причем каждый из каналов может тактироваться от указанного сигнала или напрямую, или через дополнительный делитель. Регистры PWSCNT0/PWSCNT1 и PWSCAL0/PWSCAL1 устанавливают режимы работы этих двух дополнительных делителей.

Регистры делителей PWSCNT0/PWSCNT1 и PWSCAL0/PWSCAL0

Делитель 0 обслуживает каналы 0 и 1 (рис. 4.100), он формирует свой выходной сигнал из импульсной последовательности CLOСK_A. Делитель 1 обслуживает каналы 2 и 3 (рис. 4.100) и формирует выходной сигнал из последовательности CLOСK_B. Коэффициент деления каждого из этих делителей определяет код в регистрах PWSCAL0 и PWSCAL1 соответственно. Коэффициент деления Kx (x — номер делителя) вычисляется по формуле:

Kx = (PWSCALx + 1)/2,

где PWSCALx — десятичный эквивалент кода в регистре PWSCALx.

Код из регистров PWSCAL0 и PWSCAL1 автоматически загружается в вычитающие счетчики PWSCNT0 и PWSCNT1, когда последние обнуляются. Таким образом, счетчики выполняют функцию делителей частоты с плавно изменяющимся коэффициентом деления. Регистры счетчиков PWSCNT0 и PWSCNT1 доступны только для чтения. Форматы регистров PWSCAL0/PWSCAL1 и PWSCNT0/PWSCNT1 приведены на рис. 4.106 и 4.107.

Рис. 4.106. Формат регистров делителей PWSCALx


Рис. 4.107. Формат регистров вычитающих счетчиков PWSCNTx


Регистры счетчика каналов PWCNTx

При рассмотрении принципа действия отдельного канала генератора ШИМ-сигнала мы выяснили, что в формировании сигнала участвует непрерывно считающий 8-разрядный двоичный счетчик, текущий код которого сравнивается с кодом коэффициента заполнения и кодом периода. В регистрах PWCNTx (x — номер канала 0…3) отображается текущий код счетчика каждого канала. Формат регистров PWCNTx представлен на рис. 4.108. Регистры PWCNT0… PWCNT3 доступны только для чтения, попытка записи в регистр счетчика текущего кода вызывает сброс счетчика.

Рис. 4.108. Формат регистров счетчика каналов PWCNTx


Регистры периода каналов PWPERx

Число регистров периода PWPERx равно числу каналов ШИМ в модуле PWM. Все регистры PWPER0…PWPER3 — 8-разрядные. Формат регистров PWPER0…PWPER3 приведен на рис. 4.109. Период следования ШИМ-сигнала каждого канала определяется кодом, который записан в соответствующем регистре периода PWPERx:

Рис. 4.109. Формат регистров периода каналов PWPERx


• для фронтовой ШИМ период сигнала равен

TPWM = (PWPERx + 1)/fx

• для центрированной ШИМ период сигнала равен

TPWM = 2 × (PWPERx + 1)/fx

где PWPERx — десятичный эквивалент кода в регистре периода PWPERx, fx — частота тактирования счетчика канала с номером «x».

Регистры коэффициента заполнения каналов PWDTYxФормат регистров коэффициента заполнения PWDTYx

Рис. 4.110.


Число регистров коэффициента заполнения PWDTYx также равно числу каналов ШИМ в модуле PWM. Все регистры PWDTY0…PWDTY3 — 8-разрядные. Формат регистров PWDTY0…PWDTY3 представлен на рис. 4.110. Длительность импульса в каждого канале определяется кодом, который записан в соответствующем регистре коэффициента заполнения PWDTYx:

• для фронтовой ШИМ длительность импульса равна

TIMP = (PWDTYx + 1) / [(PWPERx + 1) × fx]

• для центрированной ШИМ длительность импульса равна

TIMP = 2 × (PWDTYx + 1) / [(PWPERx + 1) fx]

Регистры коэффициента заполнения каналов PWDTYx

Число регистров коэффициента заполнения PWDTYx также равно числу каналов ШИМ в модуле PWM. Все регистры PWDTY0…PWDTY3 — 8-разрядные. Формат регистров PWDTY0…PWDTY3 представлен на рис. 4.110. Длительность импульса в каждого канале определяется кодом, который записан в соответствующем регистре коэффициента заполнения PWDTYx:

• для фронтовой ШИМ длительность импульса равна

TIMP = (PWDTYx + 1) / [(PWPERx + 1) × fx]

• для центрированной ШИМ длительность импульса равна

TIMP = 2 × (PWDTYx + 1) / [(PWPERx + 1) × fx]

Коэффициент заполнения в обоих режимах равен

γ = [(PWDTYx + 1)/(PWPERx + 1)] × 100%,

где PWDTYx — десятичный эквивалент кода в регистре коэффициента заполнения PWDTYx, PWPERx — десятичный эквивалент кода в регистре периода PWPERx, fx — частота тактирования счетчика канала с номером «x».

Регистр управления PWCTL

Формат регистра управления модулем PWMCTL представлен на рис. 4.111. В этом разделе мы рассмотрим только бит CENTR этого регистра. Этот бит определяет форму выходных сигналов всех каналов модуля PWM. Если бит CENTR = 1, то в каналах реализуется центрированная ШИМ, при CENTR = 0 выходные сигналы генерируются по способу фронтовой ШИМ.

Рис. 4.111. Формат регистра управления PWCTL


Регистр специальных режимов PWTST

Этот регистр используется только в специальных режимах работы МК. Его формат представлен на рис. 4.112. Более подробно мы не будем его рассматривать.

Рис. 4.112. Формат регистра PWTST


Регистры работы с портом P

Обслуживание модуля PWM — альтернативная функция линий порта PORT P. Линии PP0…PP3 порта P могут использоваться не только в качестве выходов модуля PWM, но и как линии порта ввода/вывода общего назначения. Если работа соответствующих каналов модуля PWM разрешена, то линии порта P автоматически конфигурируются для работы в качестве выходов, на которых формируются ШИМ-сигналы. Если каналы модуля PWM не активизированы, то линии PP0…PP3 работают как обычные линии ввода/вывода. Направление передачи сигнала линиями PP0…PP7 определяется битами регистра направления передачи DDRP. Формат регистра DDRP приведен на рис. 4.113. Запись 1 в соответствующий разряд регистра DDRP конфигурирует линию на вывод. Порт P обслуживается регистром данных PORTP (рис. 4.113).

Рис. 4.113. Формат регистров обслуживания порта PORTP

4.24.5. Примеры программирования модуля PWM

Изучая модуль PWM, читатель должен был заметить, что модуль требует инициализации достаточно большого числа регистров для определения параметров работы каналов ШИМ. Однако после активизации каналов их программное обслуживание состоит лишь в смене значений коэффициента заполнения и реже, периода следования выходной импульсной последовательности.

Рассмотрим последовательность действий, которую необходимо проделать для инициализации модуля PWM:

• Для конкретного приложения следует определить разрешающую способность генерируемого ШИМ-сигнала, т.е. число дискретных отсчетов частоты таткирования канала в периоде и длительности импульса выходного сигнала канала. На основании полученных данных следует определить, в каком режиме, 8-разрядном или 16-разрядном, Вы будете использовать каналы модуля PWM;

• Для конкретного приложения следует определить требуемую частоту генерируемого ШИМ-сигнала. На основе полученных данных определить структуру подсистемы тактирования каналов модуля PWM;

• Установить биты CON23 и CON01 в регистре PWCLK для выбора 8-разрядного или 16-разрядного режима работы;

• Определить, будете ли Вы использовать режим центрированной или режим фронтовой ШИМ. В соответствие с выбранным режимом установить бит CENTR в регистре PWCTL;

• Определить активный уровень ШИМ-сигнала, в соответствии с выбором установить биты PPOL0…PPOL3 в регистре PWPOL;

• Назначить источники тактирования для каналов, для чего установить биты PCLK0…PCLK3 в регистре PWPOL;

• Установить коэффициенты деления для импульсных последовательностей CLOСK_A и CLOСK_B, используя для этого биты PCKA2…PCKA0 и PCKB2…PCKB0 регистра PWCLK;

• Установить для используемых каналов значения регистров периода и регистров коэффициента заполнения;

• Разрешить работу выбранных каналов модуля PWM, используя для этого биты PWEN0…PWEN3 регистра EPWM.

В конце данной главы в разделе самостоятельных заданий (задание 12) мы предложим Вам определить параметры инициализации модуля ШИМ самостоятельно. А пока приведем два примера.

Инициализация модуля PWM, пример 1

Определим параметры настройки модуля PWM для генерации ШИМ-сигнала с частотой 976 Гц и коэффициентом заполнения 66,7%.

Частоту тактирования канала ШИМ выберем равной 8МГц/32 = 250 кГц. Этой частотой будем тактировать 8-разрядный счетчик канала. Для формирования частоты 976 Гц потребуется 256 отсчетов частоты 250 кГц, что соответствует максимально возможному коэффициенту счета 8-разрядного счетчика периода канала.

Для формирования сигнала с коэффициентом заполнения 66,7% следует установить код периода, равный 256 отсчетам, а код коэффициента заполнения — 171 отсчету. Для формирования ШИМ-сигнала будем использовать канал 0 модуля PWM.

Программный фрагмент init_pwm.c производит начальную установку регистров специальных функций модуля PWM для генерации на выходе PP0 ШИМ-сигнала с частотой 976 Гц и коэффициентом заполнения 66,7%:

/*--------------------------------------------------------*/

/* Функция init_pwm задает начальные установки модуля PWM */

/*--------------------------------------------------------*/

void ini_pwm(void) {

 PWTST = 0x00; /*выбрать нормальный режим работы модуля PWM*/

 PWCTL = 0х00; /*выбрать режим фронтовой ШИМ*/

 PWCLK = 0x28 /*канал 0 в 8разрядном режиме, коэфф. деления*/

       /* частоты E_CLOСK равен 32*/

 PWPOL = 0х01; /*установить высокий активный уровень сигнала*/

 DDRP = 0хFF; /*настроить порт P на вывод*/

 PWEN = 0x01; /*разрешить работу канала 0 модуля PWM */

 PWPER0 = 255; /*установить код периода*/

 PWDTY0 = 171 /*установить код коэффициента заполнения*/

}

/*--------------------------------------------------------*/

Инициализация модуля PWM, пример 2

В начале раздела 4.24, мы рассматривали пример использования широтно-импульсной модуляции для управления серводвигателем. Для напоминания структурная схема управления серводвигателем приведена на рис. 4.114. В рассматриваемом примере серводвигатель приводит в движение рулевой механизм радиоуправляемой модели автомобиля. Вращение серводвигателя обеспечивает отклонение рулевого механизма на определенный угол от центрального положения. Этот угол определяется средним значением напряжения, которое прикладывается к двигателю. Напряжение регулируется способом широтноимпульсной модуляции, тогда среднее значение напряжения прямопропорционально коэффициенту заполнения ШИМ-сигнала. Значение коэффициента заполнения передается по радиоканалу. Изменение длительности импульсов напряжения, прикладываемого к серводвигателю, при сохранении частоты следования импульсов вызывает поворот рулевого механизма на определенный угол. Допустимый для рулевого управления диапазон регулирования коэффициента заполнения составляет от 4,5 до 10 %. При этом частота следования импульсов напряжения на двигателе должна составлять 50 Гц.


Рис. 4.114. Использование ШИМ для поворота рулевого колеса радиоуправляемой модели автомобиля.


Определим параметры настройки модуля PWM для генерации ШИМ-сигнала с частотой 50 Гц и коэффициентом заполнения 4,5…10,0 %. Предположим, что частота импульсной последовательности E_CLOСK равна 8 МГц. Тогда период следования импульсов E_CLOСK составляет:

TECLOCK = 1/fECLOCK = 1/8 МГц = 125 нс

Период следования формируемого ШИМ-сигнала составляет:

TPWM = 1/fPWM = 1/50 Гц = 20 мс

Число периодов импульсной последовательности E_CLOСK, которое должно быть отсчитано для формирования периода ШИМ-сигнала, составляет:

KE_CLOCK = TPWM/TE_CLOCK = 20 мс/125 нс = 160 000

Подсчитанное число слишком велико, чтобы его можно было разместить не только в 8-разрядном, но и 16-разрядном регистре. Поэтому при конфигурации модуля PWM необходимо воспользоваться программируемым делителем частоты E_CLOСK. Максимальное значение коэффициента этого делителя составляет 128: 160 000/128 = 1250.

Именно такое число отсчетов следует использовать для генерации ШИМ-сигнала с частотой 50 Гц. Число 1250 может быть размещено в 16-разрядном регистре, поэтому мы будем использовать объединение двух 8-разрядных каналов модуля PWM в один 16-разрядный. Аналогичным способом следует вычислить коды, соответствующие диапазону возможных коэффициентов заполнения 4,5…10,0%.

Запишите код инициализации модуля PWM для управления серводвигателем рулевого механизма самостоятельно, используя блок схему рис. 4.115 и программный фрагмент init_pwm.

Рис. 4.115. Последовательность действий МК при обслуживании модуля PWM

4.25. Ограничение энергии потребления

Используя мобильный телефон, Вы должны были заметить, что он переходит в режим экономичного расхода энергии аккумуляторной батареи после того, как Вы перестали им пользоваться. Все современные телефоны оснащены красочным дисплеем с подсветкой. После завершения разговора подсветка дисплея автоматически выключается, и будет оставаться в выключенном состоянии до тех пор, пока пользователь не начнет нажимать на кнопки панели управления. Однако через некоторое время после последнего нажатия дисплей опять выключится.

Все описанные действия имеют своей целью экономию энергии аккумуляторной батареи в те промежутки времени, когда телефоном не пользуются. Телефон переходит в режим низкого энергопотребления («sleep mode» — режим сна) и остается в нем до тех пор, пока не поступит звонок или пользователь нажмет на кнопки. В главе 6 мы подробно рассмотрим, как экономить энергию батареи в микропроцессорных системах. Мы также увидим, что энергия потребления МК, выполненных по CMOS технологии, пропорциональна частоте системной шины МК. Некоторые значения для токов потребления в различных режимах работы МК приведены в таблице рис. 4.116.

Частота внутренней системной шины
Максимальные значения токов потребления 2 МГц 4 МГц 8 МГц
Активный режим работы
Однокристальный режим 15 мА 25 мА 45 мА
Расширенный режим 25 мА 45 мА 70 мА
Режим ожидания Wait (все периферийные модули отключены)
Однокристальный режим 1,5 мА 3 мА 5 мА
Расширенный режим 4 мА 7 мА 10 мА
Режим останова STOP Однокристальный режим, (система тактирования выключена)
–40 +85 (°C) 10 мА 10 мА 10 мА
+85 +105 (°C) 25 мА 25 мА 25 мА
+105 +125 (°C) 50 мА 50 мА 50 мА

Рис. 4.116. Ток, потребляемый МК семейства 68HC12 в различных режимах работы


Анализируя приведенные в таблице цифры, Вы можете увидеть ярко выраженную зависимость тока потребления МК от частоты тактирования. А также, что МК значительно снижает ток потребления в режимах ожидания WAIT и останова STOP.

4.25.1. Как остановить МК 68HC12

МК семейства 68HC12 переходит в режим ожидания WAIT сразу после исполнения команды WAI языка ассемблер. Перед тем, как перейти в режим ожидания, МК записывает в стек содержимое регистров центрального процессора и адрес возврата. Затем модуль системной интеграции отключает генератор тактирования центрального процессора, в то время как тактирование периферийных модулей МК продолжается. МК может быть выведен из состояния ожидания WAIT поступлением запроса на прерывание. Этот запрос может быть внешним, или внутренним, например, по какому либо событию в модуле таймера. После поступления запроса, МК перейдет из состояния WAIT в активный режим работы, восстановит значения кодов регистров центрального процессора из стека, а затем перейдет к исполнению подпрограммы прерывания.

МК переводится в режим останова STOP командой STOP языка ассемблер. Команда STOP исполняется только в том случае, если бит S в регистре признаков CCR центрального процессора сброшен. После поступления команды STOP центральный процессор сохраняет все регистры в стеке, а затем модуль системной интеграции полностью выключает систему тактирования МК. При полном отсутствии тактовых импульсов все логические элементы в составе полупроводниковой ИС микроконтроллера находятся в статическом режиме, т.е. в состоянии 0 или 1. Известно, что основные потери энергии в логических элементах происходят при переключениях из одного установившегося состояния в другое. Именно поэтому в состоянии STOP микроконтроллера, когда переключений элементов внутренней структуры нет, энергия потребления резко падает. Данные таблицы рис. 4.116 показывают, что в режиме останова STOP ток потребления МК снижается на три порядка, т.е. примерно в тысячу раз.

4.25.2. Как вывести МК 68HC12 из состояния пониженного энергопотребления

Поступление запроса на внешнее прерывание способно вывести МК семейства 68HC12/HCS12 из режима WAIT или STOP. Однако для подключения сигналов внешних запросов могут быть использованы не только входы IRQ и XIRQ. Линии портов PORT D, PORT Y и PORT J могут быть конфигурированы таким образом, что перепад сигнала на них из 1 в 0 вызовет переход МК из режима пониженного энергопотребления в активный режим работы.

Для реализации функции пробуждения МК все перечисленные регистры снабжены двумя дополнительными регистрами управления. Это регистр разрешения функции прерывания пробуждения KWIEx и регистр флагов прерывания пробуждения KWIFx (x — буквенное обозначение порта). Поскольку формат этих дополнительных регистров для всех перечисленных портов одинаков, мы рассмотрим только регистры порта D. На рис. 4.117 приведен формат всех четырех регистров специальных функций для обслуживания линий порта PORT D:

• Регистра данных PORTD;

• Регистра направления передачи DDRD;

• Регистра разрешения функции прерывания пробуждения KWIED;

• Регистра флагов прерывания пробуждения KWIFD.

Рис. 4.117. Формат регистров обслуживания порта PORD


Установка одного из битов регистра KWIED в 1 разрешает генерацию запроса на прерывание в момент перехода сигнала на одноименной линии из 1 в 0. Одновременно устанавливается флаг в регистре KWIFD. Прерывания от порта PORT D не имеют собственного вектора. Эти прерывания в МК связаны с прерыванием по входу IRQ. Поэтому, чтобы прерывания от линий порта PORT D были обслужены, необходимо установить бит IRQEN и разместить подпрограмму прерывания в памяти по вектору внешнего прерывания IRQ. Различные модели МК семейства 68HC12/HCS12 несколько отличаются по конфигурации функции внешнего прерывания пробуждения. Так в МК 68HC12A4 порты PORT J и PORT H обладают собственными векторами прерывания, что позволяет упростить подпрограмму прерывания по входу IRQ.

Обсудив возможность вывода МК из режима пониженного энергопотребления посредством дополнительных внешних прерываний, не следует забывать, что любой МК может быть переведен в активный режим работы подачей сигнала внешнего сброса.

Уменьшение потребляемой микроконтроллером в процессе работы мощности возможно также снижением частоты тактирования посредством перепрограммирования коэффициентов умножителя частоты или выбора специального режима тактирования «slow mode». Такое решение позволит оставить центральный процессор в работе, в отличие режимов WAIT и STOP, в которых центральный процессор останавливается.

4.26. Советы по использованию платы отладки MC68EVB912B32

В этом параграфе мы более подробно рассмотрим аппаратные средства отладочной платы MC68EVB912B32, в том числе, какие возможности предоставляет конструкция платы по присоединению к ней внешних интерфейсных компонентов.

Плата развития (evaluation board) MC68EVB912B32 разработана компанией Motorola для практического изучения МК семейства 68HC12 и отладки прикладных программ управления для относительно несложных приложений. На плате установлен МК MC68HC912B32 и дополнительные схемы, обеспечивающие функционирование МК и его связь с персональным компьютером для целей загрузки кодов разработанной программы и ее отладки. Внешний вид платы MC68EVB912B32 и схема размещения на ней компонентов представлены на рис. 4.118.

а) Внешний вид

б) Схема размещения компонентов

Рис. 4.118. Отладочной плата MC68EVB912B32


МК B32 схемотехнически установлен в режим взаимодействия с персональным компьютером по последовательному интерфейсу. Для организации взаимодействия необходимо установить соединение между портом P1 платы и COM-портом компьютера, используя для этого стандартный кабель с разъемами DB-9. Обмен производится со скоростью 9600 бод, в формате 8 бит данных, один стоповый бит, без контроля паритета. Обмен данными на более высоких скоростях невозможен.

Для работы с платой пользователь должен загрузить в персональный компьютер программный пакет класса «Интегрированная среда разработки ПО для микропроцессорных систем», например ICC12 от компании ImageCraft. Этот пакет позволит вам ввести исходный текст программы на языке ассемблера или на Си, произвести его компиляцию, обработать программой линковщика и получить файл исполняемых кодов. Далее следует загрузить полученный программный код в память МК отладочной платы, после чего выполнить внешний сброс МК. И МК начнет исполнять загруженную программу без участия персонального компьютера.

Отладочная плата MC68EVB912B32 имеет встроенную программу монитора отладки D-Bug12. Эта программа размещается в области Flash ПЗУ МК. Если пользователь желает поместить отлаживаемую программу также в область Flash, то он должен сначала стереть область Flash ПЗУ, а затем записать в эту область коды прикладной программы. При этом функции отладки будет невозможно реализовать.

МК B32 и другие ИС, размещенные на плате MC68EVB912B32, выполнены на основе CMOS технологии. Эти ИС достаточно чувствительны к статическому электрическому заряду, поэтому следует соблюдать повышенную осторожность при присоединении к плате внешнего оборудования. Более подробно вопросы безопасной коммутации внешних устройств к платам с МК мы рассмотрим в главе 5.

Отладочная плата MC68EVB912B32 имеет свободное монтажное поле для размещения дополнительных ИС, например ИС ЦАП, и установочных изделий, таких как дополнительные переключатели и светодиодные индикаторы. Для подключения этих компонентов к выводам МК можно использовать группу штыревых контактов 2×10, которую следует впаять в подготовленную линейку металлизированных отверстий. На каждый штыревой контакт может быть надета пружинящая клемма с подпаянным к ней монтажным проводом (рис. 4.119).

а) Соединение через штыревой контакт, на который надевается пружинящая клемма с подпаянным к ней пружинящим проводом

б) Конструкция пружинящей клеммы

в) Соединение двух плат с электронными компонентами при помощи мезонинной конструкции

Рис. 4.119. Способы подключения дополнительных компонентов к отладочной плате


Инженер кафедры вычислительной техники университета в Вайоминге Lew Sircin усовершенствовал данную технологию. Он предложил произвести автоматизированную разводку платы с дополнительными компонентами с выводом необходимых соединений на аналогичную линейку контактов 2×10, но только на дополнительной плате установить ответную часть разъема для штыревых контактов платы отладки. Соединив две платы через этот разъем, Вы получите мезонинную конструкцию, в которой одна плата расположена над другой (рис. 4.119).

4.27. Заключение по главе 4

В данной главе мы достаточно подробно рассмотрели структуру, принцип действия и регистры управления периферийных модулей в составе МК семейства 68HC12/HCS12.

Мы изучили резидентную память МК, систему тактирования, порты ввода/вывода, подсистемы таймера, аналого-цифрового преобразования, контроллеры последовательных интерфейсов, модуль ШИМ. Мы также рассказали Вам об особенностях обслуживания прерываний и о состоянии сброса в МК семейства 68HC12/HCS12.

Вы научились измерять временные интервалы и генерировать импульсные последовательности с использованием режимов входного захвата и выходного сравнения таймера. Вы также освоили проведение измерений аналоговых сигналов с использованием встроенного в МК модуля аналого-цифрового преобразования. Вы познакомились с принципами организации обмена между интеллектуальными электронными устройствами в последовательном коде и со способом широтно-импульсной модуляции, который позволяет регулировать напряжение, прикладываемое к обмоткам исполнительного двигателя.

Для каждого из периферийных модулей мы рассмотрели эталонный учебный пример программного кода на Си, который далее может быть использован Вами при разработке учебных и реальных прикладных программ.

4.28. Что еще почитать?

1. Motorola. 68HC12 M68EVB912B32 Evaluation Board User's Manuаl (68ЕVВ912В32-UМ/D). Motorola Inc., 1997.

2. Motorola. HC12 M68HC12B Family Advance Information, (М68НСI2В/D), Motorola Inc., 2000.

3. ImageCraft. ImageCraft С Compiler and Development Environment for Motorola HC12, Version 6. Раlo Alto, СА: ImageCraft, Inc.

4. Pack, Daniel, and Steven Barrett. 68HC12 Microcontroller: Theory and Application, Upper Saddle River, NJ: Prentice Наll 2002.

5. Wakerly, John. Digital Design principles and Practices, Upper Saddle River, NJ: Prentice Наll, 2001.

4.29. Вопросы и задания

Основные

1. Объясните назначение каждого функционального модуля МК 68HC12B32.

2. Семейство 68HC12 включает несколько моделей МК. Каковы различия между отдельными моделями?

3. Сколько ячеек памяти занимает блок регистров специальных функций в МК семейства 68HC12? В какой области памяти, и по каким адресам этот блок располагается?

4. Опишите все функции линий порта PORT AD.

5. Каков объем встроенной памяти типа EEPROM в микроконтроллере семейства 68HC12?

6. Какое состояние МК называют прерыванием? Кратко опишите последовательность действий МК по обслуживанию прерывания.

7. Каковы различия между маскируемыми и немаскируемыми прерываниями. Какие из этих прерываний имеют более высокий приоритет?

8. Какова разрешающая способность встроенного АЦП для МК семейства 68HC12? Может ли она изменяться и при каких условиях?

9. Каково назначение регистра направления передачи порта ввода/вывода?

10. Число разрядов счетчика временной базы равно 16. Чему равен его коэффициент счета?

11. Счетчик временной базы тактируется частотой 0,5 МГц. Чему равен период переполнения счетчика?

Исследовательские

1. При изучении подсистемы входного захвата мы рассмотрели пример измерения длительности импульса с высоким логическим уровнем, которая по условию задачи не должна была превышать периода переполнения счетчика временной базы таймера. Разработайте блок схему алгоритма для этого примера.

2. Напишите программу на Си для реализации задачи предыдущего вопроса. Программа должна включать все операции по инициализации модуля таймера. Считайте, что таймер тактируется частотой 2 МГц, исследуемый импульсный сигнал подается на вход канала 2 модуля таймера.

3. При изучении подсистемы выходного сравнения мы рассмотрели пример генерации на одном из выходов МК единичного импульса с низким логическим уровнем. По условию задачи длительность этого импульса не превышала периода переполнения счетчика временной базы таймера. Разработайте блок-схему алгоритма для этого примера.

4. Напишите программу на Си для реализации задачи вопроса № 3. Программа должна включать все операции по инициализации модуля таймера. Считайте, что таймер тактируется частотой 2 МГц, импульсный сигнал генерируется на на выходе канала 2 модуля таймера.

5. Напишите программу на Си, которая изменяет код на выходе порта A в порядке инкрементирующего двоичного счетчика. Временной интервал между двумя соседними изменениями кодов должен составлять 30 мс.

6. Напишите программу на Си, которая изменяет код на выходе порта A сначала в порядке инкрементирующего двоичного счетчика от 0x00 до 0xFF, а затем в обратном порядке 0xFF…0x00. Временной интервал между двумя соседними изменениями кодов должен составлять 30 мс.

7. В рассмотренном при изучении подсистемы таймера примере измерения периода некоторого импульсного сигнала мы предположили, что этот период будет меньше, чем период переполнения счетчика временной базы. Измените предложенный ранее алгоритм таким образом, чтобы измерения проводились для сигналов с периодом, превышающим период переполнения счетчика временной базы.

8. Укажите ограничения по минимальному и максимальному значению периода сигнала для предложенного Вами алгоритма в задании № 7.

9. В параграфе 4.14.5, посвященном счетчику внешних событий в составе модуля таймера, мы обсудили способ измерения скорости движения велосипеда с использованием датчика Холла. Разработайте блок схему алгоритма, напишите текст программы на Си для реализации такого измерителя скорости.

10. В примере использования модуля меток реального времени (раздел 4.15) мы программно отсчитывали 122 периода модуля RTI по 8,196 мс для формирования интервала в 1 с. Сколько отсчетов необходимо было бы сделать для отсчета 24 часов? Сколько 8-разрядных ячеек памяти понадобилось бы задействовать для этой задачи?

11. В разделе 4.18 мы рассмотрели программный фрагмент для инициализации контроллера SCI и передачи с его помощью ASCII кодов некоторых символов. Предположите, что Вам требуется организовать связь по последовательному асинхронному интерфейсу двух МК семейства 68HC12. Нарисуйте функциональную схему соединения микроконтроллеров. Разработайте две блок-схемы алгоритмов для передающего и принимающего контроллеров. Напишите программы для обоих МК на Си.

12. В параграфе 4.24 мы обсудили способ управления исполнительным двигателем рулевого управления радиоуправляемой модели автомобиля с использованием ШИМ. Частота импульсного напряжения, прикладываемого к двигателю, составляет 50 Гц. Диапазон изменения коэффициента заполнения при полном ходе механизма рулевого управления составляет 4,5…10,0%. Разработайте блок-схему алгоритма, напишите текст программы на Си для управления рулевым механизмом. Для решения задачи предположите, что код задания угла поворота рулевого механизма в 8-разрядном формате поступает на входы порта A.

Рис. 4.120. Электрический двигатель с оптическим датчиком скорости


13. Разработайте блок схему алгоритма и напишите текст программы на Си для расчета скорости вращения двигателя (об/мин) по сигналам оптического датчика скорости. Принцип действия датчика поясняет рис. 4.120. Прозрачный пластмассовый диск закреплен на валу двигателя. Диск поделен светонепроницаемой краской на секторы. Диск помещен между излучающим светодиодом и фотоприемником. Если напротив светодиода находится черная полоса диска, то на выходе электронной схемы фотоприемника формируется логический 0. Если напротив светодиода располагается прозрачная полоса диска, то выход электронной схемы фотоприемника устанавливается в 1. В результате, когда двигатель вращается, на выходе электронной схемы формируется импульсная последовательность, частота которой прямопропорциональна скорости вращения двигателя. Для решения задачи предположите, что оптический датчик скорости формирует 200 импульсов на один оборот двигателя.

Загрузка...