Робимо isp-програматор з arduino - експонента

Думаю, ні для кого не секрет, що спочатку програму в мікроконтролер заливають за допомогою спеціального пристрою - програматора. Звичайно, ардуінщікам зазвичай не потрібно про це турбуватися - у них є bootloader (завантажувач), заздалегідь прошитий в мікроконтролер, і прошивку він забирає по UART через COM-порт або через USB. Але щоб прошити цей завантажувач або іншу прошивку в «чистий» МК, потрібен програматор.

Але в цій статті ми не будемо розглядати збірку і пайку програматора з нуля, а скористаємося можливостями Arduino. Справа в тому, що на більшості плат Arduino до версії Uno є мікросхема FT232RL компанії FTDI.
Ця мікросхема є конвертор UART-> USB, надаючи операційній системі віртуальний COM-порт, який працює через USB. Але в даному випадку нам потрібна інша її можливість - управління окремими висновками мікросхеми, іменоване режимом bit-bang, яке дозволяє «загорнути» довільний протокол в USB. Завдання полягає в тому, загорнути в USB протокол прошивки МК.

Мікроконтролери AVR, використовувані в Arduino, прошиваються по вже знайомому нам протоколу SPI через роз'єм для внутрисхемного програмування - ISP (I n-S ystem P rogramming). Він так називається тому, що дозволяє прошивати МК прямо в кінцевому пристрої. Ось як виглядає цей роз'єм на платі CraftDuino:

MISO, MOSI, SCK, RESET - це все лінії шини SPI, тільки замість SS - RESET.

Але нам ще потрібен доступ висновків FT232RL, через які буде здійснюватися прошивка, і розробники Arduino подбали про це, зробивши роз'єм X3 (ікс-три):
Якщо на вашій платі тільки контактні площадки для X3, потрібно буде припаяти шматок PLS-гребінки самим.

Піни цього роз'єму мають таке призначення для ISP-програматора:

А у CraftDuino замість X3 є стандартний роз'єм RS232, теж з'єднаний з FT232RL, з якого нам потрібні ті ж 4 виведення:

  • 1 (CD) - MOSI
  • 6 (DSR) - SCK
  • 8 (CTS) - MISO
  • 9 (RI) - RESET

Пораскінув мізками, зробимо кабель для нашого імпровізованого ISP-програматора:
З одного кінця кабелю - роз'єми для Arduino X3 / CraftDuino UART, і для харчування:

А з іншого кінця - стандартний роз'єм ISP:

Зазвичай для прошивки AVR використовується популярна утиліта avrdude. яка підтримує безліч різних програматорів і моделей МК, її використовує навіть серед Arduino IDE для заливки скетчу. Для цієї утиліти є патч, що дозволяє прошивати МК через мікросхему FT232RL, використовуючи режим bit-bang. Знайшлися добрі люди, які вже пропатчити Windows-версію avrdude для роботи з bit-bang-програматором на базі цієї мікросхеми, а я зробив те ж і для Linux:

  • Патчений версія 5.3.1 для Windows.
  • Версія 5.10, deb-пакет для Linux i386 і amd64 (x86_64).
  • Архів вихідних текстів версії 5.10, бібліотекою libftd2xx-1.0.4 з офіційного сайту FTDI і правління Makefile.in і avrdude.conf. щоб все це збиралося, коректно встановлювалося і працювало. Перевіряв тільки на Ubuntu 11.04 (i386 і amd64).

Якщо ви працюєте в Linux, доведеться зробити ще кілька дій (FTDI нас любить):

  • Вбити драйвер ftdi_sio. який заважає avrdude відкрити COM-порт FTDI:

Якщо хочете, можете занести цей модуль ядра в чорний список, внісши в /etc/modprobe.d/blacklist.conf рядок:

