今日は、前回FPGAが動かなかった原因を探していた。
一度完全に動いていたヴァージョン(周波数固定)に戻してみたら、正常動作していた。
ということは、後から追加したロジックが適切じゃないということだ。
周波数を可変にするために、外部から3つの信号を取り込むようにしたのだが、これがどうやらバグっているようだ。
もう一度VHDLの本を読んだりしていたら、追加した外部からの信号が、クロックと同期がまったく取れていないためだろうなと思い始めた。単純に信号を入れただけ、タイミングなんか全然考えていない。だから、当然といえば当然かもしれない。
信号を内部のクロックと同期させるために、フリップフロップを入れる必要がある。また、取り込むタイミングが曖昧な状態だったので、何クロックで処理を完了するのかなど、きちんと定義する必要があるようだ。
いつも仕事でやっているプログラムとは随分違いがあるなぁ。。。
良くわからないことだらけ。
アクエリアスの時代到来、そして新たな時代に合った文明や科学、人のありかたなどを探求してみたい。そして、太陽の国である日本は地球人類のリーダー的存在となる必要があります。その一助を担えれば幸いです。
2009年9月27日日曜日
2009年9月23日水曜日
インターフェース部の暫定版と三相信号発生器
とりあえず、PIC24に切り替えて無事動くようになった。メモリー不足でリリースすらできなかったのが、今は順調に動くようになった。
タクトスイッチの上のボタンを押すと周波数の変更モードに切り替わり、左右のスイッチで希望する位置にカーソルを移動して、エンコーダーを回すとその部分の数字がUP/DOWNする。希望する周波数を入力したら、下のボタンで設定完了する。このような簡単なものなのに、かなり時間がかかってしまった。16bitのPICは初挑戦だったから仕方ないか。。。
あと、設定周波数をFLASHメモリーに記録する部分だとか、シリアルインターフェースなどまだやることがのこっているが、とりあえず暫定版としてリリースすることにした。
もともと、このインターフェース部分は、FPGA(Spartan-3A)で作った三相高周波信号発生器の周波数を変更するためのものだった。
なので、すでに半年ほど前に出来上がっていたはずの、三相信号発生器に接続して、動作確認をしてみた。
ところがである、予想通り出力が出てこない。
FPGAの書き込みをもう一度やり直してみたがだめで、Xilinxのシミュレーターを使ってみると、出力が出ないことが判明した。レジスタの初期値が設定されていなかったり、32ビット信号から上位11ビットを取り出すところで、下位ビットを拾っていたため出力が変化しなかったりといろいろ問題が見つかった。
これらを修正したのだが、それでも信号が出てこない。。。
出力段のDAコンバータにオシロのプローブを当てて調べていたら、レギュレーターから100Hz程度の信号が出ているようだし、まだまだ完成するまで先は長そうだ。
dsPIC33からPIC24に変えてみる
dsPIC33FJ32GP202というチップでプログラムを作ってきたのだが、SRAMの容量が足りなくなってしまった。
このdsPICには2KバイトのSRAMが載っているのだが、周辺のプログラムがどんどん増えていくにしたがって、ヒープ領域とスタックがかぶってしまってPICが暴走するようになってしまった。プログラムをSVNで以前のバージョンに戻すと正常動作するから間違いない。
SRAMの消費を抑えるために、できるだけ無駄な変数の宣言やファンクションコールを減らしてみたが、どうしても限界がある。
というわけで、思い切って、PIC24FJ64GA002というチップに交換することにした。実はこのPIC24シリーズはdsPIC33とは兄弟みたいなもので、DSP機能がついているかついていないかの違いしかない。今回DSPを使う予定はない訳だし。
そして、SRAM不足を解消するために、8KバイトのSRAMを積んだPIC24FJ64GA002にした。これだとPIN数も同じ28ピンだし、何の問題もなく交換できる。
午後から秋月に行って購入した。450円だからdsPIC33FJ32GP202と同じ価格。他の8bitのPIC16シリーズなどと比べると2倍以上の金額だけれど、アセンブラではなくC言語で開発できるのが良い。それに、PIC16のメモリーアクセスに癖があって、これに悩まされた経過があるので多少の出費は仕方ないかなと。
このdsPICには2KバイトのSRAMが載っているのだが、周辺のプログラムがどんどん増えていくにしたがって、ヒープ領域とスタックがかぶってしまってPICが暴走するようになってしまった。プログラムをSVNで以前のバージョンに戻すと正常動作するから間違いない。
SRAMの消費を抑えるために、できるだけ無駄な変数の宣言やファンクションコールを減らしてみたが、どうしても限界がある。
というわけで、思い切って、PIC24FJ64GA002というチップに交換することにした。実はこのPIC24シリーズはdsPIC33とは兄弟みたいなもので、DSP機能がついているかついていないかの違いしかない。今回DSPを使う予定はない訳だし。
そして、SRAM不足を解消するために、8KバイトのSRAMを積んだPIC24FJ64GA002にした。これだとPIN数も同じ28ピンだし、何の問題もなく交換できる。
午後から秋月に行って購入した。450円だからdsPIC33FJ32GP202と同じ価格。他の8bitのPIC16シリーズなどと比べると2倍以上の金額だけれど、アセンブラではなくC言語で開発できるのが良い。それに、PIC16のメモリーアクセスに癖があって、これに悩まされた経過があるので多少の出費は仕方ないかなと。
2009年9月22日火曜日
FreeRTOSでエンコーダとキーの処理
液晶の表示が出来るようになったので、次はロータリーエンコーダとタクトスイッチの入力を処理するサンプルを作ってみた。
はじめ、キー入力があったときに割り込みを使って処理することを考えていた。
そのためには、入力変化割り込みを有効にする必要があるらしい。そのためのレジスタがCNxIEというものらしいのだが、このレジスタの設定方法がまったくわからない。リファレンスマニュアルを読んでも詳しい設定方法が書いてないし、サンプルを探したが、dsPIC、PIC24Fでは見当たらない。
何がわからないかというと、dsPIC33FJ32GP202のピン番号とChange Notification Registerのマッピングが一致しないのだ。チップ自体は28ピンで、このうち入力に使えないVddやVssなどを除くと21ピンが対象ピンとなる。この数は、CNレジスタの有効な数と一致する。しかし、このCNレジスタの番号がPORTA、PORTBの並びとはまったく異なるのだ。かといって、ほかにマッピングするためのレジスタは見当たらない。
さんざん考えた末、この割り込みを使う方法はあきらめて、タイマーで周期的にキー入力を見るというオーソドックスな方法に切り替えた。
このオーソドックスな方法、案外簡単ながら強力だなと思った。キー入力には必ずチャタリングが付きまとうものだが、周期的にスキャンするので、前回の値とを比較するだけでチャタリングが除去できてしまう。
ELMさんのテクニカルノートがとても参考になった。ここにはチャタリング対策やロータリーエンコーダの使い方などがC言語のプログラム付で解説されている。FreeRTOSへの実装にも、ほぼそのまま利用可能だ。
これで、OKだと思ってPICに書き込んで動かしてみたが、キーの2つは正常に動作するのだが、ほかがまったく反応しなかった。
これでまた少し悩んだ。
配線をチェックしたり、テスターでキー入力の変化がPICに届いているかなど調べた。問題なかった。
では、ソフト側の問題かと考えていたら、どうも、A/D変換用の入力ピンが認識していないことがわかってきた。マニュアルを読むと、AD1PCFGレジスタを設定しないと、TRISxレジスタで入力を指定した場合にPORTxの値が読み込めないとある。
さらにdsPIC30のマニュアルなども読んでみた。そうしたら、0でA/D、1でディジタルI/Oとなると書いてある。
ソースを修正して、AD1PCFG=0xFFFF;としてみたら、全てのキーとロータリーエンコーダの値がとれるようになった。ヤッター!
はじめ、キー入力があったときに割り込みを使って処理することを考えていた。
そのためには、入力変化割り込みを有効にする必要があるらしい。そのためのレジスタがCNxIEというものらしいのだが、このレジスタの設定方法がまったくわからない。リファレンスマニュアルを読んでも詳しい設定方法が書いてないし、サンプルを探したが、dsPIC、PIC24Fでは見当たらない。
何がわからないかというと、dsPIC33FJ32GP202のピン番号とChange Notification Registerのマッピングが一致しないのだ。チップ自体は28ピンで、このうち入力に使えないVddやVssなどを除くと21ピンが対象ピンとなる。この数は、CNレジスタの有効な数と一致する。しかし、このCNレジスタの番号がPORTA、PORTBの並びとはまったく異なるのだ。かといって、ほかにマッピングするためのレジスタは見当たらない。
さんざん考えた末、この割り込みを使う方法はあきらめて、タイマーで周期的にキー入力を見るというオーソドックスな方法に切り替えた。
このオーソドックスな方法、案外簡単ながら強力だなと思った。キー入力には必ずチャタリングが付きまとうものだが、周期的にスキャンするので、前回の値とを比較するだけでチャタリングが除去できてしまう。
ELMさんのテクニカルノートがとても参考になった。ここにはチャタリング対策やロータリーエンコーダの使い方などがC言語のプログラム付で解説されている。FreeRTOSへの実装にも、ほぼそのまま利用可能だ。
これで、OKだと思ってPICに書き込んで動かしてみたが、キーの2つは正常に動作するのだが、ほかがまったく反応しなかった。
これでまた少し悩んだ。
配線をチェックしたり、テスターでキー入力の変化がPICに届いているかなど調べた。問題なかった。
では、ソフト側の問題かと考えていたら、どうも、A/D変換用の入力ピンが認識していないことがわかってきた。マニュアルを読むと、AD1PCFGレジスタを設定しないと、TRISxレジスタで入力を指定した場合にPORTxの値が読み込めないとある。
さらにdsPIC30のマニュアルなども読んでみた。そうしたら、0でA/D、1でディジタルI/Oとなると書いてある。
ソースを修正して、AD1PCFG=0xFFFF;としてみたら、全てのキーとロータリーエンコーダの値がとれるようになった。ヤッター!
2009年9月19日土曜日
FreeRTOSで液晶表示
先週なかなか表示してくれなかった文字がようやく表示されるようになった。
・・・
前回Blogに投稿したときは、LCDのクリアやカーソルの移動が出来ていたので、LCDへのコマンドは届いているが、データが届いていないという状況だった。
ハードの問題なのか、ソフトの問題なのか良くわからなかったので、今使っているLCDライブラリとは作者が別なソフトをネットで探し出しLCDの表示を試してみた。
しかし、状況は変わらなかった。
でも、これでソフトウェアの問題ではないことが確定した。
そして、LCDがコマンドを受け付けてデータを表示しないことから、RS(Register Select)信号がLowになったままであることが推測された。
よって、dsPICからLCDまでの配線をもう一度チェックして、半田付けもやり直した。
また、LCDへの5Vの電源電圧が不安定なために表示できていないのではないかとも思われたので、5Vのレギュレーターを追加した。
しかし、状況は変わらず。
次に、dsPICのリファレンスマニュアル等を読んで出力ピンの特性だとか、設定方法などを再チェック。
ここで、オープンドレインの設定が出来るということを知った。
オープンドレイン?って何だろ、と調べてみた。以下のURLに詳しく解説されていた。
http://www001.upp.so-net.ne.jp/FITDESIGN/manu6.htm
http://www.picfun.com/PIC24F/module/mod24F02.html
要するに大きな電圧や電流の回路とインターフェースするための回路構成ということで、今回のようにdsPICが3.3VでLCDが5Vの場合に、5Vで信号のやり取りをするための機能なんだと理解した。
そこで、問題のRSラインだけこのオープンドレインにして、RSラインを5Vにプルアップしてみることに決めた。
この際、当初使っていたRB15はA/Dコンバータと兼用できるピンだったため、入力電圧の許容が3.6Vと低く使えないので、Digitai出力専用のRB11と入れ替えた。
しかし、これでも駄目。
この後、しばらく悩みつつオシロスコープのプローブを当てて調べていたら、思わぬところに間違いを発見!
回路図を描くために使っているのが水魚堂さんの回路図エディタBSch3Vなのだが、これについていたLCDのライブラリのRSとR/Wのピン番号が、LCDモジュールを買ったときについてくる資料のものと違っていた。ライブラリではRSが5、R/Wが4なのだが、資料の方は、RSが4で、R/Wが5だった。
こんなところにバグが潜んでいるとは。。。。
というわけで、この配線を直したところ、正常に動いてくれた。やれやれ。
YouTubeに動画をUP。
http://www.youtube.com/watch?v=FAblW7iKw3I
2009年9月13日日曜日
2009年9月5日土曜日
登録:
投稿 (Atom)