2008年12月 7日 (日)

アセンブラのバグなのか?

【事後フォロー記事】
所長です、こんばんわ

下記の記事ですが、内容に誤りがある為、訂正します。
私が「バグバグ」と騒いでいた原因は、「関数のリエントラント(再入可能)性」の問題であり、コンパイラのバグでは無く、私のプログラミング知識不足からくる、プログラムのバグでした。
すっぽんのクリさん(コメント参照)からのアドバイス通りです。
m( __ __ )m

「リエントラント性」とは、分かり易く言うと、
割り込む前に使っていた関数(変数)が、割り込みから復帰した後に、何事も無かったかのように、正常に復帰するかどうか?
といった感じでしょうか・・・

わかりやすい例を挙げて説明します。

【悪い例】
#int_timer1
void  timer1_isr(void)
{
int t;
   disable_interrupts(GLOBAL);
   output_high(ST_PLUG);
   delay_us(100);               // wait 100usec (at 8MHz)
   output_low(ST_PLUG);
   set_timer1(set_interval_p);
   enable_interrupts(GLOBAL);
}

void main()
{
 中略
  delay_us(val);
 中略
}

何が悪いかと言うと、main()の中でdelay_us(x)関数が使われていますが、割り込みルーチンの中でも、同じdelay_us(x)関数を使っています。

(クリさんの言葉を借りれば・・・)「内部で静的な変数を使っている場合」両方のdelay_us(x)関数は、同じ変数を使っている可能性があります。言葉の通りだとすれば、間違った使い方だということがわかると思います。

要するに、さっきまで使っていたdelay_us(x)関数内部の変数が、使っている途中で、他の場所から使われてしまうわけです。
これでは、期待通りのプログラムにはなりません。

【良い例】
#int_timer1
void  timer1_isr(void)
{
int t;
   disable_interrupts(GLOBAL);
   output_high(ST_PLUG);
   for (t=0; t<24; t++) { }           // wait 100usec (at 8MHz)
   output_low(ST_PLUG);
   set_timer1(set_interval_p);
   enable_interrupts(GLOBAL);
}

void main()
{
 中略
  delay_us(val);
 中略
}

割り込みの部分で、 for 文を使って、delay_us(x)と同じ働きをするプログラムを作りました。

結果は、期待通りの動作となり、私が使っているCCSCのコンパイラでは、delay_us(x)は、「リエントラント性」が保障されていない事がわかりました。

割り込み関数を使う上で、
次の点に注意してプログラムを作ることにしました。
 ①割り込み中に、多重割り込みを防止するために、GIEピットをクリアする。
 ②割り込み関数は、極力簡素にする。
 ③リエントラント性を考慮する。

以上、事後フォローでした。

なお、回路は出来上がり、点火するところまでは、こぎつけました。
しかし、使っていたモーターから煙が噴いたので、また後戻り中です。
Speed400モーターは、起動時にあまり負荷が大きいと、20A(7.2Vで)も流れます。おそらく、タービンの回転がおかしかったときに、モーター内部の巻線が焼損したか、コミュテーター、ブラシ周辺が焼損したと思われます。

モーターは、高速回転タイプではなく、普通の380モーターでしばらくがんばります。

では・・・

------------------- 元記事 ---------------------
おおぉぉ~!
やっとプログラムのバグが直った!

バグはたくさんあるのですが、中でもどうしようも無かったのが、TimerとRAポートの割り込み制御でした。
割り込みを切っているはずなのに、切れてない。
どういうことなのか生成された(10年ぶりに)アセンブラを覗いてみると・・・
思ったようにコンパイルされていない!
コンパイルされたコードを見ると、何を意図しているのかよーわからん。

そこで、CCSCコンパイラで、インラインアセンブラを組んでみた。
(インラインアセンブラとは、C言語の記述の中に、無理やりアセンブラを組み込む方法)
CCSCのインラインアセンブラ記述はこんな感じ・・・

#asm ~ #endasm までの間がそのまま組み込まれます。

【実例】
#int_timer1
void  timer1_isr(void)                   // for plug heater interval
{
//   disable_interrupts(int_RA);    ←コメントアウトした元コード
#asm
      BCF    0x0B,3                   ←直接書いたアセンブラコード
#endasm
      set_adc_channel(0);              // set A/D channel
      delay_us(20);
      real_current = read_adc();       // plug current check by 10bit
      output_high(ST_PLUG);
      delay_us(200);                      // Make plug heat pulse
      output_low(ST_PLUG);      
      enable_interrupts(int_RA);
      set_timer1(set_interval);
}

これがコンパイラーのバグだとすると、ちょっと複雑な事をしようとしたときは、結局アセンブラがわかんないとやっぱダメなんだなーと思った。

