Журнал «Электронные компоненты» №1 2002 г.
Ракович Н. Н.
Помимо упомянутых в предыдущей статье ИС для игрушек и бытовой техники, Holtek выпускает широкий спектр компонентов для систем связи, компьютерной техники, систем управления. В данной публикации рассмотрим 8-разрядные микроконтроллеры с высокоэффективной RISC-подобной архитектурой, которые применяются как контроллеры дистанционного управления, контроллеры вентиляторов, светильников, стиральных машин, весов, игрушек и т.д. Невысокая стоимость микроконтроллеров Holtek в сочетании с высокой эффективностью делает их применение оправданным и с экономической и с технической стороны, а модели с встроенными драйверами ЖКИ позволяют создавать функционально завершенные устройства с индикацией.Ракович Н. Н.
Все контроллеры Holtek с RISC-подобной архитектурой имеют встроенный кварцевый и RC генератор, 63 команды (62 команды у HT48CA0 и HT48RA0A), сторожевой таймер, выполнение всех команд происходит за один или два машинных цикла. Для снижения потребления используется функция останова и схема запуска после состояния ожидания. Перечень микроконтроллеров приведен в таблице 1.
Рассмотрим основные параметры контроллеров Holtek на примере микросхем серии НТ48ххх и НТ49ххх (с драйвером ЖКИ).
Микроконтроллеры HT48ххх
HT48ххх - 8-разрядный высокопроизводительный RISC-подобный микроконтроллер, разработан для применения в устройствах и системах с несколькими линиями ввода/вывода (блок-схема - на рис. 1).
- напряжение питания - 2,4-5,2 В;
- двунаправленные линии ввода/вывода (от 18 до 56 в зависимости от модели);
- программируемый таймер/счетчик событий с прерыванием по переполнению и выбором одного 8-разрядного счетчика или одного 8-разрядного и 16-разрядного счетчиков или двух 16-разрядных счетчиков;
- встроенный генератор;
- сторожевой таймер;
- двухуровневый стек подпрограмм;
- память программ 1Кх14 или 2Кх14 или 4Кх15 или 8Кх16 бит;
- ОЗУ данных 64х8; 96х8; 160х8 или 224х8 бит;
- вход прерывания;
- выполнение всех команд за 1 или 2 цикла;
- длительность цикла команды не более 0,5 мкс при частоте тактового генератора 8 МГц и напряжении 5В;
- 2/4/8 уровней вложения подпрограмм;
- 63 команды.
Конвейерная обработка команд
Выполнение команды занимает 4 цикла тактового генератора. Но поскольку одновременно выполняются две операции (исполнение текущей команды и выборка следующей команды из памяти), то линейные команды выполняются за 1 цикл. За два цикла выполняются команды перехода, изменяющие содержимое счетчика команд.
Счетчик команд PC
Микроконтроллер имеет счетчик команд на 10-13 разрядов, позволяющий адресовать до 1К-8К слов программной памяти. Младший байт счетчика команд (PLC) представлен в памяти данных как регистр, доступный для чтения и записи, с адресом 06h. После выборки из памяти очередной команды счетчик команд автоматически увеличивает свое значение на единицу и указывает на адрес следующей, подлежащей выполнению команды.
При выполнении команд перехода, условного пропуска команды, загрузки регистра PLC, вызова подпрограммы, начального сброса, внутреннего, внешнего прерываний или возврата из подпрограммы в счетчик команд загружается адрес, определяемый соответствующей командой.
В микроконтроллере имеется набор команд условного пропуска. В зависимости от выполнения соответствующего условия, эти команды обеспечивают либо выполнение следующей за ними команды, либо холостого цикла.
Чтобы осуществить безусловный переход в пределах 256 соответствующих адресов программы, достаточно загрузить соответствующее значение в младший байт счетчика команд PLC.
При любой передаче управления формируется холостой цикл для очистки конвейера команд, при этом не выполняется никакая команда.
Память программы
Память программы микроконтроллера может быть адресована счетчиком команд или таблично. Для специальных применений зарезервированы следующие адреса памяти программы:
000h: с этого адреса начинается выполнение программы после инициализации (сброса) микроконтроллера.
004h: адрес зарезервирован для подпрограммы обработки внешнего прерывания. В случае активизации сигнала на выводе INT микроконтроллера, если разрешено внешнее прерывание и стек подпрограмм не заполнен, управление передается команде по адресу 004h.
008h: адрес зарезервирован для прерывания таймера/счетчика событий. При переполнении управление передается команде по адресу 008h (при разрешении прерывания от таймера/счетчика и неполном стеке подпрограмм).
Загрузка констант в регистры
Любое слово в памяти программ может быть использовано как константа для загрузки в регистры оперативной памяти. Команды TABRDC(m) (текущая страница) и TABRDL(m) (последняя страница) передают содержимое младшего байта кода в указанный регистр m оперативной памяти, а старший байт кода - в регистр TBLN (08H), который доступен только для чтения. Два старших бита в регистре TLBH читаются как 0. Указателем на адрес внутри страницы, из которого будет читаться константа, является регистр TBPL (07H). Все команды загрузки констант выполняются за 2 цикла.
Регистр стека STACK
В регистре стека при передаче управления подпрограммам сохраняется текущее значение счетчика команд PC. Регистр стека имеет два уровня для НТ48С10/НТ48С30, четыре уровня для НТ48С50, восемь уровней для НТ48С70 и располагается вне памяти данных. Активный уровень определяется указателем стека (SP). При обращении к подпрограмме содержимое счетчика команд помещается в стек. При завершении подпрограммы содержимое счетчика команд восстанавливается командами возврата RET или RETI.
После выполнения сброса микроконтроллера значение SP указывает на верхний уровень стека. Если стек полон и при этом приходит разрешенное прерывание, то устанавливается флаг запроса прерывания, но прерывание не обслуживается. Прерывание будет обслужено при освобождении стека. Таким образом, предотвращается переполнение стека.
Память данных
Память данных состоит из 8-битных регистров (81 регистр для НТ48С10, 113 - для НТ48С30, 184 - для НТ48С50 и 255 - для НТ48С70). Она разделена на две функциональные группы: регистры специальных функций и память данных общего применения (64х8, 96х8,160х8, 224х8 соответственно для НТ48С10/ НТ48С30/ НТ48С50/ НТ48С70). Большинство регистров доступны для чтения и записи, но некоторые - только для чтения.
О регистрах специальных функций упомянем ниже, а пока несколько слов о памяти данных общего назначения (проще - ОЗУ). ОЗУ используется для данных и информации управления и имеет адресное пространство 40H 7FH (HT48C10), 20H-7FH (HT48C30), 60H-FFH (HT48C50), 20H-FFH (HT48C70). Исключая некоторые специализированные биты, каждый из битов памяти данных может быть установлен или сброшен командами SET(m).i и CLEAR(m).i соответственно. Косвенный доступ к регистрам памяти данных обеспечивается через регистр указателя памяти (МР, 01Н).
Регистры специальных функций
Регистр косвенной адресации
Расположенный по адресу (00Н) регистр косвенной адресации не имеет физической реализации. Любая операция чтения/записи по отношению к этому регистру обеспечивает доступ к регистру памяти данных, адрес которого указан в регистре указателя памяти (МР, 01Н). Чтение регистра 00Н при косвенной адресации дает результат 00Н. Регистр указателя памяти (МР, 01Н) является 7-битным. Старший бит регистра всегда читается как 1.
Аккумулятор
Аккумулятор непосредственно связан с арифметико-логическим устройством (АЛУ). Он представлен по адресу 05Н в памяти данных. Обмен данными между двумя регистрами памяти может быть осуществлен только через аккумулятор.
Арифметико-логическое устройство (АЛУ)
АЛУ выполняет 8-разрядные арифметические и логические операции:
- арифметические действия (команды ADD, ADC, SUB, SBC, DAA),
- логические действия (команды AND, OR, XOR, CPL),
- циклический сдвиг (команды RL, RR, RLC,RRC),
- приращение и уменьшение (команды INC, DEC),
- переходы (команды SZ, SNZ, SIZ, SDZ.
Регистр состояния STATUS
Регистр состояния (0АН) содержит флаг нуля (Z), флаг переноса (С), дополнительный флаг переноса (АС), флаг переполнения (ОV), флаг режима пониженного потребления (PD) и флаг срабатывания сторожевого таймера (ТО). За исключением флагов PD и ТО, биты регистра могут быть изменены командами (аналогично другим регистрам). Значения флагов PD и ТО не изменяются при выполнении операций над регистром состояния. Изменение значения флага ТО происходит при включении питания, при срабатывании сторожевого таймера или при выполнении команд CLR WDT, HALT. Изменение состояния флага PD происходит при выполнении команд HALT, CLR WDT или при выключении питания.
Следует учитывать, что при обработке прерывания или вызове подпрограммы содержимое регистра состояния не сохраняется автоматически. Поэтому, если его значение необходимо сохранить, то необходимо вставить в программу соответствующую команду.
Прерывания
Микроконтроллер обеспечивает обработку внешнего прерывания и прерывания от таймера/счетчика событий. Регистр управления прерывания (INTC, OBH) содержит биты разрешения/запрета прерываний и флаги запроса прерываний. При обслуживании прерывания все остальные прерывания блокируются (очисткой бита EMI). Таким образом предотвращается возможность получения вложенных прерываний. Запрос на обработку другого прерывания, поступивший в этот период, приводит только к установке флага запроса прерывания. Для того, чтобы разрешить обслуживание прерывания при обслуживании другого прерывания, необходимо установить бит EMI и соответствующий бит разрешения прерывания. Если стек подпрограмм заполнен, запрос на прерывание не будет обработан, даже если вложенное прерывание разрешено, пока не будет закончено выполнение текущей подпрограммы. Поэтому, если необходимо постоянно обрабатывать прерывания, то надо принять меры к предотвращению заполнения стека. Оба вида прерываний обеспечивают возможность выхода микроконтроллера из режима пониженного потребления.
Не рекомендуется выполнять переход к выполнению подпрограммы командой CALL внутри подпрограммы обработки прерывания, так как возможно появление запроса на прерывание и немедленное его обслуживание, что потребует свободного места в стеке.
Сторожевой таймер WDT
Сторожевой таймер предназначен для предотвращения программного сбоя. Возможна программная блокировка сторожевого таймера.
Тактовым генератором сторожевого таймера может быть встроенный RC-генератор или делитель на 4 тактовой частоты микроконтроллера (определяется выбором маски). Если используется встроенный генератор (период около 78 мкс), то с помощью делителя на 256 устанавливается время срабатывания таймера 20 мс. Дальнейшее увеличение времени срабатывания обеспечивается 7-разрядным предварительным делителем, значение коэффициента деления которого определяется битами WSO:WS2 регистра управления сторожевым таймером WDTS и изменяется в пределах от 1:1 до 1:128. Таким образом, максимальное значение времени срабатывания сторожевого таймера может составлять около 2,6 с. Старший полубайт и бит 3 регистра управления WDTS зарезервированы для флагов пользователя и могут использоваться программистом по своему усмотрению.
Если внутренний генератор сторожевого таймера отключен, то таймер тактируется от тактового генератора микроконтроллера, но следует иметь в виду, что при выполнении команды HALT перехода в режим пониженного потребления тактовый генератор микроконтроллера останавливается и, таким образом, будет остановлена и работа сторожевого таймера. В связи с этим рекомендуется использовать внутренний тактовый генератор.
Переполнение сторожевого таймера при нормальной работе вызывает сброс микроконтроллера и установку бита ТО регистра состояния. Однако при выполнении команды HALT переполнение сторожевого таймера приводит к «горячему сбросу», при котором обнуляется только регистр счетчика команд РС и стек подпрограмм SP. Чтобы очистить содержимое сторожевого таймера, включая предварительный делитель, существует три метода: внешний сброс при низком уровне на выводе RES микроконтроллера, программные команды и команда HALT.
Режим пониженного потребления
Переход в режим пониженного потребления инициализируется командой HALT, в результате чего:
- тактовый генератор микроконтроллера останавливается, однако тактовый генератор сторожевого таймера (если он выбран) продолжает работать;
- содержание памяти данных и регистров не меняется;
- содержимое сторожевого таймера и его предварительного делителя обнуляется (если он тактируется от встроенного генератора);
- все порты ввода/вывода сохраняют свое состояние;
- устанавливается флаг PD и сбрасывается флаг ТО регистра состояния.
Переход к нормальному режиму функционирования из режима пониженного потребления выполняется за 1024 такта тактового генератора микроконтроллера.
Сброс
В микроконтроллере предусмотрены три вида сброса:
- внешний сброс в нормальном режиме;
- внешний сброс в режиме пониженного потребления;
- сброс при срабатывании (timeout) сторожевого таймера в нормальном режиме.
Для обеспечения запуска и стабильной работы генератора тактовых импульсов стартовый таймер микроконтроллера SST формирует задержку в 1024 периода тактовой частоты перед началом выполнения программы при включении питания или при выходе из режима пониженного потребления. При внешнем сбросе SST задержка блокируется.
Таймер/счетчик событий
Разрядность таймера/счетчика событий зависит от конкретной модели микроконтроллера: для НТ48С10/НТ48С30 - это 8-разрядный программируемый счетчик, для НТ48С50/НТ48С70 - это два счетчика, обозначенных как таймер/счетчик событий 0 (16-разрядный) и таймер/счетчик событий 1 (8-разрядный для НТ48С50 и 16-разрядный для НТ48С70).
В качестве источника тактовых импульсов используется внешний генератор импульсов или встроенный генератор микроконтроллера (тактовая частота, деленная на 4). Применение тактового генератора микроконтроллера позволяет генерировать таймеру/счетчику только временные интервалы. При использовании внешнего источника тактовых импульсов с помощью таймера можно вести подсчет внешних событий, измерять временные интервалы, длительность импульсов или формировать точные временные интервалы.
Управление работой таймера/счетчика осуществляется через регистры TMR (0DH) и TMRC (0EH) для НТ48С10/30 и регистры TMRxH, TMRxL и TMRxC для НТ48С50/70. С регистром TMR (TMRxH, TMRxL) связаны два физических регистра: при записи в регистр в таймер/счетчик записывается начальное значение (регистр загрузки), чтение регистра вызывает считывание текущего состояния таймера/счетчика. Регистр TMRC (TMRхC) является регистром управления таймером/счетчиком, с помощью которого задаются режимы работы.
Биты ТМ0 и ТМ1 регистра TMRC определяют один из трех режимов работы таймера/счетчика:
- режим счета внешних событий (внешний тактовый генератор);
- режим таймера (тактовый генератор микроконтроллера);
- режим измерения длительности импульсов.
При подсчете внешних событий переполнение таймера/счетчика является одним из событий, приводящих к «пробуждению» микроконтроллера из режима пониженного потребления.
На время считывания содержимого таймер/счетчика во избежание ошибок блокируется подача тактовых импульсов, что необходимо учитывать при разработке программы во избежание пропусков при счете.
Порты ввода/вывода
Число двунаправленных портов ввода/вывода меняется в зависимости от микроконтроллера: 18 - для НТ48С10, 22 - для НТ48С30, 32 - для НТ48С50 и 56 для НТ48С70. Для операций ввода порты должны быть готовы к приему данных по спаду фазы Т2 команды MOV, так как не имеют защелки. При выводе все данные располагаются в регистре-защелке и остаются неизменными до тех пор, пока в регистр не будет записана новая информация.
Каждый линия ввода/вывода имеет свой собственный регистр управления, позволяющий выполнять динамическую конфигурацию линии с помощью программы.
При сбросе порты ввода/вывода устанавливаются в состояние с высоким уровнем, но каждый бит регистра-защелки может быть установлен или очищен командами SET и CLR соответственно.
Микроконтроллеры НТ49ххх со встроенным драйвером ЖКИ
Микроконтроллеры этого семейства предназначены для различных устройств с ЖКИ и малым потреблением: калькуляторы, часы, игрушки, весы и т.п. Они имеют архитектуру, аналогичную семейству контроллеров НТ48ххх, поэтому рассмотрим только особенности микроконтроллеров НТ49ххх, в частности: многофункциональный таймер, временная база, часы реального времени, драйвер жидкокристаллического индикатора, детектор напряжения питания и зуммер.
Многофункциональный таймер
Наличие трех таймеров (сторожевой таймер, временная база, таймер/счетчик) в составе микроконтроллера требует решения задачи распределения сигналов с выхода каждого из этих устройств. Это выполняется при помощи встроенного многофункционального таймера, состоящего из делителя на 7 разрядов и предварительного делителя частоты на 8 разрядов, на вход которого подаются тактовые импульсы сторожевого таймера, часов реального времени, или генератора микроконтроллера. Помимо формирования требуемых тактовых последовательностей с помощью многофункционального таймера генерируется частота (диапазон от fs/22 до fs/28, где fs - частота тактового генератора микроконтроллера, рекомендуемая частота - 4 кГц) для драйвера ЖКИ и для звукового сигнала зуммера (диапазон от fs/22 до fs/29).
Временная база
Временная база формирует периодический сигнал переполнения для регулярного внутреннего прерывания. Период этого сигнала можно изменять от fs/212 до fs/215. При появлении сигнала переполнения устанавливается соответствующий флаг запроса прерывания. Сигнал переполнения временной базы может также использоваться как источник тактовых импульсов для увеличения периода таймера/счетчика.
Часы реального времени (RTC)
Принцип работы часов реального времени аналогичен временной базе: прерывания через регулярные интервалы времени. Период сигнала часов может изменяться программным путем от 1/28 до 1/215 тактовой частоты микроконтроллера. Коэффициент деления задается битами RT0:RT2 регистра управления часами реального времени RTCC (09Н). При появлении сигнала переполнения часов реального времени в регистре управления прерываниями INTC1 (1ЕН) устанавливается флаг запроса прерываниями RTF. Если прерывание разрешено и стек подпрограмм не полон, управление передается подпрограмме обработки запроса на прерывание, расположенной по адресу 18Н.
Память дисплея ЖКИ
Для управления ЖКИ дисплеем микроконтроллеры семейства НТ49ххх создают специальную область встроенной памяти данных, расположенную по адресу 40Н-60Н в ОЗУ банка 1. Указатель банка ВР, расположенный в памяти данных по адресу 04Н, обеспечивает переключение между памятью данных и памятью ЖКИ дисплея. Если указатель банка установлен в 1, то запись в регистры с адресом 40Н-60Н приводит к изменению состояния сегментов ЖКИ. При установке указателя ВР в 0 область памяти по адресу 40Н-60Н используется как память данных общего применения. Память ЖКИ дисплея допускает чтение и запись только с использованием косвенного метода адресации через регистр косвенной адресации МР1 (02Н). Данные памяти ЖКИ дисплея автоматически считываются драйвером ЖКИ, который генерирует соответствующие сигналы для подачи на выводы ЖКИ. Для включения дисплея в соответствующий бит памяти дисплея необходимо записать 1, для выключения - 0.
Драйвер ЖКИ
Число выводов драйвера ЖКИ зависит от типа микроконтроллера и может быть 33х2, 33х3, или 32х4 (для НТ49С10 - 19х3 или 18х4), тип смещения - «R» или «С». Если выбрано смещение «R», то отпадает необходимость во внешних конденсаторах. Для смещения типа «С» необходимо подключение конденсатора между выводами С1 и С2 микроконтроллера. Напряжение смещения схемы управления ЖКИ может быть выбрано при программировании из значений 1/2 и 1/3. Если выбрано значение смещения ?, то требуется подключение конденсатора между выводом V2 микроконтроллера и общей цепью. Для смещения 1/3 требуется еще подключение дополнительного конденсатора между выводом V1 микроконтроллера и общей цепью.
Детектор напряжения питания
Для переносных устройств в микроконтроллере предусмотрен детектор напряжения питания. Если напряжение питания опускается ниже установленного значения, то устанавливается флаг разряда батареи BLF (бит 5 регистра управления часами реального времени RTCC). Значение порогового напряжения составляет 3,3:3,6 В или 2,2 : 2,4 В в зависимости от выбранного значения смещения. Детектор пониженного напряжения питания может быть включен или выключен записью 1/0 соответственно в бит BON регистра управления часами реального времени RTCC. Достоверное значение флага BLF можно считывать через 100 мс после включения детектора.
Зуммер
В микроконтроллере реализован парафазный выход для подключения зуммера (выводы РА0 и РА1порта А). Использование этих выводов для зуммера и частота сигнала зуммера определяется при программировании микроконтроллера. Когда выбрана функция зуммера, выводы РА0 и РА1 надо установить в 1 для включения зуммера и в 0 для его выключения.
Надеюсь, что даже такая краткая информация позволит получить представление о RISC-подобных микроконтроллерах фирмы Holtek и успешно их применять в различных системах.
Источник: rtcs.ru