Как исправить avr

Титл

Внимание ! Автор устройства не стоит на месте — постоянно усовершенствует своего «Доктора». За изменениями слежу и я, внося обновления в статью.
В статье описана самая стабильная версия Update №9. от 13.03.2011.
В конце статьи есть последняя версия и  архив со всеми старыми версиями «Доктора».

Хочу спросить у читающих мой блог — много ли у Вас скопилось микроконтроллеров с неправильно прошитыми фьзами и непригодными для дальнейшего использования? Я думаю, если Вы довольно продолжительное время работаете с микроконтроллерами, то у Вас были случаи неправильной прошивки фьюзов. Свои «запорченные» микроконтроллеры я складывал в специальную коробочку с надеждой на то, что когда-то, в будущем, соберу высоковольтный параллельный программатор и верну их к жизни. Но высоковольтный программатор как-то особо не хотелось собирать. Схема довольно наворочена, да и применение такого программатора разовое – оживить ошибочно прошитый микроконтроллер. Короче, всегда проще (и дешевле) было купить новый микроконтроллер. Так и хранились бы и дальше «мертвые» микроконтроллеры если бы не случилась странная штука – при изготовлении нового устройства (скоро выложу) перестали подавать признаки жизни, сразу две тини2313 без особых на то причин. Подозрение пало на то, что при прошивке были неправильно выставлены фьюзы. Новых, в SOIC корпусе, быстро достать не получалось, а схемку закончить чесались руки. Так как, я все равно собирался, когда то делать высоковольтный программатор, решил, что пришло время это сделать. Но высоковольтный программатор я так и не сделал, а сделал устройство специально предназначенное для исправления ошибочно установленных фьюзов.

Некоторое время назад, по ссылке geovas , я поглядел на устройство под названием «Atmega fusebit doctor». Автор — поляк Pawel Kisielewski. Так как схема этого устройства относительно несложная решил вместо высоковольтного программатора собрать «доктора». И не ошибся – устройство оказалось замечательным! Не могу не поделиться своими впечатлениями о «Atmega fusebit doctor», так как в этом проекте есть много вещей, которые я ценю.

Что интересного есть в «Atmega fusebit doctor»?
Как Вы поняли – это не совсем высоковольтный программатор. Это устройство предназначено только для одной цели – вернуть к «жизни» микроконтроллер с неправильно прошитыми фьзами.

Такими фьюзами могут быть:
— CKSEL фьюзы выбора задающего генератора (выбран внешний генератор при его отсутствии или выбрана очень маленькая частота внутреннего);
— SPIEN запрет последовательного программирования;
— RSTDISBL использование ножки сброса как дополнительной линии ввода-вывода;
— установленные LOCK биты;
— другие, мешающие последовательному программированию.

ПРИНЦИП РАБОТЫ УСТРОЙСТВА

— очень прост – подаем на плату 12 вольт, вставляем в панельку «запорченный» микроконтроллер, нажимаем кнопочку «START» и через доли секунды получаем новенький рабочий микроконтроллер. Очень просто, даже не нужен компьютер (всегда возмущают псевдо навороты, в виде управления при помощи специальной программе на PC, там, где это в принципе не нужно). И если внешне устройство выглядит просто, то внутри все гораздо сложнее. При нажатии кнопки «START» устройство читает сигнатуру микроконтроллера-пациента, при этом, если она не читается, делается несколько попыток прочитать различными способами. После того как сигнатура прочитана по базе определяется тип микроконтроллера и восстанавливаются заводские, для данного микроконтроллера, установки фьюз бит. Если сигнатура неизвестна или микроконтроллер выдает ее неверно устройство установит фьюз биты в такое состояние, при котором станет возможным последовательное программирование. При восстановлении фьюз бит прошивка микроконтроллера остается нетронутой. Еще на плате есть перемычка «ALLOW ERASE«, при замыкании которой устройство полностью «обнулит» микроконтроллер. Это нужно в том случае, если пациент «залочен», т.е. установлены защитные биты которые препятствуют чтению/записи микроконтроллера.

Для индикации работы устройство имеет два светодиодакрасненький и зелененький :). Минималистично? Но этого вполне хватает!
Если горит зеленый – пациент успешно вылечен, фьюз биты восстановлены до заводских. Если микроконтроллер «залочен» (LockBits включены), просто проверяются фьюз биты и если они совпадают с заводскими — загорается зеленый светодиод.
Если горит красный – проблемы с сигнатурой чипа, невозможно прочитать, нет микроконтроллера в панельке или нет такой сигнатуры в базе данных.
Если зеленый мигает — сигнатура в порядке, фьюз биты с ошибкой, но исправить их невозможно, так как микроконтроллер «залочен» (LockBits включены), необходимо полное стирание микроконтроллера (нужно установить перемычку для стирания — «ALLOW ERASE»).
Если мигает красный — сигнатура в порядке, микроконтроллер «не залочен», но, по какой-то причине, невозможно восстановить фьюз биты.

Если Вы хотите получить более подробную информацию о процессе «лечения» на плате есть выход UART. Отправьте этот сигнал на терминал и получите «распечатку» того, что было сделано.

Установки для терминала:
baudrate: 4800
parity: none
databits: 8
stopbits: 1
handshake: none

Информация о процессе лечения

На плате установлены три панельки для «пациентов» на 20 (Attiny2313 …), 28 (Atmega48/88/168, Atmega8 …), 40 (Atmega16, Atmega8535 …) ножек. Если Вы решили «полечить» другого «пациента», то на плате предусмотрен специальный разъем для подключения адаптеров с панельками под любой, нужный Вам, микроконтроллер. Устройство поддерживает аж 106 типов микроконтроллеров AVR.
Вот полный список:
1kB:
AT90s1200, Attiny11, Attiny12, Attiny13/A, Attiny15
2kB:
Attiny2313/A, Attiny24/A, Attiny26, Attiny261/A, Attiny28, AT90s2333, Attiny22,Attiny25, AT90s2313, AT90s2323, AT90s2343
4kB:
Atmega48/A, Atmega48P/PA, Attiny461/A, Attiny43U, Attiny4313, Attiny44/A, Attiny48, AT90s4433, AT90s4414, AT90s4434, Attiny45
8kB:
Atmega8515, Atmega8535, Atmega8/A, Atmega88/A, Atmega88P/PA, AT90pwm1, AT90pwm2, AT90pwm2B, AT90pwm3, AT90pwm3B, AT90pwm81, AT90usb82, Attiny84, Attiny85, Attiny861/A, Attiny87, Attiny88, AT90s8515, AT90s8535
16kB:
Atmega16/A, Atmega16U2, Atmega16U4, Atmega16M1, Atmega161, Atmega162, Atmega163, Atmega164A, Atmega164P/PA, Atmega165A/P/PA, Atmega168/A, Atmega168P/PA, Atmega169A/PA, Attiny167, AT90pwm216, AT90pwm316, AT90usb162
32kB:
Atmega32/A, Atmega32C1, Atmega323/A, Atmega32U2, Atmega32U4, Atmega32U6, Atmega32M1, Atmega324A, Atmega324P, Atmega324PA, Atmega325, Atmega3250, Atmega325A/PA, Atmega3250A/PA, Atmega328, Atmega328P, Atmega329, Atmega3290, Atmega329A/PA, Atmega3290A/PA, AT90can32
64kB:
Atmega64/A, Atmega64C1, Atmega64M1, Atmega649, Atmega6490, Atmega649A/P, Atmega6490A/P, Atmega640, Atmega644/A, Atmega644P/PA, Atmega645, Atmega645A/P, Atmega6450, Atmega6450A/P, AT90usb646, AT90usb647, AT90can64
128kB:
Atmega103, Atmega128/A, Atmega1280, Atmega1281, Atmega1284, Atmega1284P, AT90usb1286, AT90usb1287, AT90can128
256kB:
Atmega2560, Atmega2561

Зелененьким отмечены кристаллы которые проверялись и удачно полечились пользователями «доктора». Если Вы вылечили кристалл не помеченный зеленым, прошу сообщить об этом автору устройства или мне — я передам.

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

