50MHz Transciever Mk-94 製作記
PICマイコンとその限界


本機の頭脳に相当する制御部には、汎用PICマイコンの16F877Aを二つ使用しています。開発上1つにまとめたほうがよいことはわかっていたのですが、ROMライターの関係で、40ピンのDIPタイプのもが限界であることと、この型番は非常に一般的で、その入手性と価格の安さからDualCPUにしています。
選んだCPUは16F877Aといって8BitのPICマイコンです。1個で33のI/Oを持っています。

DISP(上)とCONT(下)


 デバック中のマイコンボード
16F877Aは40PのDipタイプで、プログラムを焼いてはテスト、焼いてはテストを繰り返す。
(各4つのCPUチップを交互に使う)







片方を「CONT CPU」もう一つを「DISP CPU」と呼んで、それぞれに各回路の制御を分担させています。




1. Encorder Pulse
周波数のダイアルに相当する部分は、エンコーダ「EC202A050A(村田)」で、A相とB相という2つの出力がこのCONTに入力されています。エンコーダを右に回すと、A相に比べてB相のパルスが先行し、逆に左に回すとA相が進みます。これをプログラムで検知して、周波数変化を起こします。

2.Keyboard入力
縦横4X4個計16個のキーがマトリクス上に配置されています。CONTではどのキーが押されたか?を検知して、それに対応した処理をします。

3. CW用エレキー
DotとLine入力で、マニュピレータのパドルが押されたことを検知します。1:3の長さやスペースの挿入などエレキーの動作は、CONT CPUにプログラムの一部として組み込まれています。また、スピードの調整は、可変抵抗器でアナログ入力のポートに加わる電圧を可変することで、スピードデータとしています。子の出力信号は、エレキー出力のON/OFFに従い、第2局発をスイッチします。また同時に、AF発振器に対、SideTone信号も出しています。

4. 第2局発のDDS制御
第2局発用のDDS IC (AD9834)のコントロールをしています。基本パラメータのセットに続いて、キーボードのモード切替に対応して、周波数切り替えなどを実施します。

5. 送受信切り替え
PTTスイッチの検出や、CWマニュピレータのキーが押されたことを検出して、送受信を切り替えています。CWはセミブレークイン機能や、送受信切り替え時にスピーカーから「ボスッ」という音が出ないように、Muteする機能なども、CONTのプログラムで行っています。

6. モードコントロール信号の制御
モードによって、高周波回路の一部をONしたり、OFFしたりする制御もCONTで行っています。例えば、モードによってキャリアを注入する量を変化させたり、AMモード時に、LA1600からのデータをAF回路に通したりする制御などです。



1. LCDディスプレイの制御
秋月通商から購入した、Dot Matrix LCD Display (SG12864A)に、周波数・モード・メモリチャンネル・周波数ステップ・送受信の状態を表示します。苦労したのは、大きな数字を表示する方法で、各キャラクタは「「各数字のドットパターンをテーブルに用意しておいて、データによってそれを切り替える」ということをしています。普通の大きさのキャラクタ(Mode表示など)なら簡単なのですが、表示エリアの関係で、大きな文字の場合は、一度組み立ててLCDに転送する工夫が必要で、考案するのにかなり時間を要しました。

2.VFOの制御
VFOで使用している、PLL IC(TC9526P)とDDS IC (AD9834)を制御しています。つまり、周波数データそのものはこのDISPが持っていて、CONTからのエンコーダパルス情報で、周波数を上下させるように、VFOに信号を出します。



CONTとDISP間は、SPI通信と呼ばれる、複数のPICマイコン間を結ぶ通信で情報をやり取りしています。詳細はPICの文献にまかせますが、3本の信号 SCK(クロック)SDI(入力)SDO(出力)で構成され、データ線であるSDI/SDOがループ状になるように接続します。実は、この通信が今回鬼門で、他の処理が間に合わないのか、CONTからDISP側にデータが送られない場合があり、改善の余地がある点となっています。



PICマイコンは、Microchip社の登録商標で、この会社のWebからアセンブラのコンパイラを無料でダウンロードできます。また、これにはデバッガなども付属していて、アマチュアには助かるサービスを受けられます。ただし、所詮はアセンブラで、すべてをユーザが管理しなくてはいけません。例えば、PICは「バンク」といってメモリエリア内がいくつかに分かれているのですが、知らずにプログラムを書き続けていると、いつしかこのバンクをまたいでしまっています。この場合、「プログラムレジスタのページ切り替え」のコードを書く必要があり、いつも「メモリを何番地まで使ったか?」を気にしていなければいけません。

有料ですが、Cコンパイラなどもあり、こちらはそういうわずらわしさもないのですが、今度はブラックボックスになってしまい、デバッガにかけても、細かいタイミングにかかわるバグがつぶせないなどの弊害がありました。この辺、アセンブラとCの混在ができればよいのですが、調べた限りでは難しそうで、結局アセンブラに戻った経緯があります。