Рябов В.Т. - Устройство и программирование однокристальных микроконтроллеров (1041592), страница 18
Текст из файла (страница 18)
Здесь задана длительность тика в 1 мкс для резонатора с частотой 11МГц. После сброса МК все его порты установлены в состояние единицы и все прерывания56запрещены. В системной настройке мы разрешили только прерывания от нулевого таймерасчетчика. В подпрограмме начальной настройки пользователя, которая должна размещаться садреса 162h, можно провести установку выводов портов в состояние, адекватно определяющее начальное состояние объекта управления, определить начальное состояние квантов пользователя и используемых в них переменных, разрешить нужные прерывания и их приоритеты, настроить приемо-передатчик и т.п.Далее за начальной настройкой следует так называемая «пультовая петля» диспетчерапроцессов. Она ведет очередь квантов с жестким или круговым приоритетом.
При жестком приоритете, при одновременном выполнении условий запуска ((FPR)*(SPR)=1), предпочтение отдается кванту с минимальным номером. При круговом приоритете предпочтение отдается кванту, следующему за только что выполненным, и далее по кругу пультовой петли. Обычно круговой приоритет выбирают в случаях, когда есть опасность постоянного захвата процессорного времени каким либо из квантов. Начальный фрагмент пультовой петли приведен ниже.ORG 4Fh; анализ состояния нулевого квантаPR0:JNB 21h.0h,PR1; если флаг нулевого кванта не установлен, переход к PR1JNB 20h.0h,PR1; если статус нулевого кванта не установлен, переход к PR1CLR 21h.0h; иначе очистить флаг квантаLCALL 149h; запустить нулевой квантJNB 26h.0h,PR0; если очередь квантов на круговая, переход в начало петлиPR1:JNB 21h.1h,PR2; анализ состояния первого кванта и так далееПодобным образом анализируется состояние всех восьми квантов.
Заканчиваетсяпультовая петля безусловным переходом на метку PR0.Обсудим, как запускать квант? Где он будет находится в памяти, диспетчер знать неможет, ведь кванты пользователя «накладываются» на готовый отлаженный универсальныйдиспетчер, который хранится в неизменяемой части памяти программ. В то же время, команда вызова подпрограммы кванта пользователя LCALL требует указания конкретного адреса ее начала.Для вызова подпрограмм с изменяемым адресом начала используют таблицу привязки, схожую по организации с таблицей векторов прерываний. Эту таблицу размещаютв изменяемой части памяти программ.
Состоит она из 8-и триад байтов. В триаду для каждого кванта после его создания вписывается переход на уже известный адрес его начала,как это показано для первого кванта. При совместной трансляции квантов пользователя сдиспетчером процессов в таблицу привязки могут быть вписаны символические адреса(названия) квантов пользователя.;------------------------векторы пользователя-------------------------ORG 149hLJMP NAME0;-------имя кванта0--------------ORG 14ChLJMP NAME1;-------имя кванта1------------------------------------------------------------------------------------------------------ORG 15EhLJMP NAME7;------- имя кванта7-------------ORG 162hLJMP USERSTART ;-------имя начальной настройки пользователя---Приступим к разработке программы прерываний таймера-счетчика.
Она запускается с каждым тиком таймера и должна анализировать, не окончилась ли задержка каждогоиз восьми квантов. Задержка для квантов может отсчитываться в малых или больших тиках в зависимости от состояния соответствующих битов регистра размерности задержек,расположенного в ячейке памяти с адресом 22h. Большой тик содержит 256 малых.Подпрограмма прерывания состоит из четырех основных частей. Первая, вводная57часть запрещает все другие прерывания на время ее выполнения.
Затем, сохраняет в стекесостояние основной программы, чтобы в нее можно было без проблем вернуться и определяет, не окончился ли вместе с малым и большой тик:TIMER: CLR EA; запретить прерыванияPUSH PSW; сохранить в стеке слово состояния процессораPUSH ACC; сохранить в стеке аккумуляторSETB RS0; задать первый банк регистров МКMOV TH0,24h; восстановить в счетном регистре таймераMOV TL0,25h; начальные значенияDJNZ 23h,FL0; если счетный регистр малых тиков не ноль, переход к FL0.Именно последняя команда этого фрагмента определяет, какой тик произошел,большой или малый. При большом тике будет выполняться следующая команда подпрограммы, при малом – последует переход к метке FL0. Опишем обработку большого тика, которая начинается с анализа задержки нулевого кванта.DJNZ R0,FH1; уменьшить задержку кванта 0 и переход к FН1, если не 0SETB 21h.0h; если задержка обнулена, установить флаг кванта 0FH1:DJNZ R1,FH2; уменьшить задержку кванта 1 и переход к FН2, если не 0SETB 21h.1h; если задержка обнулена, установить флаг кванта 1 и т.д.Если тик малый, будет выполняться часть подпрограммы, помеченная флагом FL0,уменьшающая на единицу задержки времени, заданные только в малых тиках и выставляющая флаги тех квантов, у которых задержка окончилась.
Далее приведен один извосьми сходных фрагментов этой части, описывающий декремент и последующий анализзадержки нулевого кванта.FL0:JB 22h.0h,FL1; если задержка кванта - в больших тиках, переход к FL1DJNZ R0,FL1; иначе уменьшить задержку и переход к FL1, если не нольSETB 21h.0h; если задержка обнулена, установить флаг кванта 0FL1:JB 22h.1h,FL2; и т.д.Завершающая, четвертая часть обеспечивает правильный возврат из прерывания.ENDTM: POP ACC; восстановить аккумуляторPOP PSW; и слово состояния процессораSETB EA; разрешить прерыванияRETI;возврат из прерыванияПодпрограмма, если посмотреть на ее полный текст, может показаться громоздкойи неуклюжей.
С помощью цикла ее можно было бы описать гораздо компактнее. Но короткая программа и быстрая программа далеко не одно и то же.В рассмотренном примере диспетчера процессов обрабатываются только синхрокванты. Реализовать запуск интерквантов можно, подавая аппаратно задаваемый сигнал ихзапуска на выводы какого либо порта МК и анализируя состояния выводов в пультовойпетле.
Следует отметить, что экстракванты запускаются через прерывания, минуя диспетчер процессов, и их обработка может быть задана в подпрограмме начальной настройкипользователя.Распределение памяти программ приведено в таблице 5.5. Затонированы строки памяти программ, занимаемой диспетчером процессов. Диспетчер является основной ведущей программой. Зоны памяти, которые могут занимать стартовая программа и квантыпользователя, оставлены светлыми.
Пользователь диспетчера может произвольно выбирать имена своей стартовой программы и квантов. Для привязки к диспетчеру он долженвписать эти имена в соответствующие зоны таблицы привязки и далее описать свои процессы (кванты) как подпрограммы в соответствии с правилами языка Ассемблер.Пример разработки программного обеспечения локального микроконтроллера, которое будет выполняться под управлением рассмотренного диспетчера процессов, приведенв следующем разделе главы 5, а полный текст программного обеспечения - в ПРИЛОЖЕНИИ 2.58Таблица 5.5.Распределение памяти программ МК под диспетчер процессовАдрес0000h0003h – 0025h002Bh – 0048h004Ah004Fh – 00BFh00D0h – 0141h0149h – 0164h0149h014Ch014Fh0152h0155h0158h015Bh015Eh0162h0165h и далееНаименование программы или зоны памятиНачальный пуск системыЗона векторов прерываний MKНачальная системная настройка МКЗапуск начальной настройки МК пользователем по адресу 0162hПультовая петля диспетчера задачПодпрограмма прерываний таймераЗона векторов системных прерываний для пользователяПереход к кванту пользователя с нулевым приоритетом LJMP NAME0Переход к кванту пользователя с первым приоритетом LJMP NAME1Переход к кванту пользователя со вторым приоритетом LJMP NAME2Переход к кванту пользователя с третьим приоритетом LJMP NAME3Переход к кванту пользователя с четвертым приоритетом LJMP NAME4Переход к кванту пользователя с пятым приоритетом LJMP NAME5Переход к кванту пользователя с шестым приоритетом LJMP NAME6Переход к кванту пользователя с седьмым приоритетом LJMP NAME7Переход к подпрограмме начальной настройки STARTСтартовая программа и кванты пользователяПри практическом использовании текста диспетчера процессов, если пользоватьсясвободно распространяемым сейчас ассемблером A8051.EXE и линковщиком XLINK.EXEпод DOS, следует набирать текст в кодировке DOS.
Как это сделать и как транслировать илинковать программу, будет проиллюстрировано в следующем разделе, где рассмотреноиспользование диспетчера для написания программы управления шаговым двигателем.Контрольные вопросы.1. Назначение и состав диспетчера процессов. Переменные окружения синхрокванта и управление ими.2. Функции и настройка таймера счетчика микроконтроллера при использованиидиспетчера потоков. Почему выбран первый режим?3.
Рассчитайте максимальную задержку кванта при малом «тике» в 2 мс.4. Механизм запуска кванта и управление им.595.3. Пример разработки программного обеспечения.Аппаратное построение контроллера для управления шаговымдвигателемКонтроллер должен управлять вращением шагового двигателя с переменной скоростью в ту или иную сторону. Пульт управления, содержит четыре кнопки К1..К4. Однакнопка запускает, а при повторном нажатии останавливает ШД.
Вторая реверсирует еговращение. При нажатии и удерживании третьей кнопки двигатель ускоряет свое вращение. Четвертая аналогичным способом задает замедление. Обеспечить необходимый алгоритм работы должно программное обеспечение контроллера.Прежде всего, рассмотрим объект управления. Шаговый двигатель (ШД) - это электрическая машина, позволяющая преобразовывать импульсы управления в угловые илилинейные перемещения фиксированной величины. шаговые двигатели по типу движениябывают двух видов: поступательные и вращательные. По конструкции ШД вращательногодвижения представляют собой многофазные синхронные двигатели с явно выраженнымиполюсами, рассчитанные на работу в широком диапазоне частот управляющих импульсов,включая нулевую (фиксацию ротора при питании фазной обмотки постоянным током).ШД различаются, прежде всего, числом фаз и типом магнитной системы. Большинствоконструкций ШД имеет от двух до шести фаз.