FLUX capacitor trinket | So I've made myself an AVR resetter then
2017-07-16 20:37:38
to fix almost all my tiny13a's I had to build this, but it definitely fixed all 10 boards :) for the tinies you don't need any parallel connections, so it's basically SPI + 12V on reset. I've hooked up a boost converter, added a button and "some" LEDs (bicolor), worked them in the code and now basically have a "power on and fix" stand alone fuse resetter for soic Attinies. That's not highly specialised at all. BUT IT WORKS AND THEY WORK! Now I need to clean up my desk.
http://www.engbedded.com/fusecalc/
https://arduinodiy.wordpress.com/2015/05/16/high-voltage-programmingunbricking-for-attiny/

#define RST 13
#define SCI 12
#define SDO 11
#define SII 10
#define SDI 9
#define VCC 8
#define BUTTON 3
#define LED_RED 7
#define LED_GRN 5
#define HFUSE 0x747C
#define LFUSE 0x646C
#define EFUSE 0x666E
#define ATTINY13 0x9007
#define ATTINY24 0x910B
#define ATTINY25 0x9108
#define ATTINY44 0x9207
#define ATTINY45 0x9206
#define ATTINY84 0x930C
#define ATTINY85 0x930B
void setup() {
pinMode(BUTTON, INPUT_PULLUP);
pinMode(LED_GRN, OUTPUT);
pinMode(LED_RED, OUTPUT);
pinMode(VCC, OUTPUT);
pinMode(RST, OUTPUT);
pinMode(SDI, OUTPUT);
pinMode(SII, OUTPUT);
pinMode(SCI, OUTPUT);
pinMode(SDO, OUTPUT);
digitalWrite(RST, HIGH);
Serial.begin(19200);
}
void loop() {
digitalWrite(LED_GRN, HIGH);
digitalWrite(LED_RED, LOW);
if (digitalRead(BUTTON) == LOW)
{
digitalWrite(LED_GRN, LOW);
digitalWrite(LED_RED, HIGH);
pinMode(SDO, OUTPUT);
digitalWrite(SDI, LOW);
digitalWrite(SII, LOW);
digitalWrite(SDO, LOW);
digitalWrite(RST, HIGH);
digitalWrite(VCC, HIGH);
delayMicroseconds(20);
digitalWrite(RST, LOW);
delayMicroseconds(10);
pinMode(SDO, 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);
digitalWrite(RST, HIGH);
delay(1000);
}
}
byte shiftOut (byte val1, byte val2) {
int inBits = 0;
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);
shiftOut(0x00, 0x68);
val = shiftOut(0x00, 0x6C);
Serial.print("LFuse ");
Serial.print(val, HEX);
shiftOut(0x04, 0x4C);
shiftOut(0x00, 0x7A);
val = shiftOut(0x00, 0x7E);
Serial.print(", HFuse: ");
Serial.print(val, HEX);
shiftOut(0x04, 0x4C);
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;
}https://cdn.hackaday.io/images/5768371500229940288.jpg
FLUX capacitor trinket | So I've made myself an AVR resetter then
2017-07-16 20:37:38
to fix almost all my tiny13a's I had to build this, but it definitely fixed all 10 boards :) for the tinies you don't need any parallel connections, so it's basically SPI + 12V on reset. I've hooked up a boost converter, added a button and "some" LEDs (bicolor), worked them in the code and now basically have a "power on and fix" stand alone fuse resetter for soic Attinies. That's not highly specialised at all. BUT IT WORKS AND THEY WORK! Now I need to clean up my desk.
http://www.engbedded.com/fusecalc/
https://arduinodiy.wordpress.com/2015/05/16/high-voltage-programmingunbricking-for-attiny/

#define RST 13
#define SCI 12
#define SDO 11
#define SII 10
#define SDI 9
#define VCC 8
#define BUTTON 3
#define LED_RED 7
#define LED_GRN 5
#define HFUSE 0x747C
#define LFUSE 0x646C
#define EFUSE 0x666E
#define ATTINY13 0x9007
#define ATTINY24 0x910B
#define ATTINY25 0x9108
#define ATTINY44 0x9207
#define ATTINY45 0x9206
#define ATTINY84 0x930C
#define ATTINY85 0x930B
void setup() {
pinMode(BUTTON, INPUT_PULLUP);
pinMode(LED_GRN, OUTPUT);
pinMode(LED_RED, OUTPUT);
pinMode(VCC, OUTPUT);
pinMode(RST, OUTPUT);
pinMode(SDI, OUTPUT);
pinMode(SII, OUTPUT);
pinMode(SCI, OUTPUT);
pinMode(SDO, OUTPUT);
digitalWrite(RST, HIGH);
Serial.begin(19200);
}
void loop() {
digitalWrite(LED_GRN, HIGH);
digitalWrite(LED_RED, LOW);
if (digitalRead(BUTTON) == LOW)
{
digitalWrite(LED_GRN, LOW);
digitalWrite(LED_RED, HIGH);
pinMode(SDO, OUTPUT);
digitalWrite(SDI, LOW);
digitalWrite(SII, LOW);
digitalWrite(SDO, LOW);
digitalWrite(RST, HIGH);
digitalWrite(VCC, HIGH);
delayMicroseconds(20);
digitalWrite(RST, LOW);
delayMicroseconds(10);
pinMode(SDO, 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);
digitalWrite(RST, HIGH);
delay(1000);
}
}
byte shiftOut (byte val1, byte val2) {
int inBits = 0;
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);
shiftOut(0x00, 0x68);
val = shiftOut(0x00, 0x6C);
Serial.print("LFuse ");
Serial.print(val, HEX);
shiftOut(0x04, 0x4C);
shiftOut(0x00, 0x7A);
val = shiftOut(0x00, 0x7E);
Serial.print(", HFuse: ");
Serial.print(val, HEX);
shiftOut(0x04, 0x4C);
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;
}https://cdn.hackaday.io/images/5768371500229940288.jpg
FLUX capacitor trinket | So I've made myself an AVR resetter then
2017-07-16 20:37:38
to fix almost all my tiny13a's I had to build this, but it definitely fixed all 10 boards :) for the tinies you don't need any parallel connections, so it's basically SPI + 12V on reset. I've hooked up a boost converter, added a button and "some" LEDs (bicolor), worked them in the code and now basically have a "power on and fix" stand alone fuse resetter for soic Attinies. That's not highly specialised at all. BUT IT WORKS AND THEY WORK! Now I need to clean up my desk.
http://www.engbedded.com/fusecalc/
https://arduinodiy.wordpress.com/2015/05/16/high-voltage-programmingunbricking-for-attiny/

