Делаем программатор AVRISP MKII за 5 минут

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

На нашем форуме уже была инфа про то, что платы Arduino Leonardo, Micro и ProMicro легко переделываются в программатор AVRISP MKII.  Но никаких подробностей никто не рассказывал, хотя очевидно, что это будет интересно всем.  Мне как раз нужен был программатор для АтмелСтудии, и я на выходных разобрался сам, и результатами хочу поделиться.
Есть такая библиотека "LUFA" для МК с USB на борту, в ней куча примеров работы через USB, один из которых собссно наш программатор. Но есть одна засада, те исходники что выложены не работают с atmega32u4 на котором собраны все вышеупомянутые ардуины. Хотя официально нигде про это не написано.  Но оказывается есть некая подпаченная версия исходников, которая с этим мк работает. Уже не помню, где я её нашёл, главное с ней всё завелось без проблем.
В чём плюсы этого программатора -он умеет шить все AVR, работает в разных программах, а главное в atmel студии и конечно с avrdude.  Правда были какие-то версии avrdude с которыми он не работает, но с последней 6.3 точно работает. Это нужно учитывать. Последний avrdude так же используется в ArduinoIDE 1.6.12 Так что с ним так-же удобно работать, с тиньками можно просто нажимать кнопку "загрузка" без выбора пункта "загрузить через программатор"
Программатор быстрый, и у него нет заморочек с джамперами что б читать медленные МК. Учитывая что дешевая плата промикро стоит сейчас порядка 200 рублей, и кроме неё больше в принципе ничего не нужно -программатор получается ещё и очень дешевым. В общем очевидный конкурент народному программатору USBAsp. На фото -прошивка тини25 ардуиной микро в качестве программатора avrisp mk2

Схема подключения проста:
Все выводы ISP на программаторе  соединяются с одноимёнными на программируемом чипе кроме  Reset,
его нужно подключить на вывод 8 (portb,4). Ещё можно измерять напряжение на программируемом чипе (в атмел студии) для этого вывод А5 (ADC0) подключить к целевому MK, при условии конечно что он питается от своего источника. Иначе будет измеряться напряжение с программатора.

Ардуино MICRO/LEONARDO ЦЕЛЕВОЙ МК
MISO MISO
MOSI MOSI
SCK SCK
pin8 (PB4) Reset
Gnd Gnd
Vcc Vcc
A5 Vcc*

На фото работа с модулем программатора в атмел студии 7.

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

avrdude -v -patmega32u4 -cavr109 -PCOM5 -b57600 -D -Uflash:w:AVRISP_MKII.hex:i
Пути и номер компорта разумеется исправить на свои. Прошивать нужно так: нажать ресет на плате, и после треньков винды "пабабам-пам-пам-пам" выполнить команду. Нужно помнить, что комп-порт бутлоадера доступен секунд 7 после ресета. Я узнал номер порта просто посмотрев лог загрузки блинка в ардуино ide. Для переделки вам понадобится сама прошивка, драйверы из последней библиотеки. Cкачать архив, дрова лежат по пути Projects/AVRISP-MKII/WindowsDriver  Система сама находит программатор, но нужен обязательно правильный драйвер. Корректно установленный программатор выглядит в системе вот так:

 

 

 

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

