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で一定周期で処理させるアイデアです。
たんなる思いつきなので実用に耐えるかは分かりません。
・PWM出力をどこかの入力に繋ぐ。
・PWMを10ms周期、Dutyは50%とか適当に設定し動かす。
・「どこかの入力」を常に読み出し、0から1に変化するのを検出する。
・検出したら必要なプログラムを起動する、さもなければ読み出しを続ける。

問題点
・08M2ではピン数が足りないかも知れません。
・10ms周期は処理速度的にきついかも知れません。
・「どこかの入力」の読み出しも多少ばらつくので常に10ms周期にはならず、周期がばらつきますが平均的には10ms周期になると思われます。

眠い頭で思いついたことなので怪しいですが、参考になればと思います。

re:一定周期処理のアイデア

TK-80BSさん、コメントありがとうございます。

I/Oピンからの割り込み機能はあるので、外部信号で叩く案はちょっと考えたのですが、LSI一つでシンプルな構成にしたいので却下してました。

なるほど、PWMを自分に返せばいけそうですね。面白そうなので時間が出来たらやってみたいと思います。ナイスアイディア、ありがとうございます。

それにしてもTK-80BSとは懐かしい!

No title

短期間の間に色々と作られていますね。私はやっとI2C LCDを動かした位です。タイマー割り込みが無いのは衝撃でしたがw それを改善する発想に脱帽です。参考にさせて頂きます。

air_variableさん、おはようございます

やはりタイマー割り込みが無いといろいろやり難いことがありますよね。

それと、そちらのブログで紹介していただいてありがとうございます。たぶん今日のアクセスが増えそうな予感

アイデア倒れでした

お気づきかと思いますが、PWMで10msみたいに長い周期は分周比の関係で現実的には無理そうですね。
(PWM出力と「どこかの入力」の間に1/100位の分周器を入れれば可能ですがスマートじゃないですね)

お時間取らせてしまい申し訳ありませんでした。

re:アイデア倒れでした

TK-80BSさん、いえいえそんなことありません。このアイディアはちゃんと動いてます。

こんなふうにコマンド書けば
pwmout pwmdiv64, 2, 249, 128 ;PWM on C.2 2ms/16ms
setint %00000100, %00000100
タイマー割り込み出来てます。

ちょとすぐには時間が無いですが、近日中に解説記事でご報告します。

re:re:アイデア倒れでした

分周比の確認をしていなかったので少しあせってしまいました。
1/100は勘違いで、1/10(setfreq m4 で10ms周期前提)でした。

CPU周波数と割り込み周期に幅を持たせてよいならば、ギリギリ可能ですね。
重ね重ね失礼致しました。

記事楽しみにしております。
カレンダー
10 | 2017/11 | 12
- - - 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 - -
プロフィール

ラジオペンチ

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

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