Darkside(リンクエラー修正しました)

2014年05月の記事

<< 前のページ

2014年5月31日(土) 20:34

こっちを進める

 無線を使うアイデアまで思い至ったことにより、大型表示板の方も俄然製作意欲が沸いて来た。LCDは有線の手元表示用になるわけで、無線が威力を発揮するのはコッチである。
 作業再開にあたって回路を確認すると、基本パーツの実装はほぼ完了していて、配線が面倒過ぎるので放置という感じだ。ここで威力を発揮するのが、錫メッキ銅線。さくさくパターンを引き回し、立体交差せざるをえない部分だけジャンパーを飛ばす。
 時間は要したが、小数点LEDを除いてGNDとVccの配線が完了した。

 別に高度な情報を遣り取りする訳ではなく、単純なスモールデーターを一方的に送るだけなので、Bluetooth でなくても XBEE で良いのではないか?
 日本では小規模無線局の出力制限が厳しいので、どれだけ飛ぶかという点では製品ごとの差は出難い。しかし消費電力には大きな差がある。千石で扱っている XBEE モジュールは、低消費電力で良さそうだ。秋月のやつとは数倍の差がある。

 XBEE にしろ Bluetooth にしろ、3.3V動作の製品だらけ。PIC16F88 Cは基本5Vだが、8MHz動作時は2.9Vあれば動作する。無線モジュールもPICもすべて3.3V動作で統一すれば済む。
 大型表示板はLEDのスイッチングにFETを実装している。K2963で、データシート上は20ミリアンペアのような小電流であればゲート操作電位3Vで十分に働く。
ゲートとPIC端子を200Ωで接続すれば問題ないだろう。

 LEDは4直列で、電流制限抵抗150Ωが付いている。もう記憶に無いが12V掛ける前提で設計したのだろう。1セットあたり15ミリアンペア程度なら、フル点灯でも秋月の DC/DC コンバーターモジュールで足りそう。

written by higashino [高度測定装置] [この記事のURL] [コメントを書く] [コメント(0)] [TB(0)]

この記事へのトラックバックPingURL

2014年5月30日(金) 20:55

シリアル通信

 新規開発を進めるにあたっては、外部表示装置がないと不便である。もちろん最終的にも必要になるが、早めに用意した方が途中も楽になる。LEDだけでは不便。
 しかし、LCDは操作に7本ものI/Oピンを浪費するため、実装するとPICで使えるピンが思い切り減ってしまう。いつもの悩みである。

 ここで考えた。だったらLCD表示専用のPICを実装し、外部とはシリアル通信やれば?

 最新の自作戦車アンプでは、ラジコン受信器のデコードとモーター制御を別々のPICで行ない、両者がシリアル通信やるという方式を試して成功した。表示装置のように一方方向の通信であれば、安定した同期通信でも信号線は3本で足りる。引き回しが楽になる。
 7本必要だった信号線が3本になれば、I/Oピンが4つ余計に使える。
 更に、プロトコルの異なる表示装置でもPICが翻訳することで、同じプロトコルが使えるようになる。自前で、好きなプロトコルを使える。

 どうして今までやらなかったんだ?という名案だ。

 dsPIC は強力だが、低速用途では旧PICが適している。
 特に PIC16F88 のハイライトは、内蔵8MHzクロックで動作させる場合に発揮される。18ピンでありながら、電源とGNDを除く16本のピンすべてを
I/O用に使えるのだ。外部水晶を使わないのであれば、VccとGNDが逆で実装し難いという問題も無い。dsPIC
は外部水晶無しでも、28ピンのうち20本しかI/O用に使えない。
 もちろん PIC16F88 は消費電力も小さい。

 LEDを並べた大型3桁表示装置も、同様にシリアル3本信号で表示できるようにしてしまおう。
 と、ここまで考えて更に思い付いた。大型表示装置の方は、置き場所が難しい。それに、何メートルも配線を引き回せば、ノイズだって心配だ。だったら無線に出来ないか?
 BrueTooth あたりで数字を飛ばし、表示装置で受信して表示。これが出来れば、使い勝手が大幅に向上するだろう。