#define RST 13
#define SCI 12
#define SDO 11
#define SII 10
#define SDI 9
#define VCC 8
#define BUTTON 3
#define LED_RED 7
#define LED_GRN 5
#define HFUSE 0x747C
#define LFUSE 0x646C
#define EFUSE 0x666E
#define ATTINY13 0x9007
#define ATTINY24 0x910B
#define ATTINY25 0x9108
#define ATTINY44 0x9207
#define ATTINY45 0x9206
#define ATTINY84 0x930C
#define ATTINY85 0x930B
void setup() {
pinMode(BUTTON, INPUT_PULLUP);
pinMode(LED_GRN, OUTPUT);
pinMode(LED_RED, OUTPUT);
pinMode(VCC, OUTPUT);
pinMode(RST, OUTPUT);
pinMode(SDI, OUTPUT);
pinMode(SII, OUTPUT);
pinMode(SCI, OUTPUT);
pinMode(SDO, OUTPUT);
digitalWrite(RST, HIGH);
Serial.begin(19200);
}
void loop() {
digitalWrite(LED_GRN, HIGH);
digitalWrite(LED_RED, LOW);
if (digitalRead(BUTTON) == LOW)
{
digitalWrite(LED_GRN, LOW);
digitalWrite(LED_RED, HIGH);
pinMode(SDO, OUTPUT);
digitalWrite(SDI, LOW);
digitalWrite(SII, LOW);
digitalWrite(SDO, LOW);
digitalWrite(RST, HIGH);
digitalWrite(VCC, HIGH);
delayMicroseconds(20);
digitalWrite(RST, LOW);
delayMicroseconds(10);
pinMode(SDO, 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);
digitalWrite(RST, HIGH);
delay(1000);
}
}
byte shiftOut (byte val1, byte val2) {
int inBits = 0;
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);
shiftOut(0x00, 0x68);
val = shiftOut(0x00, 0x6C);
Serial.print("LFuse ");
Serial.print(val, HEX);
shiftOut(0x04, 0x4C);
shiftOut(0x00, 0x7A);
val = shiftOut(0x00, 0x7E);
Serial.print(", HFuse: ");
Serial.print(val, HEX);
shiftOut(0x04, 0x4C);
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;
}https://cdn.hackaday.io/images/5768371500229940288.jpg
FLUX capacitor trinket | So I've made myself an AVR resetter then
2017-07-16 20:37:38
to fix almost all my tiny13a's I had to build this, but it definitely fixed all 10 boards :) for the tinies you don't need any parallel connections, so it's basically SPI + 12V on reset. I've hooked up a boost converter, added a button and "some" LEDs (bicolor), worked them in the code and now basically have a "power on and fix" stand alone fuse resetter for soic Attinies. That's not highly specialised at all. BUT IT WORKS AND THEY WORK! Now I need to clean up my desk.
http://www.engbedded.com/fusecalc/
https://arduinodiy.wordpress.com/2015/05/16/high-voltage-programmingunbricking-for-attiny/

#define RST 13
#define SCI 12
#define SDO 11
#define SII 10
#define SDI 9
#define VCC 8
#define BUTTON 3
#define LED_RED 7
#define LED_GRN 5
#define HFUSE 0x747C
#define LFUSE 0x646C
#define EFUSE 0x666E
#define ATTINY13 0x9007
#define ATTINY24 0x910B
#define ATTINY25 0x9108
#define ATTINY44 0x9207
#define ATTINY45 0x9206
#define ATTINY84 0x930C
#define ATTINY85 0x930B
void setup() {
pinMode(BUTTON, INPUT_PULLUP);
pinMode(LED_GRN, OUTPUT);
pinMode(LED_RED, OUTPUT);
pinMode(VCC, OUTPUT);
pinMode(RST, OUTPUT);
pinMode(SDI, OUTPUT);
pinMode(SII, OUTPUT);
pinMode(SCI, OUTPUT);
pinMode(SDO, OUTPUT);
digitalWrite(RST, HIGH);
Serial.begin(19200);
}
void loop() {
digitalWrite(LED_GRN, HIGH);
digitalWrite(LED_RED, LOW);
if (digitalRead(BUTTON) == LOW)
{
digitalWrite(LED_GRN, LOW);
digitalWrite(LED_RED, HIGH);
pinMode(SDO, OUTPUT);
digitalWrite(SDI, LOW);
digitalWrite(SII, LOW);
digitalWrite(SDO, LOW);
digitalWrite(RST, HIGH);
digitalWrite(VCC, HIGH);
delayMicroseconds(20);
digitalWrite(RST, LOW);
delayMicroseconds(10);
pinMode(SDO, 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);
digitalWrite(RST, HIGH);
delay(1000);
}
}
byte shiftOut (byte val1, byte val2) {
int inBits = 0;
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);
shiftOut(0x00, 0x68);
val = shiftOut(0x00, 0x6C);
Serial.print("LFuse ");
Serial.print(val, HEX);
shiftOut(0x04, 0x4C);
shiftOut(0x00, 0x7A);
val = shiftOut(0x00, 0x7E);
Serial.print(", HFuse: ");
Serial.print(val, HEX);
shiftOut(0x04, 0x4C);
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;
}https://cdn.hackaday.io/images/5768371500229940288.jpg
FLUX capacitor trinket | So I've made myself an AVR resetter then
2017-07-16 20:37:38
to fix almost all my tiny13a's I had to build this, but it definitely fixed all 10 boards :) for the tinies you don't need any parallel connections, so it's basically SPI + 12V on reset. I've hooked up a boost converter, added a button and "some" LEDs (bicolor), worked them in the code and now basically have a "power on and fix" stand alone fuse resetter for soic Attinies. That's not highly specialised at all. BUT IT WORKS AND THEY WORK! Now I need to clean up my desk.
http://www.engbedded.com/fusecalc/
https://arduinodiy.wordpress.com/2015/05/16/high-voltage-programmingunbricking-for-attiny/

#define RST 13
#define SCI 12
#define SDO 11
#define SII 10
#define SDI 9
#define VCC 8
#define BUTTON 3
#define LED_RED 7
#define LED_GRN 5
#define HFUSE 0x747C
#define LFUSE 0x646C
#define EFUSE 0x666E
#define ATTINY13 0x9007
#define ATTINY24 0x910B
#define ATTINY25 0x9108
#define ATTINY44 0x9207
#define ATTINY45 0x9206
#define ATTINY84 0x930C
#define ATTINY85 0x930B
void setup() {
pinMode(BUTTON, INPUT_PULLUP);
pinMode(LED_GRN, OUTPUT);
pinMode(LED_RED, OUTPUT);
pinMode(VCC, OUTPUT);
pinMode(RST, OUTPUT);
pinMode(SDI, OUTPUT);
pinMode(SII, OUTPUT);
pinMode(SCI, OUTPUT);
pinMode(SDO, OUTPUT);
digitalWrite(RST, HIGH);
Serial.begin(19200);
}
void loop() {
digitalWrite(LED_GRN, HIGH);
digitalWrite(LED_RED, LOW);
if (digitalRead(BUTTON) == LOW)
{
digitalWrite(LED_GRN, LOW);
digitalWrite(LED_RED, HIGH);
pinMode(SDO, OUTPUT);
digitalWrite(SDI, LOW);
digitalWrite(SII, LOW);
digitalWrite(SDO, LOW);
digitalWrite(RST, HIGH);
digitalWrite(VCC, HIGH);
delayMicroseconds(20);
digitalWrite(RST, LOW);
delayMicroseconds(10);
pinMode(SDO, 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);
digitalWrite(RST, HIGH);
delay(1000);
}
}
byte shiftOut (byte val1, byte val2) {
int inBits = 0;
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);
shiftOut(0x00, 0x68);
val = shiftOut(0x00, 0x6C);
Serial.print("LFuse ");
Serial.print(val, HEX);
shiftOut(0x04, 0x4C);
shiftOut(0x00, 0x7A);
val = shiftOut(0x00, 0x7E);
Serial.print(", HFuse: ");
Serial.print(val, HEX);
shiftOut(0x04, 0x4C);
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;
}https://cdn.hackaday.io/images/5768371500229940288.jpg
FLUX capacitor trinket | So I've made myself an AVR resetter then
2017-07-16 20:37:38
to fix almost all my tiny13a's I had to build this, but it definitely fixed all 10 boards :) for the tinies you don't need any parallel connections, so it's basically SPI + 12V on reset. I've hooked up a boost converter, added a button and "some" LEDs (bicolor), worked them in the code and now basically have a "power on and fix" stand alone fuse resetter for soic Attinies. That's not highly specialised at all. BUT IT WORKS AND THEY WORK! Now I need to clean up my desk.
http://www.engbedded.com/fusecalc/
https://arduinodiy.wordpress.com/2015/05/16/high-voltage-programmingunbricking-for-attiny/

