google-site-verification: google3bd66dd162ef54c7.html

PICAXEを使ってみる-その3 タイマー割り込みが無い?

 引き続きPICAXEの話。

 LEDをピコピコさせるUSB電流チェッカーを製作中です。前の記事でタイマー割込みが使えなくて困ったのですが、その後マニュアルを読み込んでみてもタイマー割り込みの話は出てきません。どうも08M2にはこの機能はサポートされていないみたいです。

 でも現在製作中のUSB電流チェッカーのような簡単なプログラムなら対策方法があります。

▼対策前のプログラムの実行時間
対策前の実行時間
 この波形は c.0 Pinの波形で、プログラムが実行中にHiになります。最短だと2.8msで処理出来るのに、if文で分岐があると7.4msまで処理時間が伸びています。この処理時間の違いを吸収するためにタイマー割り込みを使いたかった訳です。

 でもタイマー割込みが使えないなら、ソフトでiF文の分岐の有無にかかわらず同じ処理時間になるようなプログラムにしてしまえば隠蔽する必要も無くなります。

つまり、
if aaa = bbb then
  let aaa = ccc
endif

と書く代わりに

if aaa = bbb then
  let aaa = ccc
else
  pauseus x    ; wait same time
endif

と書いて、pauseus x でif文が成立したのと同じ時間を else 側で消費させれば分岐の有無にかかわらず処理時間は同じになります。
 (pauseus命令は 指定値 × 10μs 待つ関数です)

こういう対策を行った結果,

▼対策後の実行時間
対策後
 どんな条件でも処理時間は約7.4msになりました。これならタイマー割り込みは不要で、10ms周期にしたいのなら、残りの2.6msをpauseus命令で待たせればOKです。

 この方法はアセンブラで書くプログラムの実行時間を調節するテクニックの一つです。ただBASICのような高級言語では、環境やバージョンによって実行時間が変わってくる可能性が大きいのでいつも同じ結果が得られるとは限らないのが難点です。また処理する内容によって実行時間が複雑に変わる関数などの場合はお手上げです。

 でも、PICAXEは石の中にインタープリターが入っているみたいなので案外大丈夫な場合が多いかもしれません。ただ、PICAXEがターゲットとするユーザーの多くはオシロとか持って無さそうなので、だれでも出来る対策方法では無いのが最大の難点かもしれません。

 参考に、USB電流チェッカーの対策後のプログラムはこちら

tag : 処理時間 08M2

PICAXE(ピカクス)を使ってみる-その2 USB電流チェッカーの製作

 前の記事でPICAXEをいじる環境を作ったので、早速具体的なテーマに取り組んでみました。

 課題は、USBの電流チェッカー。

 ええそうです、ついこのあいだArduinoで作ったばかりの物と基本は同じです。コンセプトとしては、充電電流の大小がLEDの点滅周期で判る物。Arduinoで作ったやつは累積電流が表示出来ます。でも使ってみるとほとんどの場合は、累積電流の測定機能は使いません。それよりもLEDの点滅で「充電中で電流がじゃんじゃん流れているかどうか?」が判るのがすごく便利です。

 ということで、電流だけ判る物をPICAXEで作ってみました。といってもまだブレッドボードの段階です。

▼ブレッドボード
PICAXEで試作
 PCAXEのCPU以外はLEDと抵抗が少々。

▼回路図(クリックで別窓に拡大)
USB電流モニタ回路図
 めちゃめちゃシンプルです。こんなふうに8PinのPICを使うのに憧れていたんですが、PICAXEのおかげで簡単に実現できました。

 おっと、これがどういうふうに動くか、説明を全くしていませんでした。

 動作としては、USBの電源電流を測定して電流の大小でLEDの点滅周期を変えています。つまり、電流が多ければLEDのチカチカの点滅速度が速くなります。これがあると、スマホなどの充電をする時にまだ充電中か、はたまたもう充電が終わったかなどが簡単に判ります。
 LEDの点滅速度は電流に比例。LEDは二つあって、片方は1A流れた時に毎秒1回。もう一つは0.1A流れた時に毎秒一回点滅します。これなら2Aから0.01Aあたりまで広い範囲で充電の状態が判ります。

 とはいってもまだPICAXEのプログラミングの勉強段階で、まだ完全に使い方が判っているわけではありません。

 一番の問題はPICAXEの実行速度がめちゃくちゃ遅いこと。このチェッカーでは2A流れた時に高速側のLEDの点滅周波数は20Hzが必要です。この速度はArduinoでは楽勝ですが、PICAXEだとかなり苦しくなります。

 それと、タイマー割り込みなどの方法で正確な周期でプログラムを動作させる方法が見当たりません。

 Arduinoみたいに処理速度が速くて、それこそ数十マイクロ秒で処理が終われば、タイマー割り込み無しでdelay関数でもいけます。でもPICAXEでは処理が数ミリ秒もかかるので正確な周期で動かすうまい手が見つかりません。

  とかなんとかで作った現在のプログラム

 これ、正確な時間間隔で動かすのは諦めてます。LEDの点滅時間の誤差は10%以上あると思いますが、まあ目安に使うなら許容範囲。PICAXEで例えば10ms間隔で割り込みかける方法は本当に無いのかな。

 PICAXEで残念だったことばかり書いてますが、デバッグの画面はすばらしいです。

▼DEBUG画面
PICAXEのDEBUG画面
 こんなふうに内部の変数がリアルタイムで表示出来て、これは便利。但しDEBUG画面のデータを一回送るのに数十msが必要です。

 それと、この画面を見て思い出したのは、PICAXEでは変数のメモリーのへのアサイン方法がすごく原始的であること。変数の名前はw1とかb1とかあらかじめ決まっていて、各々の変数のメモリー上の位置も固定です。実はこの仕様が最初は全く理解できませんでした。適切な変数名の選択は、良いプログラムを書く時に重要なんですが。(変数名はsymbol命令で他の名前にマップすることはできます)
 PICAXEのプログラムを書くには、変数とメモリー上の位置の関係を正確に把握していないといけません。見かけはBASICですが、変数の利用つまりメモリアクセスに関してはアセンブラと思わないといけません。

 なんだか最後はぐだぐだの記事になりました。
カレンダー
04 | 2013/05 | 06
- - - 1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31 -
プロフィール

ラジオペンチ

Author:ラジオペンチ
電子工作を中心としたブログです。たまに近所(東京都稲城市)の話題など。60過ぎて視力や器用さの衰えを感じつつ日々挑戦!
コメントを入れる時にメールアドレスの記入は不要です。なお、非公開コメントは受け付けていません。

記事が気に入ったらクリックを!
最新記事
カテゴリ
最新コメント
リンク
FC2カウンター
検索フォーム
月別アーカイブ
RSSリンクの表示
QRコード
QRコード