Тільки майте на увазі, що для роботи з віртуальним портом / dev / ttyUSB0 і т.п. (Потрібно Arduino IDE) цей модуль повинен бути запущений. Це можна робити командою

  • За замовчуванням, система при спробі avrdude відкрити віртуальний COM-порт FTDI покаже йому дулю, а він вам - не дуже інформативне повідомлення про помилку. Потрібно дати собі права на повний доступ до віртуальних COM-портів, створивши в /etc/udev/rules.d/ файлик з ім'ям 80-ftdi.rules такого змісту:

    USB Vendor ID і Product ID можна для вірності уточнити командою lsusb. якщо Arduino підключена до комп'ютера:

    Потім потрібно створити групу ftdi-user і додати себе в неї:

    після чого потрібно перелогініться.

    Ну і, щоб служба udev дізналася про зміни, потрібно або перезавантажити комп, або викликати

    У статті про програмування AVR на C товариш noonv вже описав. як користуватися avrdude. а я опишу лише заливку завантажувача на Arduino Diecimila з ATmega168:

    1. Встановлюємо необхідні для швидкої прошивки завантажувача fuse-біти: кварц> 8 МГц, вбудований дільник на 8 вимкнений:
    2. Заливаємо завантажувач:

    Але консоль не завжди краще гуя, особливо для завдання fuse-бітів, і є набагато більш зручний і надійний спосіб - скористатися програмою SinaProg, розробленої іранськими програмістами. Їх сайт давно здох, зате програма живе і процвітає і до цього дня. Про її налаштування докладно написано у Di Halt'а, ну а ми не будемо втрачати часу і візьмемо готову налаштовану збірку з пропатченний avrdude (в збірці Di Halt'а помилка в одному з конфігов). Версії під Linux, на жаль, не існує.

    У секції Hex file вибирається hex-файл, який потрібно залити або вважати. Записувати і зчитувати можна як пам'ять програм (Flash), так і незалежну (EEPROM). У секції Device потрібно вказати конкретний МК, в секції Programmer - програматор (у нас це ftbb), порт (FTDI0) і швидкість порту (9600).

    Ну і те, заради чого варто користуватися цією програмою - секція Fuses. У списку можна вибрати зумовлені конфігурації fuse-бітів, які задаються в Fuse.txt. Але найголовніше відкривається нашому погляду після натискання кнопки Advanced:

    Тут можна набивати fuse-байти вручну, а можна натискати на кнопки «C» поруч із значенням байтів і виставляти фьюз тикання галочок з описами. Для заливки завантажувача спочатку натиснемо кнопку Read. щоб вважати поточні значення fuse, а потім налаштуємо Low fuse. частота кварцу - більше 8 МГц, час старту МК - 65 мс, дільник на 8 вимкнений:

    Після настройки тиснемо кнопку Write і чекаємо появи напису «Writing Fuses ... OK».

    Тепер можна в головному вікні в секції Hex file вибирати файл завантажувача ATmegaBOOT_168_diecimila.hex і в секції Flash жати кнопку Program. Якщо в процесі будуть виникати помилки, то над індикатором прогресу є кнопка «>», що відкриває збоку у вікні лог роботи avrdude.

    А давайте-ка прошьyoм який-небудь інший МК - наприклад, ATtiny13.

    Поставимо МК на макетке, подсоединим до неї все лінії роз'єму ISP від ​​нашого bit-bang-програматора, причепимо світлодіод через резистор на 500 Ом до 3-й ніжці (DB4) і підтягнемо RESET до харчування резистором на 10 кОм:

    Робимо hex-файл прошивки:

    Перевтикаем Arduino в USB і спостерігаємо мигання світлодіода за умови, що немає помилок підключення (:

    Ось так, шляхом нехитрих маніпуляцій руками і мізками, можна зробити собі USB ISP-програматор, так що не потрібно паритися з відсутністю LPT на сучасних комп'ютерах і COM-порту майже на будь-якому ноутбуці - вже USB-то є скрізь.

    За матеріалами, здається, робокрафт.ру