Рябов В.Т. - Устройство и программирование однокристальных микроконтроллеров (1041592), страница 17
Текст из файла (страница 17)
Наиболее гибким и удобным для построения диспетчера представляется режим 1, схема функционирования которого и содержание управляющего регистра таймера TMOD представлены на рис.5.1.Здесь в регистре TMOD определен режим таймера Т/С0, система не ограничиваетпользователя в выборе допустимого режима Т/С1.Если в подпрограмме обработки прерываний перезагружать старший и младший регистры таймера, мы сможем гибко регулировать время малого тика (время прерывания таймера), абольшой тик будет отсчитываться после 256 прерываний (малых тиков).В ячейках с адресами 24h и 25h будем хранить начальные значение старшего имладшего байта TH0 и TL0 таймера счетчика Т/С0.
Таймер счетчик начинает считать от16-и разрядного числа, заданного регистрами 24h и 25h и, как только переполнится, возникнет прерывание и запустится подпрограмма его обработки. В подпрограмме обработкиэтого прерывания снова установим начальное значение счетного регистра таймера и обработаем флаги прерываний в соответствии с заданными задержками квантов.53В микроконтроллерах семейства MCS-51 - автовекторная система прерываний. Закаждым источником прерываний закреплен свой вектор – адрес в младшей зоне памятипрограмм.Затаймером Т/С0закреплен вектор0Bh.
При наступлении прерывания микроконтроллер заканчивает выполнениеочереднойкоманды и записывает в стек содержимое счетчика команд, атам всегда содержится адресследующей коРис. 5.1. Функциональная схема работы и состояние регистра режимовманды, которуютаймера TMOD для проектируемого диспетчера процессов.следует выполнить. Это нужно,чтобы после обработки прерывания вернутся к выполнению основной программы. Затем всчетчик команд заносится вектор наступившего прерывания. МК обращается в памятьпрограмм по этому адресу, считывает и выполняет приведенную там команду.Ячейка с адресом 26h – регистр управления очередью квантов. Квант запускается из пультовой петли диспетчера, если установлены его статус и флаг.
Анализ состоянийквантов (очередность запуска) будем вести по двум стратегиям:1) приоритетный запуск, начинается анализ с нулевого кванта (самого приоритетного) и заканчивается седьмым.2) круговой запуск, если выполнялся, например, пятый квант, после его выполнения и возврата в диспетчер первым анализироваться будут условия запускашестого, седьмого, нулевого, первого и т.д.Бит 26.0 (нулевой бит ячейки 26h) – бит круговой очереди в диспетчере.
Если онсброшен в 0 – приоритетный запуск, если установлен в 1 – круговой.Для стека микроконтроллера выделим зону памяти в 28 байтов с адреса 64h и до конца резидентной памяти данных. Стек используется микроконтроллером при вызове подпрограмм. Так же программисты используют стек для передачи в подпрограммы параметров – значений. Длина стека в 28 байтов, скорее всего, не будет ограничивать программиста.
При необходимости программист может изменить значение указателя стека.Распределение оперативной памяти микроконтроллера с диспетчером процессов показано в таблице 5.4. Затонированы зоны системных переменных диспетчера. Программист должен использовать их в соответствии с предписанными диспетчером правилами.Остальные программист волен использовать по своему усмотрению.54Таблица 5.4.Распределение резидентной памяти микроконтроллера под диспетчер задачАдресСодержимое ячейки памятиR0 … R7 пользователя00h..07hR0..R7 таймера – задержки 0-го..7-го кванта в тиках08h..0Fh15 свободных байтов пользователя (второй и третий банки регистров)10…1Fh20h Статусы квантов SPR7SPR6SPR5SPR4SPR3SPR2SPR1SPR021h Флаги квантовFPR7 FPR6 FPR5 FPR4 FPR3 FPR2 FPR1 FPR022h Размерность заR_PR7 R_PR6 R_PR5 R_PR4 R_PR3 R_PR2 R_PR1 R_PR0держек квантов23h24h25h26h24h..63h64h..7FhСчетный регистр числа малых тиковРегистр значения старшего байта TH0 счетчика ТС0Регистр значения младшего байта TL0 счетчика ТС0Регистр типа очереди квантовБайты пользователяСтек системы и пользователяЗапускаются синхрокванты из пультовой петли диспетчера, куда и передают управление после своего завершения.
В синхрокванте пользователь должен декларировать необходимость следующего запуска, устанавливая бит статуса запуска SPR0…SPR7 для каждого из восьми синхроквантов. Если квант перезапускать во времени не нужно, пользователь должен очистить соответствующий бит статуса.Задержка на перезапуск синхрокванта задается пользователем как число быстрыхили медленных тиков в пределах от 1 до 255 в переменных ожидания wait0…wait7.В первом банке регистров МК будем хранить задержки квантов.
Задержка устанавливается пользователем и затем уменьшается с каждым тиком таймером. Использование набора регистров первого банка позволит использовать подразумеваемую адресациюи сократить время анализа состояния задержек, т.е. время работы подпрограммы обработки прерываний таймера Т/C0.08h (R0) – задержка времени нулевого кванта (wait0).09h (R1) – задержка времени первого кванта (wait1).0Ah (R2) – задержка времени второго кванта (wait2).0Bh (R3) – задержка времени третьего кванта (wait3).0Ch (R4) – задержка времени четвертого кванта (wait4).0Dh (R5) – задержка времени пятого кванта (wait5).0Eh (R6) – задержка времени кванта (wait6).0Fh (R7) – задержка времени кванта (wait7).Программно-аппаратный таймер диспетчера уменьшает в соответствии с реальнымвременем переменные wait, и, как только они обнулятся, устанавливает соответствующийфлаг запуска квантов FPR0…FPR7.
Запускаться синхрокванты будут из пультовой петлидиспетчера.Разработка текста программыПосле распределения переменных приступим к написанию текста программы диспетчера. Исходный текст программы на языке Ассемблер имеет определенный формат. Каждаякоманда представляет собой строку четырехзвенной конструкции:МЕТКА - ОПЕРАЦИЯ - ОПЕРАНДЫ – КОММЕНТАРИЙ.МЕТКА.
В поле метки размещается имя ячейки памяти, в которой хранится отмеченная команда или операнд. Метка представляет собой буквенно-цифровую комбинацию, начинающуюся с буквы латинского алфавита. Длина метки не должна превышать шести символов. Метка всегда завершается двоеточием.
В качестве символических имен и меток нельзяиспользовать мнемокоды команд псевдокоманды и операторы ассемблера, а также мнемонические обозначения регистров и других внутренних блоков МК.55ОПЕРАЦИЯ. В поле операции записывается мнемоническое обозначение командыМК или псевдокоманды ассемблера, которое является сокращением полного английского наименования выполняемого действия.ОПЕРАНДЫ.
В этом поле определяются операнды, участвующие в операции.Звенья разделены между собой произвольным числом пробелов.Команды языка Ассемблер могут быть без операндов, одно или двухоперандными.Операнды разделяются запятой. Операнд может быть задан непосредственно или в виде егоадреса (прямого или косвенного). Непосредственный операнд представляет собой число илисимволическое имя с обязательным указанием префикса непосредственного операнда (#).Прямой адрес операнда может быть задан мнемоническим обозначением, числом или символическим именем.
Указанием на косвенную адресацию служит префикс @.Используемые в качестве операндов символические адреса и метки должны быть определены, а числа представлены с указанием системы счисления. Для этого применяют суффикс - букву, стоящую после числа: В - для двоичной, Q - восьмеричной, Н - шестнадцатеричной, D – для десятичной систем счисления. Если суффикс не указан, принимается десятичная система счисления.КОММЕНТАРИЙ. Поле комментария используется для текстового или символического пояснения логической организации прикладной программы.
Поле комментария полностьюигнорируется транслятором, поэтому в нем допустимо использовать любые символы. По правилам языка Ассемблер поле комментария начинается после точки с запятой.Транслятор языка Ассемблер преобразует исходную программу в объектные коды.Для более точной трансляции необходимо указать некоторые дополнительные параметры.Всю эту информацию программист вставляет в исходный текст прикладной программы в виде псевдокоманд языка Ассемблер или директив, которые управляют процессом трансляциии не преобразуются в объектные коды программы.Например, псевдокоманда ORG 10Н задает транслятору адрес ячейки памяти 10Н, вкоторой расположена следующая за ней команда прикладной программы.
Ниже приведен начальный фрагмент программы диспетчера. По нулевому адресу установлена команда перехода к стартовой ячейке диспетчера, по адресу 0Вh (адресу вектора прерываний таймера Т/C0)– команда перехода к подпрограмме обработки его прерывания.ORG 0LJMP 2Bh; переход к входу в программу диспетчераORG 0ВhLJMP TIMER; переход к подпрограмме обработки прерывания таймера Т/C0ORG 2Вh; вход в диспетчер и системная настройка МКMOV SP,#64h; установка указателя на стек диспетчераMOV 24h,#0FCh ; установка значения старшего байта для регистра таймераMOV 25h,#82h; установка значения младшего байта для регистра таймераMOV TH0,24h; запись значения в старший байт регистра таймераMOV TL0,25h; запись значения в младший байт регистра таймераMOV TMOD,#11h ; установка 1-го режима Т/C0MOV TCON,#10h ; запуск таймера Т/C0MOV IE,#82h; разрешение прерываний от таймера счетчикаCLR A; очистка аккумулятораMOV 20h,A; очистка ячейки статусов квантовMOV 21h,A; очистка ячейки флагов квантовMOV 26h,A; очистка ячейки управления очередью квантовLCALL 0162h; переход к начальной настройке пользователяДля повышения точности отсчета времени с учетом разброса частоты тактового резонатора МК, значения младшего и старшего байта для регистра таймера следует откорректировать индивидуально.