CCSCには他にもバグっぽいところがいくつかある。
これらのコードを使うときは、バグに気をつけよう。
delay_ms(x)
delay_us(x)
delay_cycles(x)
disable_interrupts(x)

その他にも、割り込みにからんだコードを使うときは、なるべく他の割り込みを一時停止するのが良いです。
例えば・・・
・PWMのdutyを書き換えるとき等は、書き換える前に他の割り込みを止める。
・A/Dコンバーター(変換終了)や、EEPROM(書き込み終了)なんかも割り込みが絡んでるので注意。

CCS社(日本の代理店殿へも)にちょっと一言
Webで見るとCCSCのバグって結構ある見たいね。
有料でバグだらけの癖にアップデート期限があるなんてせこいぞ!
本国(アメリカ)で買うと12ヶ月、日本で買うと30日だけ?
どうにかなんないのかねぇ

では・・・

| | コメント (4)

2008年12月 5日 (金)

バグとの戦い

いやー、久々のブログ更新
皆様、お待たせしましたって、実は進んでないんですがね・・・
あまりに進まないんで、なんで進んでないのかを報告したいとおもいますね。
といっても、時間がかかってるだけで、のろまのカメのごとく進んでますよ(!)

【進まない理由その1】
新回路で、回路のバグ修正と格闘。
同一基板上で、あれもこれも一緒に動かす場合、モーターのノイズなどが悪さをします。
このノイズ対策が不足しており、電解コンデンサの追加や、
パターン引き回し変更を余儀なくされました。
又、プラグヒート用のPchFETの内部抵抗の高さで、どうしてもまともに電流が流れず、NchのFETに変更。
且つ、FETがあっちっちなので、FETは3個並列に!
Img_1429自作ECUは、なんだか
オブジェ見たいになっています。
これはこれで「作品(?)」かも


【進まない理由その2】
ハードルの高いプログラミングと格闘

前回、モータードライバーとして機能していた2つの8ピンのPICを
新回路では、1つ削減しました。1つのPIC(PIC12F683)をこれ以上使えないくらいフルに使ってます。各ポートの割り当ては、こんな感じ・・・
PIN_A0   Starter Plug Current Feed Back
PIN_A1   Starter Plug(自作PWM)
PIN_A2   Kerosin pump (内部PWM)
PIN_A3   Clock from MAIN
PIN_A4   Data from MAIN
PIN_A5   GUS Valve(自作PWM)

プラグヒート電流のフィードバック制御とかで、技量も無いのに難しい事をしてたので、ここでも時間かかってます。
ちなみに、MAIN側 CPUとの通信(片側通行ですが)は、SPIもどきの独自プロトコルにしてみました。(って言うとかっこいいけど、大したことはしてません)

【進まない理由その3】
CCS社製コンパイラのバグと格闘
有料のコンパイラなんですけど、時々バグってます。

いつもつかまるバグは、「Delay_xx()」ですかね。
入れる数字の大きさによって、割り込みが利かなくなります。
今、どうしようも無く困ってるバグは、「勝手に変数が変わるバグ」です。
if(valve_pwm_last != valve_pwm)
{
  中略
}
2つの変数を比較してるだけなのに、別のことをすると
勝手にValve_pwmの変数が変わってしまう・・・
変数の定義をintからlongにしてみたり、
if文の定義を無理やり変えてみたりしてますが、
なかなか直りません。(どーしよう・・・困った)
このバグが無くなれば、一段落するんですが・・・

ちなみに、PICの書き込みには、CCS社純正のICD-U40 を使ってますがこれまた使いにくImg_1430 い・・・
コンパイラからの直接書き込みは、超時間がかかるので、結局、単独でプログラマを起動し、コンパイルするたびに別の書き込みプログラムを使って書き込んでます。
そもそも、8pinや、18pinのPICでは、どうしても空きポートがなくなってしまうので、写真の様な、2段重ねROMソケット+切り替えスイッチを自作して使ってます。


【おまけ】
最近1週間で、どんな人がBlogに訪問してるのか、訪れる人の検索ワードを覗いてみました・・・
Blog_access
やはり上位を占めるのは「ジェットエンジン」ですが、PIC系の検索ワードも多いですね。(あんまり役に立ってなくてゴメンナサイ)

いつも上位に組み込むのは、mikrocですかねぇ。
PICのコンパイラですが、あまりにバグが多いので、私はやめました。皆さん困っているんでしょうね。

FETプラグヒーターを自作しようという人も多いようです。

「ジェットエンジン起動」の人は、自作を目指しているんでしょうか?
検索ワードを見てると、あーみんな考えることは同じなんだなぁ~とか思ってしまいます。

累計アクセス数:59119
一日平均:84.34
結構思ったよりもアクセスしてもらっているようなので、がんばらねば・・・

