РЕШЕНО Hv fusebit doctod shield для avr

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

Статус темы:
Закрыта.
  1. Airbus

    Airbus Радиохулиган Модератор

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

     
     
    Последнее редактирование: 13 апр 2018
    Odin__, Igor68 и kabazyaka нравится это.
  4. kabazyaka

    kabazyaka Нуб

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

    Airbus Радиохулиган Модератор

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

    Airbus Радиохулиган Модератор

    Для универсальных целей есть специальное устройство.Но это уже другая песня.Думаю переписать скетчи под Мегу 328 и Тини 13 а также под тини 2313 (плата уже имеется) но нет времени.А мне самому это уже не нужно купил высоковольтный универсальный прог TL-868
    [​IMG]
    Но рад если кому то мои идеи помогли!
     
    ostrov, ИгорьК и kabazyaka нравится это.
  8. ИгорьК

    ИгорьК Гуру

    Поделитесь ссылочкой где купили.
     
  9. Airbus

    Airbus Радиохулиган Модератор

    Я переписал скетч для Меги 8/88/48/168/328 и исправил исходный в начале статьи. Отличия-скетч стал полностью автономным не надо нажимать ни на какие кнопочки да и кнопку можно вообще убрать. Подали питание он сделал своё дело и весело замигал светиком на пине 13. Забил фьюзы для разных Мег - специально для Гурманов теперь нужные фьюзы раскоментируем а ненужные наоборот закоментируем. Вот собственно пока и всё!Пользуйтесь на здоровье!На очереди переписать скетч для Тини-13 и допилить для Тини-2313.
     
    IvorDaihashik и kabazyaka нравится это.
  10. Airbus

    Airbus Радиохулиган Модератор

    Появилось время-допилил скетч для Тини 2313/4313 протестировал-работает.
    Код (C++):
    //Фьюзбит доктор для Тини2313
    //После лечения чип снова виден для ISP программатора
    #define  HFUSE  0xDF   // дефолтные фьюзы для ATTiny 2313
    #define  LFUSE  0x64   // дефолтные фьюзы для ATTiny 2313
    // Назначение пинов
    #define  DATA    PORTD // PORTD порт данных
    #define  DATAD   DDRD
    #define  VCC     8
    //#define  RDY     12     // RDY/!BSY сигнал от МК
    #define  OE      11
    #define  WR      10
    #define  BS1     9     //BS1=PAGEL
    #define  XA0     13
    #define  XA1     19    //XA1=BS2
    #define  RST     14    // Выход подачи 12 вольт на RESET
    #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(RST, OUTPUT);  // Выход подачи 12 вольт на RESET
      pinMode(XTAL1, OUTPUT);
      // инициализируем пины
      digitalWrite(RST, HIGH);  // выключим пока +12V
      delay(300);  // ждём пока всё устаканиться
      // приводим пины в режим программирования
      digitalWrite(WR, LOW);
      digitalWrite(XA1, LOW);
      digitalWrite(XA0, LOW);
      digitalWrite(BS1, LOW);
      // переходим в режим программирования
      digitalWrite(VCC, HIGH);  // подаём питание
      digitalWrite(OE, HIGH); // и единицу на OE
      delay(1);
      digitalWrite(RST, LOW);   //  подаём +12V на RESET
      delay(1);
      digitalWrite(WR, HIGH); // и единицу на WR
      // сначала пишем HFUSE
      //sendcmd(B01000000);  // отправляем команду на запись фьюза
      digitalWrite(XA1, HIGH);
      digitalWrite(XA0, 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);
      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(XA1, LOW);
      digitalWrite(XA0, LOW);
      digitalWrite(BS1, LOW);
      digitalWrite(VCC, LOW);//выключаем питание
      }
    void loop() //дело сделано весело мигаем
    {
      digitalWrite(XA0, HIGH);
      delay(1000);            
      digitalWrite(XA0, LOW);  
      delay(1000);            
        }
    Осталось только переделать для тини 13/45/85
     
    Последнее редактирование: 17 апр 2017
    Vitalya и kabazyaka нравится это.
  11. Airbus

    Airbus Радиохулиган Модератор

    Переписал и оттестил скетч под тини13/45/85 заменил в начале статьи "старый".Можно пользоваться-всем удачи!
     
  12. AlexU

    AlexU Гуру

    Если проект востребованный и нет причин его скрывать, то можно было бы уже выложить его на какой-нибудь хостинг проектов, например, https://github.com. И заодно оформить его в нормальной EDA, а не в SprintLayout.
     
  13. Airbus

    Airbus Радиохулиган Модератор

    Вы как всегда правы!Но проект делался для себя с целью разобраться в алгоритме HV программирования.Что и было достигнуто.На Амперку выложил для Форумчан-рад если кому то помог.Насчёт востребованости не знаю сейчас у многих есть HV программаторы и фьюзбит Доктора.Насчёт https://github.com идея хорошая но совсем нет времени.Такое чувство что чем старше становишься тем время быстрее бежит.
     
  14. Ariadna-on-Line

    Ariadna-on-Line Гуру

    Повторить вам плату в в ОрКаде 9.2 ? Если надо !?
     
  15. Airbus

    Airbus Радиохулиган Модератор

    Тока просьба если будете делать сделайте под простой транзистор.Кт315 как я понял стал раритетом.Да и плату надо переделать.Питать от 12 вольт а 5 получать из 12 через Lm7805.Я б и сам сделал для удобства Юзверей но совсем нема времени.
     
  16. Airbus

    Airbus Радиохулиган Модератор

    Скетч один.Я его просто обновил.А старый удалил чтоб народ не путался.Питание подаем одновременно.На ресет ардуины тоже можно нажать как вариант.Но питание 5 и 12 должно быть уже подано.Вы не торопитесь и у Вас все получиться.
     
  17. Ariadna-on-Line

    Ariadna-on-Line Гуру

    Плата в ОрКад 9.2. Разведена вручную, поэтому не гарантировано от ошибок. По желанию автора добавлен линейный понижающий стабилизатор 12-5 вольт (КРЕН-ка). Наверняка желательно его ложить на уголок - радиатор. Добавлены 3 светодиода (с ограничительными резисторами) контроля процесса. Изменен транзистор (с Э-К-Б на Э-Б-К).
    Псс. Сам дизайн в формате Оркада (xxxx.MAX) здешние правила не пропускают.
     

    Вложения:

    Последнее редактирование: 18 мар 2019
  18. Ariadna-on-Line

    Ariadna-on-Line Гуру

    Читайте тему выше. Я предложил - ТС согласился. Только и всего. А чем плох ОрКад ? Удобнее и практичнее Лайаута. Намного меньше глаза мозолит ненужной в деле графикой.
     
    Последнее редактирование: 18 мар 2019
  19. Airbus

    Airbus Радиохулиган Модератор

    Спасибо Друг!Хорошая работа!Немного опередил-я сегодня тоже переделал схему.Надо старые посносить дабы народ не смущать.
    Та ладно тебе!Чем больше КАДов тем лучше!
    Есть такое.У меня их трёхлитровая банка со времен СССР.Батя натырил с Завода.Вот я их везде и тыркаю.Хороший транзистор "для всего".Как лампа 6П3С до него.Или как микруха К155ЛА3.Что на ней только не делали!....Ладно всем пока побежал Казань брать.
     
    Последнее редактирование: 18 мар 2019
  20. Ariadna-on-Line

    Ariadna-on-Line Гуру

    В Лайауте сделал копию ОрКадовской платы. Могу отправить. Без гарантий !
    Выложить сюды не получается.
     

    Вложения:

    Odin__ нравится это.
Статус темы:
Закрыта.