ATtinyで誤って露出したヒューズを回復する方法

画像



すべてのhabrayuzerにこんにちは。 マイクロコントローラに関係する多くの人は、たとえば不適切なクロック設定、特に16 KHzなどの非常に低い周波数など、誤ってヒューズビットを設定してマイクロコントローラを「ブロック」する経験がほとんどないと思います。



また、この方法は、RSTDISBLヒューズビットがランダムに変更された場合に適している必要があります。具体的には、RESETポートは入出力ポートまたはSPIENヒューズビットへの不注意な姿勢(シーケンシャルプログラミングの許可)として使用されます。プロトコルSPI(インシステムプログラミング)によって。







このビデオでは、ヒューズビットが正しく設定されていないATtinyシリーズのマイクロコントローラーをロック解除する方法を説明します。



この方法はすべてのATtinyに適しているわけではありませんが、最も一般的なATtinyには適しています。以下にリストを示します。





ビデオでは、Arduinoを使用して工場ヒューズビットを復元する方法を示しました。実際、以下に示す情報はビデオ形式で複製されています。





ウェイン・ホルダー同志のプロジェクトは基礎になっているとすぐに言わなければなりません。彼のおかげで、 ここに彼の記事へのリンクがあります

それでは、始めましょう、ATtiny13の例を使用した接続図です。



画像



そして、この回路が私のパフォーマンスでどのように見えるかを以下に示します。



画像



ATtiny25 / 45/85/24/44/84へのプロ接続は低くなります。



ご覧のとおり、回路は公称値1 KOhm、1 NPNトランジスタ2n3904の6つの抵抗で構成されています。そのピン配置は次のとおりです。



画像



ATmelエンジニアが上記のマイクロコントローラーのドキュメントで推奨しているように、実際にはソビエトKT315またはそのアナログを11.5-12.5 Vの電圧源にすることができます。 電圧を過大評価または過小評価する価値はないと思いますので、復元する前に、電圧計またはマルチメータで電源の電圧を確認することをお勧めします。 ビデオの撮影時、バッテリーの電圧は12.4 Vでした。



12 Vを得ることができるいくつかの言葉は、ルーターまたはモデム用のさまざまな種類の電源です。たとえば、DSLモデムASUS DSL-N10Eには12 Vの電源しかありません。通常 、各電源には電圧が表示されます。

また、コンピューターのMOLEXコネクターから12 Vを取り出すこともできます



画像



そしてより正確に-黄色と黒。



12 Vの部品を接続するときは、この電圧がマイクロコントローラーと他のArduino周辺機器(USB-TTLコンバーターなど)の両方を簡単に焼損するため、非常に注意する必要があることに言及する価値があります 。 したがって、アルゴリズムに従います。





これはATtiny13ヒューズビットをリセットする方法です(リセットポートを入力/出力ポートとして使用しました)。プロジェクトの1つをデバッグするときに既に10〜15回です。以下に短いビデオプレビューを示します。



ATtiny13のLCD(HD44780)マルチメーター




次のように、他のマイクロコントローラに「ヒューズビットレデューサー」を接続します。



画像







これらはすべてコードに再割り当てされ、問題ありません。



これが著者のページのコードです
// 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-voltage-serial-programmer/ // // Fuse Calc: // http://www.engbedded.com/fusecalc/ #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); 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; }
      
      







ご覧のとおり、複雑なものは何もありません。彼らはUARTとvoilaを介してArduinoに文字を送信し、ヒューズビットは工場のビットに復元されました。



以前の記事では、 Arduinoを本格的なAVRISPプログラマーにする方法について説明しました 。 ビデオソフトウェアで言及されているマイクロコントローラーファームウェアについて読むことができます。



また、 Wayne Holderによるわずかに異なるプロジェクトにアクセスすることをお勧めします。



12ボルトのチャージポンプを備えたATTinyヒューズリセット



本質は同じですが、12 Vのソースを探す必要はありません。



すべての出版物



PS Serial.begin(19200);



All Articles