今週は、風邪を引いて、思考能力はメロメロですが、
バグとの格闘を続けますかぁねぇ・・・

| | コメント (4)

2007年9月 1日 (土)

回路図、プログラム公開

ジェットエンジンコントローラー(ECU)の回路図や、プログラムを紹介!

電子工作で困っている方、PICプログラムを始めようとしている方、参考になるプログラムが見当たらなくて困っている方。
ジェットエンジンのコントローラーは、電気回路はもちろんのこと、PICの機能を使いまくらないとできないので、参考になると思います。あんまりまとまってなかったり、変なプログラムだったりしますが、自分もC言語のプログラムは、20年ぶりなので、勘弁してくださいね。

では一挙に公開!

【回路図】

本体回路
入力系統-回転数、排気温度、バッテリー電圧監視、THU、AUX(受信機からの信号)
出力系統-始動用DCモーター、液体燃料ステッピングモーター、プラグヒーター制御、ガスバルブ制御
その他-操作パネルとの通信
Dsc07971
Ecu_PIC16F88-メインCPU
PIC12F629-ステッピングモータードライバーのドライバー
PIC12F629-プラグヒーターのPWM、ガスバルブのPWM
AD594(Analog Device)-熱伝対コントローラ
PQ1VZ1(Sharp)-DC/DCコンバーター(ON/OFF付き)、5Vを作る
MTD2102G(新電元)-バイポーラステッピングモータードライバー(入手困難かも)


操作パネル
本体に接続し、回転数、排気温度などを見たり、本体の設定をする。
いい加減に作ったので、基盤の裏はジャンパー線だらけである。(とても見せられない)
Dscf0195
Ecu__2
SC1602B-16x2行バックライト付きのLCD(秋月電子)
適当にDC/DCで昇圧し、5Vを作っている。


中継回路
Dsc07972
Ecu__3
必要か否かは別として、機体外部からプラグ、モーターなどの動作を確認する為の中継回路。コードの中継も兼ねる。



【その他のデバイス】

・熱伝対-秋月で買ったTypeK(TypeJは耐熱低くいので不可)
・ネオジウムマグネット(回転計に使う)
・ホールIC-DN6851/6852(Panasonic)-回転計に使用。(ホール素子は玄人向け)

【制御プログラム】

PIC16F88は、内臓8MHzの発信器を持っているので、外付けの水晶を付ける必要が無く、とても便利です。今回の回路は、すべて内臓発信器を使ってます。(ほんとは、20MHzくらいまで発信してほしいんだけど・・・)

ECU本体
 メインプログラム
     Jet_ECU_MAIN.c
      PWM、ADC、割り込み、EEPROM、シリアル通信の他、
      ラジコン受信機信号処理、回転数検知などあり!

 プラグヒーター(PWM)とガスバルブ(サーボ)のプログラム
     Jet_Starter_Plug.c 
      プラグヒーターのPWM制御、サーボの制御がわかります

      PIN_A3 - Gus Valve 制御入力
        電源ON直後に、2つの幅のPWM(Open/Close)を
        受信しそれを記憶する。
        その後は、Hi/LoでOpen/Closeを制御

      PIN_A4 - 点火PlugのPWMコントロール用の入力
        幅の異なるパルスで、PWMUpと、PWMDownを
         コントロール
        5msec→Up、2msec→Down


 液体燃料用ステッピングモーターコントロールプログラム
     Jet_Kerosine_Pump.c
      バイポーラのステッピングモーター制御がわかります。
      回転スピードによって、1-2相励磁 と、2-2相励磁 を使い分ます。
      ステッピングモーターは、敷居が高そうに見えるけど、
      まわすだけならほんとに簡単!

      ただし、バイポーラモーターは、モーターそのものもICも、
      なかなか手に入りません。(秋葉原で聞きまくったけどなかった)
      そんな時は、ちょっと古めのガラクタ電子製品からもぎ取ると良いかも。
      所長は、某C社の古いガラクタMFPから部品を取りました。

ECU操作パネル

     JET_ECU_CNT.c (LCD表示、キー入力、シリアル通信)
     lcd_lib.c」 (適当にモディファイして使ってください)


【開発環境】
  PIC開発環境 → ここみてね

  回路、パターン → EagleCadを使ってます 検索
              100x100mmまでならフリーで、且つ、
              基盤のパターンまで引ける優れもの。
              ものすごく癖があるので、英語マニュアル
              を熟読しないと独学では無理でしょう。
              でも、親切なHPや、掲示板もあるので、
              何とかなりますよ。
              ここにはお世話になりました
                 「Eagle入門
                 「とりあえずEAGLE BBS

 

| | コメント (0)