#define RST 13
#define SCI 12
#define SDO 11
#define SII 10
#define SDI 9
#define VCC 8
#define BUTTON 3
#define LED_RED 7
#define LED_GRN 5
#define HFUSE 0x747C
#define LFUSE 0x646C
#define EFUSE 0x666E
#define ATTINY13 0x9007
#define ATTINY24 0x910B
#define ATTINY25 0x9108
#define ATTINY44 0x9207
#define ATTINY45 0x9206
#define ATTINY84 0x930C
#define ATTINY85 0x930B
void setup() {
pinMode(BUTTON, INPUT_PULLUP);
pinMode(LED_GRN, OUTPUT);
pinMode(LED_RED, OUTPUT);
pinMode(VCC, OUTPUT);
pinMode(RST, OUTPUT);
pinMode(SDI, OUTPUT);
pinMode(SII, OUTPUT);
pinMode(SCI, OUTPUT);
pinMode(SDO, OUTPUT);
digitalWrite(RST, HIGH);
Serial.begin(19200);
}
void loop() {
digitalWrite(LED_GRN, HIGH);
digitalWrite(LED_RED, LOW);
if (digitalRead(BUTTON) == LOW)
{
digitalWrite(LED_GRN, LOW);
digitalWrite(LED_RED, HIGH);
pinMode(SDO, OUTPUT);
digitalWrite(SDI, LOW);
digitalWrite(SII, LOW);
digitalWrite(SDO, LOW);
digitalWrite(RST, HIGH);
digitalWrite(VCC, HIGH);
delayMicroseconds(20);
digitalWrite(RST, LOW);
delayMicroseconds(10);
pinMode(SDO, 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);
digitalWrite(RST, HIGH);
delay(1000);
}
}
byte shiftOut (byte val1, byte val2) {
int inBits = 0;
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);
shiftOut(0x00, 0x68);
val = shiftOut(0x00, 0x6C);
Serial.print("LFuse ");
Serial.print(val, HEX);
shiftOut(0x04, 0x4C);
shiftOut(0x00, 0x7A);
val = shiftOut(0x00, 0x7E);
Serial.print(", HFuse: ");
Serial.print(val, HEX);
shiftOut(0x04, 0x4C);
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;
}https://cdn.hackaday.io/images/5768371500229940288.jpg
FLUX capacitor trinket | So I've made myself an AVR resetter then
2017-07-16 20:37:38
to fix almost all my tiny13a's I had to build this, but it definitely fixed all 10 boards :) for the tinies you don't need any parallel connections, so it's basically SPI + 12V on reset. I've hooked up a boost converter, added a button and "some" LEDs (bicolor), worked them in the code and now basically have a "power on and fix" stand alone fuse resetter for soic Attinies. That's not highly specialised at all. BUT IT WORKS AND THEY WORK! Now I need to clean up my desk.
http://www.engbedded.com/fusecalc/
https://arduinodiy.wordpress.com/2015/05/16/high-voltage-programmingunbricking-for-attiny/

#define RST 13
#define SCI 12
#define SDO 11
#define SII 10
#define SDI 9
#define VCC 8
#define BUTTON 3
#define LED_RED 7
#define LED_GRN 5
#define HFUSE 0x747C
#define LFUSE 0x646C
#define EFUSE 0x666E
#define ATTINY13 0x9007
#define ATTINY24 0x910B
#define ATTINY25 0x9108
#define ATTINY44 0x9207
#define ATTINY45 0x9206
#define ATTINY84 0x930C
#define ATTINY85 0x930B
void setup() {
pinMode(BUTTON, INPUT_PULLUP);
pinMode(LED_GRN, OUTPUT);
pinMode(LED_RED, OUTPUT);
pinMode(VCC, OUTPUT);
pinMode(RST, OUTPUT);
pinMode(SDI, OUTPUT);
pinMode(SII, OUTPUT);
pinMode(SCI, OUTPUT);
pinMode(SDO, OUTPUT);
digitalWrite(RST, HIGH);
Serial.begin(19200);
}
void loop() {
digitalWrite(LED_GRN, HIGH);
digitalWrite(LED_RED, LOW);
if (digitalRead(BUTTON) == LOW)
{
digitalWrite(LED_GRN, LOW);
digitalWrite(LED_RED, HIGH);
pinMode(SDO, OUTPUT);
digitalWrite(SDI, LOW);
digitalWrite(SII, LOW);
digitalWrite(SDO, LOW);
digitalWrite(RST, HIGH);
digitalWrite(VCC, HIGH);
delayMicroseconds(20);
digitalWrite(RST, LOW);
delayMicroseconds(10);
pinMode(SDO, 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);
digitalWrite(RST, HIGH);
delay(1000);
}
}
byte shiftOut (byte val1, byte val2) {
int inBits = 0;
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);
shiftOut(0x00, 0x68);
val = shiftOut(0x00, 0x6C);
Serial.print("LFuse ");
Serial.print(val, HEX);
shiftOut(0x04, 0x4C);
shiftOut(0x00, 0x7A);
val = shiftOut(0x00, 0x7E);
Serial.print(", HFuse: ");
Serial.print(val, HEX);
shiftOut(0x04, 0x4C);
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;
}https://cdn.hackaday.io/images/5768371500229940288.jpg
FLUX capacitor trinket | So I've made myself an AVR resetter then
2017-07-16 20:37:38
to fix almost all my tiny13a's I had to build this, but it definitely fixed all 10 boards :) for the tinies you don't need any parallel connections, so it's basically SPI + 12V on reset. I've hooked up a boost converter, added a button and "some" LEDs (bicolor), worked them in the code and now basically have a "power on and fix" stand alone fuse resetter for soic Attinies. That's not highly specialised at all. BUT IT WORKS AND THEY WORK! Now I need to clean up my desk.
http://www.engbedded.com/fusecalc/
https://arduinodiy.wordpress.com/2015/05/16/high-voltage-programmingunbricking-for-attiny/

