ラベル FreeRTOS の投稿を表示しています。 すべての投稿を表示
ラベル FreeRTOS の投稿を表示しています。 すべての投稿を表示

2012年5月29日火曜日

パルスジェネレーターver2.0


先日、新しいパルスジェネレーターを検討すると書いたが、いろいろ思考をめぐらしていくうちに、今あるパルスジェネレーターを少し改造すれば、簡単に使えるのではないかと思った。

実を言うと、USB機能の追加が少しハードルが高くて、どうしようか悩んでいたのもある。
まずPIC18Fだと、Cよりもアセンブラになるだろうということ、リアルタイムOSが使えるかどうかということ、USBをリアルタイムOSに乗せるのは可能か、などなど。
すると、実績などを考えるとPIC24Fの方がよくないかとか、課題が増えてしまって、収集がつかなくなってしまう。


だから、まずは既存のパルスジェネレーターを改造することから初めて、新しいパルスジェネレーターの本当に必要な機能を見極めてから、作っても遅くは無いだろうという思いが出てきた。


USB機能はないが、マニュアル操作で、パルス量をリアルタイムに変化できるようにしてみたい。

操作は、ロータリーエンコーダーがあるので、パルス出力中にこれをまわすとパルス量が増減できるようにする。
となると、PICソフトを書き換えるだけで済む。

MPLABを立ち上げて、プロジェクトを開く。FreeRTOSを使ったソフトだったことを思い出した。

LCD表示でパルス幅1.0usec未満の場合に小数点が消えるバグがひとつあったので、これもついでに直す。


コンパイルが通ったところで、メモリーUSAGEを見てみる。まだ十分な余裕がある。

パルス量増減モードを追加しても問題なさそうだ。

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;としてみたら、全てのキーとロータリーエンコーダの値がとれるようになった。ヤッター!

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日日曜日

FreeRTOSでLCD表示をしてみたが


FreeRTOSのキューを使ってLCDに文字を表示するサンプルを作ってみた。

しかし、文字が表示されない。カーソルが出て、ポジションを動かすことまで出来ているのに、肝心のキャラクタがまったく出てこない。

どうしてだろ?

液晶が壊れていると思って、別なものに交換したが、症状は変わらない。

今日はもうあきらめよう。

2009年8月23日日曜日

FreeRTOS動作確認

昨日の続き、dsPIC33FのインターフェースボードにFreeRTOSをのせて動かすテストを行った。

テスト中の動画


画面左側の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!エラーは出なくなった。

2009年8月17日月曜日

FreeRTOS


今回、dsPIC用のフリーのリアルタイムOSであるFreeRTOSを使うことにする。


FreeRTOSのサイト:
http://www.freertos.org/

参考サイト:
http://www.picfun.com/RTOS24/FreeRTOS24frame.html

最新版は、v5.4.2だった。

exeファイルをダウンロードして、実行すると、自己解凍された。