Обсуждаем контроллеры компании Atmel.
Ответить

FuseDoctor для лечения Attiny13/85 (возможно 24)

Ср июн 09, 2021 14:59:47

Сделал универсальный fusedoctor для восстановления Attiny13 и Attiny85 (сам определяет). Скетч заливаем в Attiny13, паяем и пользуемся.
Изображение
Код:
// AVR High-voltage Serial Fuse Reprogrammer
//                          +-\/-+
//          ADC0 (D 5) PB5 1|    |8 Vcc
// аналог-3 ADC3 (D 3) PB3 2|    |7 PB2 (D 2) ADC1  аналог-5
// аналог-6 ADC2 (D 4) PB4 3|    |6 PB1 (D 1) PWM1  цифра1
//                     GND 4|    |5 PB0 (D 0) PWM0  цифра0
//                          +----+

#define F_CPU 4800000UL // в настройках тиньки при заливке скетча выставить 4.8Mhz internal clock

#define SDI                PB0
#define SII                PB1
#define SDO                PB2
#define SCI                PB3
#define RST                PB4

#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

byte n=0;

void setup() {

  pinMode(RST, OUTPUT);
  pinMode(SDI, OUTPUT);
  pinMode(SII, OUTPUT);
  pinMode(SCI, OUTPUT);
  pinMode(SDO, OUTPUT);     // Configured as input when in programming mode
  digitalWrite(RST, LOW);  // Level shifter is inverting, this shuts off 12V
 
  CLKPR = 0b10000000;  // разрешаем менять регистр делителя
  CLKPR = 0b00000001;  // для частоты 4.8МГц
 // CLKPR = 0b00000000;  // для частоты 9.6МГц
 // CLKPR = 0b00000011;  // для частоты 1.2МГц
   delay(500);
}

void loop() {
    if(n==0)
     {
    pinMode(SDO, OUTPUT);     // Set SDO to output
    digitalWrite(SDI, LOW);
    digitalWrite(SII, LOW);
    digitalWrite(SDO, LOW);
    digitalWrite(RST, LOW);  // 12v Off

    delayMicroseconds(20);
    digitalWrite(RST, HIGH);   // 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 == ATTINY24 || sig == ATTINY44 || sig == ATTINY84 ||
               sig == ATTINY25 || sig == ATTINY45 || sig == ATTINY85) {
      writeFuse(LFUSE, 0x62);
      writeFuse(HFUSE, 0xDF);
      writeFuse(EFUSE, 0xFF);
    }

    digitalWrite(SCI, LOW);
    digitalWrite(RST, LOW);   // 12v Off
    n++;
     }

}

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;
}

Раньше скетч к этой плате шел только для исправления фьюзов Attiny13, я его немного подправил - теперь лечит и 13-ю и 85-ю. другие не пробовал за неимением.
По хорошему, кнопка и светодиод не нужны. Лечится все при подключении питания. Диод моргает просто и все.
вылечил кучу запоротых тинек. После специально глумился над ними. Все лечится замечательно.
Последний раз редактировалось Paul_B Чт июн 10, 2021 11:08:28, всего редактировалось 1 раз.

Re: FuseDoctor для лечения Attiny13/85 (возможно 24)

Ср июн 09, 2021 16:10:29

а просто hex можете выложить ? (для не фаната ардуины скетч - это сложно....))))..)

Re: FuseDoctor для лечения Attiny13/85 (возможно 24)

Ср июн 09, 2021 17:08:24

hex прилагается. Светодиод моргнул - фьюзы исправлены (либо по времени через 1 секунду после подачи питания на схему)
Вложения
FuseDoc_Universal.ino.hex
(1.48 KiB) Скачиваний: 107
Ответить