Выяснил почему не работала прошивка из свежих исходников програматора. На это ушло 2 дня, я уже просто пошёл на принцип. Владельцы Teensy писали что у них всё работает, значит с мк нет проблем, проблема в чём-то ещё. Выяснилось, что на выводе SlaveSelect ISP интерфейса на плате Arduino Micro висит светодиод. А программа делает pull-up этой ноги, но из-за светодиода уровень не дотягивает до лог.1, и поэтому SPI не выходил в готовность. Вписал в исходник пару команд, и проблемы нет. Исправленная часть на всякий случай, файл \lufa-master\LUFA\Drivers\Peripheral\AVR8\SPI_AVR8.h

			
static inline void SPI_Init(const uint8_t SPIOptions)
			{
				/* Prevent high rise times on PB.0 (/SS) from forcing a change to SPI slave mode */
				DDRB  |= (1 << 0) | (1 << 1) | (1 << 2);
				

				
				DDRB  &= ~(1 << 3);
				PORTB |=  (1 << 3) | (1 << 0);

				if (SPIOptions & SPI_USE_DOUBLESPEED)
				  SPSR |= (1 << SPI2X);
				else
				  SPSR &= ~(1 << SPI2X);

				/* Switch /SS to input mode after configuration to allow for forced mode changes */
			//	DDRB &= ~(1 << 0); 

				SPCR  = ((1 << SPE) | SPIOptions);
			}

			/** Turns off the SPI driver, disabling and returning used hardware to their default configuration. */
			static inline void SPI_Disable(void);
			static inline void SPI_Disable(void)
			{
				DDRB  &= ~((1 << 1) | (1 << 2) | (1 << 0));
				PORTB &= ~((1 << 0) | (1 << 3));

				SPCR   = 0;
				SPSR   = 0;
			}

Так что выкладываю прошивку собранную из самого последнего релиза.

 

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

Скомпмилил свежую прошивку для платы промикро. Скачать.  Выяснилось что светодиоды на этой плате включены не как по схеме "к земле", а к плюсу. Соответссно нет всех тех заморочек, о которых я писал во 2м посту.

Светодиоды кстати работают, но они бесполезны, т.к. отображают и без того очевидные вещи:

Оба горят - USB USB interface is enumerating или  interface is busy
Светик около 14 ноги горит -USB interface is ready
Светик около 7 ноги горит USB interface is not ready
Изменил ногу измерения напряжения на А0.

Итого все ноги для этой платы задействованные в качестве ног программатора:
A0 -для измерения напряжения на целевом МК (видно в Атмел студии)
15 -SCK
14-MISO
16-MOSI
8 -к ресету целевого МК
9 -меандр 4 МГц

Так же сделал платку, что б программатор стал более менее цивилизованным . Фотка кликабельна. Сначала хотел буфер 74hc244 на выход поставить, но потом передумал, вполне достаточно токоограничительных резисторов на случай всяких коротышей. Печатка в спринте, вдруг кому пригодится.

 

bodriy2014
bodriy2014 аватар
Offline
Зарегистрирован: 12.05.2015

dimax Спасибо за полезный девайс и то что делитесь наработками.!

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

При измерении напряжения девайс сильно врал из-за того, что запитан был через диод, и вместо 5 вольт реально было порядка 4.6в.  Мелочь вроде, но неприятно. Решил перевести измерение на внутренний ИОН, но потребовалось поставить на вход резисторный делитель. Конечная схема ниже, номинал резисторов в делителе не принципиален, важно что бы оба были одинаковыми, и желательно 1% ными. На остальных ногах номинал резисторов тоже не критичен, чем меньше тем тяжелее будет перенести МК какой нибудь коротыш. Чем больше, тем  сильнее будут скругляться фронты, и следовательно падать надёжность.  100-200 Ом оптимально.

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

И ещё вернул загорание светодиода при чтении/записи, так  интереснее.  Но в авторской версии он не мигает.

  Прошивка.

 

SergeIO
Offline
Зарегистрирован: 09.06.2017

Повторил программатор на базе такой же платы Pro Micro. Спасибо за прошивку из предыдущего поста, всё работает. Windows 10 x64, Arduino 1.8.2, Atmel Studio 7. Из того, с чем столкнулся:

1. "Сходу" не залил прошивку через avrdude. Как выяснилось, для Pro Micro нужно перед загрузкой выполнить двойное нажатие Reset (дважды замкнуть RST и GND) для переключения контроллера в режим bootloader'а. Режим устанавливается на 8 секунд, при этом формируется новый виртуальный COM-порт. С первого раза может не заработать, Windows понадобится время для настройки драйвера. После второй (или третьей, как повезёт) попытки всё должно получиться. Подробности есть на сайте Sparkfun.