メインコントローラ 完成!

  しばらく、アップデートをサボってましたが、何もしてなかった訳ではありませんよ・・・

待望のメインコントローラーが完成しました。
ソフトもほとんどできてまっす!
後は、適当な所長理論で作った、エンジン本体の改造するだけで、動くんじゃないの!!!
※多数の方よりありがた~いご指摘を受けまして、所長理論は、撤回しますんで、ほんとにできるかもよ!

では、メインコントローラを紹介しますね。

Dsc07968 全部つないだところ
液体燃料ポンプと、エンジン本体以外は、これで完璧?



Dsc07882ECU基盤を一から作りました。
知る人ぞ知る、サンハヤトの両面基盤。
ベトナムはいつも曇っていて、パターンが焼けないので、日本からちびライトを買ってきたっす。

Dsc07883パターンができた図。
両面基盤って言っても、表と裏のパターンをつなぐスルーホールの加工はアマでは無理なので、ワイヤーを使って、表と裏をはんだ付け!約100ヶ所!!!
(表面実装部品があって、出っ張って困るところは、ゴリゴリ削る。)

Dsc07885 実装完(パターン焼きから、ここまで丸一日。単身赴任ならでは・・・)
パターンミスが何箇所もあり、裏で修正してます。
(裏面は絶対見せられん!)



Dsc07965動作確認してから、組み込み。
(上の写真から、この写真まで、パターン修整や、部品定数変更などで、丸一日。単身赴任でしかできない・・・)


Dsc07966
コネクタの説明①
左から、操作パネル接続コネクタ、THU、AUX、回転計、熱伝対


Dsc07967_2
コネクタの説明②
左から、バッテリー(Lipo3cell)、始動モーター、リセット、液体燃料ポンプ、ヒートプラグ、ガスバルブ)

Ecu

コネクタの説明③
自分で使っていた資料です。


とりあえず、すべての機能が動くようなので、次からは本当に動くジェットエンジンを目指します。

これからの作業
 ・本体作り直し(ベアリングなどの、材料は日本から調達済み。部屋はステンレスのガラクタだらけ!)
 ・液体燃料ポンプ作成(メドはたっておる)
 ・プログラム調整
 ・エンジン始動!!!

「所長理論」は次のように改めますんで・・・
 ・ディフューザー(吸入気圧縮) → つけます
 ・アンギュラベアリング(超高速回転) → つけます
 ・オイル → 供給します(あたりまえか・・・)

では、次に回路図とプログラムをアップするっす。

| | コメント (2)

2007年7月15日 (日)

ジェットエンジン テストベンチ完成

ジェットエンジンをコントロールする目処がたったので、
テストベンチをつくったっす。

とりあえず動画 → 「Jet_TestBench.MPG」(3.4M)

Dsc07665_1

手前右・・・始動用のブタンガス(カセットコンロのガス)以前に紹介した自作のガスタンクも快調。
手前左・・・ケロシンです(灯油ですが)



Dsc07671ケロシンのポンプ
ステッピングモーターで駆動だけど、動作はいまいち。
負荷が重すぎてよくモーターが脱調する。
(強力モーターがほしいっ・・・)
ドライブ用のICは、デュアルブリッジ内臓で
バイポーラ駆動用のICが手に入った。
ただし、16F88のピン数が足りないので、PIC12F629を
使って、ドライバーICをコントロールする。
ステッピングモーターの駆動は思ったより簡単よんっ!


Dsc07675

苦心のサーボガスバルブ!
サーボは、JRのNES-341
バルブは、テトラの燃料用ミニコックS
はじめは燃料バルブが重くて、ミニサーボでは無理かと思ったら、
動かしてるうちにだんだん軽くなってきたのであっけなく合体!
液体用のバルブだけど、気体でもばっちりで、一晩たっても
ガス抜け無し。(抜けてたら部屋がガスで充満たいへん・・・)

Dsc07668_1

ブレットボードに乗った回路です。
解説付けたので、興味のある方はどうぞ。

はじめは「16F88の1個だけでピン足りるから全部動くじゃん」と思ったが、
そもそも中身がマルチタスクのCPUではないので、あれもこれも
一度に動かすのは無理。
外に8本足のPIC12F629が2つも増ることになった。

1個目は上で紹介したステッピングモーターICを駆動する。
ステッピングモーター制御ICに対して、忙しくリアルタイムに
信号を送る必要があるので、仕方なく増えた。
16F88とは2本の信号線でつながっており、回転、スピードアップ、
ダウン、ストップのステータスを2進数の信号で制御する。

