2012年4月14日土曜日

ATMEGA328Pを内部発振化&クロックダウンしたい

前回のエントリーの最後に、optifix(スケッチ)の最後のoptibootのバグフィックス版のイメージをテキストエディタで編集してブートローダーのHEXファイルを用意したって書きましたが・・・いいのかこれで・・
サイトを廻っていると、

参考:Crystal-less Arduino (8MHz)
   内蔵RC発振器でArduinoを動かす
   Arduino 0023 でoptibootに染まってみる

どの周波数で動かすにしてもその周波数用のブートローダーを用意してます。
そのためには「makefile」を編集し、「make」することでブートローダーのHEXファイルが生成できる・・・と。
ということは、コピペで作ったHEXファイルは外部クロック16MHz用ということ・・?

ひとまず置いておいて、avrdude-serjtagでヒューズを書き換え、内部発振8MHzのチップを作りblinkさせてみました。
ブレッドボードにチップ、AE-UM232R、LED、抵抗を配置、ArduinoIDEからターゲットのボードはUnoにしてアップロード。
スケッチではdelay(1000);ですが、実際には2秒点灯、2秒消灯で動作。
16MHz用にコンパイルされたスケッチが8MHzで実行されているからですね。
ArduinoIDEをインストールしたフォルダの中の
D:\Program Files\arduino\hardware\arduino\boards.txt
に追加しました。
コピペするときはコメント削除してください。

##############################################################

uno_int_8.name=Arduino Uno INT.8MHz    ←IDEでboardにこの名前が表示される
uno_int_8.upload.protocol=arduino
uno_int_8.upload.maximum_size=32256
uno_int_8.upload.speed=57600                ←自分はこの速度なら通信出来ました
uno_int_8.bootloader.low_fuses=0xf2        ←328Pを内部発振8MHzで使うとき
uno_int_8.bootloader.high_fuses=0xde
uno_int_8.bootloader.extended_fuses=0x05
uno_int_8.bootloader.path=optiboot
uno_int_8.bootloader.file=optifix_atmega328.hex  ←コピペして作ったブートローダー
uno_int_8.bootloader.unlock_bits=0x3F
uno_int_8.bootloader.lock_bits=0x0F
uno_int_8.build.mcu=atmega328p
uno_int_8.build.f_cpu=8000000L               ←周波数8MHz
uno_int_8.build.core=arduino
uno_int_8.build.variant=standard

##############################################################

ArduinoIDEを再起動するとボード一覧に「Arduino Uno INT.8MHz」があるのでそれを選択してもう一度blinkをアップロード。
delay(1000);通り1秒間隔で動作しました。

分周比レジスタを操作することでマイコン動作中に周波数を変更できるらしい。

参考:http://www.avr.jp/user/DS/PDF/mega88A.pdfの22ページ
http://www.arduino.cc/cgi-bin/yabb2/YaBB.pl?num=1163418637

今回はvoid setup(){}に次の2行をスケッチに追加
CLKPR = (1<<CLKPCE);
CLKPR = B00000011;      //この場合分周比1/8で1MHzで動作

INT.8MHzを選択してアップロードしたので8秒点灯、8秒消灯の動作に。
ボードが8MHz用に定義されてるから当然ですね。
上の定義ファイルの周波数を1MHzに変えたのがこれ。

##############################################################

uno_int_1.name=Arduino Uno INT.1MHz
uno_int_1.upload.protocol=arduino
uno_int_1.upload.maximum_size=32256
uno_int_1.upload.speed=57600
uno_int_1.bootloader.low_fuses=0xf2
uno_int_1.bootloader.high_fuses=0xde
uno_int_1.bootloader.extended_fuses=0x05
uno_int_1.bootloader.path=optiboot
uno_int_1.bootloader.file=optifix_atmega328.hex
uno_int_1.bootloader.unlock_bits=0x3F
uno_int_1.bootloader.lock_bits=0x0F
uno_int_1.build.mcu=atmega328p
uno_int_1.build.f_cpu=1000000L
uno_int_1.build.core=arduino
uno_int_1.build.variant=standard

##############################################################
delay(1000);が1秒で機能しました。(オシロなんかで実際の周波数を測りたいところだけどそんなものないです)
この要領で分周比1/16、1/32、1/64、1/128と試しましたが、思った速度で動作をしてません。何かが間違ってるような・・・

思い通りに動けば低電圧電源、低消費電力で動かせそうなんですが。
動作周波数と電源電圧の関係はデーターシートに書いてます。

振り出しに戻って・・・
おそらく外部クロック16MHz用であろうoptifixのブートローダーをこのような使い方をしていいものかどうか・・・
内部発振8MHzや他の周波数で運用したい時は、Arduino1.0に含まれていたoptiboot(バグフィックス前)のソースから各周波数用のブートローダーをmakeするべきなのか・・・

環境:ArduinoUno、Arduino1.0





0 件のコメント:

コメントを投稿