SNSへはこちら

MPLAB Snapを買った&使ってみた(3) – AVR

続いて AVR です。これにはちょっとハマりました。あと、現状 IDE 側のバグがあるので、Workaround も 示しておきます。今回は ATmega328P でやってみます。

ツールチェインの登録・プロジェクト作成

どうやら avr-gcc ではツールチェインの登録自体はうまくいくものの、プロジェクト作成時にこれを指定しようとしても、選択ができません。どうやら MPLAB X IDE は AVR の gcc には対応していないようです。
ではどうするかと言うと、なんと、XC8 コンパイラを使うようです(そんな不自由なツールになんか頼りたくないよーだ)。最新版の XC8 だと AVR の gcc が同梱されていて、これを用いるようです。

追記(2018/12/20):
どうやら gcc も使えるようです。こちらをご覧ください

3つのインターフェイス

このデバッガでは、いわゆる書き込みの ISP と、デバッグの debugWIREJTAG の3種類が対応しています。それぞれについて説明しましょう。

ISP

シリアルプログラミングをするプロトコルです。最近のマイコンとは違って、SPI で書き込みを行います。avrdude や、これを使う Arduino IDE ではこの方法で書き込みをしています。配線は RESET、MISO、MOSI、SCK の4線が必要です。AVR は RESET をしている間にブートローダーが起動します。

debugWIRE

Atmel 社が独自に開発した、1線デバッグプロトコルです。コードの書き込み、Fuse の書き換え、ブレークポイントでの停止、レジスタの監視等々がたった1本の信号線でできるすぐれものです。これまでは AVR Dragon 等、比較的高価なインターフェイスを購入しないと利用できませんでした。

JTAG

元来 LSI の検査規格であったこの規格は、汎用的にマイコンのデバッグにも用いられます。基本的に内部のインターフェイスに割り込んで使う感じになります。配線は TDI、TDO、TCK、TMS、RESET の5線です(JTAG 固有の配線自体は4線)。この多い配線を ARM がなんとかしたものが SWD (配線は SWDIO + SWCLK + SWO) です。
今回は JTAG に対応している AVR デバイスを所持していないので、この説明は省略します。

回路接続

ISP でも degugWIRE でも同じ接続で行けます。degugWIRE のみを使うのであれば、dW の線だけでデバッグできます。が、debugWIRE では IDE 側が Fuse の書き換えに失敗するようです(現状バグ?)。なので次の項に示しますが、ハマりどころ満載です。

とりあえず回路。ここでのハマりどころは、MOSI と MISO をクロスしないということです。通常は In/Out が逆になるのでクロスが必要なのですが、参照した Pickit4 のデータシートの記載は、マイコンのどのピンに繋げばいいかがそのまま端子名になっているっぽいです。僕もうまく行かなくて「まさか」と思ってクロスせずにつないだら書き込み出来てしまって、唖然としていました。

デバッガ側No. デバッガ側ピン名 ATmega328P側ピンNo.
2 VTG
3 Ground
4 MISO 18
5 SCK 19
6 RESET# 1
7 MOSI 17

ISP での書き込み

書き込みモードの設定

まずは基本からです。このモードでは 書き込みのみでデバッグはできません。まぁ当然ですね。

さて、プロジェクトを作成した段階ではデフォルトで debugWIRE のモードになっています。なので、プロジェクトのプロパティから変えましょう。

現状通信速度は弄れないようです(自動制御?)。

Fuse の読み出しとか

これも IDE 上で出来ます。まずはメニューバーから Window -> Target Memory Views -> Configuration Bits により開きましょう。

すると、こんな画面が下側に出ます。

ここから色々編集ができるのですが、IDE からも言われるように、最初に Fuse の読み出しを行うことが推奨です。上の画像に見える緑色上向き矢印のあるボタンを押しましょう。うまくいくと現在の値が表示されます。ここでの IDE 側のビットの解釈なのですが、以下のようになっています。なんか大事そうなのでわざわざ箇条書きにします(Atmel Studio と同じ解釈)。

  • SET は「有効」の意(Fuse Bit は 0)
  • CLEAR は「無効」の意(Fuse Bite は 1)

ちゃっちゃか編集して書き込みたい場合は緑色矢印下向きのボタンを押せばいいでしょう。

書き込み

これまでと同じように出来ます。簡単です。僕の場合はこんなテストコードを書いて値を変えながら書き込めているか確認していました。

#include <avr/io.h>

void wait(volatile const uint32_t loop) {
    for(volatile uint32_t i=0; i<loop; i++);
}

int main(void) {
    DDRB = 1 << 1;
    while(1) {
        PORTB ^= 1 << 1;
        wait(30000);
    }
    return 0;
}

debugWIRE での書き込み・デバッグ

ちょっと一癖ある(IDE のせい)ので、こちらも入念に説明します。

書き込みモードの設定

先程の画面にて、debugWIRE を選択してください。

また、debugWIRE を使うためには Fuse Bytes の DWEN ビットを設定する必要があります。このビットを SET(0)に設定しておくとデバッグができるようになりますが、同時に ISP ができなくなります。もちろんまたこのビットを設定しなおせばいいのですが。

このビットを設定せずに debugWIRE を使おうとすると、IDE 側で有効にするか聞いてくるので、特に手順を踏まなくてもいいです。

Fuse

debugWIRE 単体ではできません
なので、DWEN を有効/無効で切り替えて使いたい場合は、1線のみの接続ではなく、ISP の端子も合わせて接続する事が必要です。

書き込み・デバッグ

いつもどおりに出来ます。その際のダイアログ、ハマりどころを書いておきましょう。

まず、debugWIRE を行おうとしているのにも関わらず、DWEN の設定をしていない場合は以下のダイアログが出ます。

ここでは素直に Yes を押して設定をしてしまいましょう。何度も言いますが、Fuse を変えるので、ISP の配線をしていることが必要です。
書き換えが完了すると「一旦マイコン側の電源を入れ直してちょ」と言われるので従います。

書き込み or デバッグが終わると以下のダイアログが出ます。

意味は「このまま debugWIRE をつかう場合や、そのままでもいいや〜という人は Yes、ISP を有効に戻したい場合は No を選択してちょ」という意味なのですが、これ、書き込みの時は No を押しても絶対に書き換えに失敗します(バグ?)

Could not disable debugWIRE

対してデバッグから抜けた時に No をすると成功するので、戻したい場合は一旦デバッグに入って、すぐ抜けるという事を行うと、No クリックで元の ISP が有効な状態に戻れます。

ハマりどころが多い!めちゃ苦労しましたこれ。でも AVR もデバッグできるようになったので、とても嬉しいです。
MPLAB X IDE での AVR サポートはまだ Beta だということで、だったら仕方がないのですが、今度のバージョンアップで修正されることを期待しておきましょう。