Цифровые вычислительные устройства и микропроцессоры приборных комплексов

Федеральное агентство по образованию

Государственное образовательное учреждение

высшего профессионального образования

Уфимский государственный авиационный технический университет



Кафедра авиационного приборостроения











	Лабораторный практикум

	по теме

	«Цифровые вычислительные устройства и микропроцессоры приборных комплексов»









Выполнил студент гр. АП-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 в полученной сумме. При этом требуется коррекция суммы прибавлением к ней шести единиц (числа 01102).

	Покажем эти действия на примерах.

	– Сложить десятичные цифры 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

			В этом случае полученное в результате суммирования число 10012 меньше десяти и коррекция суммы не требуется.

	– Сложить десятичные цифры 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 101102, то = 1 010102 (знаковые разряды выделены полужирным шрифтом). Обратное преобразование из дополнительного кода в прямой код производится по тому же правилу.

	Рассмотрим примеры выполнения операции сложения.

	Пусть =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

			SUBSTR:	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		; запоминание результата

	Умножение двоичных чисел. Пусть производится умножение чисел 11012 и 10112.

		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	произведение

		Как видно из примера, при выполнении умножения формируются частичные произведения (произведения множимого на цифры разрядов множителя), которые суммируются с соответствующими сдвигами друг относительно друга. В цифровых устройствах процессу суммирования частичных произведений придают последовательный характер: формируется одно из частичных произведений, к нему с соответствующим сдвигом прибавляется следующее частичное произведение, к полученной сумме двух частичных произведений прибавляется с соответствующим сдвигом очередное частичное произведение, и так далее, пока не будут просуммированы все частичные произведения. Этот процесс суммирования можно начинать с младшего либо старшего частичного произведения.

		Ниже показаны процессы при умножении с суммированием частичных произведений, начиная со старшего частичного произведения (используется приведенный выше пример умножения чисел 11012 и 10112).

		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	произведение

		Рассмотрим выполнение операции умножения с суммированием частичных произведений, начиная с младшего частичного произведения на примере умножения чисел 11012 и 10112.

		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:

				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, его центральный процессор, организацию памяти программ и данных, средства расширения памяти программ и данных; рассмотрел систему команд по пересылке и обработке данных; ознакомился с приведенными ниже примерами программ на языке ассемблера; произвел ввод, отладку и трансляцию в объектный код этих программ; выполнил программы по шагам с просмотром результатов выполнения в регистрах и оперативной памяти.