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のメモリーアクセスに癖があって、これに悩まされた経過があるので多少の出費は仕方ないかなと。
アクエリアスの時代到来、そして新たな時代に合った文明や科学、人のありかたなどを探求してみたい。そして、太陽の国である日本は地球人類のリーダー的存在となる必要があります。その一助を担えれば幸いです。
2009年9月23日水曜日
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年8月23日日曜日
FreeRTOS動作確認
昨日の続き、dsPIC33FのインターフェースボードにFreeRTOSをのせて動かすテストを行った。
テスト中の動画
画面左側のLEDは200ms周期で点滅。右側は500ms周期。これと右上のブザーで1kHzの音を100ms鳴らして、500ms止める動作を繰り返している。ただし、カメラの特性なのか、動画の特性なのかわからないけれど、1kHzの音が録音できていない。
ソースはこちらから→ FreeRTOSConfig.h, main001.c
修正した最新の回路図
ちなみに、PicKit2をデバッグモードで動かしているので、ソースの修正から動作確認まで非常に簡単にできてしまう。とても便利。
さて、この次は周辺ものである、ロータリースイッチやLCDなどをつけて動作確認だ。
テスト中の動画
画面左側のLEDは200ms周期で点滅。右側は500ms周期。これと右上のブザーで1kHzの音を100ms鳴らして、500ms止める動作を繰り返している。ただし、カメラの特性なのか、動画の特性なのかわからないけれど、1kHzの音が録音できていない。
ソースはこちらから→ FreeRTOSConfig.h, main001.c
修正した最新の回路図
ちなみに、PicKit2をデバッグモードで動かしているので、ソースの修正から動作確認まで非常に簡単にできてしまう。とても便利。
さて、この次は周辺ものである、ロータリースイッチやLCDなどをつけて動作確認だ。
2009年8月22日土曜日
dsPIC33FJ32GP202+FreeRTOS
まずはじめに、FreeRTOSで簡単なサンプルプログラムを作ってみることにした。
dsPICの23番ピン(RB12)にLEDをつけてある。これを点滅させるのだ。
発信器は内臓のものを使う。
電子工作室のページに移植手順が書いてあるので、ディレクトリを適当に決めて、ほぼここに書かれているとおりに作業を行った。プロジェクト名はinterface001にした。FreeRTOSのソースファイルは数が少ないのには少し驚いた。

メインのプログラムを書いていて、デバイスのConfigurationのところでつまづいた。
dsPIC33Fのリファレンスマニュアルを見る必要がありそうだ。
MICROCHIPのサイトにdsPIC33Fファミリ リファレンス マニュアルがあるが、英語版のみで日本語版はない。
浅草ギ研のページによると、dsPIC33Fリファレンスマニュアルの日本語版はまだなく、dsPIC30がそのまま使えるらしいことがわかった。ついでに、そのままそこにあったリファレンスマニュアルをGETさせてもらった。
リファレンスの必要そうな部分だけに目を通して、ソースを完成させた。

ビルドを何度か繰り返してエラーを取り除いて、最終的にHEXファイルをEXPORTしてバイナリーをつくった。
次に、PicKit2を接続して、書き込みだ。
PicKit2をPCのUSBポートにつないで、ターゲットボード上に用意したピンヘッダーに接続、ボードの電源を入れる。そして、PicKit2のソフトを起動する。すると、起動時にエラーメッセージが出る。VDDの電圧が異常?しばらくよくわからないまま、作業を続けていた。
dsPIC33Fは、自動的にデバイスを認識してくれないのかな?マニュアルでデバイスを指定。
PicKit2のマニュアルをみて、PicKit2が検出しているVDD電圧が2.3~2.4Vで、デバイスの書き込みに必要な2.7~3.0に達していないということがわかってきた。
それで、PicKit2本体のVDD電圧をキャリブレーション調整する。0.5Vほどずれているようだった。
これで直ったかと思ったが、その後もVDDの電圧でメッセージが出てくる。???原因がよくわからない。