СБОРКА УСТРОЙСТВА.

Схема устройства довольно простая. Номиналы резисторов можно варьировать в небольших пределах

Схема Доктора

059-atmega_fusebit_doctor_V2e_schematic.pdf (53736 Загрузок)

Плата устройства разведена хорошо, но есть один нюанс, о котором важно не забыть при сборке устройства. Ножки 40-ка пиновой панельки с 29 по 37 необходимо откусить (лучше в плате вообще не сверлить отверстия под эти ножки).

Внешний вид платы

Еще есть картинка для нанесения на плату со стороны деталей (монтажная картинка). Я впервые попробовал нанести такую картинку. Получилось очень удобно – монтаж превращается в простую процедуру установку деталек по картинкам. Наноситься рисунок методом ЛУТ. Вскройте рисунок лаком, иначе он быстро сотрется.

Монтажный рисунок на плату

059-atmega_fusebit_doctor_V2e_PCB.zip (41556 Загрузок)

«Набиваем» плату радиодеталями, ставим несколько перемычек, получаем вот такое устройство:

Готовое устройство

ВНИМАНИЕ! Если у Вас собрана предыдущая версия платы «Доктора» (V2d — плата апдейдов по №6 включительно), для новой версии (апдейты  №№7-9) переделывать ее нет необходимости, изменения минимальны. Для апгрейда версии платы V2d до версии V2e необходимо, всего лишь, припаять в нужном месте резистор на 100 Ом. Ниже показано куда его впаивать.

UpGrade

Hryam сделал рисунок платы версии V2d в Спринте. Вышло даже лучше чем у автора (размеры площадок, например).

059-atmega_doctor_plate_v2d_Sprint.zip (49242 Загрузки)

ПЛАТА ДЛЯ SMD КОМПОНЕНТОВ.

Появилась версия платы для SMD компонентов (товарисщь Shuffle постарался) . В этой плате нет панелек под «пациентов» есть только разъем для подключения адаптеров. Все «пациенты» включаются через адаптеры. Добавлен преобразователь UART to USB TF232RL, а значит Доктор будет выдавать информацию о ходе лечения по USB (можно не ставить). В остальном все как в оригинале.

059-shuffle_avrdoc_usb.zip (50066 Загрузок)

ПРОШИВАЕМ МИКРОКОНТРОЛЛЕР.

Теперь осталось только прошить микроконтроллер ATmega8 и устройство готово!

atmega_fusebit_doctor_2.09_m8.zip (46849 Загрузок)

059-FuseBits.png (68962 Загрузки)

Фьюз байты: Lock Bits = 0x 3F; High Fuse = 0x D1; Low Fuse = 0x E1; Ext. Fuse = 0x 00

Напоминаю:Для Algorithm Builder и UniProf галочки ставятся как на картинке.
Для PonyProg, AVR Studio, SinaProg галочки ставятся инверсно.
Как программировать микроконтроллеры читаем в FAQ.

Данный вариант прошивки еще есть для микроконтроллеров:
Atmega88, Atmega88P, Atmega168, Atmega168P, Atmega328, Atmega328P.
Прошивка для микроконтроллеров с 16kB и 32kB памяти, кроме того, выдает названия восстанавливаемых микроконтроллеров.
Прошивки и фьюзы для других микроконтроллеров  смотрите в архиве старых версий «Доктора» в конце статьи.

АДАПТЕРЫ ДЛЯ МИКРОКОНТРОЛЛЕРОВ.

Автором были разработаны два адаптера:
— для HVPP программирования 20-ти пиновых Attiny26 подобных и 40-ка пиновых Atmega8515 подобных контроллеров.
— для HVSP программирования для 8-ми пиновых и 14p-ти пиновых микроконтроллеров с высоковольтным последовательным способом программирования

059-adapter-1HVPP_dip20-dip40.zip (25498 Загрузок)

059-adapter-HVSP-dip8-dip14.zip (24173 Загрузки)

Небольшой бонус от меня – адаптеры для микроконтроллеров 8-ми пиновых (ATtiny13 …) и 20-ти пиновых (ATtiny2313 …) в корпусах SOIC.

Внешний вид адаптеров

059-adapter_soic20-soic8.zip (27596 Загрузок)

Пользоваться адаптерами для SOIC корпусов очень просто:

Работа с адаптером

Вставляем адаптер

АРХИВ ВСЕХ ПРЕДЫДУЩИХ ВЕРСИЙ ДОКТОРА.

Это архив со всеми предыдущими версиями «Доктора». Кроме того архив содержит дополнительные материалы, такие как пинауты для различных корпусов AVR, платы-адаптеры и другое.

atmega-hvpp-fusebit-doctor_archive.zip (33490 Загрузок)

ПОСЛЕДНЯЯ, НА ДАННЫЙ МОМЕНТ, ВЕРСИЯ «ДОКТОРА».

Как я уже упоминал выше, главным достоинством «Доктора»  является его автономность. Для восстановления фьюзов нужно лишь само устройство. Это очень хорошо!
Да, «Доктор» по UART выдавал информацию о процессе «лечения». Сообщения по UART, дублируя светодиоды,  давали более полную картину «лечения»,  но многим этого было недостаточно. Хотеться более полного контроля процесса восстановления.  И в новом апдейте автор дает этот полный контроль!

Теперь стало возможным:
— двухстороннее общение с «Доктором» по UART;
— работа с кристаллами у которых неверная сигнатура;
— устанавливать свои fusebits и  lockbits;
— об остальном читайте в описании внутри архива…

atmega-hvpp-fusebit-doctor_update11.zip (64224 Загрузки)

ПЛАТЫ ДОКТОРА ЧИТАТЕЛЕЙ БЛОГА.
Здесь находятся устройства собранные читателями — хорошо когда есть выбор.

Печатка «Доктора» от Paul (в Сплинте)

ATmega-Fusebit-Doctor-PCB.zip (23220 Загрузок)

zloynik нашел некоторые ошибки:
1.Резистор с 23 ноги меги не соединен с панельками.
2.Резистор с 4 ноги меги не соединен с панельками.
3.Резистор с 5 ноги меги не соединен с панельками.
4.Транзистор BC547(Т2) с 13 ноги меги-нет контакта с эмиттера на «землю».
В остальном вроде все впорядке. Собрал-залочил тиньку 2313-восстановило.
Учтите при изготовлении.

Вариант «Доктора» в SMD исполнении от webconn.

ATmega Fusebit Doctor SMD by WebConn V2h.zip (19127 Загрузок)

Хотел бы внести свой вклад в форме ещё одной платы для «доктора» в SMD-исполнении. Всего 5 перемычек и 3 SMD-»пофигистора», питание от Power Jack 5mm (но в архиве есть версия с колодкой) через 78L05 (греется, но пару минут можно работать без отключения питания, а больше обычно и не нужно ) Также греется один из транзисторов, но тоже в меру (мелкота требует жертв). Тем не менее, плата юзабельна. Совместима с последней версией Доктора V2h (то есть полностью растащен UART).

Вариант «Доктора»  от Machineman.

Fusebit-Doctor.zip (11815 Загрузок)

Плата в спринте, разводил под детали, которые были в наличии, так что там симбиоз SMD с выводными элементами, от перемычек уйти не удалось, как ни крутил. Транзистор T3 перевернул в нужную сторону (по началу запутался с эмиттером-коллектором). Да, с питанием не стал особо заморачиваться и вывел все на разъем molex.  Ну и разумеется выход на платы расширения. Удачи!

Вариант «Доктора»  от TaseG (разводка в сплинте).

hvpp-fusebit-doctor-v2h.zip (13929 Загрузок)

Исправление разводки от Максима Носырева.
Я начинающий, поэтому прошу строго не судить, если я ошибся.
Если сравнить разводку с оригиналом из статьи, то там есть лишняя дорожка, замыкающая 9 и 5 вольт, как я понял на питание меги придет 9 вольт. Может, конечно, я ошибаюсь, но наверно так не должно быть…

Вариант «Доктора»  от Sailanser (разводка в Eagle 5.10)