#define RST 13
#define SCI 12
#define SDO 11
#define SII 10
#define SDI 9
#define VCC 8
#define BUTTON 3
#define LED_RED 7
#define LED_GRN 5
#define HFUSE 0x747C
#define LFUSE 0x646C
#define EFUSE 0x666E
#define ATTINY13 0x9007
#define ATTINY24 0x910B
#define ATTINY25 0x9108
#define ATTINY44 0x9207
#define ATTINY45 0x9206
#define ATTINY84 0x930C
#define ATTINY85 0x930B
void setup() {
pinMode(BUTTON, INPUT_PULLUP);
pinMode(LED_GRN, OUTPUT);
pinMode(LED_RED, OUTPUT);
pinMode(VCC, OUTPUT);
pinMode(RST, OUTPUT);
pinMode(SDI, OUTPUT);
pinMode(SII, OUTPUT);
pinMode(SCI, OUTPUT);
pinMode(SDO, OUTPUT);
digitalWrite(RST, HIGH);
Serial.begin(19200);
}
void loop() {
digitalWrite(LED_GRN, HIGH);
digitalWrite(LED_RED, LOW);
if (digitalRead(BUTTON) == LOW)
{
digitalWrite(LED_GRN, LOW);
digitalWrite(LED_RED, HIGH);
pinMode(SDO, OUTPUT);
digitalWrite(SDI, LOW);
digitalWrite(SII, LOW);
digitalWrite(SDO, LOW);
digitalWrite(RST, HIGH);
digitalWrite(VCC, HIGH);
delayMicroseconds(20);
digitalWrite(RST, LOW);
delayMicroseconds(10);
pinMode(SDO, 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);
digitalWrite(RST, HIGH);
delay(1000);
}
}
byte shiftOut (byte val1, byte val2) {
int inBits = 0;
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);
shiftOut(0x00, 0x68);
val = shiftOut(0x00, 0x6C);
Serial.print("LFuse ");
Serial.print(val, HEX);
shiftOut(0x04, 0x4C);
shiftOut(0x00, 0x7A);
val = shiftOut(0x00, 0x7E);
Serial.print(", HFuse: ");
Serial.print(val, HEX);
shiftOut(0x04, 0x4C);
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;
}https://cdn.hackaday.io/images/5768371500229940288.jpg
FLUX capacitor trinket | So I've made myself an AVR resetter then
2017-07-16 20:37:38
to fix almost all my tiny13a's I had to build this, but it definitely fixed all 10 boards :) for the tinies you don't need any parallel connections, so it's basically SPI + 12V on reset. I've hooked up a boost converter, added a button and "some" LEDs (bicolor), worked them in the code and now basically have a "power on and fix" stand alone fuse resetter for soic Attinies. That's not highly specialised at all. BUT IT WORKS AND THEY WORK! Now I need to clean up my desk.
http://www.engbedded.com/fusecalc/
https://arduinodiy.wordpress.com/2015/05/16/high-voltage-programmingunbricking-for-attiny/

#define RST 13
#define SCI 12
#define SDO 11
#define SII 10
#define SDI 9
#define VCC 8
#define BUTTON 3
#define LED_RED 7
#define LED_GRN 5
#define HFUSE 0x747C
#define LFUSE 0x646C
#define EFUSE 0x666E
#define ATTINY13 0x9007
#define ATTINY24 0x910B
#define ATTINY25 0x9108
#define ATTINY44 0x9207
#define ATTINY45 0x9206
#define ATTINY84 0x930C
#define ATTINY85 0x930B
void setup() {
pinMode(BUTTON, INPUT_PULLUP);
pinMode(LED_GRN, OUTPUT);
pinMode(LED_RED, OUTPUT);
pinMode(VCC, OUTPUT);
pinMode(RST, OUTPUT);
pinMode(SDI, OUTPUT);
pinMode(SII, OUTPUT);
pinMode(SCI, OUTPUT);
pinMode(SDO, OUTPUT);
digitalWrite(RST, HIGH);
Serial.begin(19200);
}
void loop() {
digitalWrite(LED_GRN, HIGH);
digitalWrite(LED_RED, LOW);
if (digitalRead(BUTTON) == LOW)
{
digitalWrite(LED_GRN, LOW);
digitalWrite(LED_RED, HIGH);
pinMode(SDO, OUTPUT);
digitalWrite(SDI, LOW);
digitalWrite(SII, LOW);
digitalWrite(SDO, LOW);
digitalWrite(RST, HIGH);
digitalWrite(VCC, HIGH);
delayMicroseconds(20);
digitalWrite(RST, LOW);
delayMicroseconds(10);
pinMode(SDO, 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);
digitalWrite(RST, HIGH);
delay(1000);
}
}
byte shiftOut (byte val1, byte val2) {
int inBits = 0;
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);
shiftOut(0x00, 0x68);
val = shiftOut(0x00, 0x6C);
Serial.print("LFuse ");
Serial.print(val, HEX);
shiftOut(0x04, 0x4C);
shiftOut(0x00, 0x7A);
val = shiftOut(0x00, 0x7E);
Serial.print(", HFuse: ");
Serial.print(val, HEX);
shiftOut(0x04, 0x4C);
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;
}https://cdn.hackaday.io/images/5768371500229940288.jpg
FLUX capacitor trinket | So I've made myself an AVR resetter then
2017-07-16 20:37:38
to fix almost all my tiny13a's I had to build this, but it definitely fixed all 10 boards :) for the tinies you don't need any parallel connections, so it's basically SPI + 12V on reset. I've hooked up a boost converter, added a button and "some" LEDs (bicolor), worked them in the code and now basically have a "power on and fix" stand alone fuse resetter for soic Attinies. That's not highly specialised at all. BUT IT WORKS AND THEY WORK! Now I need to clean up my desk.
http://www.engbedded.com/fusecalc/
https://arduinodiy.wordpress.com/2015/05/16/high-voltage-programmingunbricking-for-attiny/

#define RST 13
#define SCI 12
#define SDO 11
#define SII 10
#define SDI 9
#define VCC 8
#define BUTTON 3
#define LED_RED 7
#define LED_GRN 5
#define HFUSE 0x747C
#define LFUSE 0x646C
#define EFUSE 0x666E
#define ATTINY13 0x9007
#define ATTINY24 0x910B
#define ATTINY25 0x9108
#define ATTINY44 0x9207
#define ATTINY45 0x9206
#define ATTINY84 0x930C
#define ATTINY85 0x930B
void setup() {
pinMode(BUTTON, INPUT_PULLUP);
pinMode(LED_GRN, OUTPUT);
pinMode(LED_RED, OUTPUT);
pinMode(VCC, OUTPUT);
pinMode(RST, OUTPUT);
pinMode(SDI, OUTPUT);
pinMode(SII, OUTPUT);
pinMode(SCI, OUTPUT);
pinMode(SDO, OUTPUT);
digitalWrite(RST, HIGH);
Serial.begin(19200);
}
void loop() {
digitalWrite(LED_GRN, HIGH);
digitalWrite(LED_RED, LOW);
if (digitalRead(BUTTON) == LOW)
{
digitalWrite(LED_GRN, LOW);
digitalWrite(LED_RED, HIGH);
pinMode(SDO, OUTPUT);
digitalWrite(SDI, LOW);
digitalWrite(SII, LOW);
digitalWrite(SDO, LOW);
digitalWrite(RST, HIGH);
digitalWrite(VCC, HIGH);
delayMicroseconds(20);
digitalWrite(RST, LOW);
delayMicroseconds(10);
pinMode(SDO, 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);
digitalWrite(RST, HIGH);
delay(1000);
}
}
byte shiftOut (byte val1, byte val2) {
int inBits = 0;
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);
shiftOut(0x00, 0x68);
val = shiftOut(0x00, 0x6C);
Serial.print("LFuse ");
Serial.print(val, HEX);
shiftOut(0x04, 0x4C);
shiftOut(0x00, 0x7A);
val = shiftOut(0x00, 0x7E);
Serial.print(", HFuse: ");
Serial.print(val, HEX);
shiftOut(0x04, 0x4C);
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;
}https://cdn.hackaday.io/images/5768371500229940288.jpg
FLUX capacitor trinket | So I've made myself an AVR resetter then
2017-07-16 20:37:38
to fix almost all my tiny13a's I had to build this, but it definitely fixed all 10 boards :) for the tinies you don't need any parallel connections, so it's basically SPI + 12V on reset. I've hooked up a boost converter, added a button and "some" LEDs (bicolor), worked them in the code and now basically have a "power on and fix" stand alone fuse resetter for soic Attinies. That's not highly specialised at all. BUT IT WORKS AND THEY WORK! Now I need to clean up my desk.
http://www.engbedded.com/fusecalc/
https://arduinodiy.wordpress.com/2015/05/16/high-voltage-programmingunbricking-for-attiny/

