Electronics Engineering BLOG

Блог об электронике

Программирование AVR.

| комментария 4


Привет друзья.
Меня Анатолий попросил поподробнее рассказать о программировании микроконтроллера AtMega8, дело в том, что очень много вопросов по программированию микроконтроллеров, в частности по программированию микроконтроллера именно в этом 910 программаторе и поэтому я решил записать это видео. Данный программатор у меня работал, с ним всё было хорошо. Сейчас я сбросил ему все настройки по умолчанию, то есть очистил флешь и fuse сделал такими же, какими они были изначально у микроконтроллера когда он вышел с завода.
Программирование-AVR_Программирование-микроконтроллера-AVR
Сейчас я подключил 910 программатор в USB порт, и вы видите, что USB устройство не опознано.
Программирование-AVR_С-чистым-микроконтроллером--в-AVR910-устройство-не-опознано
Всё это происходит из-за того, что в схеме есть резистор 1.5 кОм который подтягивает линию DM к VCC и по спецификации USB 1.1 таким образом компьютер понимает что в USB что-то вставлено, что-то подключено, но что именно, он не может определить, потому что сейчас микроконтроллер не общается с компьютером.
Программирование-AVR_Резистор,-благодаря-которому-компьютер-чувствует-что-в-него-вставлено-USB-устройство
Для того чтобы это исправить нужно запрограммировать микроконтроллер. Каждый делает это по разному, но лично я подпаиваю провода к самим пинам, но в данном случае, мне только один провод, пришлось припаять к пину микросхемы (к лапке микросхемы), а все остальные лапки микросхемы у меня идут через резисторы на штекер. Я непосредственно припаялся к самим резисторам, потому что к самим ножкам, таким паяльником которым я пользовался, припаять не то, что невозможно, но немного проблематично. Точнее заняло бы больше времени, чем хотелось бы.
Программирование-AVR_Припаять-провода-к-TQFP-можно-даже-большим-жалом
Теперь подключаю рабочий программатор для программирования AVR910. Подключаю, вставляю в USB, и программирую микроконтроллер. Для того, чтобы запрограммировать, нужна прошивка. Прошивку я возьму со своего сайта, тут я выложил все файлы (http://www.elenblog.ru/programmator-dlja-avr-usb-avr910/). Сразу положу файл hex на диск С.
Программирование-AVR_подключаю-рабочий-программатор-для-программирования-AVR910
Теперь открываем программу, которой вы шьёте контроллер, я для этой цели использую USBasp. Выбираю наш файл который я только что кинул на диск С и выбираю программирование. Всё, программирование завершено.
Программирование-AVR_Запрограммировали-Flash-микроконтроллера-AVR
Если я сейчас вставлю AVR910 в USB, то у меня ничего поменяться не должно. Видите, опять USB устройство не опознано.
Программирование-AVR_С-запрограммированным-Flash-микроконтроллера-в-AVR910-устройство-так-же-не-опознано
Почему это происходит? Дело в том, что по умолчанию микроконтроллер работает на внутреннем генераторе частотой 1 МГц, а для того чтобы это устройство как-то определилось, микроконтроллер должен работать на частоте 12 МГц, от вот этого кварца. Для этого нужно перенастроить fuse. Наверное, многие думают: ну блин, он должен как-то работать, в 12 раз медленнее, 1 МГц, 12 МГц, но должен, хоть и медленнее, но должен. Это всё не так, дело в том, что по спецификации USB все временные интервалы очень жёстко определены и если программатор или другое USB устройство не ответило в определённые временные рамки, определённым образом составленный пакет, то считается что USB устройства нет, или оно неисправно. Поэтому, если микроконтроллер не работает на 12 МГц, то программатор не определится. Даже если он будет работать на частоте 16 МГц, он тоже не определится. Для того, чтобы программатор определился, он должен работать ровно на 12 МГц от этого кварца. Для этого нужно прошить fuse. Как это сделать?
Заходим на fuse, выбираем обязательно чтение, потому что сейчас fuse выставлены от балды.
Программирование-AVR_Изначально,-fuse-в-AVRDUDE-prog-выставлены-от-балды
Нажимаю чтение …. Вот видите.. Так… ну конечно, захотел я прочесть fuse, а программатор то не вставил… Fuse сейчас считались с этого микроконтроллера на программаторе AVR910.
Программирование-AVR_После-чтения,-fuse-считаны-с-микроконтроллера-в-программаторе-AVR910
Теперь мы можем править те, которые нам нужны. Нам нужны вот эти вот fuse (CKOPT, SUT0 и BODEN). Я писал одному товарищу, Скутеру Игоревичу. Сейчас я их поставлю, и заодно проверю, обманул я его или нет.
Программирование-AVR_fuse-для-микроконтроллера-AtMega8-в-программаторе-AVR910
Итак, мне нужно выставить только 3 бита, а все остальные нужно сбросить. Как это сделать? Дело в том, что по идее нужно почитать даташит, но с fuse в AVR всё напутано потому что вот здесь видите, fuse с инверсией, а вообще fuse могут быть прямые, с инверсией, По спецификации AVR «0» означает что fuse запрограммирован, но для программиста, запрограммированный fuse означает галочка есть и получается что есть неразбериха, у кого-то они прямые, у кого-то они инверсные, кто-то делает свою программу так как Atmel это оговаривает, а кто-то делает это так, как он считает ему удобнее. На самом деле с fuse большая неразбериха. На много удобнее использовать программы как я показывал типа AVRosp либо khazama. Там fuse выбираешь из списка, так как тебе нужно. Точнее ты не fuse выбираешь, а выбираешь нужную тебе комбинацию частоту или ещё что-то и fuse автоматически выставляются. Сейчас мы будем плясать следующим образом: мне нужно сбросить все fuse, а потом установить CKOPT, SUT0 и BODEN. Что значит сбросить все? Как вообще я могу узнать какие здесь fuse? Дело в том, что есть такой fuse который называется SPIEN почти Спеян, как и моя фамилия. Вот если мы переключим с прямых на инверсные, мы видим что он меняется, но он не активный. Дело в том, что этот fuse он всегда, внимание ВСЕГДА установлен. Если мне нужно сбросить все fuse то у меня должно быть, так как он всегда установлен, а мне нужно их все сбросить, то состояние должно быть противоположное SPIEN, так как на этом нет птички, то на всех остальных птичка должна быть установлена. Вот я ставлю на все fuse птичку. Всё, это я сбросил все fuse.
Программирование-AVR_Сбрасываем-все-fuse-(состояние-неустановленных-должно-быть-противоположное-биту-SPIEN)
Теперь мне нужно установить CKOPT, SUT0 и BODEN.
Программирование-AVR_Установил-fuse-AtMega8-CKOPT,-SUT0-и-BODEN
Теперь нажимаем программирование и всё, теперь проверяем, должно определиться устройство AVR910. Вот оно есть. Устройство AVR910. Только оно с восклицательным знаком, потому что не установлены драйвера. Как устанавливать драйвера я показывал в этом видео (http://www.elenblog.ru/programmator-dlja-avr-usb-avr910/), переходите и смотрите.
Программирование-AVR_После-программирования-Flash-и-fuse-микроконтроллера-AVR-AtMega8-программатор-AVR910-определился-в-системе
Вот как бы и всё, программатор у нас работает, драйвера ставим и всё у нас будет хорошо. Если у вас в системе программатор увиделся как AVR910, это означает, что микроконтроллер уже общается с контроллером компьютера. Уже есть связь, и можете быть уверены что программатор на 90% заработает. Единственное где вы можете накосячить, это в выходной части. Если он определился, значит вы во-первых его правильно зашили, во вторых правильно выставили fuse на тактирование его от кварца. Ну вот и всё, это всё очень и очень просто, так что дерзайте и всё у вас получится.
Всем пока, удачи и всего вам самого доброго.

4 комментария

  1. Pingback: Программатор для AVR usb. (AVR910) | Electronics Engineering BLOG

  2. Привет автор.
    я использую USBasp пробовал шить с помощью DUDE все время прога в стает в одном месте и пишет что то для меня далекое (safemode: lfuse chanded! Was e1, and is now ff Would you like this fuse to be changed back?) пробовал и очистить камень такая же тема. и камень менял все бестолку.дай совет.

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

  3. Огромное спасибо автору за подробнейшие комментарии и описание своих действий! Недавно понадобилось запрограммировать контроллер и сделать для этого программатор. Все получилось благодаря вам.

Добавить комментарий

Обязательные поля отмечены *.