Atmega-fuse-doctor.zip (11309 Загрузок)

Сам себе делал это устройство по выложенной оригинальной схеме. Плату сделал двухстороннюю дабы была маленькой и компактной. Делал на SMD плюс управляющий контроллер в DIP. Контроллеры для излечивания если необходимо подключаю с помощью внешней макетки.

Вариант «Доктора»  от MVV
А еще «Доктора» можно сделать и так:

Адаптер для ATtiny26 от Fahivec

Adapter_Tiny26_SMD.zip (7702 Загрузки)

В архиве фотка и файлы .sch/.brd из Eagle 5.7.0

Доктор от dimon24
вариант печатной платы с универсальными ZIF панельками под 5 МК DIP8,14,20,28,40

Atmega-fusebit-doctor-ZIF.zip (Одна Загрузка)

Переходник для ATmega48A/PA/88A/PA/168A/PA/328/P TQFP32 от S@per

TQFP32-for-fuse-bit-doctor.zip (9298 Загрузок)

ЗАКЛЮЧЕНИЕ.

В результате работы «Atmega fusebit doctor» мною были возращены к жизни несколько ATtiny2313, ATmega48, Atmega8535. «Atmega fusebit doctor» зарекомендовал себя с наилучшей стороны. И даже появились планы на нестандартное его использование. Давно руки чешутся заюзать ножку сброса ATtiny13 как еще один порт ввода/вывода, но всегда останавливало то, что микроконтроллер теряется для последующего использования. С «доктором» можно смело использовать ножку по своему усмотрению и при необходимости восстанавливать ее «заводское» назначение.

Еще смотрим:
Что такое фьюз биты?
Как правильно прошить фьюз биты в разных программах?
Страничка ATmega FuseBit Doctor

(Visited 396 308 times, 2 visits today)

Для вылечивания микроконтроллеров с неправильно прошитыми фьюзами собрал Atmega fusebit doctor.

Всю информацию почерпнул с сайта с этой статьй: Исправляем AVR фьюзы при помощи «Atmega fusebit doctor»

Что доктор может или как это будет работать?

При подаче питания 12 вольт на плату, и установке «порченого» микроконтроллера, нажатием на кнопку START получим рабочий микроконтроллер.

При восстановлении фьюз бит прошивка микроконтроллера остается нетронутой. На плате есть перемычка, при замыкании которой устройство полностью «обнулит» микроконтроллер.

Приступим )

1. Изготовление платы

1. Собираем устройство по самой последней версии на данный момент.
Печатка Доктора от Paul (в Сплинте)

Ошибки в данной плате, обнаруженные zloynik:
1.Резистор с 23 ноги меги не соединен с панельками.
2.Резистор с 4 ноги меги не соединен с панельками.
3.Резистор с 5 ноги меги не соединен с панельками.
4.Транзистор BC547(Т2) с 13 ноги меги-нет контакта с эмиттера на «землю».

Не беда. Дорисовываем недостающие соединения.
Печатная плата в Спринте

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

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

принтер не в лучшем состоянии (. Мажет. Единственное спасение — это то, что он в самом начале нормально пропечатывает

3. Прогреваем плату предварительно утюгом на максимуме. Прикладываем рисунок — он моментально прилипает. А мы его разглаживаем ваткой и опять греем утюгом.

4. НУ вот и первый блин комом. Перестарался с очисткой бумаги. Не отчаиваемся, переделываем ) a-a.d-cd.net/cfcaaa8s-960.jpg

5. Пропустим попытку №2 и сразу к третьей передем. А если быть более точным честным, то плата эта была 5-й раз переделана. После протравки в хлорном железе получилось это чудо )
Нужно было маркером подправить перед травлением.

желтым выделил места, где недотравил. Зеленым — дорожки в процессе травления пострадали

6. Смываем тонер растворителем 646-м (что имелось по близости, то пошло в дело) и получаем нужные дорожки. Эти дорожки ввиду недотравления пришлось доводить до ума путем “прозвонки” каждого соединения. Еще та задачка…

вот они, перетравленные дорожки. Пришлось перемычки лепить в этих местах

7. Представляю помощника в изготовлении отверстий. Его название: ДП-11 7500 обмин.
Очень полезная штукенция. Правда кушает 27В, но и от 24-х не отказывается (два аккума от УПСа ). Взял попользоваться на неопределенное время.

Особенность: если положить моторчик, перестает крутиться. А если начать сверлить (только подносишь к будущему отверстию и надавливаешь), то начинает сверлить.

миниатюрный моторчик

Т.е. вначале не понравилось, когда он в горизонтальном положении останавливался, а потом понял, что это вообще незаменимая вещь! Просверлил нужные отверстия, отложил моторчик всторону. Нужно просмерлить? берешь и сверлишь… Питание при этом не убитается.

Вначале думал, что там какой-то регулятор стоит. Но нет там ничего такого, это просто моторчик износился со временем и глючит. Глюк на пользу )))

2. Сборка устройства Atmega fusebit doctor</b>

1. Набиваем плату компонентами. Вначале припаиваем перемычки и панельки под микросхемы.

Подписал радиоэлементы. Неподписанные резисторы — на 1К Ом. Не было в наличии одного резистора на 10К Ом. По совету vasilii76 установил меньше на 8,2К (какой был).
Резисторы при монтаже планировались для установки в лежачем положении (на 0.125 Вт), но раз приобрел 0,250Вт, то так и запихал их…

Устройство Atmega fusebit doctor. Надписи со стороны элементов не делал — и так пойдет (на функционирование устройства не влияет)

2. На первый раз для дорожек 0,5мм сойдет. Боялся перетравить дорожки, поэтому в процессе пришлось их дорабатывать.

позже покрою лаком сверху

3. Получилось довольно скромно ). В планах немного не так себе представлял.
Панельку под микроконтроллер на 40-пин установил на плату кверх-ногами ))) Не критично

остается подпилить края и прошить -мозги- для функционирования устройства

4. А вот такой красивый девайс с сайта getchip.net должен был получиться )

с надписями поинтереснее будет выглядеть

Сборка устройства на этом завершена. Идем прошивать микроконтроллер Atmega-8L

3. Прошивка микроконтроллера для устройства “Atmega fusebit doctor”

1. Специально делать макетку для прошивки Atmega-8L не стал.
Собирал вот по этой схемке Упрощенную отладочную для Atmega-8, но из того, что имелось и без кварца.
Две панельки на 28-ножек и пару перемычек — вот все устройство.

ну не было у меня панельки нужной ширины, прилепил на 2-х 28-и пиновыйх, но широких

2. Подключаем ранее изготовленный:
Простой LPT программатор AVR микроконтроллеров (5-ть проводков)

3. Запускаем uniprof_08_jun_10. Наш микроконтроллер определился как mega8.
Отлично! Заливаем прошивку с версией 2.11 из этого архива в папке “firmware” для нужного МК. Архив — Прошивка — atmega_fusebit_doctor_2.11_m8.bin

4. Устанавливаем фьюзы для МК и давим на батон “Write”.

Всего один фьюз изменить. Убираем галочку — значит активируем перемычку

Вот и все с прошивкой. Бежим проверять в действии )

4. Проверка работоспособности доктора

Большое спасибо vasilii76, который помогал при проверке работоспособности данного устройства, давал наставления )))

1. Собираем опять же из подручных средств переходник для Attiny13. Панелька, 11 штырьков и проводки — вот и все )))

полноценную плату буду позже готовить

2. Подключаем к доктору нашу подопытную Attiny13, с заранее активированными фьюзами:
CKSEL, RSTDISBL, SPIEN. Давим на кнопку и пациент “вылечен” )

Установка в корпус + изготовление адаптера для Attiny 13 в DIP-корпусе

1. Приобрел в радиомагазинчике корпус для РЭА модели G407. После небольших манипуляций на точильном станке плата подошла идеально!

2. Установил адаптер под Attiny 13 в DIP-корпусе. Подробнее про изготовление адаптера можно ознакомиться в статье “Ч”.
Адаптер под Attiny — 8pin (14pin) для Доктора (atmega fusebit doctor)

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

