Enkel och billig säkring läkare för Attiny
När du arbetar med Attiny som den Attiny 85 eller Attiny13, är den skyldig att hända förr eller senare: du tegel din Attiny.
Jag fick inför det när du försöker bränna en bootlaoder (dvs. att de korrekta säkringarna), att jag plötsligt fick den fruktade "usch! Ogiltig enhet signatur "felmeddelande. Som jag hade bara framgångsrikt brann det på IDE1.06 och nu försökte på IDE1.6.3, bara för att se om jag har installerat allt OK, jag visste chip var OK och att min programmerare var OK. Dessutom gjorde ett nytt chip bra, så något olycksbådande måste ha hänt mitt chip.
Kan det vara eftersom min dator hade vissa problem med minne under förbränningen???
Tja, inte mycket val än att prova och återställa min Attiny85.
För att du behöver en seriell hög spänning programmerare. Massor av kretsar att hitta, så inget sätt jag påstå sig vara original här, men jag skriver detta ibble att ta bort någon tvekan att människor kan ha av visar hur snabbt och enkelt det är.
Allt som krävs är 6 motstånd, en transistor, en DIL fot, en 9 x 20 bit av stripboard och ett 7-stift manliga huvud och naturligtvis en 12 volts försörjning. Och ja, A UNO att hålla i.
Som jag väntade mig inte att använda programmerare ofta, jag planerade att använda ett batteri, men som jag inte kunde hitta min 12 volts batteri, jag slutade med en 0,75 USD (så 75 dollarcents) 5 till 12 Volt omvandlare från aliexpress, som jag hade för ett annat projekt.
Jag använde programmet nedan. Programmet startar när du skickar en slumpmässig karaktär till den seriella porten. Som det visar sig, var det en säkring problem i mitt chip som säkring bitar var E4 DF vilket innebär att den sattes för 128 kHz oscillator. Inte säker på hur det kunde hända som jag bort detta val från min meny i filen boards.txt.
Hur som helst, det återställa säkringarna till fabriksinställningen och efter att jag kunde använda min Attiny85 igen.
Tyvärr, för att bygga denna unbricker, jag var tvungen att använda 1 k motstånd jag ville använda för själva projektet jag programmering Attiny för :-) Jaha!
Allt som allt tog mig mindre än en timme att sätta ihop det så om du har problem med din Attiny13/25/45/85 bygga en av dessa.
Om du vill att unbrick 24/44/84 serien, behöver du en större DIL fot.
Om du försöker att unbrick en Attiny15... sedan kom ihåg att det har PB3 och PB4 bytte jämfört med 13/25/45/85 serien, så behöver du förmodligen en program- eller maskinvara förändring (tjära och fjädrar för Atmel designer som gjorde detta)
AVR högspännings-seriell Fuse Reprogrammer
Anpassad från kod och design av Paul Willoughby 2010-03-20
http://www.rickety.us/2010/03/Arduino-AVR-High-VO...
//
Fuse Calc:
http://www.rickety.us/2010/03/Arduino-AVR-High-VO...
#define RST 13 / / Output till nivå shifter för! Återställ från transistor
#define SCI 12 / / Target klocka Input
#define SDO 11 / / Target Data Output
#define SII 10 / / Target instruktion Input
#define SDI 9 / / Target inmatning av Data
#define VCC 8 / / Target VCC
#define HFUSE 0x747C
#define LFUSE 0x646C
#define Eka 0x666E
Definiera ATTiny serien signaturer
#define ATTINY13 0x9007 / / L: 0x6A, H: 0xFF 8-stifts
#define ATTINY24 0x910B / / L: 0x62, H: 0xDF, E: 0xFF 14 pin
#define ATTINY25 0x9108 / / L: 0x62, H: 0xDF, E: 0xFF 8-stifts
#define ATTINY44 0x9207 / / L: 0x62, H: 0xDF, E: 0xFFF 14 pin
#define ATTINY45 0x9206 / / L: 0x62, H: 0xDF, E: 0xFF 8-stifts
#define ATTINY84 0x930C / / L: 0x62, H: 0xDF, E: 0xFFF 14 pin
#define ATTINY85 0x930B / / L: 0x62, H: 0xDF, E: 0xFF 8-stifts
void setup() {
pinMode (VCC, OUTPUT);
pinMode (RST, OUTPUT);
pinMode (SDI, OUTPUT);
pinMode (SII, OUTPUT);
pinMode (SCI, OUTPUT);
pinMode (SDO, OUTPUT); Konfigurerad som indata när i programmeringsläget
digitalWrite (RST, hög); Nivå shifter Invertera, detta stänger av 12V
Serial.BEGIN(19200);
}
void loop() {
om (Serial.available() > 0) {
Serial.Read();
pinMode (SDO, OUTPUT); Ställ in SDO till utgång
digitalWrite (SDI, låg);
digitalWrite (SII, låg);
digitalWrite (SDO, låg);
digitalWrite (RST, hög); 12V Off
digitalWrite (VCC, hög); VCC på
delayMicroseconds(20);
digitalWrite (RST, låg); 12V på
delayMicroseconds(10);
pinMode (SDO, indata); Ställa in SDO till insatsen
delayMicroseconds(300);
Serial.println ("läsning:");
unsigned int sig = readSignature();
Serial.Print ("signatur är:");
Serial.println (sig, HEX);
readFuses();
om (sig == ATTINY13) {
writeFuse (LFUSE, 0x6A);
writeFuse (HFUSE, 0xFF);
} else om (sig == ATTINY24 || sig == ATTINY44 || sig == ATTINY84 ||
sig == ATTINY25 || sig == ATTINY45 || sig == ATTINY85) {
writeFuse (LFUSE, 0x62);
writeFuse (HFUSE, 0xDF);
writeFuse (Eka, 0xFF);
}
readFuses();
digitalWrite (SCI, låg);
digitalWrite (VCC, låg); VCC Off
digitalWrite (RST, hög); 12V Off
}
}
byte shiftOut (byte värde1, värde2 byte) {
int inBits = 0;
Vänta tills SDO går hög
medan (! digitalRead(SDO))
;
unsigned int dout = (unsigned int) värde1 << 2.
unsigned int iout = värde2 (unsigned int) << 2.
för (int ii = 10; ii > = 0; ii--) {
digitalWrite (SDI! (dout & (1 << ii)));
digitalWrite (SII! (iout & (1 << ii)));
inBits << = 1;
inBits | = digitalRead(SDO);
digitalWrite (SCI, hög);
digitalWrite (SCI, låg);
}
återgå inBits >> 2.
}
void writeFuse (unsigned int fuse, byte val) {
shiftOut(0x40, 0x4C);
shiftOut (val, 0x2C);
shiftOut (0x00, (byte) (säkring >> 8));
shiftOut (0x00, (byte) säkring);
}
void readFuses () {
byte val;
shiftOut(0x04, 0x4C); LFuse
shiftOut(0x00, 0x68);
Val = shiftOut(0x00, 0x6C);
Serial.Print ("LFuse:");
Serial.Print (val, HEX);
shiftOut(0x04, 0x4C); HFuse
shiftOut(0x00, 0x7A);
Val = shiftOut(0x00, 0x7E);
Serial.Print (", HFuse:");
Serial.Print (val, HEX);
shiftOut(0x04, 0x4C); Eka
shiftOut(0x00, 0x6A);
Val = shiftOut(0x00, 0x6E);
Serial.Print (", Eka:");
Serial.println (val, HEX);
}
unsigned int readSignature () {
unsigned int sig = 0;
byte val;
för (int ii = 1; ii < 3; ii ++) {
shiftOut(0x08, 0x4C);
shiftOut (ii, 0x0C).
shiftOut(0x00, 0x68);
Val = shiftOut(0x00, 0x6C);
sig = (sig << 8) + val;
}
returnera sig;
}