Робимо isp-програматор з arduino

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

Але в цій статті ми не будемо розглядати збірку і пайку програматора з нуля, а скористаємося можливостями Arduino. Справа в тому, що на більшості плат Arduino до версії Uno є мікросхема FT232RL компанії FTDI.

Робимо isp-програматор з arduino

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

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

Робимо isp-програматор з arduino

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

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

Робимо isp-програматор з arduino

Якщо на вашій платі тільки контактні площадки для X3, потрібно буде припаяти шматок PLS-гребінки самим.

Піни цього роз'єму мають таке призначення для ISP-програматора:
  • 1 (CTS) - MISO
  • 2 (DSR) - SCK
  • 3 (DCD) - MOSI
  • 4 (RI) - RESET
А у CraftDuino замість X3 є стандартний роз'єм RS232, теж з'єднаний з FT232RL, з якого нам потрібні ті ж 4 виведення:

Робимо isp-програматор з arduino

  • 1 (CD) - MOSI
  • 6 (DSR) - SCK
  • 8 (CTS) - MISO
  • 9 (RI) - RESET
Пораскінув мізками, зробимо кабель для нашого імпровізованого ISP-програматора:

Робимо isp-програматор з arduino

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

Робимо isp-програматор з arduino

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

Робимо isp-програматор з arduino


Якщо ви працюєте в 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, на жаль, не існує.

    Робимо isp-програматор з arduino

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

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

    Робимо isp-програматор з arduino

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

    Робимо isp-програматор з arduino

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

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

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

    Робимо isp-програматор з arduino

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

    Робимо isp-програматор з arduino

    Робимо isp-програматор з arduino

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

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

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