Wanneer u met Attiny zoals de Attiny 85 of de Attiny13 werkt, het is gebonden aan het vroeg of laat gebeuren: u baksteen uw Attiny.
Ik heb geconfronteerd met het terwijl het proberen om een bootlaoder te branden (dat wil zeggen vaststelling van de juiste zekeringen), dat kreeg ik ineens de gevreesde ' Ieks! Ongeldig apparaat handtekening ' foutbericht weergegeven. Als ik had net succesfully gebrand op op IDE1.06 en nu probeerde op IDE1.6.3, gewoon om te zien dat of ik alles OK installeerde, ik wist de chip was OK en dat mijn programmeur OK was. Ook een nieuwe chip deed het goed, dus iets onheilspellend moet hebben is er gebeurd met mijn chip.
Zou het zijn omdat mijn computer had wat geheugenproblemen tijdens de verbranding???
Nou, niet veel keus dan te proberen en opnieuw instellen van mijn Attiny85.
Daarvoor moet u een seriële hoge Voltage programmeur. Tal van schakelingen te vinden, dus geen enkele manier beweren ik origineel te zijn hier, maar ik ben het schrijven van deze ibble weg te nemen enige aarzeling dat mensen wellicht door weergegeven: hoe snel en gemakkelijk het is.
Het duurt allemaal 6 weerstanden, een transistor, een DIL-voet, een stuk 9 x 20 klemmenstrook en een 7-pins mannelijke koptekst en natuurlijk een 12 Volt-aanbod. En ja, A UNO te houden het in.
Maar ik had niet verwacht dat de programmeur zeer vaak gebruiken, ik van plan om een accu gebruiken, zoals mijn 12 Volt batterij ik niet vinden kon, uiteindelijk heb ik met behulp van een 0,75 USD (dus 75 dollarcents) 5 tot en met 12 Volt converter van aliexpress, die ik had voor een ander project.
Ik gebruikte het programma hieronder. Het programma wordt gestart wanneer u een willekeurig teken naar de seriële poort. Aangezien het blijkt, was het een zekering probleem in mijn chip als de fuse-bits waren E4 DF waardoor dat het werd ingesteld voor 128 kHz oscillator. Niet zeker hoe dat zou kunnen als ik gebeuren verwijderd die keuze uit mijn menu in het boards.txt bestand.
Hoe dan ook, op beginstand zetten naar de zekeringen naar fabrieksinstelling en na dat ik mijn Attiny85 weer kon gebruiken.
Helaas, om deze unbricker te bouwen, moest ik gebruik de 1 k weerstanden die ik wilde gebruiken voor het zeer project dat was ik de programmering van de Attiny voor :-) Ach!
Alles bij elkaar kostte me minder dan een uur samen te stellen het dus als u ondervindt problemen met uw Attiny13/25/45/85 een van deze bouwen.
Als u de serie 24/44/84 unbrick wilt, moet u een groter DIL voet.
Als u probeert te unbrick een Attiny15... dan herinneren dat die PB3 heeft en PB4 overgeschakeld in vergelijking met de 13/25/45/85-serie, dus moet je waarschijnlijk een software of hardware veranderen (teer en veren voor de Atmel-ontwerper die deed dit)
// AVR High-voltage Serial Fuse Reprogrammer // Adapted from code and design by Paul Willoughby 03/20/2010 // 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 to level shifter for !RESET from transistor #define SCI 12 // Target Clock Input #define SDO 11 // Target Data Output #define SII 10 // Target Instruction Input #define SDI 9 // Target Data Input #define VCC 8 // Target VCC
#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
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 Serial.begin(19200); }
void loop() { if (Serial.available() > 0) { Serial.read(); 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); Serial.println("Reading: "); 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); // Vcc Off digitalWrite(RST, HIGH); // 12v Off } }
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); }
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); // EFuse 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; }