前回からの続きです。
このテーマを最初からご覧になる場合はこちらからどうぞ。
デバッガとArduinoの配線
結論から言いましょう。
なまら面倒くさいです!
デバッガの「Atmel-ICE」と「Arduino Mega 2560」の間で、こんな感じの配線をしなければなりません。
「Atmel-ICE」には2種類のケーブルが同梱されているはずです。
そのうちの6ピンのものは、Arduinoの「ICSP」というピンにそのまま挿すだけです。
出っ張り部分をCPU側にして、こんな感じ。
問題はもう一方のケーブル、10ピンがバラバラに出てるやつです。
それをこのように配線しなければならないのが大変なんです。
ピン配は「Arduino --- 10ピンケーブル・ピン番」で以下の通り。
RESET --- 8ピン
5V --- 4ピン
GND --- 2ピン
A4 --- 1ピン
A5 --- 5ピン
A6 --- 3ピン
A7 --- 9ピン
以上、計7ピン。
面倒だけど仕方ない、繋ぐか~…と思った矢先に更なる試練が!
どっちもメスじゃん!?
こういうケースで私がよくやる手は以下の通りです。
まず、工具箱の底の方に転がっている、こんな感じのピンヘッダ。
この金属のピンの部分をラジオペンチで樹脂から引き抜きます。
そして、引き抜いたピンを以下のようにピンソケットに挿しておきます。
これで擬似的にオスーメスの状況を作れますが、嵌合は緩く接触不良の懸念がありますので、あまりオススメしません。
これをやる場合は、配線したらマスキングテープで留めておきましょう。
AVRマイコンのヒューズ設定
「Arduino Mega 2560」に搭載されているAVRマイコン。
このシリーズには、ヒューズ設定というものがあります。
例えば、クロックは何処から取るのか?そのクロックの分周比はどのくらいか?ウォッチドッグを使うかどうか?…などといった、CPUの基本的な動作を設定するレジスタのようなものです。
その中の設定の一つに「JTAGを使うかどうか?」というものがあります。
今回、デバッガとして「Atmel-ICE」を使うことを前提に記事を書いていますが、この「Atmel-ICE」にはターゲットに対して2つの接続モードがあります。
1つ目は、ヒューズの設定やプログラムの書き込みなど、比較的シンプルな操作を行うための「ISP」モード。
2つ目は、「ISP」モードの機能に加え、ブレークポイントを仕掛けてプログラムをデバッグするなどの高度な操作を行うための「JTAG」モード。
配線の時に、2つケーブルを接続したでしょう?
6ピンの方は「ISP」モード用、バラバラ10ピンの方は「JTAG」モード用の配線なのです。
問題なのは「Arduino Mega 2560」(というかAVRマイコン全般)はデフォルトのヒューズ設定では「JTAG」モードを使用できないということです。
但し「ISP」モードは使えますし、これでヒューズの設定を変えることもできます。
ですので、これを使って「JTAG」モードを使えるようにヒューズ設定を変更しましょう。
「Atmel-ICE」高いんだから、最大限に役に立ってもらわなければ!
早速、「ISP」モードでパソコンと「Atmel-ICE」をUSBで繋ぎましょう。
「Atmel-ICE」に接続するケーブルは、6ピンの方です。
バラバラ10ピンの方は、とりあえず放置。
同時に「Arduino Mega 2560」もUSBでパソコンに繋ぎます。
(「Atmel-ICE」側は「SAM」ではなくて「AVR」の方のコネクタに接続してください。)
次は、ソフトウェア側の操作です。
「Microchip Studio」でプロジェクトを作成した前回の状況から始めます。
以下の画面が表示されたら、上部にある「ATmega2569」というタブをクリックしてください。
すると、以下の表示に切り替わりますので、すかさず左のリストから「Tool」をクリックしてください。
以下のような画面に切り替わります。
「Selected debugger/programmer」のコンボボックスに接続中の「Atmel-ICE」がID番号付きで表示されていますか?
(「J41800113804」というIDは私のですね。)
表示されていない場合は、コンボボックスをクリックして、あなたの「Atmel-ICE」(「J41800113804」以外のもの)を選択してください。
加えて「Interface」は必ず「ISP」を選択してください。
この設定を保存しましょう。
画面上部の保存アイコンをクリックしてください。
(いいよね~フロッピーディスクのアイコン。)
次に、「Microchip Studio」のメニューから「Tools」->「Device Programming」をクリックします。
以下のような画面が表示されたら、「Tool 」は Atmel-ICE、「Device」はATmega2560、「Interface」はISP、それぞれの設定を確認の上「Apply」をクリックしてください。
以下のような画面が表示されたら、左側のリストから「Fuses」をクリックします。
以下のような画面が表示されれば、「ISP」モードにより正常にCPUからヒューズ設定を読み出せた証です。
これが現在のヒューズ設定です。
ここから、以下のようにヒューズ設定を変更します。
これらを変更すると、画面下部の「HIGH」の値が変わります。
この値は、各々のヒューズ設定をビット化し、それをHEXで表したものだからです。
・「HIGH.JTAGEN」のチェックを入れる
・「HIGH.EESAVE」のチェックを入れる
・「HIGH.BOOTRST」をチェックを外す
画面下部の「HIGH」の値が「0x91」になればOKです。
「Program」ボタンをクリックして、新しいヒューズ設定をCPUに書き込みましょう。
以下の警告が出ます。
「JTAGEN」のチェックを外すとJTAG使えなくなるぞ!…って、知ってるし、今回チェックしたし、デフォルトで使わせてくれないからこうやって余計な作業をしているわけだが…。
「Continue」をクリックです!
以下のように、画面最下部に「Verify registers ... OK」の表示が出れば、無事ヒューズ設定の更新は完了です。
「Close」ボタンをクリックして、画面を閉じましょう。
これで「Atmel-ICE」で「JTAG」モードを使える設定になっているはずです。
確かめてみましょう。
「JTAG」モードでパソコンと「Atmel-ICE」をUSBで繋ぎましょう。
「Atmel-ICE」に接続するケーブルは、バラバラ10ピンの方です。
「ISP」モード用の6ピンのケーブルと繋ぎ替えてください。
「Microchip Studio」の方は、以下の画面に戻りましょう。
この画面の「Interface」のコンボボックスには、今度は「JTAG」を選択します。
おっと、保存もお忘れなく!
「Microchip Studio」のメニューから「Tools」->「Device Programming」をクリックします。
今度は「JTAG」を選択して「Apply」!
以下のように「JTAG」モードでも先程設定した通りのヒューズ設定が表示されれば大成功!
これでデバッガが使えるようになりました!
プログラムの転送とデバッグ
さて、JTAGが使えるようになったので、早速サンプルプログラムを転送して実行してみましょう。
その前に「TeraTerm」のご用意を。
インストールしていない方は、このページ(TOPPERS/ASPのビルドからデバッグまで~サンプルプロジェクトのデバッグ)の「TeraTermの導入」の項目を参考にしてください。
もちろん、シリアル通信のターミナルであれば、他のものもお使いいただけます。
「Arduino Mega 2560」はパソコンにUSB接続すると、擬似的なシリアルポートとして認識されます。
今回のTOPPERS/ASPのサンプルプログラムは、シリアル通信のメッセージを出力しますので、認識されたシリアルポート番号でターミナルを立ち上げておきましょう。
設定は、こんな感じです。
ボーレートは「9600」です。
(私のパソコンは、Arduinoをポート10として認識していますね。)
さて、「Microchip Studio」に戻りましょう。
プログラムのビルドと実行を行います。
画面上部の「▶」ボタンをクリックします。
しばらくすると、立ち上げておいたターミナルに以下のような表示が出ていると思います。
TOPPERS/ASPカーネルとそのサンプルプログラムの転送と実行に成功です。
ブレークポイントを試してみましょう。
動作中のプログラムを停止します。
画面上部の「■」ボタンをクリックします。
ブレークポイントを仕掛けましょう。
画面右の「Solution Explorer」のソースコードリストの中から「sample1.c」をダブルクリックし、ソースコードを表示します。
このソースコードの丁度中盤くらい、メインタスクの始めに仕掛けましょうか。
ブレークポイントは、ソースコードビューの左端をクリックすると赤丸が表示され、セットされていることを表します。
仮に、これを再びクリックするとブレークポイントが解除され赤丸も消えます。
では、ブレークポイントを仕掛けた状態で、プログラムを再び実行してみます。
上手く引っかかってくれるでしょうか…。
以下のようにプログラムが停止すれば成功です!
ここからは、「F10」キーでステップオーバー、「F11」キーでステップインなど、おなじみの操作が使用できます。
因みに、ステップオーバーやステップインなどを行っている時に命令が飛んでしまったり前後したりする場合は、最適化のせいです。
デバッグ時は、このページ(TOPPERS/ASPのビルドからデバッグまで~サンプルプロジェクトのデバッグ)の「サンプルプログラムのデバッグ」の項目を参考に最適化を解除しましょう。
ここまでの作業、本当にお疲れさまでした。
さて、次回はサンプルプログラムの動きの説明や、今回のArduino MEGA2560用ASPカーネルのちょっと込み入った情報を書いていきます。