2. После загрузки прошивки плата определилась в диспетчере устройств как AVRISP mkII (появилась новая группа Atmel USB Devices). До подключения платы уже была предустановлена Atmel Studio 7, видимо, соответствующий драйвер был загружен вместе с ней.

3. Попытка заменить установленный драйвер на драйвер из проекта LUFA (Projects/AVRISP-MKII/WindowsDriver) к успеху не привела - в указанной папке подходящий драйвер не был найден.

4. При помощи Zadig установленный драйвер был заменён на libusb-win32 (v1.2.6.0).

5. После выполненной замены, обновление драйвера на драйвер из проекта LUFA прошло успешно. Всё работает.

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

P.S. Небольшой вопрос к автору проекта. Обратил внимание, что измерение напряжения происходит некорректно. На контактах А0...А3 присутствует потенциал, стремящийся к напряжению питания (зависит от входного сопротивления измерительного прибора). В результате резистивный делитель, подключенный к А0, не даёт значения, равного половине питающего напряжения, итоговое значение завышено. В каком режиме работают аналоговые интерфейсы платы? Возможно, проблема в этом (цитата из datasheet на 32U4): Port F serves as analog inputs to the A/D Converter. ...... Port pins can provide internal pull-up resistors (selected for each bit).

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

SergeIO,  Ну автор проекта живёт в австралии и не читает наш форум :) А я лишь использовал его библиотеку. По сути вашего вопроса -это не проблема прошивки/библиотеки. У меня на входах А1-А3  ноль вольт. На А0 соответсно пол-питания. И измеряет напряжение программатор точно, показывает столько же, сколько и дорогой мультиметр. Так что смотрите коротыши/непромытости от флюса итд итп.

SergeIO
Offline
Зарегистрирован: 09.06.2017

Коротышей/непромытостей нет, высокий потенциал висит на аналоговых входах А0...А3 "чистой" платы контроллера, без обвязки.

Судя по всему, китайские производители могуть поставлять Pro Micro с разными загрузчиками. В моём варианте, вероятно, загрузчик подключал внутренние pull-up резисторы к аналоговым входам, а прошивка AVRISP просто оставляет настройки входов A0...A3 "как есть".

Проблема решилась подключением платы Pro Micro к внешнему программатору ISP, в качестве которого использовался Arduino Uno, прошивкой загрузчика (Arduino IDE 1.8.2, целевой платой выбрана SparkFun Pro Micro) и последующей повторной перепрошивкой AVRISP mkII от автора.

Теперь монитор показывает точно 3,3V или 5,0V в зависимости от напряжения питания.

К слову, мне попалась Pro Micro с кварцем на 16 МГц и микросхемой стабилизатора на 3,3 Вольта, т.е. контроллер по умолчанию работает в нештатном режиме. Будьте внимательны при покупке.

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

Попробовал перенести сигнал PDI/TPI CLOCK на другую ногу, но успехом не увенчалось, оказалось это был аппаратный сигнал CTS, и перенести его на другой пин невозможно.

Но на конкретно моей плате PD5 удобно перехватить прямо на токоограничивающем  резисторе светодиода.

На всякий случай перекомпилил прошивку, теперь программа не использует светодиод на ноге PD5 для отображения состояний USB-подключений , правда по прежнему светится от клоков XCK1.   Сам по себе светодиод не мешает клокам, стало быть потенциальных конфликтных ситуаций не должно быть.  Итоговая схема и прошивка

Проверил на attiny10 -TPI программирование работает.

avrdude.exe -p t10 -c avrispmkII -U  flash:r:"r:\test.hex":i

avrdude.exe: AVR device initialized and ready to accept instructions

Reading | ################################################## | 100% 0.00s

avrdude.exe: Device signature = 0x1e9003 (probably t10)
avrdude.exe: reading flash memory:

Reading | ################################################## | 100% 0.20s

avrdude.exe: Flash is empty, resulting file has no contents.
avrdude.exe: writing output file "r:\test.hex"

avrdude.exe done.  Thank you.

 

ojakov
Offline
Зарегистрирован: 26.11.2015

