Цифровые вычислительные устройства и микропроцессоры приборных комплексов
p align="left">XCH A,R1 ; обменПример 1.9. Умножить аккумулятор на число 2 в степени X, где X - число (не более 8), хранящееся в R2. Умножение на 2 заменяется арифметическим сдвигом влево аккумулятора и расширителя R1: MOV R1,#0 ; сброс R1 CLR С ; сброс флага переноса LOOP: RLC A ; арифметический сдвиг влево объединенного XCH A,R1 ; 16-битного результата в RLC A ; регистровой паре (R1) (A) XCH A,R1 ; DJNZ R2,LOOP ; цикл 3.4.2. Изучение команд манипуляции флажками и передачи управления 1) Изучить организацию стека микроконтроллера ВЕ48; 2) Рассмотреть систему команд манипуляции флажками, условных и безусловных переходов, вызова подпрограмм; 3) Ознакомиться с приведенными ниже примерами программ на языке ассемблера; 4) Произвести ввод, отладку и трансляцию в объектный код этих программ; 5) Выполнить программы по шагам с просмотром результатов выполнения в регистрах и оперативной памяти. Пример 2.1. Определить четность числа единиц в аккумуляторе. После выполнения программы аккумулятор сохранит свое значение, флаг 0 будет установлен, если число единиц в аккумуляторе было нечетно. Флаг F0 входит в состав PSW и в данном примере специфицирован пользователем для выполнения функций флага паритета. CLR F0 ; сброс F0 MOV R7,#8 ; число повторов LOOP: RRC A ; пересылка бита A.0 в перенос JNC NEXT ; пропустить, если бит равен 0 CPL F0 ; подсчет паритета NEXT: DJNZ R7,LOOP ; повторить 8 раз Пример 2.2. Передать управление по метке LL, если переключатель банка регистров (бит PSW.4) установлен: JBSET: MOV A,PSW ; передача PSW в аккумулятор JB4 LL ; переход, если A.4 = 1 LL: … ; Пример 2.3. Осуществить переход из нулевого банка памяти программ к программе с именем ROUT, расположенной в первом банке памяти программ: SEL MB1 ; установка флага MB JMP ROUT ; переход к программе ROUT Пример 2.4. Множественное ветвление программы. Допустим, что результатом работы некоторой программы является число X (в пределах от 0 до 15). Необходимо организовать передачу управления 16 различным программам с именами ROUT0-ROUTF в зависимости от вычисленного значения X: ORG 0 ; задание начального адреса программы ANL A,0F ; сброс старшей тетрады A ; во избежание ошибки перехода JMPP @A ; обращение к таблице векторов переходов ; таблица векторов переходов DB ROUT0 ; начальный адрес программы ROUT0 DB ROUT1 ; начальный адрес программы ROUT1 … … … DB ROUTF ; начальный адрес программы ROUTF Преобразование чисел из одной системы счисления в другую. Перевод шестнадцатеричных чисел в двоичную систему счисления достигается представлением цифр шестнадцатеричного числа четырехразрядными двоичными числами. Например, A7B = 1010 0111 1011 A 7 B Перевод в десятичную систему счисления. Так как перевести числа из двоичной системы в шестнадцатеричную и обратно нетрудно, то для простоты выкладок рассмотрим перевод чисел из шестнадцатеричной системы и обратно. В качестве примера перевода числа из шестнадцатеричной системы в десятичную систему выберем число 9A5F: 9A5F16 = (9•163 + 10•162 + 5•161 + 15•160)=(((9•16+10)•16+5)•16+15) = 3951910 9 A 5 F Здесь путем группировки членов вычисление полиномов представлено в форме так называемой схемы Горнера, обеспечивающей минимальное число выполняемых операций умножения. Покажем действия по переводу чисел из десятичной системы счисления в шестнадцатеричную на примере преобразования десятичного числа 3951910 в шестнадцатеричную систему счисления 39519 |16 39504 2469 |16 15 2464 154 |16 F 5 144 9 10 A Отсюда 3951910 = 9A5F16. Таким образом, последовательно деля на 16 целую часть десятичного числа и образующиеся частные, получаем в последнем частном и остатках цифры всех разрядов шестнадцатеричного представления числа. Пример 2.5. Преобразование кодов из одной системы счисления в другую. Преобразование кода из одной позиционной системы счисления в другую осуществляется делением исходного числа на основание новой системы счисления. При этом деление должно выполняться по правилам исходной системы счисления. Например, для преобразования двоичного числа в двоично-десятичное исходное двоичное число должно быть поделено на 10 (10102). Деление должно осуществляться по правилам двоичной арифметики. Пусть требуется выполнить преобразование 8-битного двоичного числа в двоично-десятичное. Исходный двоичный код хранится в аккумуляторе. Результат преобразования состоит из 12 бит: младшие 4 бита - единицы, представляют собой остаток от деления исходного числа на 10; следующие 4 бита - десятки, представляют собой остаток от деления на 10 полученного частного; старшие 4 бита - сотни, являются частным от второго деления: BBD: CALL DIV10 ; деление исходного кода на 10 MOV R7,A ; сохранение остатка в R7 MOV A,R1 ; загрузка в аккумулятор частного CALL DIV10 ; деление частного на 10 SWAP A ; передача остатка в старшую тетраду A ORL A,R7 ; передача R7 в младшую тетраду A JMP EXIT ; выход из процедуры ; подпрограмма деления на 10 ; исходный двоичный код в аккумуляторе ; результат: в R1 - частное, в аккумуляторе - остаток DIV10: MOV R1,#0 ; сброс R1 SUB10: ADD A,#(NOT(10)+1) ; вычитание 10 из делимого INC R1 ; инкремент частного JC SUB10 ; цикл, если остаток >= 0 DEC R1 ; восстановление частного ADD A,#10 ; восстановление остатка RET ; возврат EXIT: … ; В результате выполнения процедуры в младшей тетраде R1 хранятся сотни, в аккумуляторе - десятки и единицы двоично-десятичного эквивалента исходного двоичного числа. 3.4.3. Изучение аппаратных и программных средств ввода/вывода информации микроконтроллера ВЕ48 1) Изучить организацию каналов ввода/вывода информации микроконтроллера ВЕ48, интерфейс расширения ввода/вывода; 2) Рассмотреть команды, которые обслуживают пространство ввода/вывода; 3) Ознакомиться с приведенными ниже примерами программ на языке ассемблера; 4) Произвести ввод, отладку и трансляцию в объектный код этих программ; 5) Выполнить программы по шагам с просмотром результатов выполнения в регистрах и оперативной памяти. Пример 3.1. Ввести байт из порта 1 и передать его в порт 2: TRAN: MOV A,#0FF ; настройка порта 1 на ввод OUTL P1,A ; IN A,P1 ; ввод байта из порта 1 OUTL P2,A ; вывод байта в порт 2 Пример 3.2. Ввести данные из порта P7: INPUT: MOVD A,P7 ; пересылка четырех битов из порта 7 ; в младшую тетраду аккумулятора Пример 3.3. Маскирование при вводе. Ввести в регистр R7 информацию из линий 0, 1, 3, 4 и 7 порта 1: IN A,P1 ; ввод байта из порта 1 ANL A,#10011011B ; маскирование MOV R7,A ; передача Пример 3.4. Ввести в аккумулятор данные из порта 2 и выделить требуемые биты по маске, находящейся в R0: IN A,P2 ; ввод байта из порта 2 ANL A,R0 ; маскирование Пример 3.5. Выдать содержимое аккумулятора в последовательном коде через нулевую линию порта 1, оставляя без изменения остальные биты порта. Передачу вести, начиная с младшего бита: MOV R1,#8 ; счетчик бит LOOP: JB0 ONE ; переход, если бит A.0 = 1 ANL P1,#(NOT 1) ; сброс P1.0 JMP NEXT ; ONE: ORL P1,#1 ; установка P1.0 JMP NEXT ; избыточная команда для выравнивания ; времени передачи 0 и 1 NEXT: RR A ; сдвиг аккумулятора вправо (подготовка к DJNZ R1,LOOP ; передаче очередного бита) Пример 3.6. Настроить биты 0-3 порта 1 на ввод: ORL P1,#0F ; установка битов P1.0… P1.3 Пример 3.7. Очистить биты 4-7 порта 2: ANL P2,#0F ; сброс битов P2.4… P2.7 Пример 3.8. Организовать ожидание появления нулевого уровня на входе T0: WAIT: JT0 WAIT ; переход на WAIT, если на входе T0 единица Пример 3.9. Организовать ожидание появление единичного уровня на входе в предположении, что внешние прерывания запрещены: DIS I ; запрет прерываний по INT WAIT: JNI WAIT ; переход на WAIT, если на входе INT нуль 3.4.4. Изучение средств реального времени микроконтроллера ВЕ48 1) Изучить организацию таймера/счетчика и системы прерываний микроконтроллера ВЕ48; 2) Рассмотреть команды управления средствами реального времени; 3) Ознакомиться с приведенными ниже примерами программ на языке ассемблера; 4) Произвести ввод, отладку и трансляцию в объектный код этих программ; 5) Выполнить программы по шагам с просмотром результатов выполнения в регистрах и оперативной памяти. Пример 4.1. Дождаться поступления на вход T1 100 импульсов и перейти по метке PULSE: MOV A,#156D ; A = (256-100) MOV T,A ; предустановка счетчика STRT CNT ; запуск счетчика WAIT: JTF PULSE ; переход, если прошло 100 импульсов JMP WAIT ; PULSE: … Пример 4.2. Запретить прерывания от таймера, но разрешить прерывание после восьми сигналов переполнения таймера. При переходе к процедуре обработки прерывания остановить таймер. Сигналы переполнения подсчитывать в регистре 5: START: DIS TCNTI ; запрет прерываний от таймера CLR A ; сброс аккумулятора MOV T,A ; сброс таймера MOV R5,A ; сброс регистра R5 STRT T ; запуск таймера M1: JTF COUNT ; если TF=1, то переход к COUNT и сброс TF JMP M1 ; цикл COUNT: INC R5 ; инкремент регистра R5 MOV A,R5 ; пересылка содержимого R5 в аккумулятор JB3 INT ; переход к подпрограмме обслуживания ; прерывания INT, если бит A.3 равен 1 JMP M1 ; переход, если бит A.3 не равен 1 … ; INT: STOP TCNT ; останов таймера JMP 07 ; переход к ячейке 7 (вектор прерывания ; от счетчика событий) Пример 4.3. Программное формирование временной задержки. Предположим, что в управляющей программе необходимо реализовать временную задержку 100 мкс. Подпрограмма формирования временной задержки будет иметь вид: DELAY: MOV R2,#X ; (R2) < X COUNT: DJNZ R2,COUNT ; декремент R2 и цикл, если не нуль RET ; возврат Для получения требуемой временной задержки необходимо определить число X, загружаемое в рабочий регистр. Определение числа X выполняется на основе расчета времени выполнения команд, образующих данную подпрограмму. При этом необходимо учитывать, что команды MOV и RET выполняются однократно, а число повторений команды DJNZ равно числу X. Кроме того, обращение к подпрограмме временной задержки осуществляется по команде CALL DELAY, время исполнения которой также необходимо учитывать при подсчете временной задержки. В описании команд микроконтроллера указывается, за сколько машинных циклов (МЦ) исполняется каждая команда. На основании этих данных определяется суммарное число машинных циклов в подпрограмме: CALL - 2 МЦ, MOV - 2 МЦ, DJNZ - 2 МЦ, RET - 2 МЦ. При тактовой частоте 6 МГц каждый машинных цикл выполняется за 2,5 мкс. Таким образом, подпрограмма выполняется за время 5+5+5X+5=15+5X мкс. Для реализации временной задержки 100 мкс число X = (100-15)/5 = 17. Пример 4.4. Временная задержка большой длительности. В качестве примера рассмотрим подпрограмму, реализующую временную задержку 100 мс: DELAY: MOV R1,#84 ; загрузка X LOOPEX: MOV R2,#236 ; загрузка Y LOOPIN: DJNZ R2,LOOPIN ; декремент R2 и внутренний цикл, ; если R2 не равно нулю DJNZ R1,LOOPEX ; декремент R1 и внешний цикл, ; если R1 не равно нулю MOV R3,#4 ; точная подстройка временной задержки LOOPAD: DJNZ R3,LOOPAD ; RET ; Числа X и Y выбираются из соотношения T = 5+5+X(5+5Y+5)+5, где T - реализуемый временной интервал в микросекундах. Максимальный временной интервал, реализуемый таким образом, при X=Y=255 составляет 327,69 мс, т.е. приблизительно 0,3 с. В примере два вложенных цикла реализуют временную задержку длительностью 15+84(10+5*236)=99975 мкс, а дополнительный цикл LOOPAD реализует задержку 25 мкс и тем самым обеспечивает точную подстройку временного интервала. Временная задержка длительностью 1 с. Секунда является очень большим интервалом времени по сравнению с частотой тактирования микроконтроллера. Такие задержки сложно реализовать методом вложенных циклов, поэтому их обычно набирают из точно подстроенных задержек меньшей длительности. Например, задержку в 1 с можно реализовать десятикратным вызовом подпрограммы, реализующей задержку 100 мс: ONESEC: MOV R3,#10 ; загрузка в R3 числа вызовов ; подпрограммы DELAY LOOP: CALL DELAY ; задержка 100 мс DJNZ R3,LOOP ; декремент R3 и цикл, если R3 не равно 0 Погрешность программы составляет 55 мкс. Пример 4.5. Формирование временной задержки на основе таймеров. Недостатком программной реализации временной задержки является нерациональное использование ресурсов микроконтроллера: во время формирования задержки микроконтроллер практически простаивает, так как не может решать задачи управления объектом. В то же время аппаратурные средства микроконтроллера позволяют реализовать временные задержки на фоне основной программы работы. При использовании таймера в МК48 можно получить временные задержки длительностью от 80 мкс до 20 мс. Например, для реализации временной задержки 240 мкс необходимо выполнить следующие действия: MOV A,#NOT(240/80-1) ; загрузка таймера MOV T,A ; STRT T ; запуск таймера EN TCNTI ; разрешение прерывания Появление сигнала прерывания от таймера соответствует истечению временного интервала 240 мкс. Погрешность будет составлять 7,5 мкс (время выполнения команды передачи управления по вектору прерывания и команды STOP TCNT). Вывод: изучил структурную схему однокристального микроконтроллера ВЕ48, его центральный процессор, организацию памяти программ и данных, средства расширения памяти программ и данных; рассмотрел систему команд по пересылке и обработке данных; ознакомился с приведенными ниже примерами программ на языке ассемблера; произвел ввод, отладку и трансляцию в объектный код этих программ; выполнил программы по шагам с просмотром результатов выполнения в регистрах и оперативной памяти.
Страницы: 1, 2
|