オートチューナーのコントローラ

CIMG3442
ATU (オートチューナー) Elecraft T1 用のコントローラを作り始めました。昨日、前準備で終わってしまったやつです。これはどういうものかというと、無線機の設定周波数バンドに合わせて ATU にコマンドを送って、LC ネットワークの組み合わせを変えるためのものです。もっと簡単に言うと、無線機の周波数設定に応じてアンテナの特性を変えてやろう、というものです。Elecraft のオプションとして売られているようですが、将来、自分なりの工夫をいろいろ盛り込みたいので、自作することにしました。

ブレッドボード工作編

まずは、ブレッドボード上にハードを組んでいきます。PIC は PIC16F716 を使いました。秋月で売られている PIC で、A/D コンバータを搭載しているものでは非常に安価だったからです。
定電圧電源回路(13.8 → 6V*1)、PIC プログラマ PICkit 2 用の配線、テスト用の LED 点灯回路、という感じで組んでいきます。クロックは、村田製作所セラロック 4MHz を使いました。

HI-TECH C

さて、PIC の IDE は以前にインストールしたままになっていたので、最新版 8.10 にアップデートしました。これをインストールすると HI-TECH C の LITE 版がインストールされることになっているのですが、なんだかうまくいきません。説明書を探すのがメンドーだったので、HI-TECH Software 社から最新版のコンパイラをダウンロードすることにしました。最新の状況はよく分からないのですが、HI-TECH C PRO for the PIC10/12/16 MCU Family の v9.60PL2 版というのがダウンロードできました。これに付属の Quick Start Guide という PDF 形式のマニュアルが役に立ちました。プロジェクトの作成からコンパイラの指定などは、これを参考にしました。また、Chapter 3 に出てくる LED 点滅コードが参考になりました。

レジスタバンク

私は今回、PIC16F716 の知識(命令セットやメモリマップ)なしに作業を始めてしまったのですが、最初に悩んだのはレジスタバンクです。なんでも、レジスタセット群がバンク構成になっていて、STATUS レジスタというのを操作してバンクを切り替える必要があるのだそうです。しかし、逆アセンブルソースなどを眺めて分かったのは、少なくとも HI-TECH C を使う場合、例えば TRISB や PORTB レジスタをアクセスする際、明示的に STATUS レジスタRPn ビットを叩かなくても、コンパイラが適切なコードを生成してくれるようでした。例えば、次のようなコードで大丈夫です。

{
    TRISB = 0x00;
    PORTB = 0xff;
}

ICD header board

さて。簡単な LED 点滅コードを書いたのは良いのですが、うまく動きません。PIC の IDE である MPLAB の設定を見ていると、PIC16F716 でデバッグ作業ができることになっているのですが、ウェブサイト上の情報を見ると、なんか、専用のアダプタが必要なようなことが書いてあります。
アダプタは持っていないのですが、Header Board Specification (51292P) というドキュメントを読んでいると、なんとなく、PICkit 2 への結線を工夫すればうまく行きそうに見えます。しかし、実はこれが盲点で、実は結線だけではダメで、やはり AC162054 という専用のアダプタが必要のようなのです。これはただの結線ボードではなく、専用のコントローラ IC を載せたアダプタみたいで、PIC16F716 が単体では持っていないデバッグ機能を、PICkit 2 との間で仲立ちして、デバッグをできるようにするためのもののようです。生憎そんなものは持っていませんし、買うのも大げさなので、print 文デバッグで逃げることにします。
しかし、LED が点滅してくれないと print 文もできません。かなりハマりました。レジスタの設定など独特な処理の理解が足りずにハマっているのかと思ったのですが、MPLAB 上のシミュレータでデバッグしてみると、レジスタが期待した通りに変化しています。TRISB レジスタの設定も正しいようです。かなり頭を抱えました。
まずはハードウェアのクロック供給から確認、と言いたいところですが、オシロを持っていない身では、4MHz のクロック回路をモニタするのは困難です。しかし、ここで先日購入した DMM (テスタ)が役に立ちました。OSC2 端子に DMM を当て、周波数カウンタモードで測定してみました。すると、ほぼ 4MHz のクロックが供給されていることが分かります。波形は分かりませんが、とりあえずクロックは供給できていると見るべきでしょう。
ここでまた、頭を抱えました。こういうときは、初心に帰ってデータシートのピン配置など眺めます。特に、オープンになったまま放置されたピンが怪しいです。/MCLR って何だ? データシートをよく見ると、これはリセット端子なのでした。おまけに L アクティブで、こいつは TTL 入力ではないので、オープンだと入力レベルは不定です*2。ふと思いつき、これを H に固定してみたところ、無事に PIC が動き始めました。バンザイ! その後、PIC プログラマの V_PP と衝突がないように、PICkit 2 のマニュアル PICkit Programmer/Debugger User's Guide を見て、端子を処理しました。
ところで話は逸れますが、PICkit 2 内部の V_DD 端子には、保護用のダイオードが入っていないようですね。アプリケーション側の V_DD と電圧レベルが違うときは、保護ダイオードが必要かな、と思いました。(私の今回の試作では V_DD を 6V で使用しているので、ボード側に保護ダイオードを入れています。)

命令サイクル

これはただの備忘録ですが、PIC16F716 では、命令サイクルは 4 clocks/命令のようです。あ、マニュアルにも書いてあいりましたね。

コード

備忘録のため、今回のテストコードをメモしておきます。大したものではないですが、御笑納ください。

#include <htc.h>

__CONFIG(XT & WDTDIS & PWRTDIS & BORDIS & UNPROTECT);

int
init(void)
{
    TRISB = 0x00;
}

int
main()
{
    init();
    for (;;) {
        PORTB = 0xff;
        _delay(100000);
        PORTB = 0;
        _delay(100000);
    }

    return 0;
}

*1:実は、今回利用する PIC は 5V 用なのですが、T1 に合わせて 6V にしました。最大定格以下なので、まあ、素人趣味的には問題ないでしょう。

*2:DMM の入力インピーダンスで見る限り、0V 近くに落ちている。