#define RST 13
#define SCI 12
#define SDO 11
#define SII 10
#define SDI 9
#define VCC 8
#define BUTTON 3
#define LED_RED 7
#define LED_GRN 5
#define HFUSE 0x747C
#define LFUSE 0x646C
#define EFUSE 0x666E
#define ATTINY13 0x9007
#define ATTINY24 0x910B
#define ATTINY25 0x9108
#define ATTINY44 0x9207
#define ATTINY45 0x9206
#define ATTINY84 0x930C
#define ATTINY85 0x930B
void setup() {
pinMode(BUTTON, INPUT_PULLUP);
pinMode(LED_GRN, OUTPUT);
pinMode(LED_RED, OUTPUT);
pinMode(VCC, OUTPUT);
pinMode(RST, OUTPUT);
pinMode(SDI, OUTPUT);
pinMode(SII, OUTPUT);
pinMode(SCI, OUTPUT);
pinMode(SDO, OUTPUT);
digitalWrite(RST, HIGH);
Serial.begin(19200);
}
void loop() {
digitalWrite(LED_GRN, HIGH);
digitalWrite(LED_RED, LOW);
if (digitalRead(BUTTON) == LOW)
{
digitalWrite(LED_GRN, LOW);
digitalWrite(LED_RED, HIGH);
pinMode(SDO, OUTPUT);
digitalWrite(SDI, LOW);
digitalWrite(SII, LOW);
digitalWrite(SDO, LOW);
digitalWrite(RST, HIGH);
digitalWrite(VCC, HIGH);
delayMicroseconds(20);
digitalWrite(RST, LOW);
delayMicroseconds(10);
pinMode(SDO, 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);
digitalWrite(RST, HIGH);
delay(1000);
}
}
byte shiftOut (byte val1, byte val2) {
int inBits = 0;
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);
shiftOut(0x00, 0x68);
val = shiftOut(0x00, 0x6C);
Serial.print("LFuse ");
Serial.print(val, HEX);
shiftOut(0x04, 0x4C);
shiftOut(0x00, 0x7A);
val = shiftOut(0x00, 0x7E);
Serial.print(", HFuse: ");
Serial.print(val, HEX);
shiftOut(0x04, 0x4C);
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;
}https://cdn.hackaday.io/images/5768371500229940288.jpg
FLUX capacitor trinket | So I've made myself an AVR resetter then
2017-07-16 20:37:38
to fix almost all my tiny13a's I had to build this, but it definitely fixed all 10 boards :) for the tinies you don't need any parallel connections, so it's basically SPI + 12V on reset. I've hooked up a boost converter, added a button and "some" LEDs (bicolor), worked them in the code and now basically have a "power on and fix" stand alone fuse resetter for soic Attinies. That's not highly specialised at all. BUT IT WORKS AND THEY WORK! Now I need to clean up my desk.
http://www.engbedded.com/fusecalc/
https://arduinodiy.wordpress.com/2015/05/16/high-voltage-programmingunbricking-for-attiny/

#define RST 13
#define SCI 12
#define SDO 11
#define SII 10
#define SDI 9
#define VCC 8
#define BUTTON 3
#define LED_RED 7
#define LED_GRN 5
#define HFUSE 0x747C
#define LFUSE 0x646C
#define EFUSE 0x666E
#define ATTINY13 0x9007
#define ATTINY24 0x910B
#define ATTINY25 0x9108
#define ATTINY44 0x9207
#define ATTINY45 0x9206
#define ATTINY84 0x930C
#define ATTINY85 0x930B
void setup() {
pinMode(BUTTON, INPUT_PULLUP);
pinMode(LED_GRN, OUTPUT);
pinMode(LED_RED, OUTPUT);
pinMode(VCC, OUTPUT);
pinMode(RST, OUTPUT);
pinMode(SDI, OUTPUT);
pinMode(SII, OUTPUT);
pinMode(SCI, OUTPUT);
pinMode(SDO, OUTPUT);
digitalWrite(RST, HIGH);
Serial.begin(19200);
}
void loop() {
digitalWrite(LED_GRN, HIGH);
digitalWrite(LED_RED, LOW);
if (digitalRead(BUTTON) == LOW)
{
digitalWrite(LED_GRN, LOW);
digitalWrite(LED_RED, HIGH);
pinMode(SDO, OUTPUT);
digitalWrite(SDI, LOW);
digitalWrite(SII, LOW);
digitalWrite(SDO, LOW);
digitalWrite(RST, HIGH);
digitalWrite(VCC, HIGH);
delayMicroseconds(20);
digitalWrite(RST, LOW);
delayMicroseconds(10);
pinMode(SDO, 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);
digitalWrite(RST, HIGH);
delay(1000);
}
}
byte shiftOut (byte val1, byte val2) {
int inBits = 0;
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);
shiftOut(0x00, 0x68);
val = shiftOut(0x00, 0x6C);
Serial.print("LFuse ");
Serial.print(val, HEX);
shiftOut(0x04, 0x4C);
shiftOut(0x00, 0x7A);
val = shiftOut(0x00, 0x7E);
Serial.print(", HFuse: ");
Serial.print(val, HEX);
shiftOut(0x04, 0x4C);
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;
}https://cdn.hackaday.io/images/5768371500229940288.jpg
FLUX capacitor trinket | So I've made myself an AVR resetter then
2017-07-16 20:37:38
to fix almost all my tiny13a's I had to build this, but it definitely fixed all 10 boards :) for the tinies you don't need any parallel connections, so it's basically SPI + 12V on reset. I've hooked up a boost converter, added a button and "some" LEDs (bicolor), worked them in the code and now basically have a "power on and fix" stand alone fuse resetter for soic Attinies. That's not highly specialised at all. BUT IT WORKS AND THEY WORK! Now I need to clean up my desk.
http://www.engbedded.com/fusecalc/
https://arduinodiy.wordpress.com/2015/05/16/high-voltage-programmingunbricking-for-attiny/

