
Лабораторная работа № 4
1. Программирование на языке c в системе WinAvr
Архитектура микроконтроллеров AVR ориентирована на язык программирования C. Большинство компиляторов языка C являются коммерческими продуктами и стоят достаточно дорого. Однако существуют и бесплатно распространяемые C-компиляторы, одним из которых является компилятор WinAVR.
Компилятор WinAVR обладает следующими преимуществами по сравнению с другими:
он поддерживает большое количество типов микроконтроллеров AVR;
его автором является коллектив профессиональных программистов;
он имеет большое количество функций;
его версии постоянно обновляются.
WinAVR принадлежит к классу бесплатных программ, авторы которых сознательно распространяют их без ограничений, руководствуясь принципами GNU. Основная идея здесь заключается в коллективном накоплении банка программ и алгоритмов, которым мог бы воспользоваться любой желающий (при этом принципы GNU не запрещают брать деньги за услуги по тиражированию свободных программ и за услуги по адаптации программного обеспечения для нужд конкретного потребителя).
Для установки WinAVR следует скачать со страницы
http://sourceforge.net/projects/winavr
инсталляционный файл и запустить его. Если установка прошла успешно, то на компьютере появятся следующие инструменты пакета WinAVR: Avr Insight, Avr-libs, GNU manuals, MFile, Programmers Notepad, Readme, TkInfo. Доступ к ним возможен через меню Пуск Программы WinAVR. При этом единого запускающего файла (IDE) для WinAVR нет – главной оболочкой C-компилятора можно считать текстовый редактор Programmers Notepad.
Для получения исполняемой программы для микроконтроллера в WinAVR необходимо создать и откомпилировать проект. Основой проекта служит make-файл (makefile), который сообщает компилятору, какие команды запускать, какие файлы компилировать и линковать, какой выходной код генерировать и т. д. На основании информации в make-файле выполняется компиляция программы при помощи утилиты MAKE.EXE, которая находится в папке WinAVR\utils\bin. MAKE.EXE контролирует генерацию исполняемых файлов из исходного кода программы, а make-файл используется для управления ее работой.
Создать makefile можно вручную, например, в текстовом редакторе Programmers Notepad, входящем в пакет WinAVR. При этом в качестве шаблона можно воспользоваться любым make-файлом из проектов в папке с примерами или шаблоном, содержащимся в папке WinAVR\sample\.
Пример 4.1. Создание make-файла вручную и компиляция программы.
Создать на диске папку TEST для файлов проекта.
Запустить Programmers Notepad [WinAVR].
Выбрать команду File New C/C++.
Написать программу на языке C.
/**************************************
ПРИМЕР МИГАНИЯ СВЕТОДИОДАМИ
**************************************/
#include <avr/io.h>
#include <avr/delay.h>
#define F_CPU 8000000UL // 8 MHz
Int main(void) // Начало основой программы
{ DDRD = 0xff; // Все выводы порта D сконфигурировать как выходы
while (1) // Бесконечный цикл
{
PORTD = 0xff; // Установить "1" на всех линиях порта D
_delay_ms(250); // Ожидать 0.25 сек.
PORTD = 0x00; // Установить "0" на всех линиях порта D
_delay_ms(250); // Ожидать 0.25 сек.
}
}
Сохранить программу под именем TEST.C.
Закрыть Programmers Notepad [WinAVR].
Скопировать шаблон make-файла в папку TEST.
Отредактировать make-файл в редакторе Programmers Notepad.
Во-первых, обязательно нужно указать, для какого типа микроконтроллера требуется получить выходной код. Для этого требуется в строке
MCU = atmega128
вместо atmega128 указать требуемый микроконтроллер, например, atmega8, attiny2313, attiny26.
Частота используемого кварцевого резонатора в герцах определяется в строках:
# Processor frequency.
…
F_CPU = 8000000
Имя проекта, а соответственно и имя исходного файла с функцией main и выходные файлы с расширениями hex и cof, определяется в следующих строках:
# Target file name (without extension).
TARGET = testpp
Здесь вместо testpp нужно вписать нужное имя проекта (в нашем случае test).
В следующих строках:
# List C source files here. (C dependencies are automatically generated.)
SRC =
нужно после знака равенства записать $(TARGET).c, чтобы получилось
# List C source files here. (C dependencies are automatically generated.)
SRC = $(TARGET).c
Строки
# List C++ source files here. (C dependencies are automatically generated.)
CPPSRC = main.cpp
нужно заменить на
# List C++ source files here. (C dependencies are automatically generated.)
CPPSRC =
Загрузить в редактор Programmers Notepad программу test.c.
Скомпилировать программу с помощью команды
Tools [WinAVR] Make All.
Автоматизировать процесс создания make-файла можно с помощью утилиты MFile, которая входит в состав пакета WinAVR. Ее можно запустить через меню Пуск: Пуск Программы WinAVR MFile [WinAVR].
Для программирования в среде WinAVR используется стандартный язык C с некоторыми дополнительными возможностями, специфичными для микроконтроллеров AVR. В качестве первой из таких особенностей отметим однострочные комментарии, начинающиеся с символов //.
К особенностям программирования микроконтроллеров AVR можно отнести то, что переменные программы по умолчанию размещаются в памяти данных (оперативной памяти микроконтроллера), а константы (переменные с модификатором const) – памяти программ (flash-памяти). Кроме того, компилятор WinAVR позволяет записывать константы в EEPROM-память микроконтроллера и считывать их оттуда с помощью специальных функций.
С точки зрения программирования на языке C отличия, в основном, относятся к библиотеке функций. Например, стандартные функции ввода-вывода putchar, getchar, puts, gets, scanf, printf и др., определенные в файле stdio.h, в среде WinAVR предназначены для обмена данными через приемопередатчик UART/USART.
Для обработки прерываний в среде WinAVR используется предустановленная таблица векторов прерываний, содержащая адреса соответствующих подпрограмм обслуживания с заранее определенными именами. Для каждой такой подпрограммы в библиотечном файле \avr\signal.h определены два макроса: INTERRUPT() и SIGNAL(). Эти макросы регистрируют и помечают некоторую функцию как обработчик прерывания. Их различие в том, что макрос INTERRUPT() определяет функцию обработчика для случая, когда разрешено общее прерывание (т.е. обработчик может быть прерван), а SIGNAL() – для случая, когда общее прерывание запрещено (т.е. обработчик не может быть прерван).
Пример 4.2. Применение макросов INTERRUPT() и SIGNAL().
#include <avr/signal.h>
INTERRUPT(SIG_ADC)
{
… // Операторы обработчика прерывания от АЦП
}
или
#include <avr/signal.h>
SIGNAL(SIG_ADC)
{
… // Операторы обработчика прерывания от АЦП
}
В качестве идентификаторов прерываний, передаваемых в качестве параметров макросам INTERRUPT() и SIGNAL(), могут служить следующие:
SIG_2WIRE_SERIAL – двухпроводной последовательный интерфейс (I2C);
SIG_ADC – аналого-цифровое преобразование завершено;
SIG_COMPARATOR – прерывание от аналогового компаратора;
SIG_EEPROM_READY – память EEPROM готова;
SIG_INTERRUPT0, …, SIG_INTERRUPT7 – внешнее прерывание
и др.
Кроме того, в библиотечном файле \avr\interrupt.h объявлены макрофункции sei() и cli(), которые предназначены для установки и сброса соответственно флага общего разрешения прерываний.
Для ускорения выполнения некоторых фрагментов программы можно применить ассемблерные вставки, которые имеют вид: