Как сделать новый проект avr-gcc в AVR Studio 4
Написал microsin   
01.11.2008

Здесь описан процесс по шагам для создания проекта на основе свободного компилятора AVR GCC.

1. Запускаем AVR Studio, в запустившемся стартовом визарде жмем большую кнопу New Project, выбираем AVR GCC, впечатываем имя проекта (Project name:, выбираем его так, чтобы было понятно, что за проект), выбираем папку для размещения проекта (Location:), жмем кнопку Next>>

2. Выбираем платформу для отладки (Debug platform:), тип микроконтроллера (Device:), жмем кнопку Finish.

3. Вводим текст программы в главный C-файл проекта (его имя совпадает с названием, которое Вы дали проекту), что-то типа:
int main (void)
{
    while (1)
    {
    }
    return 0;
}

4. Если Вы хотите, чтобы автоматически подхватывались операторы include "имя_файла.h", то вы должны указать все папки, где нужно искать эти include-файлы, в настройках проекта - меню Project -> Configuration Options -> жмем кнопку слева "Include Directories", жмем New (Insert), указываем путь к папке (можно воспользоваться кнопкой браузинга ...).

5. Файлы проекта, которые вызываются операторами include, должны быть вручную добавлены в Header Files среды разработки, иначе она их "не видит" - файлы эти компилируются, но изменения, сделанные тесктовым резактором в них, не учитываются, пока включаемые файлы не сохранить.

6. Если во включаемых файлах объявляются функции, определенные в других C-файлах, то эти C-файлы нужно добавить в Source Files, чтобы они тоже компилировались.

7. Тип процессора (например, ATMega16) указывается в меню Project -> Configuration Options -> кнопка General -> выпадающий список Device: atmega16. При этом в зависмости от выбора компилятору передается информация от типе процессора с помощью опции -mmcu=тип_процесссора (в нашем примере -mmcu=atmega16). Символьная информация о именах регистров (которая своя для каждого типа процессора) обеспечивается файлом-селектором avr/io.h, который исходя из типа процессора загружает нужный include-файл. В нашем примере загрузится файл avr/iom16.h, причем этот файл напрямую (без avr/io.h) включать нельзя.

8. Ключевого слова extern в gcc нет, вместо него применяют простое предварительное объявление внешней функции:
extern void adcInit (void);     [НЕПРАВИЛЬНО]
void adcInit (void);            [ПРАВИЛЬНО]

9. Генерация задержек.
#include <util/delay.h>
_delay_ms(1);    // милисекундная задержка
_delay_us(1);    //микросекундная задержка

Для корректной работы подпрограмм задержки должна быть выставлена тактовая частота микроконтроллера в свойствах проекта (Project -> Configuration Options -> кнопка General -> указываем в окне ввода Frequency: частоту в герцах). При этом к компилятору передается опция -DF_CPU=тактовая_в_герцахUL, она создает макроопределение F_CPU, использующееся при генерации задержки.

10. Использование inline-инструкций ассемблера:
asm volatile ("nop");

11. Работа с таймером WatchDog (WDT):
#include <avr/wdt.h>
wdt_enable(WDTO_1S);    //настройка WDT на 1 секунду
...
wdt_reset();            //сброс WDT (для предотвращения перезагрузки) в основном цикле программы

12. Проверка бит (на примере бита ADSC регистра ADCSRA):
if (bit_is_clear(ADCSRA, ADSC))
{
    result  = ADCL;
    result += ((uint16_t)ADCH)<<8;
    ADCSRA |= (1<<ADSC);
}

В свежих версиях gcc (WINAVR) функция bit_is_clear может отсутствовать. Используйте вместо неё следующую конструкцию:
if (!(ADCSRA & (1<<ADSC)))
{
    result  = ADCL;
    result += ((uint16_t)ADCH)<<8;
    ADCSRA |= (1<<ADSC);
}

Вызов функции bit_is_set(ADCSRA, ADSC) может быть заменена на (ADCSRA & (1<<ADSC)). См. также статью "AVR GCC - операции с битами inp, outp, sbi, cbi, bit_is_set и bit_is_clear".

13. Встроена поддержка битовых констант, что довольно удобно:
void ON_LED (void)
{
    DDRB  |= 0b00000001;
    PORTB |= 0b00000001;
}

void OFF_LED (void)
{
    DDRB  |= 0b00000001;
    PORTB &= ~(0b00000001);
}

Последнее обновление ( 23.03.2010 )