суббота, 31 октября 2015 г.

Настройка среды программирования AVR МК

Последнее время всё чаще мне приходится программировать контроллеры. Я ничего не имею против Arduino IDE для простых проектиков (а только такими я и занимаюсь), но всё-таки привык я к полноценным IDE, да и Wiring мне скорее мешает, чем помогает.

Эта статья - моя память, как я настраивал среду для программирования AVR-микроконтроллеров и как я прошивал ATtiny13 без программатора. Ну почти без...
Всё внутри - кроссплатформенное, хоть я буду писать и про Ubuntu.

Тезисно:
  1. Собираем из Arduino UNO программатор.
  2. Ставим пакеты для работы с AVR.
  3. Ставим Eclipse.
  4. Ставим на него AVR Eclipse Plugin.
  5. Пишем программу-моргалку ("Hello world!" по-AVR-ски) и прошиваем ATtiny13 прямо из Eclipse.

Собираем из Arduino UNO программатор

Этот кусок по большей части взят из предыдущего поста. Устанавливаем и запускаем Arduino IDE. В отличие от предыдущего поста не важно какой версии, так что лучше поставить самую свежую. Сейчас у меня установлена версия 1.6.5-r5. Далее в IDE:
  1. Убеждаемся, что:
    • Tools => Board => Arduino UNO,
    • Tools => Serial Port => что-то там,
    • Tools => Programmer => AVRISP mkll
  2. Открываем скетч программатора: File => Examples => ArduinoISP. Он входит в состав Arduino IDE.
  3. Загружаем ArduinoISP в Arduino UNO.
Теперь подключаем к новоявленному программатору ATtiny. Для этого нам понадобится:
  • ATtiny13 - собственно, его и программируем. Мой - ATtiny13A-PU (см. datasheet). PU - это DIP-корпус.
  • Breadboard.
  • Провода для breadboard.
  • Конденсатор 10 мкФ или больше.
  • Для проверки наших трудов на скетче blink из Arduino IDE дополнительно понадобятся светодиод и резистор 250 Ом к нему.

Собираем вот такую схему:

Конденсатор предотвращает автоматический перезапуск микроконтроллера после заливки нового скетча.
Резистор и светодиод для программирования ATtiny13 не нужны. Они понадобятся только для демонстрации результата на примере скетча blink.

Ставим пакеты для работы с AVR

Вот здесь написано про все платформы, я же на Ubuntu, делал это так:
sudo apt-get install gcc-avr binutils-avr gdb-avr avr-libc avrdude

Ставим Eclipse

Вообще-то у меня уже был установлен старичок Eclipse Kepler. Вот ссылка где раздают Эклипсы.

Ставим AVR Eclipse Plugin

В меню Eclipse: Help => Eclipse Marketplace...
Находим и ставим AVR Eclipse Plugin. Зачем я это пишу? Потому что программист и не могу пропустить шаг.

После перезапуска Eclipse открываем Window => Preferences.
Тут появилась группа настроек "AVR". Надо добавить конфигурацию для программатора:
AVR => AVRDude, раздел "Programmer configurations", кнопка "Add...".

Назовём конфигурацию, скажем, "ArduinoProgrammer". Если у вас, как и у меня, нет программатора, но есть контроллер Arduino, в списке "Programmer Hardware" выбираем "Atmel AVR ISP". В поле "Override default port" указываем порт, к которому будет подключен Arduino. И задаём скорость 19200 в поле "Override default baudrate".

Пишем программу-моргалку и заливаем её в МК

  1. В Eclipse меню File => New => C Project.
    • Project name: blink
    • Project type: AVR Cross Target Application => Empty Project
  2. Next
  3. Тут можно обойтись без Debug-конфигурации, Next.
    • MCU Type: ATtiny13
    • MCU Frequency (Hz): 9600000
  4. В проекте blink добавляем Source File "main.c"
  5. Текст файла:

    #include <avr/io.h>
    #include <util/delay.h>
    
    int main(void) {
     // Пин 4 настраиваем на вывод:
     DDRB = 1<<PB4;
     while(1) {
      // Чередуем значение, выводимое в пин 4:
      PORTB ^= 1<<PB4;
      // Пауза 1 секунда:
      _delay_ms(1000);
     }
    }
    
    
  6. Выбираем конфигурацию программатора в свойствах проекта:
    • меню Project => Properties
    • AVR / AVR Dude
    • Во вкладке "Programmer" в поле "Programmer Configuration" выбрать нашу ранее созданную конфигурацию "ArduinoProgrammer".
    • OK
  7. Сохраняем проект.
  8. Собираем проект: Build 'Release' for project 'blink'.
  9. Прошиваем МК: Upload current project to Atmel target MCU.
  10. Светодиод на breadboard должен замигать.