Ср июн 09, 2021 14:59:47
// 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;
}
Ср июн 09, 2021 16:10:29
Ср июн 09, 2021 17:08:24