Выполнение лабораторной работы состоит из двух этапов: самостоятельная работа и работа на лабораторном стенде.
На этапе самостоятельной работы студент в соответствии с полученным заданием должен разработать алгоритм решения поставленной задачи и написать текст исходного модуля программы в текстовом редакторе "Блокнот". Текст программы должен быть снабжён достаточно полными комментариями. Наличие текста с исходным модулем программы является основанием для допуска к выполнению лабораторной работы.
Второй этап выполняется на лабораторном стенде и состоит из следующих шагов:
Защита лабораторной работы происходит в форме свободной беседы по теме лабораторной работы.
Отчёт по лабораторной работе должен содержать следующие разделы:
Отчёт по лабораторной работе должен быть оформлен в соответствии с требованиями стандарта ВУЗа.
Ниже приводится пример оформления отчёта по лабораторной работе.
Работа с портом ввода/вывода общего назначения микроконтроллера 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 r17,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 сек
Выводы: В ходе выполнения лабораторной работы получены навыки программирования порта ввода/вывода общего назначения и разработки программы временной задержки без применения периферийных устройств микроконтроллера.
При установке интегрированной среды разработки AVR Studio в папке Appnotes размещён ряд подпрограмм на языке ассемблера часто встречающихся при решении практических задач. Все исходные тексты приведенных программных фрагментов разработаны специалистами фирмы Atmel corp. и достаточно подробно откомментированы на английском языке. Перечень названий файлов с исходными текстами и их назначение приведены в приложении 4. Для углублённого изучения программирования для микроконтроллеров семейства AVR можно обратиться к руководящим техническим материалам (Application Notes) размещенным на сайте Atmel corp. (www.atmel.com).