
- •«Встроенные системы на микроконтроллере 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.2 Язык си
4.2.1 Типы данных, объявление данных
Идентификатором называется имя, которое дается переменной, функции, метке или другому объекту. Идентификатор может содержать буквы латинского алфавита, цифры, а также символ подчеркивания. Идентификатор не может начинаться с цифры. При написании идентификатора имеет значение регистр (малые или большие буквы). В качестве идентификатора не допускается использование зарезервированных компилятором ключевых слов.
Переменная – именованная величина, значение которой может изменяться при выполнении программы. Переменные могут быть глобальными и локальными.
Глобальные переменные – это переменные, которые доступны во всех функциях программы. Глобальные переменные объявляются в начале программы. При объявлении глобальных переменных им присваиваются нулевые значения. Локальные переменные доступны только в тех функциях, в которых они объявлены. При объявлении локальных переменных их значения случайны (могут быть любыми).
Константы (неизменяемые значения) могут быть представлены десятичной, шестнадцатеричной или двоичной записями.
Примеры:
584, 0399, 12, 3 – запись значений в десятичной системе;
0Х3ADF, 0xdf34 – запись значений в шестнадцатеричной системе;
0b11001110, 0b00011100 - запись значений в двоичной системе.
Символьная константа представляется символом, заключенным в одиночные кавычки, например, ' s ' . Значение символьной константы - числовой код (ASCII код) символа.
Строковая константа или литерал – последовательность символов, заключенная в двойные кавычки, например, « Stroka 34» .
Данные, переменные, константы объявляются перед их использованием. Данные и переменные могут храниться в регистрах микроконтроллера, ячейках ОЗУ. Константы рекомендуется хранить в программной (flash) памяти. Для определения данных целого типа используются ключевые слова bit, char, int, long, unsigned, flash,eeprom, которые определяют диапазон значений (тип переменных) и область памяти, выделяемой для их хранения.
Примеры объявлений переменных, данных, констант.
bit alfa; //Объявление битовой переменной с именем alfa; один бит в регистре
//РОН микроконтроллера.
unsigned char data1; // Переменная с именем data1; ее тип - беззнаковая символьная;
//диапазон значений 0-255 (1 байт); может размещаться в
//регистре МК или в ячейке ОЗУ.
unsigned int data2; // Значение с именем data2; ее тип - беззнаковая целая;
//диапазон значений 0-65535 (2 байта); может размещаться в двух
//регистрах МК или в двух ячейках ОЗУ.
unsigned long int DATA_3; // Переменная с именем DATA_3; ее тип - беззнаковая
//длинная; диапазон значений от 0 до 232 -1 (4 байта);
// размещается в четырех ячейках ОЗУ.
flash unsigned char ConstTime; //Константа с именем ConstTime, длиной в 1 байт (от
// нуля до 255), помещена в программную
//память микроконтроллера.
Для размещения любых данных по их объявлению резервируются регистры или ячейки памяти и в них помещаются нулевые значения, т.е. значения данных равны нулям. Можно присвоить нужные значения данным сразу при их объявлении.
Примеры:
unsigned int DATA_3 = 0xdd4f; // Объявлена переменная DATA_3 и ей присвоено
// шестнадцатеричное значение ddff.
unsigned char data1 = 233; // Объявлена переменная data1 и ей присвоено
// десятичное значение 233.
unsigned char data4 = 0b11001111; // Объявлена переменная data4 и ей присвоено
// двоичное значение 11001111.
bit alfa = 1; //Объявление битовой переменной и присвоение ей значения 1.
Массивы - это группа элементов одинакового типа (char, int, long int и т.п.). Из объявления массива компилятор СИ должен получить информацию о типе элементов массива и их количестве. При объявлении массива необходимо указать тип данных (элементов) массива, имя массива и в квадратных скобках указать число элементов в массиве:
unsigned char CODE_SEGM [10]; //Объявление массива данных CODE_SEGM
//типа беззнаковых символьных; в массиве 10
//элементов с номерами (индексами) от 0 до 9 .
При объявлении массива данных значения элементов могут быть заданы. В этом случае количество элементов можно не указывать:
unsigned char CODE_SEGM [ ] = {32,0xd7,0b11101011}; //Объявление массива данных
//CODE_SEGM типа беззнаковых целых; в массиве 3
//элемента с номерами (индексами) от 0 до 2; их
//значения 32, 0xd7 и 0b11101011.
сhar stroka_symvols [ ] = " Meassing " ; // Объявление символьной строки –
// массив, в котором 9 (а не 8) элементов;
// номера – индексы элементов 0,1,…,7,8;
// последний символ – элемент равный нулю.