2個目は、プラグヒーターと、燃料バルブ用サーボを駆動する。
サーボ用のPWM信号と、プラグヒーター用FETへのパルスを送る。
16F88とは2本でつながってて、それぞれの機能を1本で制御する。
1本はプラグヒーター用で、パルス幅で電流を増減させる。
そんなの1個の16F88でできるじゃんと思ったが、
どっこい16F88はシリアル通信をしなきゃならない。
シリアル通信って、時間がかかるんだよね。って事で追加された。
2本目はサーボ駆動用で、High/Lowでバルブを開閉させる。
この2本目はよくできており(自画自賛?)、PICを起動したときに、
開と閉のポジションをあらかじめ16F88から、12F629へお知らせする。
(2つの幅が異なるPWM信号を送るだけ。)
この機能のおかげで、開閉位置の設定が、16F88側からできる。

それで・・・・
今日は、おっかなびっくり液体燃料を注入!
排気口が真っ赤になったので、ビックリしてストップ。
ケロシン注入してアッチッチになってるのに、モーターの回転そのままじゃ、
真っ赤になってあたりまえだ。
ジェットエンジンって、ジャンジャン回転数上げて、ブースト上げるんじゃ無いのかっ!

ということで、次のステップは、
①「ブースト上げて自立運転」(に失敗して大破して怪我)
②「パターン引いて、EUC回路を作り上げる」
③「ブーストあげる前に、本体の調整(バランスとかベアリング強化とか・・・)」
④気化器の作り直し
⑤排気ノズルの作り直し

のどれかだが、順番的には②③④⑤①か・・・?

| | コメント (0)

2007年6月24日 (日)

ジェットのコントローラー

久々の投稿ですなぁ~
日本に帰国したJoさんは元気でしょうか・・・?

あまりに毎日が忙しく、ジェットエンジン製作がなかなか進みません。
飛行機も飛ばしてないっす。

今日は、一通りの制御回路とプログラムができたので、
久々に投稿。「できたっ」て言っても、基本回路が動くだけ。
いちおう回転数、排気温度を見ながら、一通りの動作をします。
回路はまだブレットボードに乗ってますが、Jet_making_controlor






【コントロール】
 ・電源はLipo3Cellを5Vに落とす
 ・PIC16F88(手前)で全部を制御
 ・PIC12F629(右の2個)で、始動モーター、プラグ、ガスバルブのPWM制御
 ・MAX232(奥)は、デバック用のRS232電圧変換

 ※メインのPIC16F88は、外付け回路をケチるため、内臓クロック8MHzで
   動かしてるんで、そもそも3つのPWM制御を同時にこなすのは無理。
   そこで、始動モーター、プラグヒート、ガスバルブのサーボは、別のPIC12F629で
   動かすことにした。
   メインのPIC16F88は、液体燃料ポンプだけを制御する。

 ※ガスバルブサーボ用のPICはメインPICと1本の信号線でつながってる。
   開閉の2点だけの制御だが、それぞれのPWM値は、電源ON時にメインPICから
   送信し記憶。その後は、信号線のHi/Lowだけで制御。
   (ピン数無いんで、考えたよ~)

【入力回路】
 ・バッテリー電圧監視
 ・Turbine回転数監視
 ・排気の温度監視(左上の回路で熱電対の電圧変換)
 ・AUX、THUからの信号監視(今はON/OFFスイッチが付いてるだけ)

【出力回路】
 ・始動モーター(右手前のPICとFET)
 ・プラグヒート(右奥のPICとFET)
 ・液体燃料ポンプ(奥のFET)
 ・ガスバルブ(左のサーボを右奥のPICで制御)

【次は・・・】
 ・本体回路を完成させる。
  回路引き直し、パターン起こして、はんだ付け(いつになるやら)
 ・液体燃料ポンプがダメ
  細かい制御ができないので、ギアダウンするか、上等な物に変更する必要あり。
 ・プラグの位置がダメ
  今の位置では、点火困難。ガスと空気が混ざってない。
 ・コンプレッサーがダメ
  たぶん今の形状では、圧縮足りない。
 ・燃料気化器(ペーパーライザー)がダメ
  十分気化してないので、作り直し・・・
 ・ベアリングがダメ
  今のベアリングはちゃちいので、エンジンが本当に動いたら即死でしょう。
  今度日本に帰ったら、セラミックのベアリングを探すか?
 ・タービンのバランス
  そんなのあとあと・・・

えー!ぜんぜん駄目じゃん・・・
まだまだこれから・・・(日本への帰国指令の気配もまったく無いし・・・)

| | コメント (2)

2007年3月26日 (月)

PIC16F88でLCD表示

  パターンミス、仕様書理解不足、初期化問題、20年ぶりのC言語などの壁にぶちあたりながらも、ようやくLCDのドライブに成功したので報告です。
私と同じレベルの人には、非常に役に立つ情報だと思います。

素材:マイコン  Microchip社 PIC16F88
    LCD    SUNLIKE社 SC1602BS*B
    BUZZER、LEDなど