written by higashino [高度測定装置] [この記事のURL] [コメントを書く] [コメント(0)] [TB(0)]

この記事へのトラックバックPingURL

2014年5月29日(木) 21:10

先に進める

 MCLRに3.3KΩの3直列でプルアップ抵抗を取り付け、実験続行。
 症状全く変わらない。
 結果として、ブラウンアウトリセットの電圧が問題だった。

 dsPIC にしろ旧PIC にしろ、最高速で動かす場合は4.5V以上が必要である。三端子レギュレーターでは安定化5Vを出力しているわけで、ブラウンアウトリセットも4.5Vで良いだろうと考えていた。ところがなぜか4.5Vでは常時リセットされてしまう。
 最低の2.0V設定にしたところ、安定して動作するようになった。訳分からない。

 念のため PicKit2 を外し、ラジコンバッテリーを接続。
 するとこれまた1回点滅しただけで消える。妙なことに、PicKit2 で動作させた直後だけは点灯するが、それ以降はラジコンバッテリーを接続し直しても1回も点滅しない。
 そこで、PicKit2 接続動作時とラジコンバッテリー接続動作時の各部電位をチェック。その結果、ラジコンバッテリーが消耗していて4Vぐらいしか出ていないと判明。三端子を通ったら3V以下になっており、これじゃ動く訳がない。

 しかし三端子が5V出しているのを確認したのは数日前であり、その間ラジコンバッテリーは殆ど使っていない。空バッテリーとうっかり取り違えてしまったのか?

 ラジコンバッテリーを充電すると、20分経たないうちに終了。容量4500なのに充電容量900ぐらいで停止しており、放電し切ったニッケル水素バッテリーとしては異常である。
 そういえば前回の充電でも、充電容量800台で終わった。とのときは「満充電に近かったのだろう」と思っていたが、どうやらバッテリーの寿命というのが正解のようだ。

 天寿間近ではあるが負荷も小さいので、dsPIC基板に接続。すると、LEDは無事に1秒周期で光り続けた。
 MCLRのプルアップ抵抗を切除し、MCLR無効に戻してみる。やはり動作は正常。こうして結論が出た。
 MCLRは不用。水晶は想定通りに発振している。dsPICへのプログラム書き込みも正常。これで、先に進める。

written by higashino [高度測定装置] [この記事のURL] [コメントを書く] [コメント(0)] [TB(0)]

この記事へのトラックバックPingURL

2014年5月28日(水) 21:26

MCLR

 アセンブラとの mixed langage programming は必須になりそうな感がある。
 もちろんインラインアセンブラというのはあるが、関数の引数や返り値と連動できなければ意味はない。
 PIC系の開発環境は、ローカルラベルの使えないマクロというゴミをかましてくれた例があるので、油断ならない。

 LEDを点滅させるには、人間が見て分かる程度の時間待ちを行わねばならない。面倒なので、タイマー割り込みで点滅させる例を参考にする。
 1.024倍のクロックアップしてるので、キリのよい時間をタイマーで簡単に作り出せる。うまく行きそうなら、時間計測もタイマーで済ませるのがベストと思われる。dsPICでは16ビットのタイマーを連結して32ビットとして使えるので、超音波の反射時間をクロック単位で計測可能。
 0.5秒ごとに点灯と消灯を繰り返すようにする。すなわち、1秒ごとに光るはず。
 だが PicKit2 で書き込むと、恐れていた通りLEDは消えたままである。

 タイマー割り込み方式だから、メインの処理は空ループ回ってるだけである。そこでその空ループ内にLED状態反転コードを追加。時間待ちは無いので、点滅は肉眼では分からないはず。暗く光り続けると想定される。
 これで書き込むと、確かに点滅しているようだが想定以上に暗い。室内照明を落とさないと、良く見えない。しかも、点滅が速い。点滅していることは分かるが、毎秒数回は光っている。

 なにかおかしい。

 今度は常時点灯のコードに変えてみる。ところが、LEDの挙動は変わらない。異様に暗く、速く点滅する。そう、常時点灯のコードなのに、点滅するのだ。これまでの経験から、思い至った。これはきっと、dsPIC
