Микроконтроллеры Atmel AVR, с чего начать?

Intro

Заметка написана после того, как я потерял массу времени в поисках информации о том, как быстро начать работать с AVR, на какие грабли можно наступить и все прочее. Информации в сети как всегда куча, но много воды, советы часто взаимоисключающие и пр. Поэтому и родился вот такой краткий конспект.

Схемотехника

Выходные линии контроллеров AVR при логическом нуле тянут гораздо больший ток, поэтому прямой смысл сделать активным уровнем низкий, например светодиоды на +5 через резистор, а не наоборот и.т.д.

Неочевидно, но не все выходы портов доступны сразу после программирования flash. Например выводы могут быть задействованы под JTAG интерфейс и при чтении/записи ничего не будет происходить. Все это лечится правильной установкой FUSE битов.

Если есть FUSE'ы BODLEVEL0/1/?, то при работе с EEPROM их нужно запрограммировать на соответствующее напряжение. В этом случае при пропадании питания ничего в EEPROM не изгадится.

Очень полезно использовать UART для связи с компьютером. Цена вопроса - одна дополнительная микросхема MAX232 и четыре конденсатора, а при отладке возможность печатать что-то в порт очень экономит время.

При расчете необходимого размера flash всегда умножайте на 2. RISC код не очень компактный, кроме того AVR работает со словами, а не байтами и указанные 16 Kбайт превращаются в 8 Кслов, что более правдоподобно.

Средства разработки

Мне показалось неразумным тратить время на изучение еще одного ассемблера, поэтому все инструменты, которые не поддерживают программирование на Си я не рассматривал. В сухом остатке:

  • GCC AVR. Open source C/C++ компилятор, линковщик и все прочее. Все работает, но все более-менее сложные библиотечные функции нужно писать самостоятельно, готового кот наплакал.
  • AVR Studio. Какая-никакая, но уже среда разработки, окошки, менюшки. Бесплатная, но опять же замаешься без готовых библиотек. Может использовать компилятор AVR-GCC.
  • IAR Embedded Workbench for AVR. С/С++. Платный. Мне этот пакет показался тяжеловатым, да и некогда вдумчиво вкуривать документацию. Возможно стоит присмотреться, если планируется постоянная работа с AVR.
  • CodeVision AVR. С без ++. Платный, но работает без лицензии для маленьких проектов. Запускается и под Win98, что позволяет гонять где угодно. Есть кодогенератор для инициализации микроконтроллера. Готовые библиотеки тоже есть для разной периферии - LCD, температурные датчики, RTC, файловая система FAT и многое другое. Я остановился на CodeVision AVR.

С и CodeVision AVR

Установка запуск CodeVision AVR не вызывают вопросов.

При создании нового проекта очень удобен CodeWidard, который сам создает код для инициализации контроллера.

Библиотечные функции работают, но я наткнулся на некоторые особенности:

  • delay_ms() сбрасывает WDT. К чему это может привести поясню на таком примере. По прерыванию таймера обслуживается матричная клавиатура, в которой есть вызовы delay_ms(). Если основная программа подвиснет, перезапуска по WDT не будет, прерывания-то работают и WDT регулярно сбрасывается. SPI и 1wire функции работают, но они подразумевают запрет прерывании. Если на прерываниях работают часы и их нежелательно стопорить, то или ставить дополнительную RTC микросхему или ловить конец прерывания и вызывать функции сразу после завершения прерывания.
  • Если в проекте выбран режим компилятора unsigned char, то зделать их signed нельзя, например такой код приведет к вису:
     
      signed char i=100;
      while (i-->=0) { ...
     
     
    Висим, потому что все равно он unsigned и всегда больше или равен 0. Опаньки!

По причине архитектуры AVR указатели могут быть:

  • просто указателями на RAM (если выбрана модель tiny, то такие указатели 8-битные),
  • указателями на flash, 16 бит, например flash char[]
  • указателями на eeprom, 16 бит, например eeprom char[]

Они НЕ кастятся между собой, потому что адресуют разную память и могут быть разного размера, хотя при прямом доступе к памяти компилятор скрывает эти ньюансы.

Указатели могут быть нулевыми. Кто сказал if (ptr == NULL) { ... :)

Вот вкратце и все.

Tags: avr microcontrollers electronic


Назад



[Home] [TTL] [Unix] [Sdictionary] [ROW Programmer] [Symbian] [Misc] [News] [Search] [Contacts] [Guestbook]


Copyright (c) 1999-2017 Alexey Semenoff