Часть I.
Стоимость деталей:
Отдельного внимания заслуживает история одинокого желтого проводка.
programmer
id = "dapa";
desc = "Direct AVR Parallel Access cable";
type = par;
vcc = 3;
reset = 16;
sck = 1;
mosi = 2;
miso = 11;
(продолжение следует, Часть II)
Как быть, если надо поэкспериментировать с Arduino, но покупать (по каким-то неуважительным причинам) совершенно не охота? Если вы умеете держать в руках паяльник, не составит большого труда соорудить его самостоятельно. Продвинутые пользователи, имеющие опыт травления печатных плат, могут воспользоваться Severino. Но для начала вполне можно ограничиться "макеткой".
"Сердце" всех плат Arduino - это микроконтроллер ATmega (точнее, ATmega8, ATmega168 или ATmega328P), который требует прошивки, поэтому для начала надо обзавестись программатором. Готовый программатор стоит недорого, но ведь его еще надо заказать и дождаться! Давайте соорудим простейший - на LPT-порту:
Девайс предназначен для программирования контроллера прямо в родной схеме (т.н. In Circuit Serial Programming или ICSP ) - надо организовать на плате гребенку 2x3 контакта, подключить к ней этот программатор и один раз зашить bootloader - специальную короткую программу инициализации, которая принимает по последовательному порту микропрограмму (sketch), прошивает ее в свободную память ATmega, а затем запускает.
Стоимость деталей:
- разъем DB25 - 10 руб.
- корпус разъема - 10 руб.
- три резистора - 1 х 3 = 3 руб.
- три колодки PBS02 - 2 х 3 = 6 руб.
- проводки - ну добавьте еще 10 руб.
Итого, 39 рублей. Наверное, вы спросите: где подвох? Не скрою, не без него: на вашей машине должен быть LPT-порт.
Процесс сборки программатора подробно описан в статье на сайте Arduino. Вот что получилось у меня:
Отдельного внимания заслуживает история одинокого желтого проводка.
Как видно из первого рисунка, на оригинальной схеме pin2 разъема ICSP "висит в воздухе". На самом деле, там должно быть Vcc +5В, которое отсутствует в LPT-порту в виде отдельной питающей шины. Авторы предлагают запитать программируемую схему отдельно (я взял +5В с разъема USB того же компьютера, к которому были подключен LPT).
В таком варианте схема работать отказалась, из порта программирования систематически читались 0xff. Когда я снял питание, то с удивлением обнаружил, что контроллер все равно умудрялся что-то высасывать из активных пинов LPT-разъема и - о чудо! - даже начал проявлять признаки жизни: пытался осмысленно отвечать на Power-up sequence. Однако, дальше дело не шло: avrdude удивленно сообщал о том, что обнаруженный процессор имеет нестандартную сигнатуру - 0, 1, 2.
Это натолкнуло меня на мысль покопаться в конфигурационном файле avrdude.conf и внимательно изучить секцию, посвященную моему дешевому программатору:
programmer
id = "dapa";
desc = "Direct AVR Parallel Access cable";
type = par;
vcc = 3;
reset = 16;
sck = 1;
mosi = 2;
miso = 11;
Все элементарно: слева - название сигнала, справа - номер контакта на LPT. Таким образом, предполагается, что программатор использует третий контакт для подачи питающего напряжения Vcc.
Так и появился желтый проводок. Как только я соединил им шину +5В микроконтроллера и DB25 pin3, bootloader для ATMEGA8 прошился на "ура".
Признаюсь, было несколько стремно (перед включением я мысленно помолился за здоровье своего LPT-порта), но, видимо потребность в питании одного-единственного МК в данном случае вполне допустима.
(продолжение следует, Часть II)
Во-первых, спасибо зв статью.
ОтветитьУдалитьСобрал свой Arduino с ATmega168. Прошивал LPT-программатором. Как и написано на сайте (http://www.arduino.cc/en/Hacking/Bootloader): "The board must be powered by an external power supply or the USB port. ". Видимо, питания от USB-порта не хватало. Я подключил батарейку на 9 вольт к штатной системе питания и всё прошилось отлично (и через avrdude и через ArduinoIDE, которая сама умеет прошивать через параллельный порт).
P.S. Сомневаюсь, что это могло повлиять, но в схеме аналоговорго напряжения я использовал катушку, а не конденсатор, как того требовала схема.
BTW ArduinoIDE шьет через параллельный порт именно через avrdude ;)
ОтветитьУдалитьЖизнеспособность программатора сильно зависит от того, насколько согласован уровень сигналов программирования SPI. Самое правильное, это когда внутрисхемный программатор питается от программируемой схемы. Конечно, если схема несложная и малопотребляющая, можно и наоборот - питать ее от программатора :) Можно наваять специальную согласующую схему на компараторах (не припомню точно, но где-то я такую точно видал).
Я себе собрал USBasp и, если честно, закинул лаптоп с LPT-портом в кладовку - он теперь не нужен :)