2010年1月17日日曜日

パルスジェネレータ&カウンタの製作(その6)


ようやく出来上がった。

CPLD側のデータ出力処理がおかしかったのと、PIC側の入力をIOポートではなくラッチからとっていたり、読み込んだ周波数のLSBとMSBを逆さまに処理していたりと、たくさんのバグを片付けた。



写真の1枚目と2枚目はパルス出力をオシロスコープで確認しているところ。3CH同時出力中で、どれも周期Tは1ms、デューティー比は上が10%、真ん中が50%、下が90%に設定。(おや、パルスが逆転している。写真を撮ったときは気がつかなかったが、まだバグがあるようだ・・・)
オシロスコープの電圧は、1Ch、2Chが2V/divで、3Chが0.5V/div。3Chは、20dBの自作アッテネーターをつけている。

パルスジェネレーターについては、パルスが逆転しているものの、そのほかは大きな問題はなさそうだ。

一方、周波数カウンタについては、いくつか問題が残った。

まず、外部入力を終端した場合に本来なら0Hzとなるはずなのに、1Hzの表示が出ていること。これは、CPLDのカウンター処理部のタイミングがおかしいようである。

それから、小さなケースに詰め込んだため、LCDケーブルの信号がノイズとなってカウンターに入ってしまっている。これは、カウンターの感度が良いために、微小なノイズも拾っているということだが、カウンター部分をシールドすれば何とかなりそうな気がする。
試しに外部入力にケーブルをつなぐと1Hzに落ち着くので、実際の測定にはあまり影響がないかもしれない。
それから、時々カウンターがビジー中に息をつくように止まることがある。これは、12.8MHzクロックが不安定なのかもしれない。

同様に、プリスケーラ側に切り替えると、外部入力をオープンにした状態で2.5GHzあたりをうろうろしている。これも感度が高いためと思われる。上記と同様に外部入力を終端してみたが0Hzにはならず、GHzあたりの数字をうろうろとしている。つぎに外部入力にケーブルをつなぎ、400MHz前後で発信する被測定物の信号を与えるてみた。(3枚目の写真)
すると、それなりの数字が出ているので、よほど微弱な信号でなければ大きな問題ではないかもしれない。ただ、もう少し詳細なデータが必要だ。

以上のような問題はあるものの、以前作成した周波数カウンターに比べると格段に性能がUPした。このことはMAX2の性能が大きく寄与しているように思う。それから、コンパクトな形にしたので、使い勝手も向上したように思う。そして何よりもパルスジェネレーターが出来たので、MOS-FETの負荷実験などをすることができる。

細かなバグ直しや調整、機能測定は後日にすることとして、いったんこの製作は終了することにする。

PIC24F+RTOSプロジェクトファイル
MAX2_VHDLソース
設計資料と回路図

最後に、あちこちウェブから参考にさせていただいたおかげで出来たような訳で、それもあまりに多いので特別記載しませんが、この場を借りて諸先達たちに感謝申し上げます。

2010年1月11日月曜日

パルスジェネレータ&カウンタの製作(その5)

もうあと少しなのだが、なかなか完成しない。
すでに、パルスジェネレータ部分は出来上がっていて、残りは周波数カウンターの表示のみ。

MAXⅡのロジック利用率も90%を超えている。はじめはロジックエレメント数が570もあるから大丈夫と思っていたが、すでに余裕はない。こちらも少しずつ余分な機能などを削った。

一方、PICのメモリー不足がまだ続いている。変数をグローバルにしたり、簡単な関数はマクロにしたり、関数呼び出し部をベタ書きにしたりして、パルスジェネレータ部分は動作した。

しかし、今度は周波数カウンタの読み取りで暴走が始まる。MAXⅡから得た周波数をいったんRTOSのキューに収めて別スレッドで表示させていたが、このキューの処理が意外とスタックを食うようだ。RTOSは、便利なのだが、その分メモリーを余分に消費してしまう。

2010年1月10日日曜日

スタックオーバーフロー


MPLAB C30で調子よくプログラムを作って、デバッグモードで動かして確認を繰り返していた。
すると、動かしている途中でリセットがかかるようになってしまった。

MPLABには、画像のようなメモリーの使用量が表示できる機能がある。
これを見る限り、まだまだ余裕があると思っていたのだが、どうも違うようである。

マニュアルによると、ソフトウェアでスタック領域の監視を行っているようで、デフォルトのままだとスタックオーバーフローが発生したらリセットするようになっているのだ。

ここら辺が、一般的なPC上で開発するソフトウェアと組み込み用のそれとの大きな違いだ。普段PCのメモリーがたっぷりある環境で開発することに慣れているので、いつものように関数なんかはどんどん作ってしまうのだが、これがスタックの浪費につながってしまうのだ。

スタックの消費量を抑えるように、プログラムの見直しをしなくては。

2010年1月5日火曜日

パルスジェネレータ&カウンタの製作(その4)


PIC側のソフトウェアの製造とデバッグ中。。。進捗50%ぐらい。

LCDの表示とキー入力やメニューと各設定への遷移は完了。


PIC側の残りは
・パルス幅とデューティー比の編集部分。
・入出力アクティブ表示用LED点灯。

CPLD側は、
・パルス出力
・カウンター
・ブザー

さあ、また次の休みに頑張ろう。