環境:デバッガ  Microchip社 MPLAB
    コンパイラ CCS社 PCM 

今現在の目標は、ジェットエンジンのコントローラーの制御パネル作成です。とりあえず、2桁x16行LCDの表示ができないと、何も進まないので、そこからスタート。20年ぶりのC言語ですら高い壁でしたが、結局仕様書だけでは読みきれない事もあったので、報告しますね。最大の難関は、LCDの初期化でした。

何も考えず電源の5Vだけ供給すると、2桁の上の表示だけ、真っ黒になります。
これは、初期化していない状態です。
初期化が中途半端だと、上の表示だけ薄暗くなります。←まともに動きません。まともに初期ができない人は、次をよく注意しながら回路、ソフトを見直してください。

【初期化できない原因】
16F84などのLCDライブラリを、そのまま移植しても、うまく動きません。下記のチェックポイントをよく見直すべし。

①電源の立ち上がりがおそい
  ちゃんと初期化シーケンスができているのに、
  初期化できない場合は、電源の立ち上がりが
  遅い可能性があります。
  初期化の初めは、15msecのWaitからですが、
  LCDの初期化条件は、
  「電源が4.5Vに達してから15msec」です。
  自分の場合は、100msecを入れるとまともに
  動くようになりました。初めてトライするときは、
  200~300msecのWaitからはじめると良いでしょう。

②余計なStrobe(E)信号がでてしまう
  ポートの出力をしていると、その気が無いのに、
  ストローブ信号が出てませんか。
  オシロがあればいいですが、無ければデバッガで
  見てください。

③Strobe(E)信号前、信号中のwaitが少ない
  ストローブをHighにする前に40usec、
  ストローブをLowにするまでの間230usec必要です。

④初期化中に、4bitと8bitを間違える
  初期化では、「0x30」3回のあと、「0x20」を送りますが、
  「0x20」は8bitモードで送信して下さい。
  (あたりまえですね?)

⑤PIC16F88のRA5は入力しかない
  この石で、RA5からアウトプットしようと思ってもできません。
  仕様書をよく読むべし。

⑥はんだ付けを甘く見ない
  悪いこと言わないので、テスターで見直してね。
  (最初にね)

⑦LCDの無使用ピンは、グランドに落ちてるかい?

【サンプル回路】
面倒なので、載せませんが・・・
下記の通りつないでください。PIC16F88は、ポートBにシリアルとかがあるので、私はLCDをポートAにつなぎました。データは4bitバスです。添付のライブラリは、ポートAで、しかもRA0~RA3に、LCDのDB4~DE7を接続して初めて動きます。RA5は"In"専用で、"out"できない為こうなった。(ここで10時間くらいはまった)
下記と違う接続をしても動かないので、あしからず。
RA4~RA7に、LCDのDB4~DB7をつなげる場合は、ライブラリのswap(xxxx)を抜いてください。

// RA0 out LCD_DB4
// RA1 out LCD_DB5
// RA2 out LCD_DB6
// RA3 out LCD_DB7
// RA4 out LCD_R/W         //read/write
// RA5 In   No use
// RA6 out LCD_RS           //chip select
// RA7 out LCD_E             //strobe

// RB0 out No use
// RB1 out No use
// RB2 out No use
// RB3 out No use
// RB4 out BUZZER
// RB5 out LED
// RB6 out No use
// RB7 out No use

【サンプルプログラム】 「PIC16F88_LCD_TEST.c」をダウンロード
上記環境で、とりあえずLCDの表示をするためのサンプルプログラムを作ったので、紹介します。Dscf0207Dscf0206
1. お約束の "Helo !"表示
2. そして、"Helo !"が右に行ったり、左に行ったり、最後は右にフェードアウト

3. 突然カウントダウンが始まる 10→9→8・・・
4. "ENGINE " → "ENGINE START !"

5. 全エリア表示
プログラムでは、LEDやブザーもピコピコ言わせてるので、とりあえず、LCDとその他回路の検証が簡単にできるようになってます。


自分のプログラムスキルが、たいしたこと無いので、あんまり難しいことはしてません。ポインタなんか使ってないので、C言語初心者の人は参考になるかも。

【LCDライブラリ】 「lcd_lib.c」をダウンロード
無理やりライブラリを作りました。(もはや財産!)
もっとスマートに作れそうですが、自分にはこれが限界です。


LCD表示をするために、必要不可欠な関数や、全てのコマンドも準備しました。
コマンドについては、ライブラリの#defineを参照してください。仕様書見てもなんだかよくわからない人は、このコマンドを使ってね。


//  lcd_init()                    イニシャライズ
//  cd_clear()                  クリアディスプレイ
//  lcd_ready()                 ビジーチェック
//  lcd_cmd(cmd)             コマンド送信(cmdにコマンドを入れて送る)
//  lcd_data("string")        文字を送信する("string"部分に文字を入れると表示する)
//  lcd_cur_set(Line,pos)   好きな場所にカーソルを移動させる
                 Line= 1 or 2 , pos= 左からの文字数
//  lcd_ltoa_out(long, digit)  桁数を指定して、数字を表示する
                   long= int or long の数字(最大65535)
                   digit= 桁数(最大5桁)


【PICのCコンパイラ】
PICには、いくつかのCコンパイラがありますが、情報が豊富、サンプル豊富、そんなに高くない、Webで購入できる。などの理由で、CCS社のコンパイラがお勧めです。
CCS社のコンパイラは、PICの種類によって、違うので注意。
また、下記の3種類は単独では動きません。MPLABにビルトイン(合体)させて初めて動くので、よくわからない人は、何で動かないんだろうと、悩まないでね。

PCB 12bitPIC  125ドル
PCM 14bitPIC  125ドル
PCH PIC18    175ドル
詳しくは、http://www.datadynamics.co.jp/ccs/pcwide.html
日本の代理店もありますが、値段は倍です。


MPLABと統合(ビルトイン、合体)させるためのプラグインはここ
Download the MPLAB® IDE Plug-in

合体方法の説明はここにもあるよ
http://www.datadynamics.co.jp/ccs/picc.html
 

【Special Thanks !】
お世話になったページ

電子工作の実験室
http://www.picfun.com/

SPECTRUM電磁工作のページ
http://speana-1.hp.infoseek.co.jp/index.htm

Cのもくじ
http://www9.plala.or.jp/sgwr-t/c/index.html

Microchip社
http://www.microchip.com

Microchip社 MPLAB IDE v7.xx (タダ)
http://www.microchip.com/stellent/idcplg?IdcService=SS_GET_PAGE&nodeId=1406&dDocName=en019469&part=SW007002

CCS社
http://www.ccsinfo.com/

CCS社 PCMコンパイラ
(125ドル カードで注文、メールで配達!)
http://www.ccsinfo.com/product_info.php?cPath=Store&products_id=PCM_full

CCS社 日本語マニュアルなど
http://www.datadynamics.co.jp/ccs/overview.html

|

2007年3月24日 (土)

PIC16F88のRA5はなんと

別にだれも読んでくれなくてもいいんだけど
はけ口がないので、とりあえず書くよ・・・(泣)

PIC16F88でとりあえずLCD表示のプログラムを組んだが、
一向に表示されず、つぼにはまっていた。
MPLABのDebuggerと何時間にらめっこしてたかわからんが、ようやく原因がつかめた。
きっと、おんなじつぼにはまった人もいるかも(俺だけか?)

LCDのデータバスには、ポートAの上位ビットを出力に当てていたが、なんと、RA5ピンは、入力しか対応してなかった!(うぎゃぁぁぁ)

Ra5_1

ほらね、RA4は「I/O」って書いて歩けど、RA5は「I」しかないでしょ。

ポートAとポートBをひっくり返すか?
(ダメダメ、シリアルポートが使えない)
それともポートAの上位と下位をひっくり返すか?
(プログラムめんどくさ)→(swapがあるよ)
基盤作り直すか・・・?
ほとんど何でもありの、16F88なのに・・・
仕様書読んでなかった俺が悪いんだけどね。
こういうのは、ブレッドボードとかで試作してから基盤作るんだよね。(ホントハ)

今日だけで、8時間。 貴重な休みが・・・!!!
だれか、プリントパターンのswapコマンド教えてくれ!
めしでも炊くか・・・

| | コメント (3)

2007年3月18日 (日)

回転計と温度センサー付けた!

今日は雨だったので、一日工作の日です。
日本にいたら家族がいるので、まる一日工作なんてムリムリ・・・
単身赴任のいいところですな。
飯はダイエットも兼ねて昼飯だけ(日本だったら残り物も出てきて太ってしまう・・・)

さて、エンジン本体の改造ですが、今日はジェットエンジンに欠かせないセンサーをつけました。
付けたセンサーは、回転計と排気温度計。

Dscf0202 カウンターが指している「173.2」はHzなので、
173.2×60≒10400rpm ってアンバイ。
下に写っているテスターが指している「027」はそのまま℃なので、室温の27℃ってアンバイ。

なぜか持ってるカウンター (周波数が計れるって便利!)
ホントはオシロがほしいんだけど・・・(ハノイで買うか・・・)

【回転計】Dscf0198
Dscf0199回転計のセンサーは、秋葉の千石電商で買ってきた、松下製のホール IC 「DN6851」
電源と出力だけの3pinなので、な~んにも考えずに、はんだ付けして、配線するだけで完成。
「DN6852」ってのもありますが、そっちはオープンコレクタタイプなので注意。

これからホール素子を使って、磁石の工作しようと思っている人へ。
間違えて、「ホール素子」買わないようにご注意。初心者が買うのは、「ホールIC」ですから~
自分も半年前に日本から買ってきた「ホール素子」の仕様書を見てビックリ(アンプとバッファが外付け!)買ったはいいが、永久に使うことは無いでしょう・・・

Dscf0197

めんどくさいかったのは、マグネットの取り付け。
日本から買ってきた「ネオジウム」製の最強磁石(φ6×t 3、3500ガウス、750円なり!なんとφ6mmで800gの吸着力だとか・・・、肩こりに効くかも!)を取り付けるために、コンプレッサーのブレードに穴あけして、スーパーXで接着して、バランス取り直し。
バランス取りでは、間違って軽い側を削り続けて30分後、重い方を削ることに気づき、1時間後に何とか完成。削りすぎでとてもスリムな仕上がりになり、満足。

【排気温度センサー】
Dscf0205秋葉の秋月電子で買ってきた、K型熱電対
-200℃~+1250℃まで計れるっす。
ジェットエンジンの排気温度は700℃に達するので、J型(600℃まで)ではダメ。

Dscf0204

テスト中の熱電対用のアンプは、AnalogDevice製 「AD594A」
±15V電源電圧で、1250℃まで計れますが、多分使うことになるだろうと思われるLipoの3セル電圧11.1Vでも1000℃まで計れるし、マイナス温度は測定不要なので、電源電圧は11.1VでOK!
「AD594A」はJ型用で、K型用は本当は「AD595A」なんですが、売って無かったので、594Aを買いました。
使い方間違っても温度が3割増しになるだけなので、プログラムで修正すればOK。

ってことで、次はC言語と格闘の予定。

| | コメント (0)

ECUのコントローラ ハード出来た

先週の休みを使って、ジェットエンジンのECUのコントローラ(操作盤)を作ったっす。
ジェットエンジンは空に飛んでしまうと、どうなっているのか皆目検討がつかないので、私に代わって機体に乗ってコントロールしてくれる人が必要です。実際は人ではなくて、ECUって言っていう、マイコンが乗ったやつがコントロールしてくれます。(はず)
先週作ったのは、そのECUに地上で接続して、設定、モニターなんかをするためのコントローラ(操作盤)です。これ↓Dscf0194_1 Dscf0195_1Dscf0196_2

なにやら ICっ ぽい物が載っていますが、 18pinのICがPICと言われているマイコン君です。流行のPIC16F88。

マイコン君は、頭がいいのですが、まだ何にも教えてない(プログラムしてない)ので、今はボケーっとしているだけです。これから教えてあげなければなりません。
その前に私がプログラミングを誰かに教えてもらわなければならないんです。(実は)

今からアセンブラを組むつもりはないので(考えるのがめんどくさい)、C言語をと考えてますが、C言語は20年くらい使ってないので、すっかり忘れてるし、最近の統合環境にもついて行けてません。しかし、いろいろなC言語のライブラリや、解説書、HPを駆使し、人のプログラムをパクリながら、なんとか開発を進めていこうともくろんでいます。

とりあえず、MikroCという無償版のC言語環境ではじめてみましたが、「LCDなんか簡単さ」なんてどこかのHPに書いてありましたが、ぜんぜん出来ない!
LCDの仕様書と、MikroCのHELPをにらみ続け、3日間かけてやっとLCDのリセットが出来たところです。
しかし、MikroCはバグだらけのようで、「絶対に間違えないようの無い3行の私のプログラムでさえコンパイルが出来ず」その後が続きません。もちろん私のプログラムもバグだらけですが・・・
MikroCの解説をしたHPはありますが、親切なようで、私には親切ではないし・・・
結局、MikroCはあきらめて、後閑さんとうPICの神様みたいな人がつくるHPで推奨している環境を整えることにしました。

コンパイラ CCS社の「CCS Cコンパイラ」 
環境     MICROCHIPのMPLAB

CCS社のコンパイラは、ネットで注文すると、メールで送られてくる様です。
さっき注文したので、早くて月曜日ですかねぇ。
MPLABは、無償なので、今からダウンロードします。
それとついでに、後閑さんの出版した名著と思しき「C言語によるPICプログラミング入門」を紀伊国屋に注文。(日本の自宅に送り、日本からベトナムに応援に来る会社の人に持ってきてもらう)

ということで、今日はマイコン君の開発環境もないし、外は雨なので、エンジン本体の改良でもしよっかな~(日曜日も忙しくて休むひまなし!!!)

| | コメント (3) | トラックバック (0)