#define RST 13
#define SCI 12
#define SDO 11
#define SII 10
#define SDI 9
#define VCC 8
#define BUTTON 3
#define LED_RED 7
#define LED_GRN 5
#define HFUSE 0x747C
#define LFUSE 0x646C
#define EFUSE 0x666E
#define ATTINY13 0x9007
#define ATTINY24 0x910B
#define ATTINY25 0x9108
#define ATTINY44 0x9207
#define ATTINY45 0x9206
#define ATTINY84 0x930C
#define ATTINY85 0x930B
void setup() {
pinMode(BUTTON, INPUT_PULLUP);
pinMode(LED_GRN, OUTPUT);
pinMode(LED_RED, OUTPUT);
pinMode(VCC, OUTPUT);
pinMode(RST, OUTPUT);
pinMode(SDI, OUTPUT);
pinMode(SII, OUTPUT);
pinMode(SCI, OUTPUT);
pinMode(SDO, OUTPUT);
digitalWrite(RST, HIGH);
Serial.begin(19200);
}
void loop() {
digitalWrite(LED_GRN, HIGH);
digitalWrite(LED_RED, LOW);
if (digitalRead(BUTTON) == LOW)
{
digitalWrite(LED_GRN, LOW);
digitalWrite(LED_RED, HIGH);
pinMode(SDO, OUTPUT);
digitalWrite(SDI, LOW);
digitalWrite(SII, LOW);
digitalWrite(SDO, LOW);
digitalWrite(RST, HIGH);
digitalWrite(VCC, HIGH);
delayMicroseconds(20);
digitalWrite(RST, LOW);
delayMicroseconds(10);
pinMode(SDO, 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);
digitalWrite(RST, HIGH);
delay(1000);
}
}
byte shiftOut (byte val1, byte val2) {
int inBits = 0;
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);
shiftOut(0x00, 0x68);
val = shiftOut(0x00, 0x6C);
Serial.print("LFuse ");
Serial.print(val, HEX);
shiftOut(0x04, 0x4C);
shiftOut(0x00, 0x7A);
val = shiftOut(0x00, 0x7E);
Serial.print(", HFuse: ");
Serial.print(val, HEX);
shiftOut(0x04, 0x4C);
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;
}https://cdn.hackaday.io/images/5768371500229940288.jpg
FLUX capacitor trinket | So I've made myself an AVR resetter then
2017-07-16 20:37:38
to fix almost all my tiny13a's I had to build this, but it definitely fixed all 10 boards :) for the tinies you don't need any parallel connections, so it's basically SPI + 12V on reset. I've hooked up a boost converter, added a button and "some" LEDs (bicolor), worked them in the code and now basically have a "power on and fix" stand alone fuse resetter for soic Attinies. That's not highly specialised at all. BUT IT WORKS AND THEY WORK! Now I need to clean up my desk.
http://www.engbedded.com/fusecalc/
https://arduinodiy.wordpress.com/2015/05/16/high-voltage-programmingunbricking-for-attiny/

#define RST 13
#define SCI 12
#define SDO 11
#define SII 10
#define SDI 9
#define VCC 8
#define BUTTON 3
#define LED_RED 7
#define LED_GRN 5
#define HFUSE 0x747C
#define LFUSE 0x646C
#define EFUSE 0x666E
#define ATTINY13 0x9007
#define ATTINY24 0x910B
#define ATTINY25 0x9108
#define ATTINY44 0x9207
#define ATTINY45 0x9206
#define ATTINY84 0x930C
#define ATTINY85 0x930B
void setup() {
pinMode(BUTTON, INPUT_PULLUP);
pinMode(LED_GRN, OUTPUT);
pinMode(LED_RED, OUTPUT);
pinMode(VCC, OUTPUT);
pinMode(RST, OUTPUT);
pinMode(SDI, OUTPUT);
pinMode(SII, OUTPUT);
pinMode(SCI, OUTPUT);
pinMode(SDO, OUTPUT);
digitalWrite(RST, HIGH);
Serial.begin(19200);
}
void loop() {
digitalWrite(LED_GRN, HIGH);
digitalWrite(LED_RED, LOW);
if (digitalRead(BUTTON) == LOW)
{
digitalWrite(LED_GRN, LOW);
digitalWrite(LED_RED, HIGH);
pinMode(SDO, OUTPUT);
digitalWrite(SDI, LOW);
digitalWrite(SII, LOW);
digitalWrite(SDO, LOW);
digitalWrite(RST, HIGH);
digitalWrite(VCC, HIGH);
delayMicroseconds(20);
digitalWrite(RST, LOW);
delayMicroseconds(10);
pinMode(SDO, 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);
digitalWrite(RST, HIGH);
delay(1000);
}
}
byte shiftOut (byte val1, byte val2) {
int inBits = 0;
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);
shiftOut(0x00, 0x68);
val = shiftOut(0x00, 0x6C);
Serial.print("LFuse ");
Serial.print(val, HEX);
shiftOut(0x04, 0x4C);
shiftOut(0x00, 0x7A);
val = shiftOut(0x00, 0x7E);
Serial.print(", HFuse: ");
Serial.print(val, HEX);
shiftOut(0x04, 0x4C);
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;
}https://cdn.hackaday.io/images/5768371500229940288.jpg
FLUX capacitor trinket | So I've made myself an AVR resetter then
2017-07-16 20:37:38
to fix almost all my tiny13a's I had to build this, but it definitely fixed all 10 boards :) for the tinies you don't need any parallel connections, so it's basically SPI + 12V on reset. I've hooked up a boost converter, added a button and "some" LEDs (bicolor), worked them in the code and now basically have a "power on and fix" stand alone fuse resetter for soic Attinies. That's not highly specialised at all. BUT IT WORKS AND THEY WORK! Now I need to clean up my desk.
http://www.engbedded.com/fusecalc/
https://arduinodiy.wordpress.com/2015/05/16/high-voltage-programmingunbricking-for-attiny/

#define RST 13
#define SCI 12
#define SDO 11
#define SII 10
#define SDI 9
#define VCC 8
#define BUTTON 3
#define LED_RED 7
#define LED_GRN 5
#define HFUSE 0x747C
#define LFUSE 0x646C
#define EFUSE 0x666E
#define ATTINY13 0x9007
#define ATTINY24 0x910B
#define ATTINY25 0x9108
#define ATTINY44 0x9207
#define ATTINY45 0x9206
#define ATTINY84 0x930C
#define ATTINY85 0x930B
void setup() {
pinMode(BUTTON, INPUT_PULLUP);
pinMode(LED_GRN, OUTPUT);
pinMode(LED_RED, OUTPUT);
pinMode(VCC, OUTPUT);
pinMode(RST, OUTPUT);
pinMode(SDI, OUTPUT);
pinMode(SII, OUTPUT);
pinMode(SCI, OUTPUT);
pinMode(SDO, OUTPUT);
digitalWrite(RST, HIGH);
Serial.begin(19200);
}
void loop() {
digitalWrite(LED_GRN, HIGH);
digitalWrite(LED_RED, LOW);
if (digitalRead(BUTTON) == LOW)
{
digitalWrite(LED_GRN, LOW);
digitalWrite(LED_RED, HIGH);
pinMode(SDO, OUTPUT);
digitalWrite(SDI, LOW);
digitalWrite(SII, LOW);
digitalWrite(SDO, LOW);
digitalWrite(RST, HIGH);
digitalWrite(VCC, HIGH);
delayMicroseconds(20);
digitalWrite(RST, LOW);
delayMicroseconds(10);
pinMode(SDO, 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);
digitalWrite(RST, HIGH);
delay(1000);
}
}
byte shiftOut (byte val1, byte val2) {
int inBits = 0;
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);
shiftOut(0x00, 0x68);
val = shiftOut(0x00, 0x6C);
Serial.print("LFuse ");
Serial.print(val, HEX);
shiftOut(0x04, 0x4C);
shiftOut(0x00, 0x7A);
val = shiftOut(0x00, 0x7E);
Serial.print(", HFuse: ");
Serial.print(val, HEX);
shiftOut(0x04, 0x4C);
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;
}https://cdn.hackaday.io/images/5768371500229940288.jpg
FLUX capacitor trinket | So I've made myself an AVR resetter then
2017-07-16 20:37:38
to fix almost all my tiny13a's I had to build this, but it definitely fixed all 10 boards :) for the tinies you don't need any parallel connections, so it's basically SPI + 12V on reset. I've hooked up a boost converter, added a button and "some" LEDs (bicolor), worked them in the code and now basically have a "power on and fix" stand alone fuse resetter for soic Attinies. That's not highly specialised at all. BUT IT WORKS AND THEY WORK! Now I need to clean up my desk.
http://www.engbedded.com/fusecalc/
https://arduinodiy.wordpress.com/2015/05/16/high-voltage-programmingunbricking-for-attiny/

