SSブログ

フリーランニング・タイマで周期割り込みを実現するには [電子工作]このエントリーを含むはてなブックマーク#

もし,マイコンのタイマの周期が指定できなかったら,周期割り込みはどうやって実現するのでしょうか.

フリーランニング・タイマ

その昔,M68HC11の標準タイマは,フリーランニング・カウンタとインプット・キャプチャ及びアウトプット・コンペアを組み合わせた構成になっていました. フリーランニング・カウンタとは,リセットまたはプリセット機能のないカウンタのことです. 例えば,8ビットのカウンタの場合には,カウンタの値は0からインクリメントされ,255の次はオーバフローを起こして0に戻ります. リセットやプリセットなどの余計な機能がないので,コスト的に有利です.

一方,マイコンを使う側からすると,これほど融通のきかないものはありません. マイコンを使う場合には,一定時間ごとに処理を行うアプリケーションが多くありますが,フリーランニング型のタイマのオーバフローイベントを使うと,タイマの周期を細かく決めることができません. さて,困ったな.

フリーランニング・タイマで周期的割り込みを実装する

free-running-01.png

そんなフリーランニング・タイマでも,周期的に割り込みをかけることは可能です. タイマのアウトプット・コンペア割り込みを使うのです.

アウトプット・コンペア割り込みとは,フリーランニング・カウンタと,あるレジスタ(OCレジスタとしておきます.)に格納した値とを比較し,それらが一致したら発生する割り込みの事です. この仕掛けは,OCレジスタと一致比較器だけで構成されるので,カウンタを別に用意するよりも簡素に作ることができます.

アウトプット・コンペア割り込み処理では,現在のOCレジスタの値に割り込み周期分のカウント値を足して,OCレジスタに書き戻します. すると,次回の割り込みは,必ず一定時間後に発生します.

アウトプット・コンペアは,タイマ落ちに注意が必要

ところが,アウトプット・コンペアを使った周期的割り込みの場合には,大きな問題点があります. 例えば,割り込み処理に時間がかかってしまい,OCレジスタに値を書き込んだ時には,すでにフリーランニング・カウンタがその値を超えてしまっていた場合,次回の割り込みは,いつ発生するでしょうか. その答えは,「フリーランニング・カウンタが一周してきたあと」です.

図の「タイマ落ちが発生する例」では,A地点直前の割り込み処理に手間取って,A地点を通り過ぎてからA地点のカウンタ値をOCレジスタに書き込んでいます. この場合,次回の割り込みは,フリーランニング・カウンタがぐるっと一周してB地点に達するまで発生しません. この現象を「タイマ落ち」と呼んでいましたが,一般的業界用語なのか,特定業界用語なのか,定かではありません.

タイマの周期を指定できる場合にも「タイマ落ち」が発生する可能性があります. しかし,この場合には,影響は軽微で済みます. 割り込み周期が2倍になる程度です. フリーランニング・カウンタが一周する時間に比べたら,はるかに短い時間になると思われます.

フリーランニング・タイマは,便利

とはいうものの,フリーランニング・タイマは,便利です. OCレジスタの値をソフトウェアから変更するだけで,任意の波形を生成することができます. また,異なる周期の割り込みをカウンタ一つで実現することもできます. その特性を理解して,注意して使えば,ソフトウェアが関与する割合が大きい分,色々な工夫が考えられます.

本日の記事は,あくまで,一般的な話題であって,実在の事件,現象,団体,人物などとは,一切関わりがありません.

nice!(1)  コメント(1)  トラックバック(0)  このエントリーを含むはてなブックマーク#

nice! 1

コメント 1

Ponta

>本日の記事は,あくまで,一般的な話題であって,実在の事件,現象,団体,人物などとは,一切関わりがありません.

何か嫌なことがあったのでしょうか?(笑)

フリーランニングカウンタ。最近使ってないな〜・・・。
by Ponta (2010-02-06 14:50) 

コメントを書く

お名前:
URL:
コメント:
画像認証:
下の画像に表示されている文字を入力してください。

トラックバック 0

トラックバックの受付は締め切りました

この広告は前回の更新から一定期間経過したブログに表示されています。更新すると自動で解除されます。