Тайм фьюз своими руками

Добавил пользователь Alex
Обновлено: 19.09.2024

Частенько при проектировании или сборке очередной схемы на микроконтроллерах у многих радиолюбителей возникают трудности с фьюзами, многие боясь испортить (заблокировать) микроконтроллер спрашивают советов на форумах, ищут похожие проекты или же пытаются разобраться с помощью калькулятора фьюзов. Честно сказать, даже в калькуляторе не так просто разобраться. Чтобы всем было проще, решил в этой статье привести примеры установок фьюзов, т.е. скриншоты. начнем с ATtiny ну, поехали!

Во всех картинках фьюзы как по даташиту:
- снятая галочка– fuse bit = 0, фьюз запрограммирован / активный;
- установленная галочка– fuse bit = 1, фьюз НЕ запрограммирован / НЕ активный.

Для UniProf - ставить как на картинках
Для PonyProg, CVAVR, AVR Studio – ставить инверсно, т.е. наоборот.

Фьюз биты позволяют устанавливать различные режимы работы микроконтроллера, задать частоту и источник тактового сигнала, превратить порт, связанный с Reset, в обычный порт ввода-вывода, и многое другое. Хранятся Fuse биты в специально отведенной для этого области памяти flash памяти. И обычно занимают от 1 до 3 байт памяти в зависимости от микроконтроллера.

Важной особенностью, является то, что значение 0 фьюз бита означает, что он активен, установлен . Тогда как значение 1 фьюз бита, означает, что соответствующий ему параметр не активен, не установлен . Это правило идет от самого названия фьюз бита, т.е. Fuse – в переводе с английского, предохранитель . Т.е. если предохранитель цел, то фьюз бит не установлен, а вот если мы меняем его значение, условно, сжигая предохранитель, то значение фьюз бита становится равным нулю.

Калькулятор фьюзов

Вначале выбирается микроконтроллер. Например, ATtiny13A . Сразу же после выбора открываются значения фьюзов, установленные по умолчанию для данного микроконтроллера.

Далее можно либо изменять характеристики работы микроконтроллера, либо управлять непосредственно фьюз битами. Оба раздела работают синхронно.

В левой колонке младший байт, а в правой старший. Отмечая галочкой разные фьюз биты, мы соответственно меняем шестнадцатиричное представление младшего и старшего байта. Именно эти значения нам дальше и понадобятся.

Т.е. видно, что по умолчанию, значения младшего (Low) и старшего (High) байта для ATtiny13 равны 6A и FF , соответственно.

Краткое описание основных фьюзов

Далее я кратко расскажу, какие фьюз биты за что отвечают, и какие нам наиболее интересны.

SPIEN – если данный фьюз отключить, то мы потеряем возможность прошивать микроконтроллер с помощью ISP программатора, в качестве которого у нас выступает Arduino UNO.

EESAVE – в активном состоянии, позволяет защитить данные в EEPROM памяти при полном сбросе к заводским установкам.

WDTON – отвечает за работу так называемого сторожевого пса (watch dog). Это таймер, у которого задается определенный временной интервал, и если в течение этого интервала его не сбросить, то он перезагрузит микроконтроллер. Это может понадобится в следствие потери связи к каким-либо датчиком, чтобы перезагрузить микроконтроллер и снова провести инициализацию всех датчиков. Если активировать данный фьюз, то сторожевой таймер включается сразу же при подаче питания и программно его уже нельзя будет отключить.

CKDIV8 – это делитель тактовой частоты на 8. По умолчанию включен.

CKSEL1 и CKSEL0 – биты определяющие использование внешнего или внутреннего тактового генератора и тактовую частоту. Данные значения проще менять непосредственно в Arduino IDE.

SUT1 и SUT0 – задают время старта тактового генератора, после подачи питания на микроконтроллер или после его перезагрузки. Их лучше оставлять по умолчанию, на мой взгляд, ни на что особо они не влияют.

SELFPRGEN – активация данного бита, разрешает проводить самопрограммирование микроконтроллера. Т.е. из нашего скетча, мы можем производить запись во флэш-память микроконтроллера. В теории механизм интересный, т.к. можно, например, хранить какие-то данные, получаемые в ходе работы программы, вместо EEPROM или вместе с EEPROM во флэш-памяти, незанятой программой.

DWEN – включает интерфейс отладки микроконтроллера по одному проводу DebugWire.

BODLEVEL1 и BODLEVEL0 – биты, отвечающие за контроль напряжения, подаваемого на микроконтроллер. И если оно ниже заданного с помощью этих двух бит, то микроконтроллер перезагружается. Изменять эти значения можно и непосредственно в Arduino IDE.