#define RST 13
#define SCI 12
#define SDO 11
#define SII 10
#define SDI 9
#define VCC 8
#define BUTTON 3
#define LED_RED 7
#define LED_GRN 5
#define HFUSE 0x747C
#define LFUSE 0x646C
#define EFUSE 0x666E
#define ATTINY13 0x9007
#define ATTINY24 0x910B
#define ATTINY25 0x9108
#define ATTINY44 0x9207
#define ATTINY45 0x9206
#define ATTINY84 0x930C
#define ATTINY85 0x930B
void setup() {
pinMode(BUTTON, INPUT_PULLUP);
pinMode(LED_GRN, OUTPUT);
pinMode(LED_RED, OUTPUT);
pinMode(VCC, OUTPUT);
pinMode(RST, OUTPUT);
pinMode(SDI, OUTPUT);
pinMode(SII, OUTPUT);
pinMode(SCI, OUTPUT);
pinMode(SDO, OUTPUT);
digitalWrite(RST, HIGH);
Serial.begin(19200);
}
void loop() {
digitalWrite(LED_GRN, HIGH);
digitalWrite(LED_RED, LOW);
if (digitalRead(BUTTON) == LOW)
{
digitalWrite(LED_GRN, LOW);
digitalWrite(LED_RED, HIGH);
pinMode(SDO, OUTPUT);
digitalWrite(SDI, LOW);
digitalWrite(SII, LOW);
digitalWrite(SDO, LOW);
digitalWrite(RST, HIGH);
digitalWrite(VCC, HIGH);
delayMicroseconds(20);
digitalWrite(RST, LOW);
delayMicroseconds(10);
pinMode(SDO, 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);
digitalWrite(RST, HIGH);
delay(1000);
}
}
byte shiftOut (byte val1, byte val2) {
int inBits = 0;
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);
shiftOut(0x00, 0x68);
val = shiftOut(0x00, 0x6C);
Serial.print("LFuse ");
Serial.print(val, HEX);
shiftOut(0x04, 0x4C);
shiftOut(0x00, 0x7A);
val = shiftOut(0x00, 0x7E);
Serial.print(", HFuse: ");
Serial.print(val, HEX);
shiftOut(0x04, 0x4C);
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;
}https://cdn.hackaday.io/images/5768371500229940288.jpg
FLUX capacitor trinket | So I've made myself an AVR resetter then
2017-07-16 20:37:38
to fix almost all my tiny13a's I had to build this, but it definitely fixed all 10 boards :) for the tinies you don't need any parallel connections, so it's basically SPI + 12V on reset. I've hooked up a boost converter, added a button and "some" LEDs (bicolor), worked them in the code and now basically have a "power on and fix" stand alone fuse resetter for soic Attinies. That's not highly specialised at all. BUT IT WORKS AND THEY WORK! Now I need to clean up my desk.
http://www.engbedded.com/fusecalc/
https://arduinodiy.wordpress.com/2015/05/16/high-voltage-programmingunbricking-for-attiny/

#define RST 13
#define SCI 12
#define SDO 11
#define SII 10
#define SDI 9
#define VCC 8
#define BUTTON 3
#define LED_RED 7
#define LED_GRN 5
#define HFUSE 0x747C
#define LFUSE 0x646C
#define EFUSE 0x666E
#define ATTINY13 0x9007
#define ATTINY24 0x910B
#define ATTINY25 0x9108
#define ATTINY44 0x9207
#define ATTINY45 0x9206
#define ATTINY84 0x930C
#define ATTINY85 0x930B
void setup() {
pinMode(BUTTON, INPUT_PULLUP);
pinMode(LED_GRN, OUTPUT);
pinMode(LED_RED, OUTPUT);
pinMode(VCC, OUTPUT);
pinMode(RST, OUTPUT);
pinMode(SDI, OUTPUT);
pinMode(SII, OUTPUT);
pinMode(SCI, OUTPUT);
pinMode(SDO, OUTPUT);
digitalWrite(RST, HIGH);
Serial.begin(19200);
}
void loop() {
digitalWrite(LED_GRN, HIGH);
digitalWrite(LED_RED, LOW);
if (digitalRead(BUTTON) == LOW)
{
digitalWrite(LED_GRN, LOW);
digitalWrite(LED_RED, HIGH);
pinMode(SDO, OUTPUT);
digitalWrite(SDI, LOW);
digitalWrite(SII, LOW);
digitalWrite(SDO, LOW);
digitalWrite(RST, HIGH);
digitalWrite(VCC, HIGH);
delayMicroseconds(20);
digitalWrite(RST, LOW);
delayMicroseconds(10);
pinMode(SDO, 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);
digitalWrite(RST, HIGH);
delay(1000);
}
}
byte shiftOut (byte val1, byte val2) {
int inBits = 0;
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);
shiftOut(0x00, 0x68);
val = shiftOut(0x00, 0x6C);
Serial.print("LFuse ");
Serial.print(val, HEX);
shiftOut(0x04, 0x4C);
shiftOut(0x00, 0x7A);
val = shiftOut(0x00, 0x7E);
Serial.print(", HFuse: ");
Serial.print(val, HEX);
shiftOut(0x04, 0x4C);
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;
}https://cdn.hackaday.io/images/5768371500229940288.jpg
FLUX capacitor trinket | So I've made myself an AVR resetter then
2017-07-16 20:37:38
to fix almost all my tiny13a's I had to build this, but it definitely fixed all 10 boards :) for the tinies you don't need any parallel connections, so it's basically SPI + 12V on reset. I've hooked up a boost converter, added a button and "some" LEDs (bicolor), worked them in the code and now basically have a "power on and fix" stand alone fuse resetter for soic Attinies. That's not highly specialised at all. BUT IT WORKS AND THEY WORK! Now I need to clean up my desk.
http://www.engbedded.com/fusecalc/
https://arduinodiy.wordpress.com/2015/05/16/high-voltage-programmingunbricking-for-attiny/

