HV Fusebit Doctod Shield для AVR

Тема в разделе "Микроконтроллеры AVR", создана пользователем Airbus, 29 окт 2015.

  1. Airbus

    Airbus Оракул

    2.JPG 3.JPG 1.JPG
    Уважаемык коллеги!Предлагаю вашему вниманию устройство для восстановления фьюзбитов микроконтроллеров AVR.Если Вы давно и всерьёз занимаетесь программированием МК за пределами проекта "Ардуино" то наверняка у Вас скопилась немалая кучка микроконтроллеров теоретически исправных но практически неработоспособных.Почему это могло произойти?
    Неправильно запрограммированные фьюзы -вот главная причина!В разных программах понятие запрограммирован/не запрограммирован трактуется по разному подробнее здесь http://tinyurl.com/q4w3ddy у Get Chip. Я например вообще ушёл от "галочек" для программирования использую понятия
    "Старший фьюз" и "Младший фьюз" они точно трактуются однозначно и выражены в цифрах!Второе применение устройства-использование ножки reset как порта ввода-вывода особенно это актуально в "осьминожках" таких так тини-13 и тини-45/85 там где явно не хватает ножек Теперь проблема будет решена!Надо сказать что сама идея таких устройств не нова их великое множество и даже у меня штук 5 под разные МК и даже один универсальный "под всё".Но как настоящий Ардуинщик разве мог я не использовать львиную мощь и силу Меги 328 в УНО?Да и держать проц специально под "Доктора" это тупо не правда ли?Ведь Ардуино может быть всем чем угодно стоит лишь спаять шилд что я и сделал!Сама идея тоже не моя скетч написан by Paul Willoughby вот здесь http://geektimes.ru/post/255396/ оригинал скетча и как это работает. Мужик долго и нудно обьясняет но послушать стоит.Авторский скетч тоже на странице.Управлять им прикольно грузишься открываешь терминал посылаешь любой символ и всё процесс проходит на глазах серез 3 секунды микроконтроллер восстановлен!Я же переписал скетч чтоб не использовать никаких дополнительных устройств не тянуться к терминалу просто втыкаю в питание +12 В и +5В. Скетч выполниться один раз благодаря оператору do-while.Всё работает одинаково хорошо и быстро я проверял чем пользоваться-дело вкуса.Плата вытравлена методом ЛУТ дорожки широкие монтаж не составит труда.Пины PLS Транзистор КТ315 (у меня их трёхлитровая банка)но подойдёт любой n-p-n резисторы R1-R4 к пинам Ардуино по 1ком-100ом при желании можно и без них если соединить перемычками. Резисторы R5-R6 (по схеме) 1ком-3ком.Как видите всё просто.Шилд прекрасно встаёт на своё место и работает. Специально чтобы постичь алгоритм программирования да и просто для красоты припаял светодиоды Красный-питание на Шилд подано Зелёный питание на Тини-13 подано Синий +12 вольт на ресет подано-идёт процесс HV программирования.Можно и без светодиодов в других шилдах я их не паял-было лень.Питание я брал из недр компьютера поэтому рекомендую сразу припаять провода к плате шилда дабы не было переполюсовки.Удачи!
     
    Последнее редактирование: 29 окт 2015
    Igor68, kabazyaka, Megakoteyka и ещё 1-му нравится это.
  2. Airbus

    Airbus Оракул

    Это скетч в моей редакции:
    Код (Text):

    //Фьюзбит доктор для Тини 13/45/85
    //После лечения чип снова виден для ISP программатора
    #define  RST  13  // Выход подачи 12 вольт на RESET
    #define  SCI  12  // Сlock Input
    #define  SDO  11  // Data Output
    #define  SII  10  // Instruction Input
    #define  SDI  9  // Data Input
    #define  VCC  8  // Питание VCC
    #define  HFUSE  0x747C
    #define  LFUSE  0x646C
    #define  EFUSE  0x666E
    // ATTiny сигнатуры
    #define  ATTINY13  0x9007  // L: 0x6A, H: 0xFF  8 pin
    #define  ATTINY25  0x9108  // L: 0x62, H: 0xDF, E: 0xFF  8 pin
    #define  ATTINY45  0x9206  // L: 0x62, H: 0xDF, E: 0xFF  8 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
      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();
      if (sig == ATTINY13)
      {
      writeFuse(LFUSE, 0x6A);
      writeFuse(HFUSE, 0xFF);
      }
      else if (sig == ATTINY25 || sig == ATTINY45 || sig == ATTINY85)
      {
      writeFuse(LFUSE, 0x62);
      writeFuse(HFUSE, 0xDF);
      writeFuse(EFUSE, 0xFF);
      }
      digitalWrite(SCI, LOW);
      digitalWrite(VCC, LOW);  // Vcc Off
      digitalWrite(RST, HIGH);  // 12v Off
      delay(6000);
      }
      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);
      }

      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;
      }
      void loop()
      { }//не делаем ничего особенного можно помигать чем нить например VCC

     
     
    Последнее редактирование: 18 апр 2017
    Igor68, kabazyaka и ИгорьК нравится это.
  3. Airbus

    Airbus Оракул

    Шилд для восстановления Мег 8/48/88/168/328
    4.JPG
    и скетч
    Код (Text):

    //Фьюзбит доктор для Меги 8/48/88/168/328
    //После лечения чип снова виден для ISP программатора
    //нужные фьюзы раскоментировать ненужные закоментировать
    //#define  HFUSE  0xD9  // дефолтные фьюзы для ATmega 8
    //#define  LFUSE  0xE1  // дефолтные фьюзы для ATmega 8
    #define  HFUSE  0xDF  // дефолтные фьюзы для ATmega 168
    #define  LFUSE  0x62  // дефолтные фьюзы для ATmega 168
    //#define  HFUSE  0xD9  // дефолтные фьюзы для ATmega 328
    //#define  LFUSE  0x62  // дефолтные фьюзы для ATmega 328
    // Назначение пинов
    #define  DATA  PORTD // PORTD порт данных
    #define  DATAD  DDRD
    #define  VCC  8
    #define  RDY  12  // RDY/!BSY сигнал от МК
    #define  OE  11
    #define  WR  10
    #define  BS1  9
    #define  XA0  13
    #define  XA1  18  
    #define  PAGEL  19  
    #define  RST  14  // Выход подачи 12 вольт на RESET
    #define  BS2  16
    #define  XTAL1  17

    void setup()  // запускается разово
    {
      // Установим линии для HV программирования как надо
      DATA = 0x00;  // линия данных
      DATAD = 0xFF;
      pinMode(VCC, OUTPUT);
      pinMode(RDY, INPUT);
      pinMode(OE, OUTPUT);
      pinMode(WR, OUTPUT);
      pinMode(BS1, OUTPUT);
      pinMode(XA0, OUTPUT);
      pinMode(XA1, OUTPUT);
      pinMode(PAGEL, OUTPUT);
      pinMode(RST, OUTPUT);  // Выход подачи 12 вольт на RESET
      pinMode(BS2, OUTPUT);
      pinMode(XTAL1, OUTPUT);
      // инициализируем пины
      digitalWrite(RST, HIGH);  // выключим пока +12V
      delay(500);  // ждём пока всё устаканиться
      //и погнали!
      // приводим пины в режим программирования
      digitalWrite(PAGEL, LOW);
      digitalWrite(XA1, LOW);
      digitalWrite(XA0, LOW);
      digitalWrite(BS1, LOW);
      digitalWrite(BS2, LOW);
      // переходим в режим программирования
      digitalWrite(VCC, HIGH);  // подаём питание
      digitalWrite(WR, HIGH);  // и единицы на OE и WR
      digitalWrite(OE, HIGH);
      delay(1);
      digitalWrite(RST, LOW);  //  подаём +12V на RESET
      delay(1);
      // сначала пишем HFUSE
      //sendcmd(B01000000);  // отправляем команду на запись фьюза
      digitalWrite(XA1, HIGH);
      digitalWrite(XA0, LOW);
      digitalWrite(BS1, LOW);
      DATA = B01000000;
      digitalWrite(XTAL1, HIGH);  // дрыгнем XTAL чтоб передать команду в чип
      delay(1);
      digitalWrite(XTAL1, LOW);
      delay(1);
      //writefuse(HFUSE);
      digitalWrite(XA1, LOW);
      digitalWrite(XA0, HIGH);
      delay(1);
      // Write fuse
      DATA = HFUSE;  // нужное значение фьюза
      digitalWrite(XTAL1, HIGH);  // дрыгнем XTAL чтоб передать команду в чип
      delay(1);
      digitalWrite(XTAL1, LOW);
      digitalWrite(BS1, HIGH);  // пишем HFUSE
      digitalWrite(WR, LOW);  //записано!
      delay(1);
      digitalWrite(WR, HIGH);
      delay(500);  // ждёмс
      // пишем LFUSE
      //sendcmd(B01000000);
      digitalWrite(XA1, HIGH);
      digitalWrite(XA0, LOW);
      digitalWrite(BS1, LOW);
      DATA = B01000000;
      digitalWrite(XTAL1, HIGH);  // дрыгнем XTAL чтоб передать команду в чип
      delay(1);
      digitalWrite(XTAL1, LOW);
      delay(1);
      //writefuse(LFUSE);
      digitalWrite(XA1, LOW);
      digitalWrite(XA0, HIGH);
      delay(1);
      // Write fuse
      DATA = LFUSE;  // нужное значение фьюза
      digitalWrite(XTAL1, HIGH); // дрыгнем XTAL чтоб передать команду в чип
      delay(1);
      digitalWrite(XTAL1, LOW);
      digitalWrite(BS1, LOW);  // пишем LFUSE
      digitalWrite(WR, LOW);  //записано!
      delay(1);
      digitalWrite(WR, HIGH);
      delay(500);  // ждёмс
      // и выходим из режима программирования
      digitalWrite(RST, HIGH);  // выключим +12V
      // обнуляем все пины
      DATA = 0x00;
      digitalWrite(OE, LOW);
      digitalWrite(WR, LOW);
      digitalWrite(PAGEL, LOW);
      digitalWrite(XA1, LOW);
      digitalWrite(XA0, LOW);
      digitalWrite(BS1, LOW);
      digitalWrite(BS2, LOW);
      }
    void loop() //дело сделано весело мигаем
    {
      digitalWrite(XA0, HIGH);  
      delay(1000);  
      digitalWrite(XA0, LOW);  
      delay(1000);  
    }

     
     
    Последнее редактирование: 14 апр 2017
    Igor68 и kabazyaka нравится это.
  4. kabazyaka

    kabazyaka Нуб

    Добрый день. Не могли бы Вы выложить трассировку шилдов ( желательно в Layout ), PDF тоже подойдёт, пожалуйста. Только начал изучать контроллеры, и умудрился залочить две 328 меги. А Ваши шилды и скетчи очень понравились.
     
  5. Airbus

    Airbus Оракул

    Могу скинуть на мыло.Платы в layoyt.
     
  6. kabazyaka

    kabazyaka Нуб

    Огромнейшее Спасибо! Было бы просто замечательно!
     
    Последнее редактирование: 5 фев 2017
  7. Airbus

    Airbus Оракул

    Отправил
     
  8. kabazyaka

    kabazyaka Нуб

    Огромное спасибо! Получил.
     
  9. Если не сложно могли бы Вы и мне скинуть шильд для МЕГИ в формате lay.. Запорол пару штук 328. Собирать полноценный доктор из-за них нерационально. А с Вашим методом вполне разумно. Заранее благодарю.
     
  10. скинь и мне пожалуйста. запорол пару 328. буду очень благодарен.
     
  11. kabazyaka

    kabazyaka Нуб

    Зря Вы так говорите. AFD очень даже нужная штука. Я,например , себе собрал и не жалею, лучше два разных, и рабочих, чем ни одного, когда приспичит
     
  12. kabazyaka

    kabazyaka Нуб

    Для тех, кому нужно- вот шилды и скетчи отAirbus. К сожалению, нет поддержки Atmega8 и Atmega328. Если и восстановятся, то с неправильными Фьюзами.Так же прилагаю папку от Автора данной конструёвины со ссылкой на его сайт , и ещё одну папку с другого сайта, с печаткой под кнопку.
     

    Вложения:

  13. Airbus

    Airbus Оракул

    В смысле нет поддержки Atmega8 и Atmega328?А эта?
    [​IMG]
    У меня всё работает. Правда фьюзы дефолтные под Мегу8. Но если очень нужно можно скетч поправить под Мегу 328.Но самое главное что после восстановления Мега 8/168/328 видна и прошивается обычным ISP программатором.А фьюзы всё равно придётся менять.Сейчас хочу переписать скетчи чтоб устройство стало 100% автономным без нажатия всяких кнопок отправок по USART просто включил восстановилось замигал светодиод можно вынимать.А что за ссылки на другие сайты можно глянуть?
     
  14. kabazyaka

    kabazyaka Нуб

     
  15. kabazyaka

    kabazyaka Нуб

    Так вот и я ж про то же, Фьюзы по умолчанию устанавливаются , как для Atmeg 48-88-168. У Atmeg 8 и 328 дефолтные фьюзы немного другие, из за этого может неправильно работать контроллер, придется дополнительно прошивать родные. В принципе, это мелочи, но начинающие работать с Мегами могут получить проблемки. Если Вам не сложно, не могли бы Вы немного доработать скетч под 8ю и 328 Меги, а то я в программировании Баран Бараном. Ссылки на сайты находятся в Файлах, просто не знаю ,как добавить напрямую. У Автора, кстати, в его скетче указаны все Фьюзы для Мег, а на втором сайте нашёл лайку платки с кнопкой, там же ТС устраивает разбор полётов скетчу Автора, чё то у него там не пошло. Дико извиняюсь, если влез с замечаниями не по делу , просто очень понравилась Ваша работа, хочется, чтобы был достойный ответ Атмега Фьюз Доктору.Ещё раз ОГРОМНОЕ Спасибо за Ваши платы и скетчи.
     
  16. kabazyaka

    kabazyaka Нуб

    http://mightyohm.com/blog/2008/09/arduino-based-avr-high-voltage-programmer/

    http://ghost-d-oleg.livejournal.com/22554.html
     
  17. Airbus

    Airbus Оракул

    Здесь в самом начале надо заменить на дефлотные фьюзы для нужных мег-но ИМХО большого смысла я в этом не вижу потому как всё равно шить будете через ISP?
    // Desired fuse configuration
    #define HFUSE 0xDF // Default for ATmega48/88/168, for others see
    #define LFUSE 0x62 //
    Для Меги 8 HFUSE 0xD9/LFUSE 0xЕ1
    Меги 168 HFUSE 0xDF/LFUSE 0x62
    Меги 328 HFUSE 0xD9/LFUSE 0x62
    Поэтому ручками в скетче заменяем то что жирным на то что нужно.Фьюз калькулятор здесь!
     
    kabazyaka нравится это.
  18. Огромное спасибо . Сваял вот такое. Восстановил Mega328. Всё работает.
     

    Вложения:

    kabazyaka нравится это.
  19. kabazyaka

    kabazyaka Нуб

    Огромное Спасибо! Будем разбираться. А добавить как нибудь можно , чтоб совсем универсальный скетч был?
     
  20. kabazyaka

    kabazyaka Нуб

    Вам тоже Спасибо! Прикольная платка получилась.