がリセットを繰り返している。
 パワーオン遅延を設定しているため、リセットしまくれば毎秒数回の点滅になるだろう。
 ではなぜ即時リセットを繰り返すのか。引っ掛かっているのは、MCLR を無効にしてあること。外付け抵抗も付けていない。PIC16F88
では、MCLR 内部プルアップの設定が可能であり、その場合 MCLR は I/O ピンとして使用できた。PIC16F88
ユーザーの大半が恐らく MCLR を無効にして使っている。わざわざ存在する意味が無い。

 これに対し F4012 では、MCLR は独立ピンであるうえに I/O ピンとしては使えない。内部プルアップの設定も無さそうである。
 dsPIC ではピンアサインが冗長であり、旧PIC に比べるとピン数の割に使える
I/O が少ない。
 素直に外付け抵抗を付けたうえで、MCLR を有効にすべきではないか?

 試しに PicKit2 を外し、三端子にラジコンバッテリーを接続。すると、ほぼ想定通りのタイミングでLEDが点滅を始めた。と思った瞬間LEDが消えたままになり、再度ラジコンバッテリーを接続し直しても消えたまま。MCLR
が外付けも何も無しでオープンというのがマズいかもしれない。
 とはいえ、どうやらクロックは無事に動いているっぽい。

written by higashino [高度測定装置] [この記事のURL] [コメントを書く] [コメント(0)] [TB(0)]

この記事へのトラックバックPingURL

2014年5月27日(火) 21:20

最初の環境構築が大変

 PICに書き込む場合、状態レジスターを設定せねばならない。初めての場合、正しい設定方法を知るのが難しい。面倒だから
Watch Dog Timer は殺しておく。クロックは果たして XT_PLL16 で良いのか?

 PWM出力ピンの論理を設定できるのは便利だが、PWMピンとして使うか通常のI/Oとして使うかの設定項目が存在するのは想定外。というのもこれでは、6系統存在するPWMピンを個別に設定でいないかのように思える。PWMは1系統で良いが、1系統は必須である。そのためにPWMモードで使うことにした場合、残りの5系統もPWMモードになってしまうのでは使い勝手が悪い。
 PWMモードでも設定次第で常時Lや常時Hに出来るだろうが、通常のI/Oピンに比べると切替が煩雑となり低速。更に、出力できても入力できない。そうなると、ピンアサイン割り当てで苦労する可能性もある。

 dsPICには3系統存在し、F4012は「モーター制御系」とされている。その意味を深く考えずに全体スペックだけで選択したが、誤ったかもしれない。駄目なら本番用は別の機種にすれば良い。


 中身空っぽのプログラムをコンパイルし、試しに書き込み実行。

 一応 F4012 は認識されているようだし、書き込みも行われているようなメッセージ。しかし、秋月ツールと違って「書き込み終了」に相当するメッセージがないため、ベリファイが正常に終了したのか無限ループにでも入っているのか分からない。

 プログラムは中身無しなのだから、LEDには何の変化もない。

 動いているのか動いていないのか、まるで分からない。
 さっさとLEDを点滅させれば良いだろ、と言われそうだが具体的にCのソースリストにどう記述すれば良いか、調べるのも大変だ。
 更に、アセンブラなら簡単だがCでコード実行時間を正確に制御する方法を探さねばならない。簡単な事を行わせる場合でも、最初は苦労する。

 距離計(高度計)では正確に時間を計測する必要があり、果たしてCでそれが出来るのかという疑問は大きい。アセンブラとCを合体させてプログラムを作る方法など、実用段階に入れば調査すべき事柄は更に増える。
 その手の解説をした書物は存在するが、XC16対応のものは見たことが無い。

written by higashino [高度測定装置] [この記事のURL] [コメントを書く] [コメント(0)] [TB(0)]

この記事へのトラックバックPingURL

<< 前のページ

Darkside(リンクエラー修正しました)

Generated by MySketch GE 1.4.1

Remodelling origin is MySketch 2.7.4