Какие микроконтроллеры были испытаны?

1. Attiny 13
На докторе был испытан микроконтроллер Attiny 13. Были проверены все фьюзы в полях:
Fuse High Byte – старший байт;
Fuse Low Byte – младший байт.
Проверка прошла успешно!

2. Attiny 12
С ним что-то не так получилось. Испытывал тут: Lock Bit Byte.
МК успешно залочен.. Мигает зеленый светодиод. Эти фьюзы не получилось восстановить (
Буду позже разбираться с ней.

Сопряжение доктора с ПК

Преобразователь RS-232 — UART (для конфигурирования различных устройств)

Сколько стоит собрать это чудо?

Цена вопроса: 270р на детали, + 130р на корпус = 400р
Из деталек самый дорогой — микроконтроллер (145р — пол стоимости Доктора)

Не учитываются трудо-затраты и материалы на печатку

Опыт при изготовлении платы — бесценен!

Варианты Доктора от драйвовчан

Хороший вариант реализовал renoshnik.

Всем удачных поделок )

Не забываем нажать кнопку Нравится )))

Спасение контроллеров дело рук самих контроллеров. Эта схема для исправления не правильно зашитых фузов ATTINY2313 (хотя наверное можно перепрограммировать и другие AVR, у них команды схожи) использует режим параллельного программирования. МК восстанавливает заводские установки, а главное бит SPIEN, включается внутренний генератор, и снова можно использовать последовательный программатор, я использую USB на atmega8. Скорость его надо уменьшить, т.е. замкнуть вывод 14 ( PB0 ) через резистор 300 ом на корпус. Повышенная скорость видимо предназначена для программирования МК вставляемых в панельки находящиеся на плате программатора. У меня ATTINY2313 стоял на макетной плате соединенной проводами( примерно 20см ) с программатором , и при повышенной скорости были ошибки чтения и FLASH и сигнатуры и фузов. Стертая FLASH читалась – частично FFFF , частично 0000 , частично вообще какие – то случайные значения . Было и такое что после первого программирования МК вообще переставал определяться. Как только программатор перевел в режим LOW все ошибки исчезли, конечно при этом увеличилось время записи и чтения. Программа использовалась – СhipBlasterAVR ver 1.12.

Нижеприведенная схема исправляет фузы . Частота кварца особого значения не имеет, может быть и 1мгц и 10 мгц , или внутренний генератор с делением частоты или без . Если нужно исправить только один AVR то он припаивается сверху D1 , отгибаются только некоторые выводы и тонкими проводками соединяются с резисторами . Если несколько AVR то сверху припаивается панелька для 20 выводного корпуса ( хотя панельки не очень надежны ) . Сначала возможно придется подобрать количество диодов для получения напряжения 12в на коллекторе источника тока КТ361 ( 11,5……12,5 ), ток коллектора примерно 10ма ( можно подбирать резистор подключенный к базе ) . При использовании вместо D2 другой МК надо сравнить даташиты ( фузы других AVR совсем другие и бит SPIEN может находиться в другом разряде , тогда придется некоторые строчки прошивки изменить ), хотя и в справочных данных на ATTINY2313 есть ошибки , не правильно указаны номера входов PAGE и BS2 . Приведена также программа ( может кому пригодится ) , временые задержки организованы на программных циклах.

mc34.gif

Сначало при подаче одновременно двух напряжений питания ( от одного блока питания ) идет стирание чипа , потом запись старших фузов далее младших , светодиод должен три раза мигнуть ( tи = 1мс при кварце 8 мгц , т. е. три раза приходит сигнал ответа RDY/BSY ) . Питание должно включаться одновременно ( нужен БП который выдает и + 5V и + 15V ) , далее МК делает набольшую задержку потом устанавливается 0 на выв. R , потом + 12в ……. и т.д.

Если после восстановления фузов будет перепрограммирован генератор с внутреннего на внешний кварц (с помощью СhipBlasterAVR ) то avr перестает определяться (сигнатура не будет читаться ) пока не будет подпаян внешний кварц .

Похожие схемы есть на греческом http://www.serasidis.gr и на немецком http://www.dl5neg.de на AVR AT90S1200, но там без обратной связи с вывода RDY/BSY ( R/B ).

Список радиоэлементов

Обозначение Тип Номинал Количество Примечание Магазин Мой блокнот
D1, D2 МК AVR 8-бит

ATtiny2313

2 Одна из них нуждается в исправлении фузов Поиск в магазине Отрон В блокнот
Биполярный транзистор

КТ315А

1 Поиск в магазине Отрон В блокнот
Биполярный транзистор

КТ361А

1 Поиск в магазине Отрон В блокнот
Стабилитрон

Д814Г

1 Поиск в магазине Отрон В блокнот
Диод

КД522Б

2 Поиск в магазине Отрон В блокнот
Резистор

330 Ом

1 Поиск в магазине Отрон В блокнот
Резистор

1 кОм

3 Поиск в магазине Отрон В блокнот
Резистор

10 кОм

1 Поиск в магазине Отрон В блокнот
Резистор

22 кОм

1 Поиск в магазине Отрон В блокнот
Резистор

150 кОм

1 Поиск в магазине Отрон В блокнот
Кварцевый резонатор 1 МГц или 10 МГц 1 Поиск в магазине Отрон В блокнот
Светодиод 1 Поиск в магазине Отрон В блокнот
Добавить все

Скачать список элементов (PDF)

Теги:

jem9kip
Опубликована: 2009 г.


0


Вознаградить

Я собрал
0

1

x

Оценить статью

  • Техническая грамотность
  • Актуальность материала
  • Изложение материала
  • Полезность устройства
  • Повторяемость устройства
  • Орфография

0

Средний балл статьи: 2.9
Проголосовало: 1 чел.

059 AVR doc viewМногие радиолюбители знают (иногда на собственном печальном опыте), что микроконтроллер AVR можно вывести из строя неосторожным программированием настроечных бит (так называемых фьюзов). Будучи запрограммированными неправильно, эти биты сохраняются в энергонезависимой памяти, и могут привести к невозможности дальнейшего программирования микроконтроллера или выбору фьюзами его тактовой частоты. По крайней мере невозможно восстановить микроконтроллер обычными средствами, без наличия специального высоковольтного HVPP/HVSP программатора.

Ссылки по проекту Fuse Bit Doctor

Файл Наименование Размер Скачать с сервера
FBD_PCB.zip Печатная плата доктора в DipTrace 270кБ Скачать
FBD_circuit.zip Схема печатной платы доктора в DipTrace 55 Скачать
FBD_circuit.pdf Схема печатной платы доктора в PDF 212 Скачать
Fromware_V2.11.zip Прошивка v2.11 для доктора 87 Скачать

В архиве FBD_PCB.zip находится 2 версии печатной платы, с кнопками и с перемычками.

{youtube}vk5Do03bWn4{/youtube}

Список потдерживаемых типов микроконтроллеров AVR

В настоящий момент поддерживается 145 типов микроконтроллеров AVR, но не все из них были протестированы. Те, что были проверены, подкрашены зеленым цветом. Автор просит в случае проблемы с каким-либо микроконтроллером сообщить ему, тогда он исправит ошибку. Список рассортирован по объему памяти программ микроконтроллера (FLASH).

1 килобайт: AT90s1200, Attiny11, Attiny12, Attiny13/A, Attiny15

2 килобайта: Attiny2313/A, Attiny24/A, Attiny26, Attiny261/A, Attiny28, AT90s2333, Attiny22, Attiny25, AT90s2313, AT90s2323, AT90s2343

4 килобайта: Atmega48/A, Atmega48P/PA, Attiny461/A, Attiny43U, Attiny4313, Attiny44/A, Attiny48, AT90s4433, AT90s4414, AT90s4434, Attiny45

8 килобайт: Atmega8515, Atmega8535, Atmega8/A, Atmega88/A, Atmega88P/PA, AT90pwm1, AT90pwm2, AT90pwm2B, AT90pwm3, AT90pwm3B, AT90pwm81, AT90usb82, Attiny84, Attiny85, Attiny861/A, Attiny87, Attiny88, AT90s8515, AT90s8535

