Цифровые вычислительные устройства и микропроцессоры приборных комплексов
Федеральное агентство по образованию
Государственное образовательное учреждение
высшего профессионального образования
Уфимский государственный авиационный технический университет
Кафедра авиационного приборостроения
Лабораторный практикум
по теме
«Цифровые вычислительные устройства и микропроцессоры приборных комплексов»
Выполнил студент гр. АП-540
Табулдин Р.А.
Проверил преподаватель
Неретина В.В.
Кумертау 2010
ЛАБОРАТОРНАЯ РАБОТА № 1
ПРОЕКТИРОВАНИЕ ЦИФРОВЫХ УСТРОЙСТВ КОМБИНАЦИОННОГО ТИПА
1.1 Цель работы
Целью работы является ознакомление студентов с математическим аппаратом, описывающим действия цифровых устройств, развитие навыков составления логических уравнений, их минимизации, а также реализации на основе полученных уравнений комбинационных устройств с учетом имеющегося набора логических элементов.
Компьютерные модели логических схем устройства:
1)
2)
3)
4)
5)
6)
Вывод: ознакомился с математическим аппаратом, описывающим действия цифровых устройств, а также реализовал на основе полученных уравнений комбинационных устройств с учетом имеющегося набора логических элементов.
ЛАБОРАТОРНАЯ РАБОТА № 2
ПРОЕКТИРОВАНИЕ ЦИФРОВЫХ УСТРОЙСТВ ПОСЛЕДОВАТЕЛЬНОСТНОГО ТИПА
2.1 Цель работы
Целью работы является ознакомления студентов с принципами функционирования последовательностных устройств, а также изучение методов анализа и синтеза синхронных счетчиков с различными коэффициентами счета.
Компьютерные модели логических схем устройства:
1)
3)
Вывод: ознакомился с принципами функционирования последовательностных устройств и изучил метод анализа и синтеза синхронных счетчиков.
ЛАБОРАТОРНАЯ РАБОТА № 3–6
ИЗУЧЕНИЕ СТРУКТУРНОЙ ОРГАНИЗАЦИИ И ПРИЕМОВ ПРОГРАММИРОВАНИЯ ОДНОКРИСТАЛЬНОГО
МИКРОКОНТРОЛЛЕРА К1816ВЕ48
3.1 Цель работы
Целью работы является изучение структурной организации, физического интерфейса, системы команд и средств расширения внутренних ресурсов однокристальных микроконтроллеров семейства МК48, а также освоение приемов программирования на языке ассемблера задач ввода и обработки данных, передачи управления, реализации средств реального времени.
Пример 1.1. Записать в РПД в ячейки с адресами 31Н и 32Н число 1C3FH:
LOAD: MOV R0,#31 ; загрузка в R0 указателя РПД
MOV @R0,#1C ; запись в РПД числа 1C
INC R0 ; продвижение указателя адреса РПД
MOV @R0,#3F ; запись в РПД числа 3F
Пример 1.2. Передать содержимое регистров банка 0 в ВПД, начиная с адреса 30H:
SEL RB1 ; выбор банка регистров 1
MOV R0,#30h ; определение начального адреса ВПД
MOV R1,#0 ; определение начального адреса банка
; регистров
MOV R2,#8 ; счетчик регистров (циклов) = 8
LOOP: MOV A,@R1 ; пересылка байта из регистра в ВПД
MOVX @R0,A ; через аккумулятор
INC R0 ; продвижение указателей
INC R1
DJNZ R2,LOOP ; продолжить, если переданы не все регистры
Пример 1.3. Вычислить произведение двух 4-битных чисел, расположенных в младших тетрадах регистров R0 и R1. Для вычисления используется таблица произведений для всех комбинаций сомножителей (всего 256). Произведение двух тетрад имеет формат 1 байт. Таким образом, необходимая таблица произведений занимает одну страницу памяти. Данную таблицу удобно разместить на третьей странице РПП:
; вычисление Z = X*Y
; R0 = 0000XXXX
; R1 = 0000YYYY
; X и Y принимают значения 0 и 1
ORG 0 ; директива ассемблера, задающая
; начальный адрес программы
MOV A,R0 ; пересылка множимого в аккумулятор
SWAP A ; обмен тетрад аккумулятора
ORL A,R1 ; формирование в аккумуляторе
; адреса произведения
MOVP3 A,@A ; загрузка в аккумулятор произведения
ORG 0300 ; директива ассемблера, задающая начальный
; адрес таблицы на третьей странице РПП директивы ассемблера, формирующие таблицу произведений
DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ; Z=0*Y
DB 1*0,1*1,1*2,…,1*0F ; Z=0*Y
…
…
…
DB 0F*0, 0F*1, 0F*2,…, 0F*0F ; Z=0*Y
Сложение положительных двоичных чисел. Выполнение этой операции покажем на примере:
Переносы 1 1 1
Первое слагаемое 0 0 1 1 0 1
Второе слагаемое 0 0 1 1 0 1
Сумма 0 1 1 0 1 0
Пример 1.4. Сложить содержимое регистра R7 и ячейки РПД с адресом 30Н:
MOV R0,#30h ; загрузка в R0 адреса РПД
MOV A,R7 ; загрузка операнда в аккумулятор
ADD A,@R0 ; сложение
Суммирование десятичных чисел. Способ суммирования десятичных чисел зависит от того, какой двоичный код выбран для представления десятичных цифр. Ниже рассматривается операция суммирования при использовании кода 8421.
Двоичные представления десятичных цифр суммируются по обычным правилам сложения двоичных чисел. Если полученная сумма содержит десять или более единиц, то формируется единица переноса, передаваемая в следующий десятичный разряд, а из суммы вычитаются десять единиц. Полученный результат есть цифра соответствующего разряда суммы. Наличие в полученной сумме десяти или более единиц выявляется по следующим признакам: появление переноса из разряда 8, возникающего при суммировании цифр; наличие единиц одновременно в разрядах 8 и 4 либо 8 и 2 в полученной сумме. При этом требуется коррекция суммы прибавлением к ней шести единиц (числа 0110>2>).
Покажем эти действия на примерах.
– Сложить десятичные цифры 6 и 2 и перенос 1, поступающий из предыдущего десятичного разряда.
Десятичная система Код 8421
Переносы 1 1 1 1
Первая цифра 6 0 1 1 0
Вторая цифра 2 0 0 1 0
Сумма 9 1 0 0 1
Коррекция —
Результат 1 0 0 1
В этом случае полученное в результате суммирования число 1001>2> меньше десяти и коррекция суммы не требуется.
– Сложить десятичные цифры 8 и 9.
Десятичная система Код 8421
Переносы 1 0 1 0
Первая цифра 8 1 0 0 0
Вторая цифра 9 1 0 0 1
Сумма 7 0 0 0 1
Коррекция 0 1 1 0
Результат 0 1 1 1
– Сложить десятичные цифры 6 и 7.
Десятичная система Код 8421
Переносы 1 0 1 1 1 0
Первая цифра 6 0 1 1 0
Вторая цифра 7 0 1 1 1
Сумма 3 1 1 0 1
Коррекция 0 1 1 0
Результат 0 0 1 1
Пример 1.5. Сложить десятичные двоично-кодированные числа (BCD-числа), расположенные в A и R7:
ADD A,R7 ; двоичное сложение
DA A ; коррекция результата
Алгебраическое сложение с использованием дополнительного кода. Для сложения чисел со знаком необходимо отрицательное число перевести в дополнительный код. В двоичной системе счисления дополнительный код отрицательного числа формируется по следующему правилу: инвертируются (путем замены 0 на 1 и 1 на 0) цифры всех разрядов, кроме знакового, и в младший разряд прибавляется единица. Например, если =1 10110>2>, то = 1 01010>2> (знаковые разряды выделены полужирным шрифтом). Обратное преобразование из дополнительного кода в прямой код производится по тому же правилу.
Рассмотрим примеры выполнения операции сложения.
Пусть =0 10110, =1 01101.
Переносы 1 1 1 1
Первое слагаемое 0 1 0 1 1 0
Второе слагаемое 1 1 0 0 1 1
Сумма 0 0 1 0 0 1
Как указывалось выше, перенос, возникающий из знакового разряда, отбрасывается.
Изменим на обратный знаки слагаемых (по отношению к предыдущему примеру): =1 10110, =0 01101. Очевидно, ожидаемый ответ = 1 01001.
Переносы 1
Первое слагаемое 1 0 1 0 1 0
Второе слагаемое 0 0 1 1 0 1
Сумма 1 1 0 1 1 1
Сумма 1 0 1 0 0 1
Таким образом, если результат сложения есть отрицательное число, то оно оказывается представленным в дополнительном коде.
Для вычитания 8-разрядных чисел без знака может быть использовано выражение , где – поразрядная инверсия . Другой способ вычитания может быть основан на следующем выражении: .
Пример 1.6. Вычитание байтов. Операция вычитания может быть выполнена двумя способами: переводом вычитаемого как отрицательного числа в дополнительный код с последующим сложением; переводом уменьшаемого в обратный код с последующей инверсией суммы.
Пусть требуется вычесть из A содержимое регистра R6. Вычитание выполнить в соответствии с выражением . Установка флага C после выполнения сложения будет свидетельствовать об отрицательном переполнении.
CPL A ; инверсия аккумулятора
ADD A,R6 ; сложение
CPL A ; инверсия суммы (получение разности)
Пример 1.7. Получить разность 2-байтных чисел без знака. Операнды располагаются в РПД. Адрес уменьшаемого хранится в R1, а вычитаемого – в R0. Результат поместить на место уменьшаемого:
; вычисление Z = X–Y
; X, Y – РПД
; R0 – адрес Y
; R1 – адрес X
; результат на место X
sub>STR: MOV A,@R0 ; загрузка младшего байта Y
CPL A ; получение дополнительного кода Y
INC A ;
ADD A,@R1 ; вычитание младших байт
MOV @R0,A ; запоминание младшего байта разности
INC R0 ; переход к старшим байтам X и Y
INC R1 ;
MOV A,@R0 ; загрузка старшего байта Y
CPL A ; обратный код Y
ADDC A,@R1 ; вычитание старших байт
MOV @R0,A ; запоминание результата
Умножение двоичных чисел. Пусть производится умножение чисел 1101>2> и 1011>2>.
1 1 0 1 множимое
1 0 1 1 множитель
1 1 0 1 1-е частичное произведение
1 1 0 1 2-е частичное произведение
0 0 0 0 3-е частичное произведение
1 1 0 1 4-е частичное произведение
1 0 0 0 1 1 1 1 произведение
Как видно из примера, при выполнении умножения формируются частичные произведения (произведения множимого на цифры разрядов множителя), которые суммируются с соответствующими сдвигами друг относительно друга. В цифровых устройствах процессу суммирования частичных произведений придают последовательный характер: формируется одно из частичных произведений, к нему с соответствующим сдвигом прибавляется следующее частичное произведение, к полученной сумме двух частичных произведений прибавляется с соответствующим сдвигом очередное частичное произведение, и так далее, пока не будут просуммированы все частичные произведения. Этот процесс суммирования можно начинать с младшего либо старшего частичного произведения.
Ниже показаны процессы при умножении с суммированием частичных произведений, начиная со старшего частичного произведения (используется приведенный выше пример умножения чисел 1101>2> и 1011>2>).
1 1 0 1 4-е частичное произведение
1 1 0 1 0 сдвиг на один разряд влево
0 0 0 0 3-е частичное произведение
1 1 0 1 0 сумма 4- и 3-го частичных произведений
1 1 0 1 0 0 сдвиг на один разряд влево
1 1 0 1 2-е частичное произведение
1 0 0 0 0 0 1 сумма 4-, 3- и 2-го частичных произведений
1 0 0 0 0 0 1 0 сдвиг на один разряд влево
1 1 0 1 1-е частичное произведение
1 0 0 0 1 1 1 1 произведение
Рассмотрим выполнение операции умножения с суммированием частичных произведений, начиная с младшего частичного произведения на примере умножения чисел 1101>2> и 1011>2>.
1 1 0 1 1-е частичное произведение
0 1 1 0 1 сдвиг на один разряд вправо
1 1 0 1 2-е частичное произведение
1 0 0 1 1 1 сумма 1- и 2-го частичных произведений
1 0 0 1 1 1 сдвиг на один разряд вправо
0 0 0 0 3-е частичное произведение
1 0 0 1 1 1 сумма 1-, 2- и 3-го частичных произведений
1 0 0 1 1 1 сдвиг на один разряд вправо
1 1 0 1 4-е частичное произведение
1 0 0 0 1 1 1 1 сумма частичных произведений
1 0 0 0 1 1 1 1 сдвиг вправо, произведение
При умножении целых чисел для фиксации произведения в разрядной сетке должно предусматриваться число разрядов, равное сумме числа разрядов множимого и множителя.
Пример 1.8. Умножить однобайтные целые числа без знака. В регистре R1 размещен множитель, в регистре R2 – множимое. Двухбайтный результат умножения будет размещен в аккумуляторе (старший байт) и в R1 (младший байт) вместо множителя. В регистр R3, выполняющий функции счетчика программных циклов, загружается число 8 (число бит множителя). Умножение выполняется младшими битами вперед со сдвигом вправо частичного произведения. Последовательность действий при этом методе умножения следующая:
– Содержимое аккумулятора и регистра-расширителя R1 сдвигается вправо на один бит так, что младший бит множителя, выдвигаемый из регистра R1, помещается в триггер флага C.
– Если C = 1, то множимое добавляется к содержимому аккумулятора, в противном случае никаких операций не производится.
– Декрементируется счетчик циклов R3, и если его содержимое не равно нулю, то все действия повторяются.
– Перед выходом из подпрограммы формируется окончательный результат сдвигом частичного результата на один бит вправо:
MPL: MOV R3,#8 ; загрузка счетчика циклов
CLR A ; очистка аккумулятора
CLR C ; очистка признака переноса
SHIFT: RRC A ; сдвиг аккумулятора вправо
XCH A,R1 ; обмен аккумулятора и R1
RRC A ; сдвиг множителя с занесением
; выдвигаемого бита в C
XCH A,R1 ; обмен аккумулятора и R1
JNC RESULT ; если C = 1, то суммирование
ADD A,R2 ; прибавление множимого
RESULT: DJNZ R3,SHIFT ; декремент счетчика и проверка
; окончания операции (R3 = 0)
RRC A ; сдвиг аккумулятора
XCH A,R1 ; обмен
RRC A ; сдвиг содержимого R1
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:
9A5F>16> = (9∙163 + 10∙162 + 5∙161 + 15∙160)=(((9∙16+10)∙16+5)∙16+15) = 39519>10>
9 A 5 F
Здесь путем группировки членов вычисление полиномов представлено в форме так называемой схемы Горнера, обеспечивающей минимальное число выполняемых операций умножения.
Покажем действия по переводу чисел из десятичной системы счисления в шестнадцатеричную на примере преобразования десятичного числа 39519>10> в шестнадцатеричную систему счисления
39519 |16
39504 2469 |16
15 2464 154 |16
F 5 144 9
10
A
Отсюда 39519>10> = 9A5F>16>. Таким образом, последовательно деля на 16 целую часть десятичного числа и образующиеся частные, получаем в последнем частном и остатках цифры всех разрядов шестнадцатеричного представления числа.
Пример 2.5. Преобразование кодов из одной системы счисления в другую. Преобразование кода из одной позиционной системы счисления в другую осуществляется делением исходного числа на основание новой системы счисления. При этом деление должно выполняться по правилам исходной системы счисления. Например, для преобразования двоичного числа в двоично-десятичное исходное двоичное число должно быть поделено на 10 (1010>2>). Деление должно осуществляться по правилам двоичной арифметики.
Пусть требуется выполнить преобразование 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
sub>10: ADD A,#(NOT(10)+1) ; вычитание 10 из делимого
INC R1 ; инкремент частного
JC sub>10 ; цикл, если остаток >= 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, его центральный процессор, организацию памяти программ и данных, средства расширения памяти программ и данных; рассмотрел систему команд по пересылке и обработке данных; ознакомился с приведенными ниже примерами программ на языке ассемблера; произвел ввод, отладку и трансляцию в объектный код этих программ; выполнил программы по шагам с просмотром результатов выполнения в регистрах и оперативной памяти.