Ардуинщик-лентяй, техноманьяк
0,0
рейтинг
13 февраля 2015 в 02:23

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

image

Привет всем хабраюзерам. Думаю многие, кто занимается микроконтроллерами, имеют небольшой опыт в «блокировке» микроконтроллера неправильно выставленными фьюз-битами, например, неправильные настройки тактирования, в частности — очень низкая частота, например 16 КГц.

Так же данный метод должен подойти для случаев, когда были случайно изменённые фьюз-биты RSTDISBL, а конкретнее — порт RESET используется как порт ввода/вывода или же небрежное отношение к фьюз-биту SPIEN(разрешение на последовательное программирование), всё это исключает прошивку классическим способом по протоколу SPI(In-System Programming).



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

Данный метод годиться не для всех ATtiny, но подходит для большинства популярных, вот их список:

  • ATtiny13;
  • ATtiny24;
  • ATtiny25;
  • ATtiny44;
  • ATtiny45;
  • ATtiny84;
  • ATtiny85.

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


Скажу сразу, за основу взят проект товарища Wayne Holder, за что ему большое спасибо, вот ссылка на его статью.
Итак, приступим, вот схема подключения на примере ATtiny13:

image

А вот так данная схема выглядит в моём исполнении:

image

Про подключение к ATtiny25/45/85/24/44/84 будет ниже.

Как Вы можете видеть, схема состоит из 6 резисторов номиналом в 1 КОм, 1 NPN транзистора 2n3904, вот его распиновка:

image

Можно взять советский КТ315, или его аналоги, ну собственно источника напряжения 11.5-12.5 В, как рекомендуют инженеры из ATmel в документациях к тех микроконтроллерах что упомянуты выше. Не думаю, что стоит завышать или занижать напряжение, так что перед восстановлением советую проверить напряжение на источнике питания вольтметром или мультиметром. На момент съёмки видео, напряжение на моём аккумуляторе было 12.4 В.

Пару слов где можно взять 12 В — это разного рода блоки питания для роутеров или модемов, вот например, мой DSL модем ASUS DSL-N10E как раз имеет 12 В блок питания, как правило на каждом блоке питания указано напряжение.
Так же 12 В можно взять из разъёма MOLEX компьютера:

image

А если точнее — жёлтый и чёрный.

Стоит упомянуть, что нужно соблюдать повышенную осторожность при подключении 12 В части, потому, что это напряжение запросто палит как микроконтроллеры так и другую периферию Arduino, например преобразователь USB-TTL, ссылаюсь на личный опыт. Поэтому следуем алгоритму:

  • Собираем схему;
  • Подаем питание на Arduino подключив к юсб;
  • Подаём +12В на транзистор;
  • Восстанавливаем микроконтроллер;
  • Отключаем +12В.

Именно таким образом я сбрасывал фьюз-биты ATtiny13(использовал порт Reset как порт ввод/вывода), уже раз 10-15 при отладке одного моего проекта, вот краткое его видео превью:

LCD(HD44780) вольтамперметр на ATtiny13


Подключаем к другим микроконтроллерам наш «восстановитель фьюз-битовов» следующим образом:

image

  • Порт RST ATtiny подключается между резистором на 1 КОм, тот что подключается к +12В, и коллектором транзистора VT1;
  • 13-й пин Arduino, он же PB5, подключается через резистор на 1 КОм к базе транзистора VT1;
  • 12-й пин Arduino, он же PB4, подключается через резистор на 1 КОм к SCI (Target Clock Input) ATtiny;
  • 11-й пин Arduino, он же PB3, подключается через резистор на 1 КОм к SDO (Target Data Output) ATtiny;
  • 10-й пин Arduino, он же PB2, подключается через резистор на 1 КОм к SII (Target Instruction Input) ATtiny;
  • 9-й пин Arduino, он же PB1, подключается через резистор на 1 КОм к SDI (Target Data Input) ATtiny;
  • 8-й пин Arduino, он же PB0, желательно подключить через резистор на 100-330 Ом к VCC ATtiny, на всякий случай.
  • GND — разумеется общий провод или другими словами «земля».


Всё это переназначается в коде, никаких проблем.

Вот код из странички автора
// AVR High-voltage Serial Fuse Reprogrammer
// Adapted from code and design by Paul Willoughby 03/20/2010
//   http://www.rickety.us/2010/03/arduino-avr-high-voltage-serial-programmer/
//
// Fuse Calc:
//   http://www.engbedded.com/fusecalc/

#define  RST     13    // Output to level shifter for !RESET from transistor
#define  SCI     12    // Target Clock Input
#define  SDO     11    // Target Data Output
#define  SII     10    // Target Instruction Input
#define  SDI      9    // Target Data Input
#define  VCC      8    // Target VCC

#define  HFUSE  0x747C
#define  LFUSE  0x646C
#define  EFUSE  0x666E

// Define ATTiny series signatures
#define  ATTINY13   0x9007  // L: 0x6A, H: 0xFF             8 pin
#define  ATTINY24   0x910B  // L: 0x62, H: 0xDF, E: 0xFF   14 pin
#define  ATTINY25   0x9108  // L: 0x62, H: 0xDF, E: 0xFF    8 pin
#define  ATTINY44   0x9207  // L: 0x62, H: 0xDF, E: 0xFFF  14 pin
#define  ATTINY45   0x9206  // L: 0x62, H: 0xDF, E: 0xFF    8 pin
#define  ATTINY84   0x930C  // L: 0x62, H: 0xDF, E: 0xFFF  14 pin
#define  ATTINY85   0x930B  // L: 0x62, H: 0xDF, E: 0xFF    8 pin

void setup() {
  pinMode(VCC, OUTPUT);
  pinMode(RST, OUTPUT);
  pinMode(SDI, OUTPUT);
  pinMode(SII, OUTPUT);
  pinMode(SCI, OUTPUT);
  pinMode(SDO, OUTPUT);     // Configured as input when in programming mode
  digitalWrite(RST, HIGH);  // Level shifter is inverting, this shuts off 12V
  Serial.begin(19200);
}

void loop() {
   if (Serial.available() > 0) {
    Serial.read();
    pinMode(SDO, OUTPUT);     // Set SDO to output
    digitalWrite(SDI, LOW);
    digitalWrite(SII, LOW);
    digitalWrite(SDO, LOW);
    digitalWrite(RST, HIGH);  // 12v Off
    digitalWrite(VCC, HIGH);  // Vcc On
    delayMicroseconds(20);
    digitalWrite(RST, LOW);   // 12v On
    delayMicroseconds(10);
    pinMode(SDO, INPUT);      // Set SDO to input
    delayMicroseconds(300);
    unsigned int sig = readSignature();
    Serial.print("Signature is: ");
    Serial.println(sig, HEX);
    readFuses();
    if (sig == ATTINY13) {
      writeFuse(LFUSE, 0x6A);
      writeFuse(HFUSE, 0xFF);
    } else if (sig == ATTINY24 || sig == ATTINY44 || sig == ATTINY84 ||
               sig == ATTINY25 || sig == ATTINY45 || sig == ATTINY85) {
      writeFuse(LFUSE, 0x62);
      writeFuse(HFUSE, 0xDF);
      writeFuse(EFUSE, 0xFF);
    }
    readFuses();
    digitalWrite(SCI, LOW);
    digitalWrite(VCC, LOW);    // Vcc Off
    digitalWrite(RST, HIGH);   // 12v Off
  }
}

byte shiftOut (byte val1, byte val2) {
  int inBits = 0;
  //Wait until SDO goes high
  while (!digitalRead(SDO))
    ;
  unsigned int dout = (unsigned int) val1 << 2;
  unsigned int iout = (unsigned int) val2 << 2;
  for (int ii = 10; ii >= 0; ii--)  {
    digitalWrite(SDI, !!(dout & (1 << ii)));
    digitalWrite(SII, !!(iout & (1 << ii)));
    inBits <<= 1;
    inBits |= digitalRead(SDO);
    digitalWrite(SCI, HIGH);
    digitalWrite(SCI, LOW);
  }
  return inBits >> 2;
}

void writeFuse (unsigned int fuse, byte val) {
  shiftOut(0x40, 0x4C);
  shiftOut( val, 0x2C);
  shiftOut(0x00, (byte) (fuse >> 8));
  shiftOut(0x00, (byte) fuse);
}

void readFuses () {
  byte val;
        shiftOut(0x04, 0x4C);  // LFuse
        shiftOut(0x00, 0x68);
  val = shiftOut(0x00, 0x6C);
  Serial.print("LFuse: ");
  Serial.print(val, HEX);
        shiftOut(0x04, 0x4C);  // HFuse
        shiftOut(0x00, 0x7A);
  val = shiftOut(0x00, 0x7E);
  Serial.print(", HFuse: ");
  Serial.print(val, HEX);
        shiftOut(0x04, 0x4C);  // EFuse
        shiftOut(0x00, 0x6A);
  val = shiftOut(0x00, 0x6E);
  Serial.print(", EFuse: ");
  Serial.println(val, HEX);
}

unsigned int readSignature () {
  unsigned int sig = 0;
  byte val;
  for (int ii = 1; ii < 3; ii++) {
          shiftOut(0x08, 0x4C);
          shiftOut(  ii, 0x0C);
          shiftOut(0x00, 0x68);
    val = shiftOut(0x00, 0x6C);
    sig = (sig << 8) + val;
  }
  return sig;
}


Как видите ничего замысловатого, отправили любой символ в Arduino через UART и вуаля, фьюз-биты восстановлены до заводских, при этом мы видим так же какие были перед разблокировкой и какие стали.

Моя предыдущая статья про то как превратить Arduino в полноценный AVRISP программатор. Там же можно почитать про упомянутый в видео софт по прошивке микроконтроллера.

Так же рекомендую посетить немного другой проект товарища Wayne Holder:

ATTiny Fuse Reset with 12 Volt Charge Pump

Суть та же, только не нужно искать источник 12 В.

Все мои публикации.

P.S. Serial.begin(19200);
Сергей ПоделкинЦ @HWman
карма
38,0
рейтинг 0,0
Ардуинщик-лентяй, техноманьяк
Реклама помогает поддерживать и развивать наши сервисы

Подробнее
Реклама

Самое читаемое

Комментарии (24)

  • +2
    Вау, спасибо большое! есть один проект — эмулятор RFID метки на t45 кажется — так вот, там всё через ногу RESET делается, наверно, из за особенностей паразитного питания… один МК я убил фьюзами и вобщем-то забил на это дело ибо даже не заработало… Теперь есть возможность попытаться еще :)
    • 0
      Тоже повосстанавливал всё свои залоченые по незнанке тини13.
  • 0
    мне бы на 2313 стереть…
  • +5
    Есть универсальное лекарство рецепт находится по словам «Atmega fusebit doctor»
    ссылки приводить не буду так их много и почти все они приводят на хорошие сайты посвященные AVR
    • 0
      Согласен, пользовался, но этот вариант ничем не хуже + собирается за 5 мин на макетке, что для новичка я считаю огромный плюс.
      • +1
        Ну, что до простоты есть и такой вариант:

        image
        взято отсюда:
        cxema21.ru/publ/mikrokontrollery/informacija_po_mk/sposob_vosstanovlenija_fuse_bita_rstdisbl_dlja_atmega8/19-1-0-156

        это, та еще (как бы помягче выразиться-то) перверсия…
        У меня кстати так не получилось почему-то — видимо недостаточно испорчен.
        • 0
          Видел такую реализацию. Но это для восьмой меги только вроде как.
        • 0
          Пробовал эту когда-то на мегу8. не помогло.
  • 0
    Да, ее родимую и пытался безуспешно вылечить. После чего собственно и спаял «доктора».
  • 0
    Я правильно понимаю, что это и есть по сути тот самый «высоковольтный программатор» который иногда поминают? И при помощи него не только фюзы можно устанавливать, но и вообще прошивки заливать?
    • 0
      Работает как высоковольтный программатор, но только сбрасывает фьюзы у перечисленных в статье моделях микроконтроллеров. Больше ничего не умеет.
  • 0
    Еще пара вопросов для полного понимания. Во первых, так ли нужны резисторы R1-R4 — вроде и без них должно работать? И почему VCC и 12в подаются по команде Ардуины? Важно подать их в определенной последовательности и на короткое время? Просто руками нельзя все в крайнем случае скоммутировать.? Это на случай если нужно будет что то восстанавливать, а нужных деталей не будет под руками.
    • 0
      R1-R4 нужны, это «правило хорошего тона» для данной схемы.

      Важно подать их в определенной последовательности и на короткое время?

      Именно.
      • +1
        Резисторы к хорошему тону не имеют никакого значения. Их предназначение — защитить микросхемы от возможного пробоя, ограничив текущие токи. Конечно, в рамках допустимого.
        • 0
          Ну да, Вы правы.
        • 0
          А откуда там токи то — на другом конце ноги другого микроконтроллера и в нормальной ситуации при правильном включении все должно быть нормально и без резисторов. Во всяком случае в большинстве схем «программатора из Ардуино» никаких резисторов между контроллерами не рисуют. Возможно конечно, что при высоковольтном программировании там могут возникать большие напряжения, тут уж не знаю.

          На упомянутой здесь схеме высоковольтного программатора mightyohm.com/blog/2008/09/arduino-based-avr-high-voltage-programmer/ просто явно написано:

          Notes:
          1K resistors protect Arduino from incorrect insertion or other faults with target AVR.

          то есть именно, что «на всякий случай» типа чтобы Ардуину не спалить если с программируемым чипом что то не так.
          • 0
            Назвать это «на всякий случай» у меня язык не поворачивается…
            • 0
              Ну может быть. Понятно, что если уж паять устройство то лучше с резисторами и даже на макетке если они есть лучше их поставить. Меня интересовала возможность что то сделать в совсем аварийной ситуации, когда под руками вообще почти ничего нет.
  • +2
    Посмотрел комментарий FisHlaBsoMAN и его ссылки, почти все вопросы снимаются.
    • +1
      В свое время тоже чесал репу, с организацией «высокольтного» программатора, потому как «ушедших в кому» чипов начало копиться достаточно. Но проанализировав ситуацию выбрал тогда только вышедший Fuse Doctor: набор чипов как нельзя лучше подходил под него, сборка вместе с платой (как раз опробовал «новые технологии» в лужении плат) заняла около недели. Да и использование не такое уж затратное: добавил к нему USB-COM на tiny2313, сейчас ищу время добавить преобразователь DC5-DC12. Приводится в действие за 5 минут.
  • 0
    Хах, только сейчас заметил что батарея на схеме изображена верх ногами…

Только зарегистрированные пользователи могут оставлять комментарии. Войдите, пожалуйста.