16kB: Atmega16/A, Atmega16U2, Atmega16U4, Atmega16M1, Atmega161, Atmega162, Atmega163, Atmega164A, Atmega164P/PA, Atmega165A/P/PA, Atmega168/A, Atmega168P/PA, Atmega169A/PA, Attiny167, AT90pwm216, AT90pwm316, AT90usb162

32 килобайта: Atmega32/A, Atmega32C1, Atmega323/A, Atmega32U2, Atmega32U4, Atmega32U6, Atmega32M1, Atmega324A, Atmega324P, Atmega324PA, Atmega325, Atmega3250, Atmega325A/PA, Atmega3250A/PA, Atmega328, Atmega328P, Atmega329, Atmega3290, Atmega329A/PA, Atmega3290A/PA, AT90can32

64 килобайта: Atmega64/A, Atmega64C1, Atmega64M1, Atmega649, Atmega6490, Atmega649A/P, Atmega6490A/P, Atmega640, Atmega644/A, Atmega644P/PA, Atmega645, Atmega645A/P, Atmega6450, Atmega6450A/P, AT90usb646, AT90usb647, AT90can64

128 килобайт: Atmega103, Atmega128/A, Atmega1280, Atmega1281, Atmega1284, Atmega1284P, AT90usb1286, AT90usb1287, AT90can128

256 килобайт: Atmega2560, Atmega2561

Я доработал текущую версию доктора до версией 2.10, фото 3D модели новой версии ниже. 

1) Штырьевые перемычки заменил на переключатели

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

3) Добавлено ещё одно посадочное место под USB на нижней стороне платы (запасной, на случай если сломается основной)

4) Добавлена поддержка прошивки V2.12, с возможностью перейти на версию 2.11

6) Поправлена разводка платы

7) + ещё некоторые незначительные измененя.

fuse bit doctor

fuse bit doctor top

6666

Схемы новой версии чуть позже, после того как проверю работоспособность!

Многие радиолюбители знают (иногда на собственном печальном опыте), что микроконтроллер AVR можно вывести из строя неосторожным программированием настроечных бит (так называемых фьюзов). Будучи запрограммированными неправильно, эти биты сохраняются в энергонезависимой памяти, и могут привести к невозможности дальнейшего программирования микроконтроллера или выбору фьюзами его тактовой частоты. По крайней мере невозможно восстановить микроконтроллер обычными средствами, без наличия специального высоковольтного HVPP/HVSP программатора.

HVPP расшифровывается как high voltage parallel programming, т. е. высоковольтное параллельное программирование.

HVSP расшифровывается как high voltage serial programming, т. е. высоковольтное последовательное программирование.

Atmega fusebit doctor, как следует из названия, это устройство, предназначенное для восстановления “убитых” микроконтроллеров AVR ATmega (и ATtiny начиная с версии v2.04 устройства) путем записи в них корректных значений бит фьюзов. Описанное простое и дешевое устройство позволит исправить Ваши брикнутые микроконтроллеры за доли секунды.

1KvLQDNsQc8

Это устройство использует параллельный и последовательный принципы высоковольтного программирования микроконтроллеров AVR. С помощью этих методов можно “достучаться” до убитых микроконтроллеров, у которых запрещен сброс или программирование ISP.

[Как восстановить фьюзы “убитого” микроконтроллера]

Просто поместите убитый AVR в сокет, нажмите кнопку START и… и это все. Вы получите восстановленный, работоспособный микроконтроллер в том виде, как он пришел с завода Atmel. На плате fuse-доктора есть 3 слота для установки большинства совместимых микроконтроллеров AVR, которые совпадают с цоколевкой DIP-версий Atmega8, Atmega16, Attiny2313. Имеется также дополнительный коннектор, куда Вы можете подключить адаптеры:

[Светодиоды индикации]

Для индикации состояния на плате fuse-доктор установлены 2 светодиода – зеленый (GOOD) и красный (BAD).

GREEN LED light const Зеленый постоянно горит – пациент успешно вылечен, биты фьюзов восстановлены. Если разрешены биты защиты, то будет просто проведена проверка состояния фьюзов – заводское ли оно, и если это так, то зеленый светодиод загорается.

RED LED light const Красный постоянно горит – проблема с сигнатурой, её нельзя прочитать, нет микроконтроллера в сокете, или такой сигнатуры нет в базе данных fuse-доктора.

GREEN LED light flashing Зеленый мигает – сигнатура в порядке, но биты фьюзов в неправильном состоянии. Причина – установлены биты защиты, нужно разрешение на полную очистку восстанавливаемого AVR (Необходимо переставить перемычку ERASE с OFF на ON).

RED LED light flashing Красный мигает – сигнатура прочитана, нет блокировки битами защиты, но по непонятной причине нельзя записать новое значение для бит фьюзов.

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

Розовый +5 Вольт

красный +12 Вольт

Светло синий GND (-)

Оранжевый +5 PROG для програмируемых МК, включается транзистором t3

Зеленый +12 RESET для подачи напряжения на ноги RESET востанавливаемых мк.

Общая схема для самостоятельной сборки

==============================================================================

==============================================================================

full

Подключение управляющего контроллера к восстанавливаемым

atmega

Схема подключения USB и преобразователь USB-UART на CP2102

USBC2102

Схема увлечения напряжения с 5в до 12в при помощи микросхемы MC34063

12

Конденсатор 470pf – емкость частотнозадающего конденсатора преобразователя. 
Сопротивление 1  – резистор который отключит микросхему при превышении тока.
C13 – конденсатор фильтра. Чем он больше тем меньше пульсаций, должен быть LOW ESR типа.
13k, 1.5k – делитель напряжения который задает выходное напряжение.
D1 – диод должен быть сверхбыстрым (ultrafast) или диодом шоттки с допустимым обратным напряжение не менее чем в 2 раза превышающим выходное.

С13 электролит 220мкф, 

Схемы соединения, светодиодов, транзисторов и кнопки “старт”

komun

Подключение микроконтроллеров ATTINY 24/44/48/2313/4313

tiny

Подключение микроконтроллеров ATMEGA 8/16/32/48/164/168/324/328

atmegaprog

Вот востановил Attiny 13A SSU

578

Также можно просмотреть что там происходит с МК при помощи любого терминала, благодаря встроенному USB-UART CP2101.

log

Фото печатной платы в DIP TRACE

Верхняя часть платы

top

Нижняя часть платы

botom

     

Поделиться

Нашли опечатку?

Пожалуйста, сообщите об этом – просто выделите ошибочное слово или фразу и нажмите Shift Enter.

avr-gcc (WinAVR): поиск и устранение ошибок при компиляции и линковке Печать

Добавил(а) microsin

  

Здесь приведены некоторые методы поиска и устранения ошибок компиляции и линковки в пакете avr-libc/avr-gcc (WinAVR, AVR Studio, Atmel Studio).

Справка по опциям командной строки высвечивается командой:

В зависимости от причин ошибки могут быть разные. Либо утилита make вообще не запускается, либо в процессе обработки makefile выдаются ошибки наподобие “Системе не удается найти указанный путь.”. Первое, что нужно сделать в таких случаях – попытаться найти причину ошибки. Если причина известна, то будет понятен возможный способ её решения. Рассмотрим возможные варианты.

1. Самый простой случай, когда make вообще не запускается:

"make" не является внутренней или внешней
командой, исполняемой программой или пакетным файлом.

Это сообщение сигнализирует о том, что операционная система не может найти утилиту make. Либо вообще не установлен тулчейн, либо по какой-то причине в системной переменной %Path% не прописан путь до утилиты make. Решение простое – убедиться, что установлен нужный тулчейн, где утилита make присутствует, и проверить, что в переменной окружения %Path% правильно задан путь для запуска утилиты make.

Для компиляции makefile-проектов для AVR (например, из библиотеки LUFA) нужен либо тулчейн WinAVR, либо AVR Studio, либо Atmel Studio.