デバイスへの書き込みを行っても電圧が不足しているからエラーが出てくる。
ボードの電圧を測定すると3.3Vでている。おかしいなぁ、、、と回路図をもう一度確認していたら、間違いを発見!
PicKit2を接続するピンの順番が間違っていた。3番目のVSS(GND)と、5番目のPGCがテレコになっていた。設計時にどこかのサイトに出ていた回路図を参考にしたときにミスったようだった。
原因がわかったところで、早速、配線の間違いを直し、PicKit2をつないでみた。OK!エラーは出なくなった。
dsPICの23番ピン(RB12)にLEDをつけてある。これを点滅させるのだ。
発信器は内臓のものを使う。
電子工作室のページに移植手順が書いてあるので、ディレクトリを適当に決めて、ほぼここに書かれているとおりに作業を行った。プロジェクト名はinterface001にした。FreeRTOSのソースファイルは数が少ないのには少し驚いた。

メインのプログラムを書いていて、デバイスのConfigurationのところでつまづいた。
dsPIC33Fのリファレンスマニュアルを見る必要がありそうだ。
MICROCHIPのサイトにdsPIC33Fファミリ リファレンス マニュアルがあるが、英語版のみで日本語版はない。
浅草ギ研のページによると、dsPIC33Fリファレンスマニュアルの日本語版はまだなく、dsPIC30がそのまま使えるらしいことがわかった。ついでに、そのままそこにあったリファレンスマニュアルをGETさせてもらった。
リファレンスの必要そうな部分だけに目を通して、ソースを完成させた。

ビルドを何度か繰り返してエラーを取り除いて、最終的にHEXファイルをEXPORTしてバイナリーをつくった。
次に、PicKit2を接続して、書き込みだ。
PicKit2をPCのUSBポートにつないで、ターゲットボード上に用意したピンヘッダーに接続、ボードの電源を入れる。そして、PicKit2のソフトを起動する。すると、起動時にエラーメッセージが出る。VDDの電圧が異常?しばらくよくわからないまま、作業を続けていた。
dsPIC33Fは、自動的にデバイスを認識してくれないのかな?マニュアルでデバイスを指定。
PicKit2のマニュアルをみて、PicKit2が検出しているVDD電圧が2.3~2.4Vで、デバイスの書き込みに必要な2.7~3.0に達していないということがわかってきた。
それで、PicKit2本体のVDD電圧をキャリブレーション調整する。0.5Vほどずれているようだった。
これで直ったかと思ったが、その後もVDDの電圧でメッセージが出てくる。???原因がよくわからない。

デバイスへの書き込みを行っても電圧が不足しているからエラーが出てくる。
ボードの電圧を測定すると3.3Vでている。おかしいなぁ、、、と回路図をもう一度確認していたら、間違いを発見!
PicKit2を接続するピンの順番が間違っていた。3番目のVSS(GND)と、5番目のPGCがテレコになっていた。設計時にどこかのサイトに出ていた回路図を参考にしたときにミスったようだった。
原因がわかったところで、早速、配線の間違いを直し、PicKit2をつないでみた。OK!エラーは出なくなった。
2009年8月17日月曜日
MPLAB C30
Microchip社の純正C言語コンパイラであるMPLAB C30というものがある。
dsPICで開発するのに必要なので、これをGETしてインストールする。
これは純正だけど、制限つきのアカデミック版が無料で提供されているのでそれを使う。
参考サイト:
http://www.picfun.com/c30frame.html
http://www.microfan.jp/mplab-c30
ダウンロードの画面


このとき、ユーザー登録が必要だったので、メールアドレスやパスワード、氏名、国、住所などを登録した。
ダウンロードが完了したら、インストール。
・・・インストール中・・・すべてデフォルト。










これでインストール終わり。
dsPICで開発するのに必要なので、これをGETしてインストールする。
これは純正だけど、制限つきのアカデミック版が無料で提供されているのでそれを使う。
参考サイト:
http://www.picfun.com/c30frame.html
http://www.microfan.jp/mplab-c30
ダウンロードの画面


このとき、ユーザー登録が必要だったので、メールアドレスやパスワード、氏名、国、住所などを登録した。
ダウンロードが完了したら、インストール。
・・・インストール中・・・すべてデフォルト。










これでインストール終わり。
インターフェース部の製作
登録:
投稿 (Atom)


