2017年9月
          1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30

最近のトラックバック

« 2014年3月 | トップページ | 2014年6月 »

2014年5月

2014年5月21日 (水)

ATmega48/88/168/328用のヒューズリセッターをArduinoで作る

 Arduinoにも使われているAtmelのAVRマイコンは、6本線のISP接続で簡単にプログラム転送などが出来るのですが、クロックソースを設定するヒューズビットの値を間違って書込んだりすると、ISPでは中々回復するのが難しい事態に陥る事が有ります。そんな時の救世主としてヒューズリセッター(その名の通り、ヒューズ設定を出荷時状態に戻す)という装置が有ります。今回は、 「Arduino-based AVR High Voltage Programmer」をベースに必要な時に簡単に組めて、なおかつ動作の確認をしやすくしたものを作ってみました。

 まずはArduinoに次のファイルをダウンロード・解凍し、スケッチをアップロードして下さい。

 その後、一旦Arduinoをパソコンから外し、回路の組み立てをします。

■材料
  • ヒューズリセットしたいAVRマイコン(ATmega48/88/168/328)チップ
  • Arduino (テストはUnoで行っていますが、他でも大丈夫なはずです)
  • 12V電源
  • ブレッドボード
  • NPNトランジスタ(テストでは2SC1815を使いました)
  • 1kΩ抵抗 x 2本 (R1,R4)
  • 10kΩ抵抗 x 2本 (R2,R3 ※トランジスタに合わせて1kΩ〜10kΩ程度で調整して下さい)
  • ジャンパーワイヤ 適宜

■回路図
Ez_hvfuse_schmatics_1024

 簡単に作れる様に保護抵抗は最小限にしました。D0,D1はシリアルモニタと通信する為に空けてあります。そのためピン数が足りないのでPAGELはプルダウン固定ですが、FlashやEEPROMのプログラミングをしない仕様なので問題有りません。

■実態配線図
Ez_hvfuse_ecb
こちらはECB配列のトランジスタ(2SC1815等)を使った場合

Ez_hvfuse_ebc
こちらはEBC配列のトランジスタ(2N3903等)を使った場合

もちろんブレッドボードは図の様な小型な物でなくてもかまいません。

 回路の組み立てが終わったら間違いないかチェックし、パソコンと12V電源を接続します。
 それからArduino IDEを立ち上げ、シリアルモニタを出します。シリアルモニタの下の設定は「CRのみ」(「改行なし」以外なら他でもOK)「9600bps」を選択します。
Ez_hvfuse_screenshot

 出て来たメッセージに「D」をタイプしてEnterキーで送信するとチップの型番を自動判定してくれます。ここで対象のチップが見つからないとメッセージが出た場合はただちにArduinoから12V電源とUSBケーブルを抜いて回路のチェックをして下さい。
 正しくチップが認識されたら、ヒューズの規定値書込みコマンド「W」を送信→確認の為の「Y」を送信します。するとチップに出荷時のヒューズが書込まれます。
 最後に「R」を送信して、ヒューズが正しく書込まれているか確認して下さい。
 もし、Lock bitsがFF以外になっていて、ヒューズ設定が書込まれない場合、「C」コマンドでチップ全体のクリアが出来ます。ただしLock bitsだけでなくFlashやEEPROMの内容もクリアされます。これでヒューズビットの書き換えが出来る様になるので、再度「W」コマンドを実行します。
 その他、「L」「H」「E」「K」コマンドで、ヒューズビットやLock Bitsの値を指定して書込む事も出来ます。

 普段はほとんど使う必要の無いヒューズリセッターですが、いざと言う時に欲しくなりますよね。なのでArduinoを使ってなおかつ正しく動作しているかをモニタしながら作業出来る様に構成してみました。

2014年5月 9日 (金)

bitDuino用フルカラーLED(RGBLED)ライブラリを作りました。

先日ATtiny13AをArduino IDEで使う としてbitDuinoを(暫定)公開しました。ところがATtiny13AはPWMポート(analogWrite出来るピン)を2つしか持っていないので、フルカラーLED(RGBLED)を使おうと思うとPWMポートが足りません。そこで、タイマーオーバーフロー割り込みを使ったフルカラーLED(RGBLED)のライブラリを作りました。

「bitRGBLED_2014_05_09.zip」をダウンロード

  • 対象はbitDuino13Aと前回も紹介したこちらのATtiny45/ATtiny85
  • bitDuino13AではanalogWrite関数やtone関数と併用出来ません。
  • ATtiny45/ATtiny85では0番,1番ピンのanalogWrite関数と併用出来ます。
  • 内部でdigitalWriteを使っているので、どのピンにも割り付け可能です。
書式
◇初期設定
initRGBLED(赤のピン番号, 緑のピン番号, 青のピン番号);
 これでフルカラーLEDのピン番号を紐付けします。またタイマーの初期化をします。ピン番号は0〜5のどのピンでもかまいません。
◇個別LEDの輝度設定
setRGBLED(RGBの色番号,輝度);
 これはほぼanalogWrite関数と等しいのですが、RGBの色番号は0〜2になります。現状、赤→0, 緑→1, 青→2を指定して下さい。デジタルI/Oピン番号では無いのでご注意。
◇フルカラーLEDの輝度一括設定
setRGBLED(赤の輝度, 緑の輝度, 青の輝度);
 RGBを一括で設定します。
以上の3つの関数で出来ています。引数はいずれもbyte値です。
サンプルスケッチ RGB_fade
#include <bitRGBLED.h>

const byte LED_R = 0;
const byte LED_G = 1;
const byte LED_B = 2;

void setup(){
  initRGBLED(LED_R,LED_G,LED_B);
}

void loop(){ 
  for(byte c=0;c<3;c++){
    for(byte i=0;i<255;i++){
      setRGBLED(c,i+1);
      delay(2);
    }
    for(byte i=255;i>0;i--){
      setRGBLED(c,i-1);
      delay(2);
    }    
  }
}

サンプルスケッチ colorWheel
#include <bitRGBLED.h>

const byte LED_R = 0;
const byte LED_G = 1;
const byte LED_B = 2;

void setup(){
  initRGBLED(LED_R,LED_G,LED_B);
}

void loop(){ 
  byte i;
  for(i=0;i<255;i++){
    setRGBLED(i,255-i,0);
    delay(2);
  }
  for(i=0;i<255;i++){
    setRGBLED(255-i,0,i);
    delay(2);
  }
  for(i=0;i<255;i++){
    setRGBLED(0,i,255-i);
    delay(2);
  }
}

いずれもライブラリに収録されています。

« 2014年3月 | トップページ | 2014年6月 »