Целью лабораторного практикума по дисциплине «Программное обеспечение и технология программирования микроконтроллеров» является закрепление знаний по архитектуре и функционированию основных модулей микроконтроллеров на примере микроконтроллеров AT90S4434/8535 семейства AVR, а также приобретение в процессе выполнения лабораторного практикума навыков программирования и отладки программ на языке Ассемблера.
Для удобства проведения лабораторного практикума в методическом руководстве дано описание основных элементов языка Ассемблера семейства AVR: системы счисления, машинное представление данных и команд. Кроме того, приведены директивы Ассемблера для AVR, и система команд процессора AT90S4434/8535 и некоторые дополнительные сведения к ним.
Одна из глав книги описывает порядок создания, компиляции и отладки программ на этапе разработки с помощью программы AvrStudio. Для записи программы в микроконтроллер используется программа New_SP.
Подробно рассмотрены особенности программирования микропроцессорных систем на языке Ассемблера, организации интерфейса с устройствами ввода-вывода и хранения информации. Каждая лабораторная работа содержит справочную информацию необходимую для решения заданной задачи с указанием возможных проблем при вычислениях и способов их устранения.
МИКРОКОНТРОЛЛЕРЫ AT90S4434/8535 СЕМЕЙСТВА AVR
Структура микроконтроллеров AVR
Упрощенно модульную структуру микроконтроллера семейства AVRможно представить в следующем виде (рис. 1.1).
UART
32 регистра общего назначения
Память данных SRAM
Порты ввода/вывода
Счетчик
команд
Flash-память программ ROM
Сторожевой таймер
Таймеры / счетчики
Последовательный периферийный интерфейс SPI
Регистр
команд
ЦПУ
Блок прерываний
АЦП
Аналоговый компаратор
АЛУ
EEPROM
64 регистра пространства ввода/вывода
Схемы синхронизации
Схемы управления
Рис. 1. Структура микроконтроллера семейства AVR
AVR представляет собой 8-разрядный RISC микроконтроллер, имеющий быстрое процессорное ядро, внутрисистемно программируемую Flash-память программ (ROM) емкостью 8 Кбайт, EEPROM память данных емкостью 512 байт, память данных SRAM (512 байт), порты ввода/вывода и интерфейсные схемы.
В микроконтроллерах AVR использованы принципы Гарвардской архитектуры – отдельные память и шины для программ и данных.
При работе с памятью программ используется одноуровневый конвейер – в то время, как одна команда выполняется, следующая команда выбирается из памяти программ, Такой прием позволяет выполнять команду в каждом тактовом цикле.
Представление данных в языке ассемблера
Для освоения программирования на ассемблере необходимо познакомиться с двоичными и шестнадцатеричными числами, так как без понимания того, как хранятся данные в памяти компьютера, трудно использовать логические и битовые операции.
Двоичная система счисления
В электрических цепях микропроцессорных систем напряжение может принимать два значения – низкого и высокого уровня (нет сигнала и есть сигнал). Этим двум значения поставили в соответствие две цифры – ноль и единица. Именно эти две цифры и используются в двоичной системе счисления, а вместо степеней десяти, как в обычной десятичной системе, – степени двойки. Для перевода двоичного числа в десятичное необходимо сложить двойки в степенях, соответствующих позициям, где в двоичном числе стоят единицы. Например:
Для перевода десятичного числа в двоичное можно, например, разделить его на два, записывая остатки справа налево (таблица 1.1).
Чтобы отличать двоичные числа от десятичных, в тексте в конце каждого двоичного числа ставится буква b.
Таблица 1.1. Перевод десятичного числа в двоичное
Частное
Остаток
151 / 2
75 / 2
37 / 2
18 / 2
9 / 2
4 / 2
2 / 2
1 / 2
Результат
10010111b
Биты, байты и слова
Битом называется минимальная единица информации. Бит либо есть, либо его нет, то есть, можно сказать, что он принимает два значения – ноль и единица, «да» и «нет» и т.п. Важно лишь то, что бит имеет только два значения. Очевидно, что один разряд двоичного числа несет один бит информации.
Единица информации размером восемь бит называется байт. Байт – это минимальный объем данных, который реально может использовать компьютерная программа. Даже для изменения одного бита в памяти приходится считывать байт, содержащий его. Биты в байте нумеруются справа налево, от нуля до семи (рис. 1.2). Нулевой бит часто называют младшим битом, седьмой – старшим.
Рис. 1.2. Байт.
Так как в байте всего восемь бит, то он может принимать до 28 = 256 различных значений. Байт используется для представления целых чисел от 0 до 255, целых чисел со знаком от –128 до +127 или любых переменных, принимающих менее 256 значений.
Следующий по размеру базовый тип данных – слово. Размер одного слова – два байта. Биты с нулевого по седьмой составляют младший байт слова, а биты с восьмого по пятнадцатый – старший. В слове содержится шестнадцать бит, а значит, оно может принимать до 216 = 65536 различных значений. Два слова подряд образуют двойное слово (32 бит), а два двойных слова – одно учетверенное слово (64 бит).
Шестнадцатеричная система счисления
Главное неудобство двоичной системы счисления – это размеры чисел, с которыми приходится обращаться. На практике с двоичными числами работают, только если необходимо следить за значениями отдельных битов, а когда размеры переменных превышают четыре бита, используется шестнадцатеричная система. Она хороша тем, что компактнее десятичной, и тем, что перевод в двоичную систему и обратно происходит очень легко. В шестнадцатеричной системе используются шестнадцать знаков (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A, B, C, D, E, F). Каждая позиция цифры в числе соответствует степени числа шестнадцать. Например,
97h = 9 × 161 + 7 × 160 = 9 × 16 + 7 = 151.
Перевод в двоичную систему и обратно осуществляется просто – вместо каждой шестнадцатеричной цифры подставляют соответствующее четырехзначное двоичное число и наоборот:
97h = (9h = 1001b, 7h = 0111b) = 10010111b.
Чтобы отличать шестнадцатеричные числа от десятичных в тексте в конце каждого шестнадцатеричного числа ставится буква h.
Иногда в ассемблерных программах используется восьмеричная система счисления. В восьмеричной системе используются восемь знаков (0, 1, 2, 3, 4, 5, 6, 7). Каждая позиция цифры в числе соответствует степени числа восемь. Например,
Перевод в двоичную систему и обратно осуществляется просто – вместо каждой восьмеричной цифры подставляют соответствующее трехзначное двоичное число и наоборот:
Чтобы отличать восьмеричные числа от десятичных в тексте перед каждым восьмеричным числом ставится 0.
Для того чтобы в программах при записи чисел, не перепутать системы счисления, а числа начинающиеся с A, B, C, D, E, F – с переменными, в каждом ассемблере принимают свои обозначения.
В ассемблере для AVR приняты следующие форматы операндов:
– десятичный (по умолчанию): 10, 255;
– шестнадцатеричный (два способа): 0´0а, $0а;
– двоичный: 0b00001010, 0b11111111;
– восьмеричный (впереди ноль): 010, 077.
В таблице 1.2 дано соответствие десятичных, двоичных и шестнадцате-ричных чисел от нуля до шестнадцати.
Таблица 1.2. Соответствие десятичных, двоичных и шестнадцатеричных чисел