2009年2月7日土曜日

エアバンド受信機(4)

【AVRソフトウェア続き】 かなり時間が経過してしまった。今回はPLL以外のプログラムについて解説する。
 本来一番最初に説明するのは、アルゴリズムであるべきと思うが、いつものように成り行きで作るので後で「あれ?」と思うようなプログラムになっている。そこでとりあえずブロックダイアグラムを描いてみた。まあ参考程度にしてください。基本はMainルーチンであることはいうまでもないが、この中に「VFOモード」と「メモリーモード」の2モードがある。それ以外は、前回解説の「PLL設定」と「LCD書込み」「メモリー書込み」のサブルーチンがあり、必要に応じて呼び出している。

●メモリー
 今回の習得目的であるメモリー(ROM)であるが、実に簡単に利用できる。この受信機では以下の目的でメモリーを使っている

* PLL可変時のステップ設定(1CH)
* モード記憶(1CH) 電源OFF時にそれまでのモード(VFO/MEMORY)を記憶
* メモリー番号記憶用(1CH) メモリーモードのチャンネルを記憶 モード切替時はこの番号で呼び出される
* 受信機の周波数記憶用(10CH) 中身はPLLの分周数である
* 受信機の周波数記憶用(1CH)  VFOモードの周波数記憶

以上である。
メモリーの書込みは以下のようにプログラムしている。
イニシャルセットの変数定義で

Dim Stepl As Eram Byte At $01 '1=10KHz 10=100KHz 100=1MHz
Dim Model As Eram Byte At $02 '0=VFO 1=Memory
Dim Memol As Eram Byte At $03 'memory No.1-10
Dim Flast As Eram Long At $05 ‘VFO freq
Dim Memo(10) As Eram Long At $09 'memory freq 1-10

としてROM領域を確保し以下の変数で受け渡しをする

Dim Mmode As Byte
Dim Fstep As Byte
Dim Memon As Byte
Dim Mainf As Long
Dim Flag0 As Byte

プログラムの中での使用は、書込みと読み込みである。
書込みは、
メモリの1CHに 126MHzを記憶する場合 PLL分周数は(126-10.7)×100=11530となるので

Memon=1 書込みチャンネルに1をセット
PLL=11530 PLLの変数に11530をセット
Memo(1)=PLL メモリーへ書き込み

以上である
読み込みは

PLL=Memo(1)
としてPLL変数をPLL書込みルーチンに送ればよい。
●スイッチ取り込み
 スイッチとして

1)周波数ステップ変更用
2)VFO/メモリ切り替え
3)メモリ書込み
の3種類を使用

スイッチを読み込むとはポートの情報を読むことなのでPin命令で読み込むことができる
ModeをVFOモード、メモリモードの状態用変数とし、スイッチをポートB の1に繋いだとして

Config Portb = Input ポートBをinputに設定
Portb = 1  ポートBをプルアップ(スイッチがオープン状態でHigh)
Mode=Pinb.1

これでModeがHighならばVFOモード。Lowならばメモリモードへ分岐すればいい。
しかし今回は

Debounce PinB.1 , 0 , Mode

とDebounce命令を使用してみた。この命令はエンコーダー取り込みに使っているが、エンコーダもいわばスイッチである。
なぜDebounce命令を使用したかというと、1行で分岐命令まですべてを書けるからである。If~then~elseで書くより見通しがいい。どちらがメモリ消費が多いかは気にしていない。
上決めいれはポートBが1ならばラベルModeへジャンプという命令である。

以上プログラム概要を書いてみた。でもたぶん皆さんにはよくわからないと思う。
書いている本人もだんだんわからなくなってきている。
もう少しBascom-AVRに慣れてきたら、ホームページにでもまとめていきたいと思う。
もし、参考にしたいという人がいるようでしたら(いないと思うが)コメントにでも書き込んでください。

以上で今回の「エアバンド受信機」は終わり。