Некоторые комментарии к AVRStudio:
- В случае неправильной работы AVRStudio с WinAVR (аварийный выход, зависание и т.п.) в первую очередь обратить внимание на версии AVRStudio и WinAVR.
- Части программы можно компилировать раздельно, прямо как модули в Pascal-e. Чтобы собрать программу из разных частей, надо или иметь готовые объектные файлы частей, или добавить исходные тексты частей в проект. AVR Studio сама сформирует необходимый make файл. Имена переменных в одной части могут совпадать c именами в другой части и это даже не дает ошибки линковщика. Главное, чтобы в заголовочных файлах были разные, т.к. с помощью директивы препроцессора #include они объединяются в один файл. Для больших проектов исходные тексты можно размещать даже в разных каталогах. Для удобства пользования директивой #include, можно в make-файле или настройках проекта указать Include Directories. Важную, но до конца не изученную мною роль в правильной сборке играют ключи CFLAGS += -D AVRGCC.
- AVRStudio 4.13 не правильно считает время передачи USART на удвоенной скорости – завышает в 2 раза.
-
WinAVR жестко придерживается стандарта ANSI С, поэтому такая широко распространённая в программах для микроконтроллеров операция как доступ к отдельным битам регистра, выполняется не так удобно, как в IAR. Нет специальной операции sbit. Приходится использовать логические операции. Но это совсем не
страшно.Установить бит: Сбросить бит: Проверить бит: reg |= (1<<bit) reg &= ~(1<<bit) reg & (1<<bit)
Во время компиляции при установленном уровне оптимизации -Os, WinAVR преобразует конструкции в одну ассемблерную команду sbi или cbi. Приведенные выше выражения совсем необязательно записывать каждый раз или делать из них функцию, можно воспользоваться препроцессором и представить их в качестве псевдофункций-макросов:
#define sbi(reg, bit) reg |= (1<<bit) #define сbi(reg, bit) reg &= ~(1<<bit) #define ckbi(reg, bit) reg & (1<<bit)
В исходном тексте такие конструкции будут выглядеть прямо как настоящие функции, повышая наглядность программы, перед компиляций препроцессор заменит их на выражения, повышая скорость работы (компилятору не придется делать оформление функции и передавать ей параметры), а в процессе компиляции компилятор выполнит оптимизацию и заменит их на соотвествующие ассемблерные команды. Таким образом и овцы целы (стандарт соблюден, есть наглядность программы) и волки сыты (операции выполняются с максимально высокой скоростью). И нет необходимости использовать ассемблерные вставки.
-
Для процессоров ATMega есть сторонняя библиотека AVRlib. Не путать с AVR libs! AVR libs поставляется вместе с WinAVR и содержит стандартные функции, присущие языку C. На сайте http://avr-libc.narod.ru/ можно ознакомится с переводом документации к этой библиотеке.
AVRlib может помочь быстро освоить периферию процессора. Для процессоров ATxMega, ATMEL позаботилась сама и выложила бесплатно на сайне прекрасную коллекцию примеров с соответсвующими библиотеками.
Для использования библиотеки AVRlib необходимо использовать внешний makefile (файл с инструкциями для компилятора). Project -> Configuration Options -> Use External Makefile. В качестве сходного makefile взять любой makefile из примеров (Examples). Достаточно изменить тип процессора и имя проекта.
Библиотека хороша для проектов, в которых не требуется высокого быстродействия и некритичен размер прошивки. Для диктофона не пригодна 🙁 -
Основная особенность работы с портами в том, что с каждым портом связано 3 регистра:
PORTx - управление выходом порта или подтягивающим резистором (0 - резистор выключен, 1 - резистор подключен) DDRx - управление направлением (0 - вход, 1 - выход) PINx - состояние ножек порта.
- Небольшая неточность в книге А.В.Евстифеев Микроконтроллеры AVR семеств Tiny и Mega фирмы ATMEL (очень хорошая книга, представляет из себя практически перевод DataSheet, но неточности есть и в ней). На стр. 291 сказано, что в режиме CTC (сброс при совпадении) устанавливается флаг прерывания TOV (происходит прерывание по переполнению). На самом деле устанавливается флаг OCFA или ICF (происходит прерывание по совпадению).
-
В памяти у числа, состоящего из нескольких байт, первым идет старший байт. Так на PC, также и в AVRStudio. Числа в двоичном виде из AVR можно напрямую использовать на PC. Но лучше пользоваться констукцией вида:
На передающей стороне (передается 32-х разрядное целое число a): putchar(a>>24); //старший байт putchar(a>>16); putchar(a>>8); putchar(a); //младший байт На принимающей стороне a = getchar(); a <<= 8; a |= getchar(); a <<= 8; a |= getchar(); a <<= 8; a |= getchar();
Такая конструкция более наглядна, аппаратно независима. А операции сдвига компилятор при оптимизации заменит на указатели.
- В WinAVR как и на компьтере можно использовать числа с плавающей запятой. Для этого достаточно объявить соотвествующую переменную как float (будет использоваться для хранения мантиссы вместе с порядком 2 байта) или double (4 байта). Но, чтобы компилятор мог задействовать аппаратные средства ускорения, надо подключить библиотеку libm.a: Project -> Configuration Options -> Libraries -> libm.a -> Add Object. Если требуется использовать форматированный вывод, то надо подлючить еще libprintf_flt.a, а также в опции линковщика добавить строку “-Wl,-u,vfprintf”: Project -> Configuration Options -> Custom Options -> [Linker Options] -> “-Wl,-u,vfprintf” без кавычек -> Add. Если требуется использовать форматированный ввод, то надо добавить libscanf_flt.a и “-Wl,-u,vfscanf”.