RSTDISBL – позволяет превратить порт связанный с Reset , в обычный порт ввода-вывода. Т.е. на ATtiny13/25/45/85 мы получаем 6 пинов ввода-вывода вместо 5 . И особенно это полезно на ATtiny10, где всего 6 ножек и устанавливая данный фьюз, мы получаем 4 пина для работы с цифровым и аналоговым сигналом, вместо 3 -х.

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

Считывание и запись фьюзов

А теперь я расскажу, как можно считывать фьюзы микроконтроллера и как их перезаписывать. В качестве ISP программатора будет выступать Arduino UNO .

Загрузим в память ATtiny13 стандартный скетч " Blink ". И установим прямо на программатор светодиод с припаянным резистором на 220 Ом. Одна ножка к земле, другая к 7 пину. Светодиод у нас мигает раз в секунду.

Получив из Китая очередную партию чипов ATtiny2313 для изготовления шлюзов UART-to-I2C/SPI/1W я, вдруг, обнаружил, что эти чипы совершенно невозможно прошить последовательным внутрисхемным (ICSP) программатором. Чипы при этом были в заводской упаковке и без следов пайки. Ранее я уже сталкивался с ситуациями, когда китайцы продавали новые рабочие чипы, но заранее прошитые под какие-либо устройства (например, — вот). Такие чипы прошивают нужной прошивкой прямо на заводе, но, видимо, время от времени случаются накладки, заказчик не забирает партию и чипы попадают в открытую продажу.

Ситуация в общем-то обычная, сложность же конкретно с контроллерами AVR заключается в том, что при сбросе определённых фьюзов, прошить контроллер становится возможно только параллельным программатором в режиме высоковольтного программирования (с использованием напряжения +12 Вольт). Схемы фьюз-докторов для AVR можно найти в интернете, однако минус всех этих схем заключается в полном отсутствии описания их работы. Выложена просто готовая прошивка, которую нужно залить в управляющий схемой контроллер, включить, нажать кнопку и будет вам счастье. Ни исходников, ни подробностей, вообще никаких объяснений.

Для меня, как для радиохламера, такой подход совершенно невозможен и невыносим, поэтому решено было разработать свой собственный программатор / фьюз-бит доктор для микроконтроллеров AVR, описать как он работает и выложить в открытый доступ не только прошивку, но и исходники программы для микроконтроллера с комментариями. Итак, поехали:

Для начала разберёмся с сигналами. Сигналы используются следующие:

  • 8 сигналов для параллельного приёма/передачи байта данных DATA[7:0]. Сигналы передаются в обоих направлениях в зависимости от сигнала OE.
  • 9 служебных сигналов:
    • RDY/BSY — уровень на этой линии сигнализирует о готовности контроллера принимать новые команды. Данные передаются от контроллера к программатору
    • OE — служит для переключения линий данных на вход (высокий уровень) или на выход (низкий уровень)
    • WR — используется для старта выполнения каких-либо действий (стирание / запись …)
    • BS2, BS1 — эти две линии используются для выбора старших или младших байт
    • XA1, XA0 — по уровням на этих двух линиях определяется какое действие будет выполняться по наличию тактового импульса
    • PAGEL — используется при программировании Flash/EEPROM
    • XTAL1 — используется для подачи тактовых импульсов

    Кроме этого нам потребуется напряжение +12 Вольт (для перехода в режим программирования), +5 Вольт — для питания контроллера, ну и естественно нужно будет подключить нулевой провод, относительно которого задаются +12 и +5 Вольт, к ноге GND.

    В некоторых контроллерах какие-то сигналы могут быть объединены (например, в ATtiny2313 объединены ноги BS1 и PAGEL, а также XA1 и BS2), кроме того, могут отличаться номера ног, на которые заводятся эти сигналы (например, в ATmega8 для данных используются два младших бита порта C и 5 младших бит порта B, а в ATtiny2313 для данных используется только порт B целиком).

    С алгоритмами тоже всё оказалось довольно просто, — вся задача сводится к выставлению нужных уровней на некоторые служебные линии (XA1, XA0, BS2, BS1, OE) и линии данных, а также к генерированию положительных или отрицательных импульсов на других служебных линиях (XTAL1, WR, PAGEL). Плюс нужно управлять питанием +5 Вольт (+1 линия) и напряжением +12 Вольт (ещё +1 линия). Управление всеми нужными линиями решено было сделать командами через UART (для этого нужно ещё 2 линии).

    Исходя из всего выше описанного, для реализаци устройства нужно иметь 21 линию I/O (8 — данные + 9 — служебные сигналы + 2 — управление линиями +5 и +12 Вольт + 2 — uart), что, согласитесь, довольно много. Чтобы ног на всё хватило, в качестве управляющего контроллера была выбрана ATmega8 (для прототипа, естественно, в dip-корпусе), — у неё 23 линии I/O.

    Справа на схеме нарисовано как подключать к ней микроконтроллеры ATtiny2313.

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

    • разводка выполнена для одностороннего текстолита (не нужно совмещать разные стороны при переносе рисунка на плату)
    • использован контроллер в dip-корпусе (возможность установки в кроватку + большие расстояния между ножками обеспечивают лёгкость пайки)
    • все нужные контакты выведены на линейки с большим шагом (2,54 мм)
    • есть разъём для внутрисхемного программирования управляющего контроллера (для отладки очень удобно прошивать контроллер прямо на плате, не вынимая из кроватки)

    При разводке платы я также предусмотрел установку конденсаторов по линиям питания +5 и +12 Вольт (прямо рядом с разъёмом питания). Эти конденсаторы на схеме не нарисованы, но я решил их на всякий случай поставить. Большого тока схема не потребляет, поэтому будет достаточно конденсаторов на 10-47 мкФ, рассчитанных на максимальное напряжение 16-25 Вольт и выше.

    После сборки устройство выглядит вот так:

    В соответствии с приведёнными в даташитах алгоритмами и диаграммами наш программатор должен уметь делать следующие вещи:

    • переходить в режим программирования
    • устанавливать и считывать уровни на линиях DATA[7:0]
    • выставлять правильные уровни на линиях XA1, XA0, BS2, BS1, OE
    • генерировать импульсы заданной ширины на линиях WR, XTAL1, PAG

    Учитывая, что переходить в режим программирования нужно из какого-то начального состояния, а также то, что линия PAG может быть совмещена с BS1, — для реализации заявленного выше функционала нам хватит всего 11-дцати UART-команд, которые я просто пронумеровал от 0x1 до 0xB:

    • 0x01 — установить все используемые для программирования выводы (включая выводы, управляющие линиями +5 и +12 вольт) в начальное состояние
    • 0x02 — выполнить алгоритм перехода в режим программирования
    • 0x03 — выполнить алгоритм выхода из режима программирования
    • 0x04 — установить нужное состояние на линиях XA1/XA0 и BS2/BS1
    • 0x05 — установить нужное состояние на линии OE
    • 0x06 — сформировать положительный импульс на линии BS1
    • 0x07 — сформировать положительный импульс на линии PAG
    • 0x08 — сформировать положительный импульс на линии XTAL1
    • 0x09 — сформировать отрицательный импульс на линии WR
    • 0x0A — установить нужные уровни на линиях Data[7:0]
    • 0x0B — прочитать состояния линий Data[7:0]

    Теперь некоторые моменты обсудим более детально:

    Во-первых. В даташитах написано, что перед переходом в режим программирования нужно установить сигналы XA1, XA0, BS1 и WR (они называются Prog_enable) в ‘0000’. Поскольку сигнал на линии WR инвертирован (active low) и далее на всех диаграммах он начинается с высокого уровня, то логично было бы предположить, что его начальное состояние — это высокий уровень (именно он для него означает 0). На деле оказалось, что это работает только после подачи питания, а до подачи питания для всех ног 0 — это низкий уровень, и перед переходом в режим программирования все ноги, входящие в группу Prog_enable должны быть притянуты к низкому уровню.

    Сам алгоритм перехода в режим программирования банален, — после того, как все линии Prog_enable притянуты к низкому уровню — нужно включить питание +5 Вольт и далее через 20-60 мкс включить напряжение +12 Вольт. Через 10 мкс после этого можно начинать переключать линии Prog_enable, а через 300 мкс — загружать каманды.

    Выйти из режима программирования можно отключив от программируемого чипа +12 Вольт или +5 Вольт (или оба сразу).

    Ну и, наконец, чтобы как-то сообщить компьютеру о том, что предыдущий принятый байт обработан и можно посылать следующий — будем отсылать обратно на компьютер 0x00 в случае успешной обработки очередного принятого байта или 0xFF в случае его неуспешной обработки. Вот, собственно, и вся концепция.

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

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

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

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

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

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

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


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

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

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

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

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

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

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

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

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


    059-adapter_soic20-soic8.zip (Одна Загрузка)

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

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

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

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

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

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




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


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




    Доктор от dimon24
    вариант печатной платы с универсальными ZIF панельками под 5 МК DIP8,14,20,28,40
    Atmega-fusebit-doctor-ZIF.zip (8373 Загрузки)

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



    TQFP32-for-fuse-bit-doctor.zip (Одна Загрузка)

    ЗАКЛЮЧЕНИЕ.

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