2016年3月1日火曜日

自作Si5351AモジュールをPIC24で操る

2月の始めに秋月でPLL多出力クロックICのSi5351Aを取り扱うようになってから、周りでもぽつぽつ感心をもたれる方が出てきました。

自分も昨年Adafruit製のSi5351Aモジュールを購入して実験したっきりになっていましたが、少し調べてみるとすでにQRP CWトランシーバに応用された方がいらっしゃいました。刺激を受けて自分もそろそろ何か実用モノを作ろうと思い立ち準備始めました。

まず、試作に当たってSi5351Aと基準発振用のクリスタルを装着したモジュールを作りました。

もっともシンプルなSi5351Aクロックモジュール 材料費220円なり
 Si5351Aは秋月が取り扱い始める前にRSから取り寄せましたが、今ではクリスタルとMSOP10-DIP変換基板、細ピンヘッダを含めすべて秋月で揃えられます。

25MHzのクリスタルが小さくて装着がちょっと難しいですが、あらかじめ薄く端子をハンダ揚げするとうまくいくようです。Si5351Aはいつもの方法(薄くハンダ揚げしたランドにフラックス塗布してICの足を合わせて上から1ピンずつハンダこて先を当てるだけ)でバッチリハンダ付けできます。

以前PIC16F1827でブレッドボードに仮組みした試作VFOに装着していたAdafruitのモジュールを外して自作モジュール装着し、3.3V VDDにあわせるためプログラムを修正してPICに流し込み、無事に目的どおり発振するのを確認しました。


このままキーヤー制御などの機能を盛り込むつもりでしたが、PIC16F1827の残りのプログラム領域がやや心もとないため、上位モデルに移植しようと考えました。最初PIC18Fにしようかなと思いましたが、どうせならもっと上位ということでPIC24にしようと決めました。

入手性のことを考えて秋月にラインナップされているPIC24シリーズを探してみました。EEPROM内蔵のモデルでプログラムメモリが大きめのということで今回はPIC24FV32KA302を選択しました。

PIC24FV32KA302は16bitアーキテクチャでプログラムメモリが32KB、SRAMが2KB、EEPROMが512B、最高動作周波数32MHzで16MIPSなんだそうです。(64MHzのPIC18Fと同じ)

PIC16F1827用に書いたソースをPIC24用に書き替えてみました。


開発環境はMPLAB X IDE(3.10)にXC16コンパイラ(1.25)で、おもに割り込み関数と初期設定のポートやタイマー関連のレジスタを修正しビルドボタンを押すとコンパイルが通りましたが、ひとつだけ

si5351_pic24_010.c:80:50: warning: '_T1Interrupt' defined but not used

というワーニングが表示されていました。
PIC24Fではイベントごとに割り込みベクターが決まっていて、Timer1を使用した場合割り込みベクターテーブル(IVT)名は_T1Interruptで表記されます(Irq3)。

Timer1割り込みと表記しているのにもかかわらず使わないとはこれ如何に・・・?

最初考えずにプログラムをスタートさせたら、出力どころか表示すら出てこなくて非常に焦りました。

配線は問題なくSi5351Aの基準発振である25MHzは出ているようなので、やはりプログラムの問題のようです。一息入れてトラブルシュートに入ります。

まずモジュールやLCDを制御するI2Cの信号線をオシロスコープで観察すると、電源投入して何かしら信号が出ているのが確認されましたが、本来各モジュールの初期化が済んだ後はロータリーエンコーダを操作しない限りはレベルHighで静止するはずなのに、ずっと信号が出ている状態でした。よく見るとどうもリセットを延々繰り返しているようでした。

なぜそうなるのか見当が付かないため、プログラムの各要素をひとつひとつ外して検証する作業となりました。まず、タイマー割り込み部分を切り離したところ運よく発振して表示も出るようになりました。割り込み部分の問題ということがわかりましたが、なかなかこの先原因にたどり着くまで時間がかかってしまいました。

IRQ番号で直接指定してみたり割り込み関数内の記述を割り込みフラグクリア以外全部外して何もしないプログラムにしても、割り込み許可にするとやっぱりダメで、あれこれやっているうちに夜中も2時過ぎてしまいさすがに眠くなってきたので明日にしようと思いつつフッとコードを見ると・・・

static void __attribute__((interrupt(auto_psv))) _T1Interrupt(void){

 あ・・・XC8の割り込み関数表記 static void ~ のままだ・・

 前記のワーニングはこの static が原因なのかもと考え、早速外して再コンパイルしたらやっとまともに動き出しました。


8bitPICでは割り込みベクタのアドレスは08h番地で、PIC24では0008hに相当するベクタはAddress Error Trap Vectorとなりますが、staticを頭につけることによってこのアドレスに移動してリセットが繰り返されたのかなぁと想像しましたが、実際はどうなのでしょう・・・

追記:
どうやらXC8のマニュアルを見ても、割り込み関数前にstaticを記述することは必然ではないようです。
__attribute__との関連もありそうですが、この現象の成り立ちはまだよくわかりません

なにはともあれこのトラブルのおかげでPIC24の割り込みの部分、8bitPICとの違いがちょっぴりわかってきました。以前おなじ16bitアーキテクチャのdsPICを使用したJUMA TX-136/500ファームウエアはいろいろ弄っておりましたが、理解という意味では自分のプログラムで体現することが大事ですね。

そのほかEEPROMの扱いも8bitPICとは違うので実験続けたいと思います。

0 件のコメント:

コメントを投稿