Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лабораторная работа № 4.doc
Скачиваний:
0
Добавлен:
01.04.2025
Размер:
96.77 Кб
Скачать

Лабораторная работа № 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-файла вручную и компиляция программы.

  1. Создать на диске папку TEST для файлов проекта.

  2. Запустить Programmers Notepad [WinAVR].

  3. Выбрать команду File New C/C++.

  4. Написать программу на языке 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 сек.

}

}

  1. Сохранить программу под именем TEST.C.

  2. Закрыть Programmers Notepad [WinAVR].

  3. Скопировать шаблон make-файла в папку TEST.

  4. Отредактировать 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 =

  1. Загрузить в редактор Programmers Notepad программу test.c.

  2. Скомпилировать программу с помощью команды

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(), которые предназначены для установки и сброса соответственно флага общего разрешения прерываний.

Для ускорения выполнения некоторых фрагментов программы можно применить ассемблерные вставки, которые имеют вид: