Лабораторная работа 1

Работа с портом ввода/вывода общего назначения

микроконтроллера AT90S2313.

Цель работы: Разработать программу вывода информации на светодиодный индикатор через порт РВ с использованием программной временной задержки.

Задание: Вид выводимой информации – «Бегущая единица», начиная с РВ0; временная задержка изменения состояний – 0,5 С.

Чертёж структурной схемы лабораторного макета приведен на рисунке Л1.1

Рисунок Л1.1 Структурная схема лабораторного макета.

Чертёж блок схемы алгоритма решения задачи приведен на рисунке Л1.2.

Рисунок Л1.2 Блок схема алгоритма программы

Примечание: переменная In1 содержит текущее значение выводимого в порт В значения.

Ниже приведен исходный текст программы proba.asm решающий поставленную задачу

.include "2313def.inc"; определение типа устройства для которого разработана

;программа

.def In1 r18; определить для хранения переменной In1 регистр r18

; определение таблицы векторов прерываний

rjmp MAIN; сброс по reset, переход на начало программы; метка MAIN

reti; не определено; возврат

reti;

reti;

reti;

reti;

reti;

reti;

reti;

reti;

reti;

reti;

reti;

;-----------------------------------------------------

;начало программы

MAIN:;

ldi r16,low(RAMEND);установка указателя стека

out spl,r16

ldi r16,255; настройка порта В на вывод информации

out ddrb,r16;

;------------------------------------------------------

;основной цикл

tostart:

ldi In1,1; In1 = 1

oneop:;

ldi r16,low(50000);записать в регистры r16, r17 значение множителя временной

ldi r17,high(50000);задержки с учётом, что шаг задержки 100 мкС для передачи

; в п/п временной задержки

rcall wait; вызов подпрограммы временной задержки

com In1; инвертировать значение In1 (необходимость этого продиктована

особенностями работы блока индикации)

out portb, In1; вывести In1 в порт В

com In1; инвертировать значение

lsl In1; логический сдвиг влево на 1 разряд значения In1

breq tostart; если In1 = 0, переход на метку tostart

rjmp oneop; в противном случае на метку oneop

;--------------------------------------------------------

;подпрограмма временной задержки

; содержимое регистров r16 (младшая часть) и r17 (старшая часть) содержат множитель;временной задержки

wait:

cpi r16,0; сравнить содержимое r16 с 0

breq wait1; переход на метку wait1 если 0

rcall wait100us; вызов подпрограммы «задержка на 100 мкС»

dec r16; вычесть единицу из содержимого регистра r16

rjmp wait; перейти в начало п/п

wait1:;

cpi r 17,0; сравнить содержимое r16 с 0

breq waitend; переход на метку waitend если 0

dec r16; вычесть единицу из содержимого регистра r16

dec r17; вычесть единицу из содержимого регистра r17

rjmp wait; перейти в начало п/п

waitend:;

ret; возврат в основную программу

;---------------------------------------------

; подпрограмма формирования временной задержки длительностью 100 мкС

.equ CLK=4000000; присвоить переменной CLK значение тактовой частоты 4МГц

wait100us:;

push r16; поместить r16 в стек

ldi r16,((CLK/10000-16)/4); загрузить в регистр r16 коэффициент пересчёта

;тактовой частоты микроконтроллера в частоту 10 кГц

;(период 100 мкС) с учётом времени выполнения цикла;wait100us1

wait100us1:;

nop; «нет операции» задержка счета на 1 цикл тактовой частоты

dec r16;; вычесть единицу из содержимого регистра r16

brne wait100us1; перейти на wait100us1если содержимое r16 не равно 0

pop r16; загрузить из стека регистр r16

ret; выход из подпрограммы»

После компиляции и загрузки программы в Flash память микроконтроллера на линейке светодиодных индикаторов наблюдается заданная информационная последовательность с частотой смены состояний порядка 0,5 С

Выводы: В ходе выполнения лабораторной работы получены навыки программирования порта ввода/вывода общего назначения и разработки программы временной задержки без применения периферийных устройств микроконтроллера.


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: