Программатор attiny13 своими руками

Добавил пользователь Skiper
Обновлено: 10.09.2024

Материал собран по интернету, любой желающий может найти самостоятельно множество вариантов схем, плат, программ.

Я выбрал наиболее простой для наколенного исполнения способ и описываю его.

Для начала вам понадобится программа.

Я предлагаю использовать. PonyProg.

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

С этой версией у меня все зашилось. Я специально это проверял при подготовке статьи.

Теперь понадобится программатор

Я использовал так называемые .

Мой макет выглядит так.


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

Схема. У меня микросхема программируется, когда питание на нее идет от 13 ноги DRB-25M, но это не очень хорошо, поэтому питание предлагается брать на USB разъеме. Там гарантированные 5В.

Плата для лазерно-утюжного метода:


Вариант для печати лежит тут.

Для изготовления понадобятся 4 сверла, но можно обойтись и двумя диаметрами

Как работать с ПО

Напомню, дистрибутив есть здесь.

После установки и запуска возникнет такое окно.

Далее программатор сообщит, что надо выполнить калибровку и установить тип адаптера.


Калибровка выполняется автоматически и там показывать нечего.

А вот так надо выставить тип адаптера.


Далее открываем HEX файл.


Жмем кнопку Write Program Memory (пятая слева кнопка)

И радуемся, что микросхема удачно зашилась.


Жмем кнопку Configuration and security bits (Восьмая слева)

Программа считает текущие параметры.

На всякий случай жмем Read.

Выставляем биты как указано и жмем Write.

ВНИМАНИЕ! Не верная установка какого-нибудь бита может привести к тому, что контроллер придется выбросить, или искать профессиональный программатор, для того, чтобы привести его в чувство
Некоторые мои проекты требуют использования 1 вывода процессора, для его использования необходимо зашить бит RSTDISBL, что PonyProg делать не умеет, тут придется воспользоваться CodeVision. Но учите, сделать это можно только один раз. После прошивания этого бита, больше таким программатором стереть/прошить этот контроллер не удастся. В проектах, где это необходимо, я отмечаю об этом специально.


Теперь микросхема зашита и готова к работе. Удачи.

Да, также через такой адаптер можно шить из CodeVision AVR.



Настраиваем тип программатора



Настраиваем, если необходимо




Выставляем настройки программирования и программируем, нажав Programm All



Про EEPROM отвечаем нет


Про RSTDISBL отвечаем да, и после этого чип больше не перепрограммируется этим программатором!


В этом уроке мы рассмотрим загрузку прошивки в ардуино через внешние “программаторы”. Давайте вспомним, о чем уже говорили в одном из первых уроков: загрузка прошивки в Arduino возможна двумя способами:

  • “Напрямую” во flash память микроконтроллера при помощи ISP (In System Programming) внутрисистемного программатора.
  • При помощи загрузчика (bootloader), который живёт в конце Flash памяти МК, принимает программный код по протоколу TTL (UART) и записывает его во Flash память.

Загрузчик (bootloader)

Загрузчик живёт в самом конце Flash памяти МК и позволяет записывать прошивку, отправляемую через UART. Загрузчик стартует при подаче питания на МК, ждёт некоторое время (вдруг кто-то начнёт слать код прошивки по UART), затем передаёт управление основной программе. И так происходит каждый каждый раз при старте МК.

  • Загрузчик позволяет прошивать МК через UART;
  • Загрузчик замедляет запуск МК, т.к. при каждом запуске ждёт некоторое время для потенциальной загрузки прошивки;
  • Загрузчик занимает место во Flash памяти. Стандартный старый для Arduino NANO занимает около 2 кБ, что весьма существенно!
  • Именно загрузчик мигает светодиодом на 13 пине при включении, как индикация работы.

Программатор

Помимо записи прошивки во flash память, программатор позволяет:

  • Считывать содержимое Flash памяти (скачать прошивку на компьютер)
  • Полностью очищать чип от всех данных и настроек
  • Записывать и читать загрузчик
  • Считывать/записывать EEPROM память
  • Читать и настраивать фьюзы (fuses, fuse-bits) и лок биты.

Программатор – ваш единственный друг при работе с “голым” микроконтроллером, то есть для его низкоуровневой настройки и загрузки прошивки.

USB-TTL (UART)

Этот способ реализован прямо на платах Arduino при помощи USB-TTL (USB-UART) преобразователя, именно поэтому мы можем подключить плату к компьютеру и загрузить код. USB-TTL позволяет только загрузку данных во flash, остальные возможности (как у ISP программатора) ему недоступны. В то же время он ограничен только возможностями загрузчика, но в этом уроке мы рассматриваем только стандартные. Также USB-TTL мост позволяет микроконтроллеру общаться с компьютером по последовательному соединению (тот самый Serial и монитор com порта). Есть платы без бортового USB-TTL, например Arduino Pro Mini. Для работы с ними нужно купить внешний USB-TTL преобразователь. Также загрузка прошивки через UART возможна и в “голый” микроконтроллер при условии наличия там загрузчика, который запишет принятый код во flash. Про запись загрузчика мы поговорим ниже. UART “загружатор” подключается к пинам RX и TX Ардуино (или микроконтроллера), RX->TX и TX->RX, также обязательно подключается земля GND. Если у прошиваемой платы нет своего питания, то подключается и питание. Загрузчик отрабатывает при запуске МК, поэтому непосредственно перед загрузкой прошивки МК должен быть сброшен (перезагружен), и для этого на платах USB-UART есть вывод DTR (Data Terminal Ready), который подключается к пину RST Reset и собственно выполняет сброс перед перед загрузкой прошивки. На платах Pro Mini есть отдельный пин DTR.

USB-TTL Arduino
DTR DTR
RX TX
TX RX
GND GND
VCC/5V/3.3V VCC

Китайцы выпускают USB-TTL модули в широком ассортименте, но в целом они все одинаковые по своей сути. Ссылка на результат поиска на aliexpress, и ссылка на все USB-TTL в моём любимом магазине WAVGAT. Что использую я? В основном платку на CP2102. Перед заказом модуля обязательно убедитесь в том, что у него есть выход DTR, иначе этот модуль можно будет использовать только для “общения” с контроллером через COM порт. Для работы с таким преобразователем нужно установить драйвер для чипа, на базе которого собран модуль, это может быть CP2102, CH340/341, FT232, PL2303 и другие. Прошивка загружается как обычно: выбираем порт, на котором сидит преобразователь, версию загрузчика и жмём загрузить, всё! Важный момент: на некоторых китайских версиях плат Arduino Pro Mini не распаян пин DTR, т.е. он не идёт на RST и автоматический сброс перед загрузкой прошивки не выполняется. В этом случае сброс нужно производить вручную, кнопкой RST, непосредственно перед загрузкой прошивки… Загрузка прошивки посредством загрузчика (bootloader) возможна с любого UART устройства, даже через Bluetooth. Но об этом мы поговорим в отдельном уроке.

ISP программатор

USBasp

Дешёвые ISP программаторы также есть в ассортименте у китайцев, рекомендую брать USBasp как самый распространенный. Поискать на алиэкспресс, мне нравится версия в корпусе. USBasp имеет не очень удобный выход 10-пин на шлейфе, поэтому рекомендуется купить также переходник 10-пин на 6-пин, который позволяет сразу подключаться к ISP header’у, который есть на большинстве плат Arduino. Внимание! Очень часто встречается брак в виде непропая контактов, поэтому во избежание проблем рекомендуется пропаять переходник и отмыть флюс (зубная щётка + бензин калоша).


Решение проблем

Решение большинства проблем с загрузкой через программатор (независимо от того, что написано в логе ошибки):

  • Вытащить и обратно вставить usbasp в usb порт
  • Вставить в другой usb порт
  • Переустановить драйвер на usbasp
  • Проверить качество соединения USBasp с МК
  • Перепаять переходник и отмыть флюс

Для прошивки микроконтроллера, тактирующегося низкой частотой (менее 1 МГц внутренний клок):

  • USBasp: на плате есть перемычка JP3, которая включает режим низкой скорости загрузки. В новых версиях прошивки для USBasp скорость выбирается автоматически, но китайцы продают старую версию. Как прошить новую – ищите в интернете.

Основные ошибки в логе Arduino IDE

  • Проверить и сменить USB порт
  • Попытаться переустановить драйвер
  • Проверить пайку USB разъема на плате программатора
  • Проверить наличие и целостность элементов вблизи usb разъема программатора, кварцевый резонатор
  • Возможно программатор криво прошит – при возможности попытаться перепрошить
  • Возможно микроконтроллер на плате программатора – брак или же мертв, попытаться заменить и прошить

avrdude: error: program enable: target doesn't answer. Причина – usbasp не видит подключаемый микроконтроллер

  • Проверить правильность и целостность соединения с МК
  • Попытаться снизить частоту прошивки, джампером или же указав более низкую скорость в среде программирования
  • Проверить пайку разъема 10 pin и переходника 10 pin – 6 pin
  • Возможно прошиваемый микроконтроллер попался с браком, или же мертв.

Arduino as ISP

Почти любая другая плата Arduino может стать ISP программатором, для этого нужно просто загрузить в неё скетч ArduinoISP:

  • Открыть скетч Файл > Примеры > 11. ArduinoISP > ArduinoISP
  • Всё! Ваша Arduino теперь стала ISP программатором
  • Подключаем к ней другую Arduino или голый чип по схеме ниже
  • Выбираем Arduino as ISP в Инструменты > Программатор
  • И можем писать загрузчики, фьюзы или загружать прошивку напрямую во Flash


ISP программатор подключается к четырем пинам микроконтроллера, не считая питания: один из пинов передает сброс, остальные – для передачи данных. Чтобы плата-программатор не сбрасывалась при загрузке, на неё нужно:

  • Либо поставить поставить конденсатор ёмкостью ~10 мкФ между RST и GND (рекомендуется)
  • Либо просто закоротить пины RST и 5V проводом


По использованию других плат Arduino в качестве программатора читай на официальном сайте.

Решение проблем

Для прошивки микроконтроллера, тактирующегося низкой частотой (менее 1 МГц внутренний клок):

  • Arduino ISP: нужно изменить частоту загрузки прошивки в скетче Arduino ISP и снова прошить его в ардуино-программатор (см. строку в скетче 45 и ниже);

Работа в Arduino IDE

Прошивка загрузчика

Из Arduino IDE при помощи ISP программатора мы можем записать другой загрузчик (по факту загрузчик + фьюзы) и загрузить скетч, а также настроить/прошить фьюзы и лок-биты, но не очень удобным способом. Когда мы выбираем плату в Инструменты > Плата и загрузчик в Инструменты > Плата (загрузчик, bootloader), Arduino IDE автоматически делает “активным” нужный загрузчик. Нажимая Инструменты > Записать загрузчик мы прошиваем загрузчик, соответствующий выбранной плате и её настройкам. Также одновременно с загрузчиком прошиваются фьюзы и лок-биты, соответствующие выбранной плате в Arduino IDE. Как и где их поменять, смотрите чуть ниже. Рассмотрим на примере записи загрузчика для atmega328, стоящей на китайской плате Arduino NANO. На данный момент китайцы прошивают в МК старую версию загрузчика, которая называется old bootloader в меню платы. Оригинальные платы идут с более современным загрузчиком, поэтому при работе с китайскими платами нам приходится выбирать old bootloader для загрузки прошивки через бортовой usb порт. Подключим usbasp по схеме выше, выберем его как программатор в Инструменты > Программатор, выберем плату Arduino NANO, загрузчик для atmega328 (первый в списке). Нажмём записать загрузчик. Всё! Теперь плату можно шить через бортовой usb порт, выбирая первый загрузчик. Он кстати легче, быстрее “прошивает” и сама прошивка быстрее “запускается”.

Как убрать загрузчик?

Загрузка скетча

В Arduino IDE можно зашить скетч через программатор, для этого надо нажать Скетч > Загрузить через программатор. Это очень удобно в том случае, когда МК используется без загрузчика, или просто голый МК.

Фьюзы

Конфигуратор платы в Arduino IDE устроен следующим образом: каждой плате в Инструменты > Плата соответствует свой набор настроек, включая фьюзы, которые прошиваются вместе с загрузчиком . Некоторые из них:

  • Загрузчик (путь к файлу)
  • Скорость загрузки (через загрузчик)
  • Объем доступной flash и sram памяти
  • Весь набор фьюзов и лок-биты

Файл конфигурации называется boards.txt и найти его можно в папке с ядром Arduino: C:\Program Files (x86)\Arduino\hardware\arduino\avr\boards.txt. Документацию на boards.txt можно почитать здесь. При желании можно вывести нужные фьюзы через калькулятор (читайте выше), изменить их в boards.txt (главное не запутаться, для какой выбранной конфигурации платы делается изменение) и прошить в МК, нажав Инструменты > Записать загрузчик.

  • Фьюзы подписаны как low/high/extended fuses, можно вставлять полученное в калькуляторе значение.
  • Локбиты работают следующим образом: unlock_bits это локбиты, которые прошьются до записи загрузчика (при нажатии на кнопку Записать загрузчик). А вот после прошивки загрузчика будут автоматически прошиты lock_bits, которые и определят доступ к памяти контроллера во время его работы. Чтобы защитить прошивку от чтения – ставим lock_bits 0x3C.


Такая работа с фьюзами максимально неудобна, но есть и другие варианты:

  • Ядро GyverCore для atmega328, в нем мы сделали кучу готовых настроек фьюзов прямо в настройках платы, читайте в уроке про GyverCore. Несколько загрузчиков, включая вариант без загрузчика, выбор источника тактирования и другие настройки в один клик мышкой.
  • Программа AVRdudeprog, про нее поговорим ниже

Фьюзы (Pro)

Фьюзы (фьюз-биты) являются низкоуровневыми настройками микроконтроллера, которые хранятся в специальном месте в памяти и могут быть изменены только при помощи ISP программатора. Это такие настройки как выбор источника тактирования, размер области памяти под загрузчик, настройка отсечки по напряжению и прочее. Фьюз-биты собраны по 8 штук в байты (т.н. байты конфигурации), как типичный регистр микроконтроллера AVR. Таких байтов может быть несколько, они называются low fuses, high fuses, extended fuses. Для конфигурации байтов рекомендуется использовать калькулятор фьюзов (например, вот такой), в котором просто ставятся галочки на нужных битах, и на выходе получается готовый байт в hex виде. Рассмотрим на примере ATmega328p:


Важный момент: в AVR биты у нас инверсные, то есть 1 это выкл, 0 это вкл. Расставляя галочки в калькуляторе, мы формируем байт, галочка стоит – бит включен, но в результирующем байте включенные биты являются нулями. Об этом стоит задумываться при ручном составлении фьюз-байта, при использовании калькулятора можете об этом даже не вспоминать. Что позволяют настроить биты?

  • CKSEL0–CKSEL3 – выбор источника и частоты тактирования (уточняй в даташите на свой МК, какая конфигурация за что отвечает)
  • SUT0–SUT1 – задержка старта МК после перезагрузки
  • CKOUT – дублирование тактирования на один из пинов (см. в даташите на какой)
  • CKDIV8 – делит тактовую частоту на 8
  • BOOTRST – если включен, МК запускается с загрузчика
  • BOOTSZ0–BOOTSZ1 – задаёт размер сектора загрузчика
  • EESAVE – защита EEPROM от стирания во время выполнения полной очистки чипа
  • WDTON – если включить, то Watchdog будет принудительно включен без возможности отключения
  • SPIEN – опасный бит , при его отключении пропадает возможность прошивки через ISP, и возможность выключить этот бит в том числе*
  • DWEN – вкл/выкл отладочный интерфейс DebugWire. На других моделях бывает и JTAG, и его бит – JTAGEN
  • RSTDISBL – опасный бит , при его включении можно использовать ногу RST как обычный цифровой пин, но пропадает возможность прошивки через ISP и выключить этот бит как следствие*
  • BODLEVEL0–BODLEVEL3 – настройка контроля напряжения (МК сбросится при падении ниже установленного напряжения)

* – прошивка возможна при помощи высоковольтного программатора

Лок-биты (Pro)

Лок-биты (lock-bits) позволяют управлять доступом к памяти микроконтроллера, что обычно используется для защиты устройства от копирования. Лок-биты собраны опять же в конфигурационный лок-байт, который содержит: BOOTLOCK01, BOOTLOCK02, BOOTLOCK11, BOOTLOCK12, LOCKBIT1, LOCKBIT2 (для ATmega328). Калькулятор лок-битов можно использовать этот. BOOTLOCK биты позволяют запретить самому МК запись (самопрограммирование) во flash память (область программы и область загрузчика)


А вот локбиты LOCKBIT позволяют запретить запись и чтение flash и EEPROM памяти извне, при помощи программатора, т.е. полностью защитить прошивку от скачивания и копирования:


Таким образом включив LOCKBIT1 (лок-байт будет 0x3E) мы запретим внешнюю запись во Flash и EEPROM память, т.е. при помощи ISP программатора, а включив LOCKBIT1 и LOCKBIT2 (лок-байт: 0x3C) полностью заблокируем заодно и чтение данных из памяти микроконтроллера. Повторюсь, всё описанное выше относится к ATmega328p, для других моделей МК читайте в соответствующих даташитах.

Avrdudeprog

  • Чтение/запись/очистка flash памяти
  • Чтение/запись/очистка eeprom памяти
  • Полная очистка чипа
  • Калькулятор фьюзов и локбитов (чтение/запись)


Более подробный обзор на avrdudeprog можно посмотреть здесь . Давайте посмотрим на калькулятор фьюзов. Выбираем свой микроконтроллер и программатор (можно добавить другие модели микроконтроллеров и программаторов, читай тут). Переходим во вкладку Fuses, нажимаем прочитать. При успешном чтении увидим текущий набор настроек своего чипа. Можно их поменять и загрузить. Важно! Галку инверсные биты не трогаем! Лок-биты и отключение RST заблокирует микроконтроллер, не трогайте их, если такой цели нет! Можно загружать прошивку или загрузчик из .hex файла, указав путь к ней на первой вкладке в окне Flash. Очень удобная утилита для низкоуровневой работы с МК.

Видео


Откройте Arduino IDE -> Файл -> Примеры -> ArduinoISP -> ArduinoISP и загрузите в Arduino.

Перевод Ардуино в программатор AVRISP

2. Установка платы для ATtiny13 в IDE Arduino

Для установки платы в Arduino IDE откройте Arduino IDE -> Файл -> Настройки, перейдите к URL-адресам Дополнительные ссылки для Менеджера плат и вставьте нижеприведенную ссылку:

Затем нажмите ОК

Установка платы для ATtiny13 в IDE Arduino


Рад приветствовать вновь всех посетителей этого славного места в интернете, чтобы привнести еще один скромный вклад.

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


Речь пойдет о программной реализации UART, для микроконтроллеров AVR компании Atmel, интеллектуальной собственностью которой с некоторых пор владеет компания Microchip.

Итак, следуя традиции, присказка

Мысль в голове на тему этой статьи закралась давно, благодаря одному спору в комментариях, что, мол: программный UART для микроконтроллера, работающего от внутреннего генератора, очень нестабильный, и на нем нельзя получить высокой точности на скоростях выше 9600 бод, ввиду сильного дрейфа задающей частоты этого самого внутреннего генератора.
И вот однажды, мне вновь захотелось проверить этот тезис (к сожалению я не смог найти ни статьи, где это обсуждалось, ни обсуждения. Хотя я уверен, что это происходило здесь, на Хабре), узнать:

  • На какую величину я смогу сократить погрешность;
  • На какой максимальной скорости передачи устройство сможет общаться;
  • Смогу ли я сжать код, используя все свои знания.

И вызов был принят…


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

Конечно же я сел писать в своей любимой IDE — Atmel Studio. В первоначальном варианте код тела функции (на инлайновом ассемблере) занял около 90 байт (45 команд), благодаря которой я выставил константы задержек, протестировав выполнение в симуляторе Proteus.

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

Собирался с мыслями я долго.

Не давала покоя одна главная мысль: раз уж я решил отказаться от прерываний таймера в передатчике, было бы неплохо построить на этом же принципе и приёмник… но как?!
И я решился на отчаянный шаг: написать обработчик прерывания таким образом, чтобы весь приём происходил в один вызов.

Да, это плохая практика, и да — это непристойное поведение! Но во-первых, объемы памяти микроконтроллера не позволяют хранить большой буфер, это накладно для основного кода, а во-вторых, я решил написать обработчик так, чтобы он умел обрабатывать:

  • Переполнение буфера (реализовано выходом из прерывания при достижении границы);
  • Разрыв линии приема (тестовая эмуляция в Proteus, показала полное зависание, в результате чего было принято решение о контроле такого состояния);
  • И, собственно, штатное поведение (с заполнением флага успешного приёма данных);


Один микроконтроллер выполнял передачу заранее заданного буфера с тестовым содержимым:


… На утро

… Так это же успех.

Действительно, вероятность ошибки оказалось на несколько порядков ниже, и я списал это на высокую точность симуляции Proteus.

Пересмотрев код приёмника и передатчика еще раз, я вновь сократил передатчик до 60 байт (30 команд), и оптимизировал приёмник.

После чего передал код @Byte_kgd, который пламенно захотел поучаствовать в тестировании, с небольшим отступлением: в наличие имеется только ATtiny2313.

И он мне злорадно и пафосно сообщил: "… сафсем ниработаит! ваапще. "


Вот так фиаско, братан.

… Настал новый год, съеден весь оливье, выпито все шампанское, вот уже горят ёлки за окном.
А код все не работает… не поддается, ни в какую!

И наконец до меня доходит, что в коде нужно половину перечеркнуть, половину переписать, а третью половину нужно вывернуть наизнанку.

И тут Остапа понесло! (с) И. Ильф Е. Петров.

Во-первых код передатчика был сокращен до 54-ёх байт (26 команд), во-вторых была устранена фатальная ошибка прерывания: несброшенный флаг (при этом Proteus переварил его, даже не сообщив в лог. И это уже вторая неточность в симуляции, которую я нашёл для МК ATtiny13A), в третьих и четвёртых — были устранены ошибки архитектурного характера, такие как: неправильный возврат флага, джитер, несоответствие длительностей передачи и приёма и т.д. Код приёмника был переписан с самосинхронизацией по STOP-биту, что несомненно повысило качество приёма.

Кроме того, я наконец достал логический анализатор, расчехлил программатор, UART-преобразователь, и достав драгоценную ATtiny13A из своих закромов, решил ВПЕРВЫЕ за всё это время, проанализировать работоспособность в железе!

Забегая вперед скажу: ЧУДО ПРОИЗОШЛО!


А так же, позволило найти теоретический предел для максимальной скорости передачи в нормальных условиях:


Я умышленно не стал выбирать другой скрин, показав ошибки приемника, который не смог работать на таких скоростях, ввиду того, что выполнение пролога и эпилога в заклинании прерывании, успевают пропустить стартовый бит. Однако в несколько измененной версии, я смог добиться уверенного приема на скорости 512 кбод, но ввиду объективных причин, решил оставить код таким как есть, с ограничением на приём/передачу в 250 кбод.

В результате проделанной, весьма изнурительной работы,

  • Получился самый компактный код в мире!
  • Не использующий немаскируемые (INT0 и INT1) прерывания
  • Не использующий прерывания таймера, освобождая все доступные для использования каналы ШИМ
  • Позволяющий гибко оперировать настройкой порта, выбирая нужные пины для линий отправки и приёма данных
  • Позволяющий стабильно передавать и принимать данные на скоростях от 9600 до 250000 бод
  • Передавать строки из флэш-памяти, благодаря соответствующей функции
  • Конвертировать и передавать данные в двоичном, hex-, и десятичном виде (для последнего реализованы две функции для передачи байт и слов данных), благодаря соответствующим функциям

Таким образом микроконтроллер вновь уходит в прерывание и затирает принятый буфер новыми данными. Чтобы этого избежать, не нужно его кормить порциями данных, большей длины, чем определенный размер буфера. На этом было решено остановиться, после нескольких обсуждений, чтобы не раздувать код обработчика. Главное условие выполнено — микроконтроллер не зависает и продолжает работу в штатном режиме.

Еще одним отступлением от традиций в этот раз, стало отсутствие выдержек кода в виде скриншотов. В прошлой статье в первом же комментарии был на эту тему гнев :)
А раз так, то пусть код лежит на Githab'е, и как следствие, отображает всю красоту в не форматированном им виде:

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

Желаю скорейшего наступления тепла, в ваши дома, на ваши улицы и в ваши сердца!
Всем успехов, творений, свершений!

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

Ну вот и пришло время нам соорудить USB программатор. Я долго не мог определиться какой бы программатор нам собрать. Выбирал по критериям простоты конструкции и удобства работы с ними, но ничего не нравилось. Выбрать программатор помог случай. Вернее я его не выбирал вообще – я его случайно собрал сам того не подозревая!

А дело было так. Некоторое количество постов назад мы собрали преобразователь USB to UART на ATtiny2313 (а в прошлой статье мы даже улучшили печатную плату). Еще при выборе схемы преобразователя я планировал на его базе (при помощи заливки различных прошивок) получать устройства различного назначения. Тогда я не подозревал, что данный преобразователь можно использовать шире, чем я планировал. Увидев схему USB программатора – USBtiny на ATtiny2313 я понял, что я уже имею готовый программатор!

Посмотрев на схему, сделанного ранее, преобразователя USB to UART (домашняя страничка )


и схему USB программатора USBTiny


можно увидеть, что это одна и та-же схема. Различия незначительны – отсутствуют сигнальные светодиоды и несколько резисторов. Для того, чтобы преобразователь стал USB программатором нужно просто прошить микроконтроллер новой прошивкой и сделать кабель для подключения.

Теперь все по порядку.
1 Для начала нужно собрать преобразователь (это если Вы его еще не собрали).
Вот рисунок печатной платы преобразователя:
T2313-SMD-2 v2.0 - Рисунок печатной платы UART-USB на ATtiny2313
Для того, чтобы обеспечить все необходимые сигналы для программирования впаиваем защитные резисторы номиналом по 100 Ом в линии ножек 12, 16, 17, 18, 19 (номинал не критичен – можно варьировать).



2 Теперь нужно прошить микроконтроллер.
Линии для программатора выведены на общий разъем платы (кроме сброса – стоит отдельно).



usbtinyisp-T2313.hex v1.04 - Прошивка USBtiny программатора для ATtiny2313
T2313-FuseBit - Фьюз-биты ATtiny2313 для USBtiny
Для Algorithm Builder и UniProf галочки ставятся как на картинке.
Для PonyProg, AVR Studio, SinaProg галочки ставяться инверсно.

3 Далее нам нужен шлейф для того, чтобы соединить программируемое устройство с нашим программатором. Все линии, необходимые для программирования находятся на одном разъеме.



Схема шлейфа проста.



Из особенностей – я вынес индикаторный светодиод и балластный резистор для него за плату на разъем – это для того, чтобы плату без перепайки можно было использовать для других устройств (ну и так прикольней – светодиод мигает прямо в разъеме ). Кроме того, линия Vcc отделена от общего разъема – это на случай если программируемое устройство запитывается не от USB, а от своего источника (что, в принципе, желательно). Сигнальные линии (SCK, MISO, MOSI) желательно экранировать (например чередованием сигнальных и земляных линий в шлейфе). Длину шлейфа не стоит делать большой – до 50 см, не больше. Если нужно программировать удаленное устройство всегда можно применить USB удлинитель – так надежней. Вот мой готовый шнурок:



4 Сам программатор готов, теперь нужно установить драйвер для того, чтобы Винда смогла с ним работать (для Mac OS X & Linux, вродь-как, драйвера вообще не нужно). Тут все просто:

4.1 Скачиваем драйвер, разархивируем его.
usbtinyisp w32 driver v1.12 - Win драйвер для USBtiny программатора
Если у Вас Винда 64 битная, Vista или Windows 7 нужно установить другой драйвер:
usbtinyisp_libusb-win32_1.2.1.0.zip - Драйвер USBtiny для х64, Vista или Windows 7



4.2 Вставляем наш программатор в USB порт.

4.4 Запустится мастер нового оборудования







Винда увидела новое устройство и готова с ним работать.

USBtiny программатор поддерживается AVRDude, а это значит, что многие среды программирования будут с ним работать без проблем. Еще одним достоинством работы с AVRDude является то, что для работы с AVRDude существует множество оболочек GUI из которых можно выбрать подходящую именно для Вас (но об этом в следующей статье).

ДОПОЛНЕНИЯ.
1 Дмитрий Шпак сделал довольно удачную разводку программатора. Программатор получился небольшого размера, имеет стандартный разъем для программирования и, я считаю, будет удобен в работе. Плата двусторонняя.

USBtiny.lay - Разводка USBtiny от Дмитрия Шпака

2 Еще один вариант разводки от Андрея Баранова (Andru_48)





USBtiny.lay - Разводка USBtiny от Андрея Баранова

3 Вариант от mebadboy
Доброе время суток.
Новую печатку я не собирал. Я просто исправил старую - Дмитрий Шпак . Там минимум исправлений – одну дорожку перерезать, кинуть проводок, впаять резистор и диод впаять в другое место.
USB-tiny-mebadboy - Печатка USBtiny от mebadboy
Вот лог dmesg при подключении под linux:
usb 4-2: new low speed USB device using uhci_hcd and address 2
usb 4-2: New USB device found, idVendor=1781, idProduct=0c9f
usb 4-2: New USB device strings: Mfr=0, Product=2, SerialNumber=0
usb 4-2: Product: USBtiny

Читайте также: