4MHz なめんな?
マイコンに手を出して C 言語でプログラミングしているワケだけれども... 4MHz というクロック周波数を正直なめてました。マイクロ秒(us)単位で処理を判定するプログラムを書こうと思ったらコンパイラが吐き出すバイナリを意識しないとダメね。
有償のコンパイラを使ったらまたちょっと違うのかも知れないが、HI-TECH C を Lite(無償) モードだとちょっとでも冗長なコード書いたら数十サイクルくらい楽に消費される。
4MHz の PIC の 1 サイクルは 1us らしい。数十サイクル = 数十 us なんだけどこれがループで積み上がるとミリ秒(ms)単位でズレがでる。2200us(2.2ms)間隔のパルス信号を処理しようとしているのに ms 単位のズレとか無理。「組込系の人って大変なんだね。」とか思った次第です。
ちなみに、PIC は 1 命令 1 サイクルらしいから「ここでこの処理したら遅延は何 us だ?」とか、アセンブラだと考えながら、計算しながらプログラムが可能になる。そうか。それでみんなアセンブラでプログラム組んでるのか。
だがしかし、俺はこんなことでは快適な C 言語環境を手放さない。ラジコンの電飾制御プログラムくらいだったらコンパイラのコツを掴めばなんとかなる。と、思う。
ってことで一昨日のプログラムを少し変更。変更箇所は HI-TECH C の __delay 関数について若干の勘違いがあった部分。
「4MHz の場合、__delay 関数には引数として 197 しか入れれないよ。」ってのをどこかで読んだ。だから区切りの良い数字で __delay_us(100) を 16 回 for ループしてたワケなんだけれども... デバッグするとこの for ループもかなりのサイクルを消費することが判明。っても 数十サイクル、数十 us くらいなので AUX の HI/LO スイッチにとっては何の問題でもないんだけれども... 何となく気になるので書き直そう、と。
で、最初は __delay_us(100) を 16 行書いてみた。これはこれで悪くないんだけども... 個人的に同じコードを複数回書くとか嫌い。ホントにコレしか方法ないのか? と色々調べると... えーとね、__delay 関数に 197 しか指定できないのは __delay_ms の場合でした。__delay_us なら 197120 まで指定できました。そう、ミリ秒とマイクロ秒を勘違していました。素直に __delay_us(1600) と書き直しました。スッキリしました。
どうやら HI-TECH C の _delay 系関数は 197,120 サイクルを超える時間を設定できないということらしい。4MHz の場合、197,120サイクルは 197,120us であり、端数切り捨てして 197ms だ。__delay_ms の説明で 197 となっていたのを __delay_us も同じだと勘違いしてたみたい。__delay_us を使うなら堂々と __delay(1600) とか書いていい。いいんだよ。
ってことで修正版
若干のおっちょこちょいもあったが... この辺の事情を踏まえて次は一昨日書いた通りツーリングカー用の電飾制御プログラムを書こうと思っている。仕様は以下。
(1)AUX の HI/LO でフロント/リアライトの ON/OFF を制御
(2)TH の LO/HI でブレーキライトの ON/OFF を制御
ブレーキは LO 側でオン、フロント/リアは HI でオン、処理が逆になる。まあ、これはいいとして... AUX のパルスと TH のパルスの両方を見る必要があるのがポイント、だと一昨日も書いた。まあ、これをどうしようかというところで C 言語でプログラムした場合の注意点が出てきたワケです。
えとね、最初はね、50us くらいでループさせてその中で 2 つの処理を平行してやって行こうと思っていたのね、でもね、これをするとね、ディレイの計算がね、不可能だったのね。
まあ、約 2ms 間隔のパルス信号だから 2 つ同時に処理とか考えず、TH と AUX を交互に見ればいいだろうと。ブレーキしてから1~2パルス間隔くらいライトが点灯するのが遅れるかも知れないけど、そんなの人間が認識するのは不可能だろうと。実際にプログラム作ってブレッドボードで仮組みしてやてみたらこの方法でうまくいった。
ソースコードはもう少しブラッシュアップしてから、基盤レイアウトと一緒に公開しようと思う。ちなみに今回のツーリングカーは GT500 のレースカーのボディなのでウインカーとかない。普通の乗用車のボディとかドリフトカーだったらウィンカーが付く。そしてステアリングの信号見てウィンカー出したいとか思うかも知れないし、ニュートラルが一定時間続いたらハザード出したいとか思うかも知れない。TH、ST、AUX、入力が3本。フロント/リア、ブレーキ、ウインカー、出力が3本。8 ピンの PIC をフルに使えばこのくらいはできそうだ。最終的にはそこが目標になると思うけどドリフトしないし乗用車のボディとか持ってないからたどり着くかどうかは不明。
| 固定リンク
「ラジコンカー/RCカー」カテゴリの記事
- TA06 サーキット初走行(2011.06.30)
- TA06 PRO(2011.06.30)
- 3ch スイッチ(フタバ CPS-1 的なモノ)(2011.05.18)
- AUXスイッチとブレーキランプ ~ ソースコード編(2011.05.17)
- 4MHz なめんな?(2011.04.13)
「PIC/マイコン」カテゴリの記事
- 3ch スイッチ(フタバ CPS-1 的なモノ)(2011.05.18)
- AUXスイッチとブレーキランプ ~ ソースコード編(2011.05.17)
- 4MHz なめんな?(2011.04.13)
- マイコンに手を出しちゃった(2011.04.11)
この記事へのコメントは終了しました。
コメント