2. В процессе работы make возникают ошибки. Нужно внимательно изучить выводимые сообщения, и по ним разбираться в причинах проблем. Самый частый случай – в системе установлено несколько разных тулчейнов, где присутствует утилита make.exe, и когда Вы выполняете команду make, то запускается утилита из не того тулчейна, который нужен.

К сожалению, в этом случае сообщения об ошибке утилиты make может быть не информативным, например:

Системе не удается найти указанный путь.

Найдите на жестком диске все исполняемые файлы make.exe, и если их несколько, то отредактируйте записи в переменной Path таким образом, чтобы make.exe нужного тулчейна запускалась в приоритете, т. е. чтобы её запись пути поиска находилась первой в списке путей.

Если у Вас установлено несколько версий WinAVR, то нужно удалить старые пути запуска из переменной окружения Path, чтобы оставить только пути до той версии WinAVR, с которой Вы сейчас работаете. Такое может произойти, если на компьютере переустанавливался WinAVR (например, раньше был WinAVR-20080610, а теперь стал WinAVR-20100110). Необходимо ОБЯЗАТЕЛЬНО очистить переменную окружения %Path% от старых путей, иначе пути включаемых файлов include будут вычисляться компилятором gcc неправильно. Нельзя допускать, чтобы старые пути WinAVR соседствовали в %Path% с новыми, даже если новые пути идут первыми. Например, из-за этого глюка я долго не мог разобраться, почему компилятор и линковщик никак не могут найти функцию eeprom_update_byte. Для проверки, какие реально включаемые пути использует компилятор (где он ищет h-файлы), используйте опцию -print-search-dirs (см. пункт 4).

Для быстрого переключения путей Path на разные версии WinAVR удобно использовать командные файлы с настроенной командой set на разные значение переменной окружения Path. Также существует очень удобная утилита Rapid Environment Editor site:rapidee.com, которая позволяет легко просматривать, изменять записи переменной Path, добавлять новые записи, изменять их положение в списке. Имейте в виду, чтобы редактировать системные записи переменной Path, необходимо запустить эту утилиту с правами администратора.

3. Изучать сообщение об ошибке нужно очень внимательно, чтобы понять причину проблемы. Вот еще один пример, где совсем не очевидно, что проблема кроется в отсутствии папки obj в корневом каталоге проекта.

c:asmlufa-LUFA-170418DemosDeviceClassDriverGenericHID>make
' [INFO]    :' Begin compilation of project "GenericHID"...
""
avr-gcc (AVR_8_bit_GNU_Toolchain_3.6.1_1750) 5.4.0
Copyright (C) 2015 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 
' [GCC]     :' Compiling C file "GenericHID.c"
avr-gcc -c -pipe -gdwarf-2 -g2 -mmcu=at90usb1287 -fshort-enums -fno-inline-small
-functions -fpack-struct -Wall -fno-strict-aliasing -funsigned-char -funsigned-b
itfields -ffunction-sections -I. -DARCH=ARCH_AVR8 -DF_CPU=8000000UL -mrelax -fno
-jump-tables -x c -Os -std=gnu99 -Wstrict-prototypes -DUSE_LUFA_CONFIG_HEADER -I
Config/ -I. -I../../../../LUFA/.. -DARCH=ARCH_AVR8 -DBOARD=BOARD_USBKEY -DF_USB=
8000000UL  -MMD -MP -MF obj/GenericHID.d GenericHID.c -o obj/GenericHID.o
Assembler messages:
Fatal error: can't create obj/GenericHID.o: No such file or directory
GenericHID.c:201:1: fatal error: error writing to -: Invalid argument
 }
 ^
compilation terminated.
../../../../LUFA/Build/DMBS/DMBS/gcc.mk:213: recipe for target 'obj/GenericHID.o
' failed
make: *** [obj/GenericHID.o] Error 1

После добавления папки obj в корневой каталог проекта ошибка исчезает.

См. также Q006 и Q015.