Привет, а для флешек 25\24 и прочих серий программатор на базе этой же платы можно сделать. Хорошо бы было на одной ардуинки и устройство покрывающее потребности 50% мастеров.

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

ojakov, не интересовался. Но эти еепромки вообще чем угодно шьются, посмотрите тут http://forum.easyelectronics.ru/viewtopic.php?f=17&t=10947

ojakov
Offline
Зарегистрирован: 26.11.2015

Спасибо.

InternetFor
Offline
Зарегистрирован: 24.03.2019

Ссылка битая, не могли бы вы перезалить ?

InternetFor
Offline
Зарегистрирован: 24.03.2019

Прошу прощения, видимо что то с форумом. https://yadi.sk/d/iNjBHWCJ3JHNMD

InternetFor
Offline
Зарегистрирован: 24.03.2019

А как бы ей прошить ATXMEGA не сгорит ли чип ? На выходе 4.2В по линии TPI Data, а рабочее напряжение 3.3в у ATXMEGA. Простите за такие вопросы я первый раз занимаюсь прошивкой чипа.

 

И еще вопросик вам, надеюсь ответите. Правильно ли я подпаял вывод PDI Clock ? Моя Micro выглядит немного иначе - 

InternetFor
Offline
Зарегистрирован: 24.03.2019

Немного покопался по форумам и нашел датащит atmega 32u4  ногу верно угадал, теперь знаю точно :) Держу в курсе, да и вдруг кому

то полезно будет))

1707
Offline
Зарегистрирован: 08.02.2017

InternetFor

Получилось у Вас Atxmegu зашить?

InternetFor
Offline
Зарегистрирован: 24.03.2019

Я прошил ее по другому немного, тут понадобится стабилитрон , либо диоды. Я делал проект WX mouse а там уже готовый программатор с фьюзами собирается, схема такая же. ТАк что думаю и тут будет работать прошивка atxmega. 

folks
Offline
Зарегистрирован: 30.05.2018

 Сегодня шил ATXmega32A4 , все отлично прошилось . И не надо городить всякие делители , просто дополняете схему стабилизатором на 3.3v и запитуете ими программируемый контроллер .

1707
Offline
Зарегистрирован: 08.02.2017

folks пишет:

 Сегодня шил ATXmega32A4 , все отлично прошилось . И не надо городить всякие делители , просто дополняете схему стабилизатором на 3.3v и запитуете ими программируемый контроллер .

Т.е. по этой схеме из поста выше, просто по VСС  ставим стаб и всё (даже на этой печатке можно https://yadi.sk/d/1mdrqnFC3JJctj)? Про меандр 4МГц не понял, это просто подать с генератора нужно при прошивке?

 

folks
Offline
Зарегистрирован: 30.05.2018

 Да , я дополнительно поставил AM1117 3.3V и джампером переключаю 3.3v или 5v . Насчет меандра не знаю , я шил контроллер на плате устройства , где уже имелся кварц .

1707
Offline
Зарегистрирован: 08.02.2017

Всем привет. Успешно прошил ProMicro, подцепились дрова из папки Lufa собствено он на скрине ниже.
Проблема в другом, AVR студия 4 и 6 не видит его, система Вин10, на Вин7 тоже самое. Драйвера стоят все.

На собранном программаторе 3.3В через стаб есть, всё остальное звонится, но программы для прошивки не видят сам программатор.

1707
Offline
Зарегистрирован: 08.02.2017

За час с небольшим подружил программатор с Вин 10. Теперь проблема новая, не читает сигнатуры и вольтаж в АВР студии 6.

Собственно брал 2 нужные мне вывода кроме питания (кварц распаян на плате):

PDI\DATA с Rx и Tx

PDI\CLK с резистора светодиода PD5

 

1707
Offline
Зарегистрирован: 08.02.2017

folks

может у Вас кокое фото есть того что Вы собрали, не смог я побороть. Питание на плату приходит с камнем, там распаен и кварц, но прошивать не хочет.

folks
Offline
Зарегистрирован: 30.05.2018

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