
- •«Встроенные системы на микроконтроллере Atmega16»
- •Оглавление
- •Введение. Управляющие системы на микроконтроллерах.
- •Характеристика микроконтроллеров семейства avr
- •1.1 Особенности микроконтроллеров
- •1.2 Характеристики микроконтроллера aTмega16
- •1.3 Условное графическое обозначение микроконтроллера
- •2 Архитектура микроконтроллера
- •2.1 Структура микроконтроллера
- •2.2 Организация программной памяти
- •Организация памяти данных
- •2.4 Арифметико-логическое устройство и регистр состояния процессора
- •Методы адресации. Форматы команд
- •Система команд
- •2.6.1 Команды передачи данных (пересылки)
- •2.6.2 Команды передачи управления
- •2.6.3 Команды арифметики и логики (вычислительные)
- •2.6.4 Команды сдвигов и операций с битами
- •2.7 Функционирование конвейера
- •3 Встроенные устройства
- •3. 1 Параллельные порты ввода/вывода
- •Подсистема прерываний микроконтроллера
- •Регистр флагов прерываний таймеров/счетчиков – tifr
- •Таймеры/счетчики
- •Общие сведения
- •Таймер/счетчик т0.
- •3.3.3 Таймер/счетчик т1.
- •Сторожевой таймер (Watchdog Timer).
- •3.4 Последовательные интерфейсы -spi и uart
- •3.4.1 Последовательный периферийный интерфейс - spi
- •3.4.2 Uart - универсальный последовательный порт
- •3.5 Аналоговый компаратор и ацп
- •3.5.1 Аналоговый компаратор
- •3.5.2 Аналого-цифровой преобразователь
- •3.6 Энергонезависимая память данных
- •4 Понятия о языках программирования микроконтроллеров
- •4.1 Язык Ассемблер
- •4.2 Язык си
- •4.2.1 Типы данных, объявление данных
- •4.2.2 Операторы
- •4.2.3 Функции
- •4.2.4 Оператор if-else (ветвления )
- •{Группа операторов 1}
- •Пример:
- •4.2.5 Оператор switch
- •4.2.6 Операторы циклов
- •Оператор цикла for
- •Тело цикла
- •Оператор while
- •Операторы тела цикла
- •4.2.7 Указатели
- •4.2.8 Директивы препроцессора
- •5 Взаимодействие микроконтроллера с объектом управления
- •5.1 Формирование временных интервалов (задержек)
- •5.1.1 Программный способ формирования временных интервалов на языке Ассемблер
- •Ext_l: ldi r17, X ;х – число внутренних циклов
- •Ext_l: ldi r17, 53 ;Загрузка в r17 константы внутреннего цикла
- •Программный способ формирования временных интервалов на языке си
- •5.2 Генерация импульсных сигналов управления с использованием программных задержек
- •5.2.1 Генерация последовательности импульсов с использованием программных задержек
- •5.2.2 Генерация пакета импульсов
- •5.2.3 Генератор заданного числа пакетов импульсов
- •Формирование импульсных сигналов управления с использованием таймеров микроконтроллера
- •5.4 Ожидание внешних событий
- •5.5 Обработка динамического дисплея
- •5.6 Особенности схемы дисплея в учебной системе управления.
- •5.7 Часы
- •5.8 Измерение временных параметров импульсов
- •5.9 Обработка клавиатуры
- •Дубров ф.И. Встроенные системы управления на микроконтроллере aTmega16
4 Понятия о языках программирования микроконтроллеров
4.1 Язык Ассемблер
С помощью языка Ассемблер можно создавать эффективные по длине кода и по быстродействию программы. Однако при этом имеются сложности и увеличивается время разработки программного обеспечения.
Программа на ассемблере представляет собой текстовый файл, который состоит из мнемоник (ассемблерных команд микроконтроллера), меток и директив. Стандартный формат текста ассемблерной программы представляет собой невидимые колонки меток, команд и комментария. Комментарии всегда начинаются с “ ; ”. Численное значение адреса в командах переходов и вызовов подпрограмм в программах на Ассемблере заменяется текстовым значением, соответствующем сути перехода или вызова.
Любая строка текста программы может начинаться с метки – набор символов, заканчивающийся двоеточием. Метки используются для обозначения строки некоторым именем и используются, в основном, для обозначения начала подпрограммы, в командах условных переходов и для обозначения данных в программной памяти.
Компилятор, кроме команд микроконтроллера поддерживает директивы. Директивы используются для указания о расположении частей программы в памяти, для именования ресурсов микроконтроллера и др. .
Программа - компилятор по “известным ей мнемоникам, директивам и длине команд” преобразует текст программы в двоичный код и определяет адреса ячеек в соответствии с метками при помощи программного счетчика.
Ниже приведен перечень некоторых директив.
.ORG adress – присвоить абсолютный адрес
Пример: .ORG 0x12
Команда следующая за этой директивой помещается Ассемблером в ячейку 0х12 программной памяти.
.DEF NAME - присвоить имя регистру РОН
Пример: .DEF COUNTER=R20 Регистру R20 присвоить имя COUNTER.
.EQU – присвоить имя выражению или константе
Пример: .EQU PAUSE = 34 значение 34 именовать именем PAUSE.
.DB – определить байт-константу в программной памяти или в EEPROM
.DW – определение слова-константы в программной памяти или EEPROM
.INCLUDE “FILE NAME”– вставить файл, имя которого в кавычках
Ассемблер позволяет использовать в тексте программы выражения.
ВЫРАЖЕНИЯ могут содержать операнды, функции и операции.
В качестве операндов могут быть использованы:
- метки;
- константы, определенные директивой EQU;
- целые константы: десятичные с записью 10,255
шестнадцатиричные с записью 0хс4 или $45
двоичные с записью 0b10001100.
коды символов ASCII c записью ‘A’,’a’.
Функции:
LOW (выражение) – младший байт выражения,
HIGH (выражение) – старший байт выражения и др.
Операции:
Умножение – знак *, пример: LDI R30,label*2;
Деление - знак /, пример: LDI r23,46|2;
Сложение знак +, пример: LDI R24, 0xCC+20;
Вычитание знак - ;
Сдвиг влево и вправо знаки << и >> на число разрядов, указанное после знака, пример: LDI R16,0b00000011<<4;
Логические операции и др.
Пример: программа управления светофором
Красная, желтая и зеленая лампы подключены к разрядам порта B соответственно: к 6,7 и 5. Времена свечения ламп: красной 0,5*10=5сек, желтой 0,5*3=1,5сек, зеленой 0,5*8=4сек. Всего в таблице 25 значений.
Комментарии описывают не команды Ассемблера, а функции программы. Функция приведенной программы: циклическая загрузка в порт D значений, выбираемых из таблицы с интервалом 0,3 секунд.
.include "m16def.inc" ;Включен файл имен ресурсов МК
.DEF COUNTER=R20
.org 0 ;Начало программы с нулевой ячейки
rjmp start ;Обход вектора прерывания
.org $c ;адрес вектора прерывания по совпадению Т1
rjmp tim1_A ;Вектор прерывания по совпадению Т1
start: ldi R16,4 ;Обошли вектор
out sph,R16 ;Загрузка старших и младших разрядов
ldi R16,$5f ;указателя стека SP значениями 3FF -
out spl,R16 ;адресом старшей ячейки ОЗУ
ldi counter,0 ;Обнуление счетчика
ldi R16,$ff ;Настройка
out ddrb,R16 ;порта В на вывод
sei ;Общее разрешение прерываний
ldi R16,0b00010000 ;Разрешение прерываний по совпадению
out timsk,R16 ;таймера Т1
ldi R16,$9c ;Значения, соответствующие
out ocr1ah,R16 ;временному интервалу 0,5сек в регистр
ldi R16,$40 ;сравнения OCR1A
out ocr1al,R16
ldi R16,0b01000000 ;Настройка Т1 в режим сброса по
out tccr1a,R16 ;совпадению
ldi R16,0b00001001 ;Включается Т1
out tccr1b,R16
loop: rjmp loop
tim1A: ldi zh,high(tab*2) ;В регистр Z адрес начала таблицы
ldi zl,low(tab*2)
add zl, COUNTER ;Адрес текущего элемента в tab
ldi R16,0 ;Чтобы не потерять
adc zh,R16 ;возможный перенос
lpm ;Чтение значения из прогр. памяти
out portb,R0 ;Переключение светофора
inc COUNTER ;Адрес след. элемента в tab
cpi COUNTER,25 ;Сравнение с числом значений в таблице
brne quit ;Если не последнее, то повторять выбор
ldi COUNTER,0;Счетчик для нового цикла
quit: reti
tab: .db $40,$40,$40,$40,$40,$40,$40,$40,$40,$40 ;красный
.db $80,$80,$80 ;желтый
.db $10,$10,$10,$10,$10,$10,$10,$10,$10 ;зеленый