Николай Королев, Дмитрий Королев
AVR-микроконтроллеры: программные средства
Не будет преувеличеним сказать, что огромное число разработчиков микропроцессорных систем в мире, а особенно в Советском Союзе, выросло на 8-разрядных микропроцессорах 8080 и микроконтроллерах MSC 48/51 фирмы INTEL. Несмотря на то что этим архитектурам уже более 20 лет и сама фирма INTEL давно забыла об этих микросхемах, аналоги MSC 51 фирмы INTEL еще продолжают выпускаться многими производителями.
Между тем, прогресс не стоит на месте, и новые микропроцессорные архитектуры на основе RISC-ядра постепенно вытесняют классические CISC-системы. Это относится как к мощным универсальным микропроцессорам (яркий пример — совместная разработка IBM и Motorola — RISC-процессор Power PC), так и к 8-разрядным микроконтроллерам. Тем не менее часто в новых разработках закладывается 8051-совместимая микросхема. Причин этому несколько — знакомая, испытанная система команд, богатый архив наработанного программного обеспечения, легкодоступные ассемблеры и компиляторы. Однако вычислительная мощность этих микроконтроллеров для некоторых приложений недостаточна, и тогда приходится искать новые решения.
Одно из таких решений — использование AVR-микрконтроллеров фирмы Atmel. Они выпускаются в корпусах с цоколевкой, идентичной Intel 8051,
что позволяет ставить эти микросхемы в уже изготовленные печатные платы.
В процессе выбора элементной базы для создания нового устройства разработчик рассматривает не только технические характеристики того или иного микроконтроллера, но также большое внимание уделяет средствам поддержки — как аппаратным (стартовые наборы, программаторы, внутрисхемные эмуляторы), так и программным (языки низкого и высокого уровня, симуляторы). Естественно, в расчет берется не только удобство работы и функциональные возможности конкретного пакета программ, но и его стоимость. Данная статья посвящена рассмотрению программных средств для разработки устройств с использованием микроконтроллеров семейства AT90S, выпускаемых фирмой ATMEL.
В настоящее время AVR-микроконтроллеры фирмы ATMEL завоевали широкую популярность на российском рынке. И это неудивительно — по количеству моделей в семействе они занимают первое место в мире среди ФЛЭШ-микроконтроллеров и по совокупности своих характеристик опережают большинство аналогичных изделий, занимая одно из первых мест в мире по соотношению цена/производительность. Высокая производительность достигнута не в последнюю очерель благодаря мощному и удобному набору команд, существенно повышающему эффективность кода по сравнению с микроконтроллерами классической архитектуры.
Как станет ясно из нижеизложенного материала, основным инструментом программиста является интегрированная среда разработки (IDE — INTEGRATED DEVELOPMENT ENVIRONMENT) — AVR STUDIO® 3.0. Эта оболочка включает в себя текстовый редактор, менеджер проектов, отладчик и предоставляет следующие возможности:
- создание и редактирование исходного кода на ассемблере;
- символьная отладка в исходных кодах;
- просмотр содержимого ФЛЭШ-ПЗУ, ЭСПЗУ, ОЗУ, регистров и портов ввода/вывода;
- неограниченное число точек прерывания;
- буфер трассировки;
- просмотр и модификация переменных с поддержкой механизма Drag-and-Drop;
- модификация состояния активности выводов портов ввода/вывода;
- загрузка файлов в форматах COFF, UBROF6 и HEX;
- поддержка проектов на языках С, Паскаль и Бейсик;.
- совместная работа со всеми внутрисхемными эмуляторами фирмы Atmel.
Менеджер проекта (project manager) объединяет в проект группу файлов и обеспечивает интерфейс для подключения внешнего ассемблера/компилятора. Таким образом, есть возможность писать программу на выбранном языке и компилировать ее выбранным компилятором. Мощный текстовый редактор, входящий в AVR Studio, обеспечивает «бесшовную» стыковку с внешним компилятором и линкером. Исходный код можно редактировать непосредственно в отладочном окне. Поддерживается цветовое выделение соответствующих фрагментов исходного кода.
Рис. 1. Окнo AVR Studio
Пользовательский интерфейс специально разработан для облегчения работы пользователя. Инструментальные панели (toolbars) и клавиши быстрого доступа обеспечивают удобный доступ ко всем ресурсам AVR-микроконтроллера. Установка точек прерывания и переключение на окно исходного текста производится одним нажатием кнопки мыши.
Одной из важных характеристик AVR Studio является встроенная поддержка работы с внутрисхемным эмулятором. При запуске программы производится опрос COM-портов компьютера на предмет наличия подключенного эмулятора. Если на каком-либо COM-порте обнаруживается эмулятор (в общем случае допускается совместная работа нескольких эмуляторов), AVR Studio стартует в режиме аппаратной отладки (emulator mode), о чем сообщает надпись «emulator» в нижней части основного окна, иначе активизируется режим симулятора. Пользовательский интерфейс в обоих случаях идентичный.
Эмуляторы AVR ICE 200, ICE PRO и AVR ICE 30 имеют возможность обновления конфигурации. Соответствующее программное обеспечение входит в состав AVR Studio. При инициализации эмулятора происходит проверка тетекущей версии эмулятора и при необходимости выводится окно с предложением «обновить» версию.
Архитектура AVR-микроконтроллеров спроектирована под компиляторы с языков высокого уровня. В частности, большое количество регистров общего назначения удобно для хранения «регистровых» переменных при написании программы на С. Этому способствует также высокое быстродействие микроконтроллеров (время выполнения команды составляет 100–150 наносекунд) и практически неограниченный объем памяти программ (микросхем ATmega 103 имеет ФЛЭШ-ПЗУ программ объемом 128 Кбайт). Фирмы, выпускающие С-компиляторы для микроконтроллеров, не заставили себя ждать и вскоре предложили соответствующие пакеты. Из всего разнообразия наиболее интересны два — первый от шведской фирмы IAR Systems и второй от американской фирмы ImageCraft Creations Inc.
Фирма IAR Systems известна своей плодовитостью, ее продукты поддерживают около двадцати типов микроконтроллеров разных фирм-производителей. В комплект поставки входит среда разработки IAR Embedded Workbench и отладчик IAR C-Spy. Девиз фирмы «Различные архитектуры. Одно решение». Такой подход имеет неоднозначную оценку пользователей. С одной стороны — единая среда разработки облегчает переход к новому типу микроконтроллера. С другой стороны, вследствие такой универсальности усложняется настройка опций компиляции и оптимизации — приходится разбираться среди массы возможно неиспользуемых для конкретного микроконтроллера ключей и настроек. Нередко приходится прибегать к прямому редактированию xcl-файлов. Для ознакомления с пакетом предлагается демо-версия, имеющая следующие ограничения: максимальный размер исходного кода на языке С составляет 2 Кбайта, на ассемблере — 1 Кбайт, размер откомпилированного приложения — 2 Кбайта, размер файла для отладки — 2 Кбайта. Кроме того, формат файлов сделан таким, что они читаются только внутри этой демо-версии.
Рис. 2. С-компилятор фирмы IAR
Следует отметить, что цена С-компилятора фирмы IAR Systems составляет в зависимости от приобретаемой конфигурации от 2500 до 3600 долларов США, что является существенным ограничивающим фактором для приобретения его многими российскими фирмами.
Более интересен для рассмотрения второй из ранее упомянутых С-компиляторов. Фирма ImageCraft пошла принципиально другим путем. Ее оптимизирующий компилятор написан специально для AVR-микроконтроллеров, и, как следствие, он достаточно компактен: дистрибутив имеет объем 2,5 мегабайта, а после установки на диск компилятор занимает немногим более 4 мегабайт. При скромных размерах он имеет достаточно богатый набор характеристик. Интегрированная среда разработки (IDE) функционирует под управлением Windows 95/98/NT, включая в себя текстовый редактор с полноценной поддержкой русского языка и менеджер проекта, который формирует стандартный makefile. Обеспечивается поддержка практически всех AVR-микроконтроллеров, включая еще не выпущенные ATmega161/163 и FPSLIC AT94. Для микросхем семейства ATtiny и AT90S1200, не имеющих внутреннего ОЗУ, есть пакет ICCTinyAVR. Опции компиляции можно выбрать из стандартного набора или установить самостоятельно, выбрав в поле «тип микросхемы» — custom device. В результате компиляции формируется стандартный HEX-файл для загрузки в микросхему, файл в формате COFF, который «понимает» AVR Studio, и файл с листингом в текстовом формате. Компилятор совместим со стандартом ANSI C. Исходный текст может содержать вставки на ассемблере (строки или ассемблерные модули). Ассемблерные директивы могут включать условное выполнение, include-файлы, макросы и текстовые определения.
Библиотеки включают функцию printf, распределение памяти, строковые и математические функции. Также есть специальные функции, такие как доступ к ЭСПЗУ, АЦП и SPI-интерфейсу. При возникновении каких-либо вопросов можно обратиться к достаточно подробно написанному help-файлу или к входящей в комплект книге объемом около 120 страниц. Следует отметить, что есть возможность обратиться за помощью непосредственно на фирму ImageCraft, написав письмо по адресу info@imagecraft.com. Эта возможность была проверена дважды, и авторы подтверждают, что на следующий день они находили в своем почтовом ящике исчерпывающие ответы на заданные вопросы. Еще одно несомненное преимущество работы с программой ICC AVR от ImageCraft — это возможность полноценной работы до приобретения С-компилятора. Последняя демо-версия пакета доступна на сайте производителя программы по адресу http://www.imagecraft. com/software/index.html, либо на сайте российского дистрибьютора http://atmel. argussoft.ru, причем эта версия максимально дружелюбна: пользователь может работать с исходными текстами неограниченной длины и компилировать файл для любой микросхемы. Единственное ограничение — время работы, 30 дней. Его достаточно для разработки даже крупного проекта. По истечении месяца пользователь должен принять решение: или переформатировать винчестер, чтобы еще раз установить демо-версию, либо отдать 240 долларов и приобрести официальный дистрибутив и право на техническую поддержку.
В качестве иллюстрации разработки проекта в С-компиляторе фирмы ImageCraft ниже приводится пример разработки устройства «Цифровые часы с функцией измерения и отображения температуры окружающей среды» на микроконтроллере AT90S2313. Датчиком температуры в данном приборе служит микросхема фирмы Analog Devices AD7817, а устройством отображения — любой стандартный цифробуквенный жидкокристаллический индикатор с контроллером типа HD44780.
Исходный код программы часов представлен на предыдущей странице (программа 1).
Частота задающего генератора = 4 MГц.
Программа 1
#include <io2313.h>
#pragma interrupt_handler
timer:5
#define LCD_E (1 << 6)
#define LCD_RS (1 << 5)
#define LCD_RW (1 << 4)
#define lcd_set_e()
(PORTD |= LCD_E)
#define lcd_set_rs()
(PORTD |= LCD_RS)
#define lcd_set_rw()
(PORTD |= LCD_RW)
#define lcd_clear_e()
(PORTD &= ~LCD_E)
#define lcd_clear_rs()
(PORTD &= ~LCD_RS)
#define lcd_clear_rw()
(PORTD &= ~LCD_RW)
// короткая задержка для ЖКИ
void delay(int ticks)
{
while(ticks--);
}
// строб ЖКИ
void lcd_pulse(void)
{
lcd_set_e();
delay(4);
lcd_clear_e();
delay(4);
}
// средняя задержка для ЖКИ
void lcd_wait(void)
{
delay(1000);
}
// посылка байта на ЖКИ
void lcd_send(unsigned char data)
{
lcd_wait();
PORTB = data;
lcd_pulse();
}
// очистка экрана ЖКИ
void clrscr(void)
{
lcd_clear_rs();
lcd_clear_rw();
lcd_send(0x01);
lcd_wait();
}
// инициализация ЖКИ
void initgraph(void)
{
DDRB = 0xFF;
DDRD |= (LCD_E | LCD_RS | LCD_RW);
lcd_clear_rs();
lcd_clear_rw();
lcd_send(0x3C);
lcd_send(0x3C);
lcd_send(0x3C);
lcd_send(0x06);
lcd_send(0x0C);
}
// перемещение курсора ЖКИ
void gotoz(unsigned char z)
{
lcd_clear_rs();
lcd_clear_rw();
lcd_send(z | 0x80);
}
#define gotoxy(x,y) gotoz((x)|((y)<<6))
// посылка символа на ЖКИ
void putchar(char c)
{
lcd_clear_rw();
lcd_set_rs();
lcd_send(c);
}
// посылка строки
void outtext(char* text)
{
unsigned char i;
for(i = 0; text[i] && i < 16; i++)
putchar(text[i]);
}
unsigned char hour = 0, minute = 0, second = 0;
// вызов 1 раз в секунду
void timer(void)
{
// текущее время
clrscr();
gotoxy(0,0);
putchar('0'+hour/10);
putchar('0'+hour%10);
putchar(':');
putchar('0'+minute/10);
putchar('0'+minute%10);
putchar(':');
putchar('0'+second/10);
putchar('0'+second%10);
// then increment counter
second++;
if(second == 60)
{
second = 0;
minute++;
if(minute == 60)
{
minute = 0;
hour++;
if(hour == 24)
{
hour = 0;
}
}
}
}
// 'main' объявлена как 'int' для совместимости с ANSI-C
int main(void)
{
TIMSK = (1<<6); // set OCIE1A
TCCR1A = 0;
TCCR1B = 0x0C; // CTC1, CK/256
OCR1H = 0x3D; // 4000000/256=15625=0x3D09
OCR1L = 0x09;
TCNT1H = TCNT1L = 0;
initgraph();
timer();
SREG = 0x80; // SEI
return 0;
}
|
Ниже представлена функция работы с AD7817 (программа 2). Для отображения на второй строке индикатора температуры окружающей среды, следует подключить эту функцию.
Программа 2
#define STRT (1 << 3)
#define WR (1 << 4)
#define OUT (1 << 2)
#define IN (1 << 2)
#define CLK (1 << 4)
void strobe0(void)
{
mcu_nop();
PORTB &= ~CLK;
mcu_nop();
}
void strobe1(void)
{
mcu_nop();
PORTB |= CLK;
mcu_nop();
}
void strobe(void)
{
strobe0();
strobe1();
}
byte hc = 0, s = 0, m = 0, h = 12;
void interrupt timer0_overflow (void)
{
byte i;
word temperature;
PORTB &= ~IN;
mcu_nop();
PORTD &= ~WR;
mcu_nop();
for(i = 0; i < 8; i++)
strobe();
mcu_nop();
PORTD &= ~STRT;
mcu_nop();
PORTD |= STRT;
for(i = 0; i < 50; i++)
mcu_nop();
PORTD |= WR;
mcu_nop();
// 10 bits
temperature = 0;
for(i = 0; i < 8; i++)
{
strobe();
temperature *= 2;
if(PIND & OUT)
temperature++;
}
|
|