#define RST 13
#define SCI 12
#define SDO 11
#define SII 10
#define SDI 9
#define VCC 8
#define BUTTON 3
#define LED_RED 7
#define LED_GRN 5
#define HFUSE 0x747C
#define LFUSE 0x646C
#define EFUSE 0x666E
#define ATTINY13 0x9007
#define ATTINY24 0x910B
#define ATTINY25 0x9108
#define ATTINY44 0x9207
#define ATTINY45 0x9206
#define ATTINY84 0x930C
#define ATTINY85 0x930B
void setup() {
pinMode(BUTTON, INPUT_PULLUP);
pinMode(LED_GRN, OUTPUT);
pinMode(LED_RED, OUTPUT);
pinMode(VCC, OUTPUT);
pinMode(RST, OUTPUT);
pinMode(SDI, OUTPUT);
pinMode(SII, OUTPUT);
pinMode(SCI, OUTPUT);
pinMode(SDO, OUTPUT);
digitalWrite(RST, HIGH);
Serial.begin(19200);
}
void loop() {
digitalWrite(LED_GRN, HIGH);
digitalWrite(LED_RED, LOW);
if (digitalRead(BUTTON) == LOW)
{
digitalWrite(LED_GRN, LOW);
digitalWrite(LED_RED, HIGH);
pinMode(SDO, OUTPUT);
digitalWrite(SDI, LOW);
digitalWrite(SII, LOW);
digitalWrite(SDO, LOW);
digitalWrite(RST, HIGH);
digitalWrite(VCC, HIGH);
delayMicroseconds(20);
digitalWrite(RST, LOW);
delayMicroseconds(10);
pinMode(SDO, 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);
digitalWrite(RST, HIGH);
delay(1000);
}
}
byte shiftOut (byte val1, byte val2) {
int inBits = 0;
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);
shiftOut(0x00, 0x68);
val = shiftOut(0x00, 0x6C);
Serial.print("LFuse ");
Serial.print(val, HEX);
shiftOut(0x04, 0x4C);
shiftOut(0x00, 0x7A);
val = shiftOut(0x00, 0x7E);
Serial.print(", HFuse: ");
Serial.print(val, HEX);
shiftOut(0x04, 0x4C);
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;
}https://cdn.hackaday.io/images/5768371500229940288.jpg
FLUX capacitor trinket | So I've made myself an AVR resetter then
2017-07-16 20:37:38
to fix almost all my tiny13a's I had to build this, but it definitely fixed all 10 boards :) for the tinies you don't need any parallel connections, so it's basically SPI + 12V on reset. I've hooked up a boost converter, added a button and "some" LEDs (bicolor), worked them in the code and now basically have a "power on and fix" stand alone fuse resetter for soic Attinies. That's not highly specialised at all. BUT IT WORKS AND THEY WORK! Now I need to clean up my desk.
http://www.engbedded.com/fusecalc/
https://arduinodiy.wordpress.com/2015/05/16/high-voltage-programmingunbricking-for-attiny/

#define RST 13
#define SCI 12
#define SDO 11
#define SII 10
#define SDI 9
#define VCC 8
#define BUTTON 3
#define LED_RED 7
#define LED_GRN 5
#define HFUSE 0x747C
#define LFUSE 0x646C
#define EFUSE 0x666E
#define ATTINY13 0x9007
#define ATTINY24 0x910B
#define ATTINY25 0x9108
#define ATTINY44 0x9207
#define ATTINY45 0x9206
#define ATTINY84 0x930C
#define ATTINY85 0x930B
void setup() {
pinMode(BUTTON, INPUT_PULLUP);
pinMode(LED_GRN, OUTPUT);
pinMode(LED_RED, OUTPUT);
pinMode(VCC, OUTPUT);
pinMode(RST, OUTPUT);
pinMode(SDI, OUTPUT);
pinMode(SII, OUTPUT);
pinMode(SCI, OUTPUT);
pinMode(SDO, OUTPUT);
digitalWrite(RST, HIGH);
Serial.begin(19200);
}
void loop() {
digitalWrite(LED_GRN, HIGH);
digitalWrite(LED_RED, LOW);
if (digitalRead(BUTTON) == LOW)
{
digitalWrite(LED_GRN, LOW);
digitalWrite(LED_RED, HIGH);
pinMode(SDO, OUTPUT);
digitalWrite(SDI, LOW);
digitalWrite(SII, LOW);
digitalWrite(SDO, LOW);
digitalWrite(RST, HIGH);
digitalWrite(VCC, HIGH);
delayMicroseconds(20);
digitalWrite(RST, LOW);
delayMicroseconds(10);
pinMode(SDO, 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);
digitalWrite(RST, HIGH);
delay(1000);
}
}
byte shiftOut (byte val1, byte val2) {
int inBits = 0;
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);
shiftOut(0x00, 0x68);
val = shiftOut(0x00, 0x6C);
Serial.print("LFuse ");
Serial.print(val, HEX);
shiftOut(0x04, 0x4C);
shiftOut(0x00, 0x7A);
val = shiftOut(0x00, 0x7E);
Serial.print(", HFuse: ");
Serial.print(val, HEX);
shiftOut(0x04, 0x4C);
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;
}https://cdn.hackaday.io/images/5768371500229940288.jpg
FLUX capacitor trinket | So I've made myself an AVR resetter then
2017-07-16 20:37:38
to fix almost all my tiny13a's I had to build this, but it definitely fixed all 10 boards :) for the tinies you don't need any parallel connections, so it's basically SPI + 12V on reset. I've hooked up a boost converter, added a button and "some" LEDs (bicolor), worked them in the code and now basically have a "power on and fix" stand alone fuse resetter for soic Attinies. That's not highly specialised at all. BUT IT WORKS AND THEY WORK! Now I need to clean up my desk.
http://www.engbedded.com/fusecalc/
https://arduinodiy.wordpress.com/2015/05/16/high-voltage-programmingunbricking-for-attiny/

#define RST 13
#define SCI 12
#define SDO 11
#define SII 10
#define SDI 9
#define VCC 8
#define BUTTON 3
#define LED_RED 7
#define LED_GRN 5
#define HFUSE 0x747C
#define LFUSE 0x646C
#define EFUSE 0x666E
#define ATTINY13 0x9007
#define ATTINY24 0x910B
#define ATTINY25 0x9108
#define ATTINY44 0x9207
#define ATTINY45 0x9206
#define ATTINY84 0x930C
#define ATTINY85 0x930B
void setup() {
pinMode(BUTTON, INPUT_PULLUP);
pinMode(LED_GRN, OUTPUT);
pinMode(LED_RED, OUTPUT);
pinMode(VCC, OUTPUT);
pinMode(RST, OUTPUT);
pinMode(SDI, OUTPUT);
pinMode(SII, OUTPUT);
pinMode(SCI, OUTPUT);
pinMode(SDO, OUTPUT);
digitalWrite(RST, HIGH);
Serial.begin(19200);
}
void loop() {
digitalWrite(LED_GRN, HIGH);
digitalWrite(LED_RED, LOW);
if (digitalRead(BUTTON) == LOW)
{
digitalWrite(LED_GRN, LOW);
digitalWrite(LED_RED, HIGH);
pinMode(SDO, OUTPUT);
digitalWrite(SDI, LOW);
digitalWrite(SII, LOW);
digitalWrite(SDO, LOW);
digitalWrite(RST, HIGH);
digitalWrite(VCC, HIGH);
delayMicroseconds(20);
digitalWrite(RST, LOW);
delayMicroseconds(10);
pinMode(SDO, 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);
digitalWrite(RST, HIGH);
delay(1000);
}
}
byte shiftOut (byte val1, byte val2) {
int inBits = 0;
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);
shiftOut(0x00, 0x68);
val = shiftOut(0x00, 0x6C);
Serial.print("LFuse ");
Serial.print(val, HEX);
shiftOut(0x04, 0x4C);
shiftOut(0x00, 0x7A);
val = shiftOut(0x00, 0x7E);
Serial.print(", HFuse: ");
Serial.print(val, HEX);
shiftOut(0x04, 0x4C);
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;
}https://cdn.hackaday.io/images/5768371500229940288.jpg