Для разборок с запутанными операторами условной компиляции (#ifdef, #ifndef, #else и проч.) удобно использовать директивы #warning “сообщение” и #error “сообщение”. Они позволяют точно определить, какую ветку в исходном тексте компилятор просмотрел, а какую отбросил.

Когда непонятно, почему не включается какой-нибудь заголовочный файл, удобно воспользоваться опцией -print-search-dirs, которая показывает пути поиска компилятором файлов. Эту опцию можно добавить в makefile к общим флагам компилятора, например так:

ALL_CFLAGS += -print-search-dirs

Причина – пропущена точка с запятой в начале строки комментария. Комментарий при этом скорее всего на русском языке.

Пример:

make: *** No rule to make target `opendous-jtag.elf', needed by `elf'. Stop.
make: *** Нет правила для сборки цели `opendous-jtag.elf', требуемой для `elf'. Останов.

Исправление ошибки:

1. Открыть makefile текстовым редактором, найти строку “elf:”. В этой строке будет прописано имя цели, например:

2. make ругается на отсутствие этой цели $(TARGET).elf. Проверьте, правильно ли задана у Вас переменная TARGET, она должна быть задана строкой наподобие:

# Target file name (without extension).
TARGET = opendous-jtag

3. Если цель у Вас задана правильно, то возможно ошибка в описании действий по обработке цели. Найдите в makefile место, где обрабатывается цель elf. Это может быть блок текста наподобие следующего:

# Link: create ELF output file from object files.
.SECONDARY :
 $(TARGET).elf
.PRECIOUS :
 $(OBJ)%
.elf:
 $(OBJ)
    @echo
    @echo $(MSG_LINKING) $@
    $(CC) $(ALL_CFLAGS) $^ --output $@ $(LDFLAGS)

Здесь % означает “любой текст”. Обычно такой знак используется для задания файлов определенного типа, например *.c, *.cpp, *.o и т. д. В некоторых случаях (например, в тулчейнах Atmel) такой паттерн обрабатывается неправильно, и не может быть автоматически сопоставлен с целью $(TARGET).elf. Поменяйте “%.elf:” на “$(TARGET).elf:”, получится следующее:

$(TARGET).elf:
 $(OBJ)
    @echo
    @echo $(MSG_LINKING) $@
    $(CC) $(ALL_CFLAGS) $^ --output $@ $(LDFLAGS)

См. также Q002 и Q015.

Пример:

------ Rebuild All started: Project: usbasploader, Configuration: default AVR ------
Build started.
Project "usbasploader.cproj" (ReBuild target(s)):
Target "PreBuildEvent" skipped, due to false condition; ('$(PreBuildEvent)'!='') was evaluated as (''!='').
Target "CoreRebuild" in file "C:Program FilesAtmelAtmel Studio 6.0VsCompiler.targets" from project 
"C:asmUSBasp-bootloaderusbasploader.cproj" (target "ReBuild" depends on it):
Using "RunCompilerTask" task from assembly "C:Program FilesAtmelAtmel Studio 6.0VsCompiler.Task.dll".
Task "RunCompilerTask"
C:Program FilesAtmelAtmel Studio 6.0makemake.exe -C "C:asmUSBasp-bootloader" -f "Makefile" clean all 
c:Program FilesAtmelAtmel Studio 6.0makerm.exe: cannot remove `*.o': Invalid argument
make: Entering directory `C:/asm/USBasp-bootloader'
rm -f usbasploader.hex main.bin *.o usbdrv/*.o main.s usbdrv/oddebug.s usbdrv/usbdrv.s
c:Program FilesAtmelAtmel Studio 6.0makerm.exe: cannot remove `usbdrv/*.o': Invalid argument
make: Leaving directory `C:/asm/USBasp-bootloader'
make: *** [clean] Error 1
Done executing task "RunCompilerTask" -- FAILED.
Done building target "CoreRebuild" in project "usbasploader.cproj" -- FAILED.
Done building project "usbasploader.cproj" -- FAILED.
Build FAILED.
========== Rebuild All: 0 succeeded, 1 failed, 0 skipped ==========

Ошибку можно устранить, если в тулчейне Atmel Studio заменить утилиту rm.exe (обычно находится в папке c:Program FilesAtmelAtmel Studio 6.0make) на rm.exe другой версии, которую можно взять из пакета WinAVR (обычно находится в папке c:WinAVR-20100110utilsbin).

Пример:

USBtoSerial.c:1:0: error: unrecognized argument to -mmcu= option: 'ATmega32U4'
USBtoSerial.c:1:0: note: See --target-help for supported MCUs

Причина в регистре символов опции MCU, которая была указана через makefile (или через командную строку). В опции -mcmu тип микроконтроллера должен быть указан маленькими буквами, т. е. вместо ATmega32U4 нужно указать atmega32u4.

#это ошибочно указанный для avr-gcc тип микроконтроллера:
#MCU = ATmega32U4
#здесь тип микроконтроллера указан правильно:
MCU = atmega32u4

Часто задаваемый вопрос, который звучит примерно так: “Скажите пожалуйста, можно ли каким нибудь образом конвертировать проект, скомпилированный с помощью MinGW, в проект AVR Studio или в Atmel Studio?”.

Здесь под “проектом MinGW” подразумевается обычный проект на основе makefile, который компилируется из командной строки командами make clean / make hex (и т. п.). Ответ на этот вопрос – можно, и довольно легко. Дело в том, и AVR Studio, и Atmel Studio ВСЕГДА использует для компиляции внешний компилятор gcc и среду компиляции на основе makefile (это называется тулчейн, он может быть установлен как отдельно в виде WinAVR, так и в составе Atmel Studio). Причем есть два способа такой компиляции – либо makefile генерируется для проекта на лету средой AVR Studio/Atmel Studio, либо подключается внешний makefile (это настраивается в свойствах проекта AVR Studio/Atmel Studio).

Таким образом, Вы можете, во-первых – подключить к проекту внешний makefile (возьмите его из “проекта, скомпилированного с помощью MinGW”). Однако такой makefile должен быть составлен по особым правилам (в частности, имя target должно совпадать с названием проекта), так что обратитесь к документации Atmel или сделайте makefile на основе готового примера. Это можно условно назвать “конвертировать проект MinGW в проект AVR Studio или Atmel Studio”.

Во-вторых, если не подключать внешний makefile, то можно просто тупо посмотреть все опции, которые настроены в “проекте MinGW” (т. е. заданы в makefile), и создать аналогичные опции в среде настроек свойств обычного проекта AVR Studio (или Atmel Studio). Например, нужно задать такие же:

– тип процессора (обычно это опция DEVICE makefile).
– тактовую частоту ядра (F_CPU).
– библиотека для отладочного вывода printf (PRINTF_LIB и т. п.).
– настройка опций генерации кода gcc – оптимизация и т. д. (CFLAGS).

Второй способ трудно назвать “конвертацией”, потому что проект Вы будете настраивать вручную, подсматривая опции для настройки в готовом makefile “проекта MinGW”. Однако и тут ничего сложного в принципе нет.

При перекомпиляции проекта Atmel Studio выдает ошибку наподобие “Целевой объект “PreBuildEvent” пропущен из-за невыполненного условия; выражение (‘$(PreBuildEvent)’!=”) равно (”!=”)”, и проект не компилируется.

Это просто глюк IDE Atmel Studio, связанный с ошибочной обработкой пустого списка событий до запуска сборки проекта (Pre-build event). Глюк можно обойти, если добавить ничего не значащее событие, которое есть, но ничего не делает. Для этого откройте свойства проекта, перейдите на закладку Build Events, нажмите кнопку Edit Pre-build и добавьте в список Pre-build event command line командную строку наподобие sleep 0, нажмите OK, сохраните проект.

После этого проект будет компилироваться нормально.

Примерно так выглядит сообщение компилятора:

Build started 8.5.2015 at 16:09:30
avr-gcc  -mmcu=atmega168 -Wall -gdwarf-2 -DF_CPU=11059200UL -Os -fsigned-char -MD -MP -MT ms5535.o
 -MF dep/ms5535.o.d  -c  ../ms5535.c
../ms5535.c: In function 'ConvertCtoW5535':
../ms5535.c:73:1: error: insn does not satisfy its constraints:
(insn 118 65 66 12 (set (reg/v:SI 20 r20 [orig:65 C6 ] [65])
        (mem/c/i:SI (plus:HI (debug_expr:HI D#1)
                (const_int 4 [0x4])) [3 C6+0 S4 A8])) ../ms5535.c:52 874 {*movsi}
     (expr_list:REG_EQUIV (mem/c/i:SI (plus:HI (reg/f:HI 34 argL)
                (const_int 4 [0x4])) [3 C6+0 S4 A8])
        (nil)))
../ms5535.c:73:1: internal compiler error: in reload_cse_simplify_operands, at postreload.c:403
Please submit a full bug report,
with preprocessed source if appropriate.
See <http://www.atmel.com> for instructions.
make: *** [ms5535.o] Ошибка 1
Build failed with 2 errors and 0 warnings...

Ошибка связана с версией компилятора avr-gcc, и устраняется обновлением, либо к откату до предыдущей версии.

Примерно так выглядит сообщение компилятора:

../usart.c:46:6: error: attempt to use poisoned "SIG_USART_RECV"
 ISR (SIG_USART_RECV)
      ^
In file included from ../usart.c:1:0:
../usart.c: In function 'SIG_USART_RECV':
../usart.c:46:6: warning: 'SIG_USART_RECV' appears to be a misspelled signal handler [enabled by default]
 ISR (SIG_USART_RECV)
      ^
make: *** [usart.o] Error 1
Build failed with 1 errors and 1 warnings...

Проект раньше нормально компилировался тулчейном WinAVR, и такая ошибка стала появляться при попытке компиляции тулчейном Atmel Studio. Проблема была решена возвратом к тулчейну WinAVR-20100110.

Примерно так выглядит сообщение компилятора:

avr-gcc  -mmcu=atmega328 -Wall -gdwarf-2 -DF_CPU=11059200UL -Os -fsigned-char -MD -MP -MT usart.o
 -MF dep/usart.o.d  -c  ../usart.c
../usart.c:47: warning: 'SIG_USART_RECV' appears to be a misspelled signal handler

Предупреждение стало появляться при переводе проекта с ATmega168 (настройка в makefile: MCU = atmega168) на ATmega328 (MCU = atmega328). Вот в этом месте кода возникало предупреждение (выделено жирным шрифтом):

//обработчик прерывания приема USART
#if ((defined (__AVR_ATmega8__)) || (defined (__AVR_ATmega168__)) || (defined(__AVR_ATmega328__)))
ISR (SIG_USART_RECV)
#elif (defined (__AVR_ATmega16__))
ISR (SIG_UART_RECV)
#endif
{
    rxbuf[inrx++] = UDR0;
    inrx &= RXBUF_MASK;
    rxtimeout = 0;
}

Ошибка связана с тем, что в подключаемом файле, где определены векторы прерывания процессора, по-разному даны имена векторов прерываний для микроконтроллеров ATmega168 и ATmega328. Для того, чтобы узнать правильное имя вектора прерывания, откройте файл avrincludeavrio.h тулчейна, найдите там строку с условием препроцессора, где проверяется тип процессора (в нашем примере надо найти __AVR_ATmega328__):

...
#elif defined (__AVR_ATmega328P__) || defined (__AVR_ATmega328__)
#  include < avr/iom328p.h >
...

Строка #include < avr/iom328p.h > укажет на заголовочный файл, где определены регистры и вектора прерывания для процессора ATmega328. Откройте файл iom328p.h, и в секции определения векторов прерываний найдите нужное имя вектора прерывания (в данном примере имя вектора приема USART будет USART_RX_vect):

/* Interrupt Vectors */
/* Interrupt Vector 0 is the reset vector. */
#define INT0_vect         _VECTOR(1)   /* External Interrupt Request 0 */
#define INT1_vect         _VECTOR(2)   /* External Interrupt Request 1 */
#define PCINT0_vect       _VECTOR(3)   /* Pin Change Interrupt Request 0 */
#define PCINT1_vect       _VECTOR(4)   /* Pin Change Interrupt Request 0 */
#define PCINT2_vect       _VECTOR(5)   /* Pin Change Interrupt Request 1 */
#define WDT_vect          _VECTOR(6)   /* Watchdog Time-out Interrupt */
#define TIMER2_COMPA_vect _VECTOR(7)   /* Timer/Counter2 Compare Match A */
#define TIMER2_COMPB_vect _VECTOR(8)   /* Timer/Counter2 Compare Match A */
#define TIMER2_OVF_vect   _VECTOR(9)   /* Timer/Counter2 Overflow */
#define TIMER1_CAPT_vect  _VECTOR(10)  /* Timer/Counter1 Capture Event */
#define TIMER1_COMPA_vect _VECTOR(11)  /* Timer/Counter1 Compare Match A */
#define TIMER1_COMPB_vect _VECTOR(12)  /* Timer/Counter1 Compare Match B */ 
#define TIMER1_OVF_vect   _VECTOR(13)  /* Timer/Counter1 Overflow */
#define TIMER0_COMPA_vect _VECTOR(14)  /* TimerCounter0 Compare Match A */
#define TIMER0_COMPB_vect _VECTOR(15)  /* TimerCounter0 Compare Match B */
#define TIMER0_OVF_vect   _VECTOR(16)  /* Timer/Couner0 Overflow */
#define SPI_STC_vect      _VECTOR(17)  /* SPI Serial Transfer Complete */
#define USART_RX_vect     _VECTOR(18)  /* USART Rx Complete */
#define USART_UDRE_vect   _VECTOR(19)  /* USART, Data Register Empty */
#define USART_TX_vect     _VECTOR(20)  /* USART Tx Complete */
#define ADC_vect          _VECTOR(21)  /* ADC Conversion Complete */
#define EE_READY_vect     _VECTOR(22)  /* EEPROM Ready */
#define ANALOG_COMP_vect  _VECTOR(23)  /* Analog Comparator */
#define TWI_vect          _VECTOR(24)  /* Two-wire Serial Interface */
#define SPM_READY_vect    _VECTOR(25)  /* Store Program Memory Read */

Осталось в проекте исправить код препроцессора, где проверяется тип микроконтроллера и подставляется правильное имя вектора прерывания:

//обработчик прерывания приема USART
#if ((defined (__AVR_ATmega8__)) || (defined (__AVR_ATmega168__)))
ISR (SIG_USART_RECV)
#elif (defined (__AVR_ATmega328__))
ISR (USART_RX_vect)
#elif (defined (__AVR_ATmega16__))
ISR (SIG_UART_RECV)
#endif
{
    rxbuf[inrx++] = UDR0;
    inrx &= RXBUF_MASK;
    rxtimeout = 0;
}

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

Как решить проблему, не прибегая к выключению отладки (опции -O0 и т. п.)? Иногда выключить отладку не представляется возможным. ИМХО самый простой способ – присвоить переменной атрибут volatile, тогда компилятор не будет её оптимизировать, и выделит для этой переменной отдельную ячейку памяти.

void placetimesectors (void)
{
   volatile u8 ss, mm, hh;
   RGB_t color;
   
   ss = BCDtoBIN(rtc.reg.ss);
   mm = BCDtoBIN(rtc.reg.mm);
   hh = BCDtoBIN(rtc.reg.hh & 0x1F);

Теперь переменные ss, mm и hh будут легко доступны при пошаговой отладки. Этот совет хорошо подходит для большинства компиляторов, как IAR, так и GCC.

Также для AVR GCC (начиная с версии 4.4) можно отключить оптимизацию для блока кода с помощью директивы pragma:

#pragma GCC push_options
#pragma GCC optimize ("O0")
 
//Код, где будет отключена оптимизация
...
 
#pragma GCC pop_options

Для функции можно отключить оптимизацию добавлением атрибута __attribute__((optimize(“O0”))), например так:

void __attribute__((optimize("O0"))) foo(unsigned char data) {
    // не модифицируемый компилятором код
    ...
}

Среда AVR Studio при запуске компиляции проекта выдает ошибку: avr-gcc: CreateProcess: No such file or directory. Проблема здесь в том, что AVR Studio не может найти тулчейн (компилятор avr-gcc.exe и утилиту make.exe). Возможные причины:

1. Тулчейн не установлен.
2. В переменной окружения %Path% отсутствуют пути запуска для avr-gcc.exe и make.exe.

Как исправить: нужно установить тулчейн. Тулчейн это либо пакет WinAVR, либо тулчейн, который можно скачать и установить в составе Atmel Stidio или отдельно. Если у Вас есть уже установленная копия тулчейна, то достаточно добавить в переменную %Path%. полный путь до утилит avr-gcc.exe и make.exe.

Возможно, что для некоторых все вышесказанное кажется абракадаброй. Поэтому если Процесс по шагам (на примере AVR Studio 4.19, Windows 7 64-bit):

1. Скачайте архив [1].

2. Распакуйте из архива папку WinAVR-20100110 на диск C:

3. На этом шаге надо настроить (или проверить правильность) путей поиска в переменной %Path%. Кликните Пуск -> Панель управления -> Система -> Дополнительные параметры системы -> Переменные среды… -> нижний список Системные переменные -> Найдите в списке строку с переменной Path и выберите её -> нажмите на нижнюю кнопку Изменить… -> Проверьте, что в строке ввода пути есть пути C:WinAVR-20100110bin (в этой папке находится avr-gcc.exe) и C:WinAVR-20100110utilsbin (в этой папке находится make.exe). После того, как внесли изменения, кликните OK, OK и еще раз OK.

Примечание: помните, что отдельные записи в переменной Path отделяются друг от друга точкой с запятой. Если Вы затрудняетесь с редактированием переменных окружения, то прогуглите этот вопрос, в Интернете полно материала по теме.

Примерно так должна выглядеть переменная %Path% после редактирования (это результат выполнения команды echo %Path%, добавленные пути выделены жирным шрифтом):

C:Python25;C:Python25Scripts;C:ProgramDataOracleJavajavapath;C:Program
FilesImageMagick-6.9.0-Q16;C:WinAVR-20100110bin;C:WinAVR-20100110utilsbin;
C:Program Files (x86)NVIDIA CorporationPhysXCommon;C:Program Files (x86)AM
D APPbinx86_64;C:Program Files (x86)AMD APPbinx86;C:Windowssystem32;C:W
indows;C:WindowsSystem32Wbem;C:WindowsSystem32WindowsPowerShellv1.0;C:P
rogram Files (x86)Common FilesAdobeAGL;C:Program FilesTortoiseHg;C:Program
 Files (x86)SecureCRT;C:Program Files (x86)SkypePhone;C:Program Files (x8
6)Atmelsam-ba_2.13drv;C:Program Files (x86)Atmelsam-ba_2.13;C:Program Fi
les (x86)Dev-CppMinGW32bin;C:Program Files (x86)AtmelFlip 3.4.7bin

4. Запустите AVR Studio, откройте проект, который у Вас компилировался с ошибкой. Откройте свойства проекта, перейдите в раздел Custom Options, снимите галочку Use AVR Toolchain, и с помощью кнопочек “…” добейтесь, чтобы для avr-gcc у Вас был путь:

C:WinAVR-20100110binavr-gcc.exe

и для make был путь:

C:WinAVR-20100110utilsbinmake.exe

AVR Studio set toolchain

Нажмите OK.

См. также Q002 и Q006.

Например, для ATmega16 следующий код скомпилируется нормально:

   out _SFR_IO_ADDR(TIMSK), R24

Но для ATmega328 подобный код выдаст ошибку “Error: number must be positive and less than 64”:

   out _SFR_IO_ADDR(TIMSK1), R24

Такая ошибка происходит из-за того, что сделана попытка обратиться к регистру SFR (регистр специального назначения, Special Function Register) командой in или out, при этом адрес SFR превысил значение 63. У регистра TIMSK1 адрес равен 0x6F (десятичное 111), что как раз адрес превышает 63.

Исправить ошибку можно, если вместо out применить команду sts (in заменяется на lds):

[Ссылки]

1. 160215WinAVR-20100110.zip.

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

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