- •Вступление
- •1 Программная среда avr Studio
- •1.1 Общие сведения
- •1.1.1 Отладка программы
- •1.1.2 Программный отладчик
- •1.1.3 Аппаратный отладчик
- •1.1.4 Полнофункциональные программные имитаторы электронных устройств
- •1.1.5 Внутренний отладчик микроконтроллеров avr
- •1.1.6 Программная среда «avr Studio»
- •1.2 Описание интерфейса. Главная панель программы «avr Studio»
- •1.3 Создание проекта
- •1.4 Трансляция программы
- •1.4.1 Форматы файлов
- •1.4.2 Формат нех-файла
- •1.4.3 Процедура трансляции
- •1.5 Отладка разрабатываемой программы
- •1.5.1 Ошибки алгоритма и его реализации
- •1.5.2 Этапы процесса отладки
- •1.5.3 Применение точек останова
- •1.5.4 Просмотр и изменение содержимого введенных переменных
- •1.6 Исправление ошибок
- •2. Лабораторные работы
- •2.1 Лабораторная работа №1
- •1 Принципиальная электрическая схема
- •2 Алгоритм
- •3 Программа на Ассемблере
- •4 Директивы
- •5 Операторы
- •6 Описание программы (листинг 1.1)
- •7 Задания для самостоятельной работы
- •8 Задания к лабораторной работе
- •9 Содержание отчета
- •2.2 Лабораторная работа №2
- •1 Принципиальная электрическая схема
- •2 Алгоритм
- •Программа на Ассемблере
- •3 Описание программы (листинг 2.1)
- •4 Задания для самостоятельной работы
- •1 Постановка задачи
- •2 Схема
- •3 Алгоритм
- •4 Программа на Ассемблере
- •5 Описание программы (листинг 3.1)
- •6 Задания для самостоятельной работы
- •7 Задания к лабораторной работе
- •8 Содержание отчета
- •9 Контрольные вопросы
- •3. Сводная таблица команд Ассемблера микроконтроллеров avr
- •Проектирование микропроцессорных систем
- •65044, Украина, Одесса, пр. Шевченко, 1
- •65044, Украина, г.Одесса, пр. Шевченко, 1, корп. 5
Программа на Ассемблере
Текст возможного варианта программы для лаб.раб.№2 приведен в листинге 2.1
Листинг 2.1
;##############################################
;## Лабораторная работа 2 ##
;## Программа переключения светодиода ##
;##############################################
;------------------------- Псевдокоманды управления
1 .include "tn2313def.inc" ; Присоединение файла описаний
2 .list ; Включение листинга
3 .def temp = r16 ; Определение главного рабочего регистра
;------------------------- Начало программного кода
4 .cseg ; Выбор сегмента программного кода
5 .org 0 ; Установка текущего адреса на ноль
;-------------------------- Инициализация стека
6 ldi temp, RAMEND ; Выбор адреса вершины стека
7 out SPL, temp ; Запись его в регистр стека
;-------------------------- Инициализация портов ВВ
8 ldi temp, 0 ; Записываем 0 в регистр temp
9 out DDRD, temp ;Записываем этот 0 в DDRD (порт PD на ввод)
10 ldi temp, 0xFF ;Записываем число $FF в регистр temp
11 out DDRB, temp ; Записываем temp в DDRB (порт PB на вывод)
12 out PORTB, temp ; Записываем temp в PORTB (потушить светодиод)
13 out PORTD, temp ; Записываем temp в PORTD (включ. внутр. резист.)
;--------------------------- Инициализация компаратора
14 ldi temp, 0x80 ; Выключение компаратора
15 out ACSR, temp
;----------------------------Начало основного цикла
16 main:in temp, PIND ; Читаем содержимое порта PD
17 sbrc temp, 0 ; Проверка младшего разряда
18 rjmp main ; Если не ноль, переходим в начало
;-----------------------------Переключение светодиода
19 in temp, PINB ;Читаем содержимое порта PB
20 sbrc temp, 0 ;Проверка младшего разряда
21 rjmp m1
22 sbi PORTB, 0 ;Установка выхода PB.0 в единицу
23 rjmp m2
24 m1: cbi PORTB, 0 ;Сброс PB.0 в ноль
;-----------------------------Цикл ожидания отпускания кнопки
25 m2: in temp, PIND ;Читаем содержимое порта PD
26 sbrs temp, 0 ;Проверка младшего разряда
27 rjmp m2 ;Продолжить ожидание отпускания кнопки
28 rjmp main ;К началу цикла
3 Описание программы (листинг 2.1)
Первая часть программы (строки 1 – 15) полностью повторяет аналогичную часть программы из предыдущего примера (листинг 1.1). И это понятно, так как алгоритм инициализации не изменился. Зато значительно усложнился основной цикл программы. Теперь он значительно вырос по объему и занимает строки 16 – 28. В строке 16 производится чтение порта PORTD. Число, прочитанное из порта, записывается в регистр temp.
В строке 17 производится проверка младшего разряда прочитанного числа. Если младший бит равен единице (кнопка не нажата), то управление переходит к строке 18. В строке 18 находится оператор безусловного перехода, который передает управление по метке main, то есть на начало цикла. Таким образом, пока кнопка не нажата, будет выполняться короткий цикл программы (строки 16,17 и 18).
Если кнопка нажата, младший разряд числа в регистре temp окажется равным нулю. В этом случае оператор sbrc в строке 17 передаст управление к строке 19, где начинается модуль переключения светодиода. И начинается он с чтения состояния порта РВ.
В строке 20 производится проверка младшего бита считанного числа. Если этот бит равен нулю, то строка 21 пропускается, и выполняется строка 22. Если младший бит равен единице, то выполняется строка 21. В строке 22 оператор sbi устанавливает младший бит регистра portb в единицу.
А в строке 21 находится оператор безусловного перехода, который передает управление по метке m1 на строку 24. Там оператор сbi сбрасывает младший бит регистра PORTB в ноль. Таким образом, происходит переключение в младшем разряде порта РВ. Ноль меняется на единицу, а единица на ноль.
После переключения светодиода управление передается на строку 25. Это происходит либо при помощи команды безусловного перехода (строка 23), либо естественным путем после строки 24.
Строки 25—27 содержат цикл ожидания момента отпускания кнопки. Цикл ожидания начинается с чтения содержимого порта portd (строка 25). Прочитанное значение записывается в регистр temp. Затем производится проверка младшего разряда прочитанного числа (строка 26). Если этот разряд равен нулю (кнопка еще не отпущена), выполняется строка 27 (безусловный переход на метку m2), и цикл ожидания повторяется снова.
Когда при очередной проверке кнопка окажется отпущенной, повинуясь команде sbrc (в строке 26), микроконтроллер пропустит строку 27 и перейдет к строке 28. Расположенный там безусловный переход передаст управление на начало основного цикла (по метке main).