水面下で アタヾ(・・;)ノヾ(;・・)ノフタ"> 水面下で アタヾ(・・;)ノヾ(;・・)ノフタ">

水面下で アタヾ(・・;)ノヾ(;・・)ノフタ

0
18日ぶりのブログです“r(^^;)ポリポリ
SP-TDCにいたっては1ヶ月の沈黙でございました“r(^^;)ポリポリ“r(^^;)ポリポリ
 
途中、本業のサーバー移転作業があったり、
出口の見えないSP-TDCのバグと闘ってたりで、とっても記事かけませんでした(-o-)
 
そんで今日はそのSP-TDCの見えないバグのネタでございます。
 
もうみなさん聞き飽きた感のある、例のカタナの怪ですね(^_^;)
8000rpm~9000rpmの間で、追い越し加速のときにたま~に失火らしき現象が出るってやつです。
このバグをとっつかまえるために、くるくる3号やらピックアップローターまで作りました(┐・・┌)ゲッソリ…
 
現象は、これまた たま~に再現できるものの、何が原因なのかをつかまえるまではいたらず・・・
 
最終的には、カタナのローターだけからの調査はあきらめて、
SRX600、ZZR1100Cのローターからも散々チェックしてみました(┐・・┌)ゲッソリ…
 
くるくる3号も酷使したから 既にボロボロです(笑
2万回転までまわすためにベアリングまでいれました┌(* ̄0 ̄)┐ ワーッハッハッハッ・・・・
そのベアリングも既に限界です。
 
作業台の上もワ~~ って感じ。
闘いのあとですね(^_^;)
 
んで、1ヶ月かかってやっっっっっっと失火が起きる瞬間のログを取ることができましたよ(☆Д☆)キラリーン♪
 
採取できたログを使って、今度はパソコン上のデバッガで再現です( ̄‥ ̄)=3 フン
 
これも十数時間かかって、ようやくデバッガ上で失火を出すことができましたよ┐( ̄ヘ ̄)┌ フゥゥ~
 
さぁ!! 原因はなんなんだぁ!!!凸( ̄ヘ ̄)
 
どうもタイマーと割り込みが重なると起きてるみたい・・・
PICの中では、エンジンの回転状況を把握するためにタイマーを使っていろいろと測ってるんですね。
ちょうどストップウォッチでタイムを測るような感じ。
 
そのストップウォッチの時間を見ようとした瞬間に、IGコイルのONとかOFFが重なると現象発生!
 
かといって、重なったからっていつも出るわけじゃない?! なんで???
 
どの程度重なったら現象が出るのか、さらに詳しくみてみたら・・・
その時間・・・
なんと0.125マイクロ秒w( ̄▽ ̄;)wワオッ!!
 
1マイクロ秒は100万分の1秒です。
この0.125マイクロ秒っていうのは、PICが動く最小単位時間なんです。
 
その単位で処理が重なったときにだけ出る現象・・・
わかるか!そんなもん(○`ε´○)プンプン!!
 
で、どういうことなのか・・・
難しい話をテキトーに説明しますと(笑
 
PICがストップウォッチの時間を読む動作なんですけど、
これが意外とPICはアホでして、下桁と上桁にわけてしか読めないんですね。
 
例えばストップウォッチの時間が10秒だったとすると、
一の位が0なんだな ポリポリ f  ̄. ̄*)
十の位が1でぇ~ ( ̄ω ̄;)エートォ…
って感じで読むわけですね。
 
なので、一の位を読むのに0.125マイクロ秒、十の位を読むのに0.125マイクロ秒、
合計0.25マイクロ秒かかるわけです。
 
そんで、一の位を読んだ直後にIGコイルONの仕事をするとどうなるか?っちゅう話です。
 
ストップウォッチの時間が9秒をさしてたとすると・・・
 
え~っと~ 一の位がぁ~・・・ 9だな。
そんで十の位がぁ・・・ え?! おっといけねぇ、IGコイルONする時間だ。
IGコイルON! っと♪
 
え~っと~・・・ なんだっけ?
あ、そうそう、十の位読むんだった。
え~っと~ 十の位は~  1だっ!! (⌒▽⌒)ノ
 
てことで今は19秒デース♪
 
 
・・・ ちがうだろっヾ(- -;)
 
結局、一の位を読んだあとにIGコイルの仕事をしてる間に1秒すすんでしまってるのでした┗( ̄□ ̄||)┛
それから十の位を読むもんだから、PICが19秒だと思ってしまうってことでした orz
 
それって、プログラムの作りが悪いだろってお思いでしょうが
違うんです。
 
PICはPICでも、PIC18Fからはこういう下桁と上桁のズレはなくなりましたU\(●~▽~●)Уイェーイ!
ってマニュアルに書いてあるんですo( ̄ ^  ̄ o) プィッ!
 
それなのに、ズレんじゃねぇかよっ!!!
 
確かに、タイマー値を読んでる最中に割り込み処理をやったら・・・ 
そんなこともマニュアルには書いてませんけど(-o-)
 
時間を読み間違ってしまっては、進角計算はメチャクチャになりますよね┗( ̄□ ̄||)┛
 
プログラム20年以上作ってますけど、
こういう言語のバグっていうか、仕様のちがいっていうか、
そういうのがたま~にあるんですよね。
こういうのって、ほんっと見つけるのが大変です(^_^;)
 
しかも、事務系のプログラムならまだしも、
イグナイターのプログラムだから、0.125マイクロ秒の間にIGコイルのONかOFFがこないと
起きないし、更にタイマーの桁が繰り上がるときにしか起きない。
こりゃなかなか見つからないわけです(┐・・┌)ゲッソリ…
 
 
そんで、ストップウォッチ見てる最中は、他の仕事をやらなくてヨシ! ってことにしまして、
そしたらPICくんは間違うことなく仕事をするようになりました(*゜▽゜ノノ゛☆パチパチ
 
これで、くるくる3号チェックでは どうやっても失火は起きなくなりました♪
 
やっと次にすすめるε- ( ̄、 ̄A) フゥー
 
このバグ見つけるの・・・ なげぇ~よぉ~ orz