• ベストアンサー

SH2のタイマ出力

Sh7050のダウンカウンタで16bit以上のタイマ出力を実現する方法はあるのでしょうか? ルネサステクノロジのSH2/SH7050のチャネル10(ダウンカウンタ機能)を使ってタイマ出力しようとしています。チャネル10は16bitタイマなのですが、出力時間はそれ以上(16bitの100倍ほど、24bit)必要です。他のタイマを並列で動作させてオーバーフローを数えることで延長すれば出来るように思うのですが、いい方法を考え出すことが出来ません。どなたか手が空いていれば、お願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • zwi
  • ベストアンサー率56% (730/1282)
回答No.11

>SH7050では、ある割り込み処理中に、それより優先順位が高い割り込みが発生すれば自動的に多重割り込みとして処理してくれたと思うのですが、私の覚え違いだったでしょうか?(割り込み検知後、マスクビットや優先順位を判定して処理に分岐するまでの時間のことでしょうか? だとすれば、確かにそれは想定外でした)。 多重割り込みは可能です。ただし、「6.5割り込みの応答時間」に書いてありますが、割り込み動作に割り込みが重なったときに割り込みが遅延してしまう可能性があります。 割り込みのマスクビットや優先順位を判定を含む一連のシーケンス(X=4+m1+m2+m3+m4)がマイコンの制御シーケンス上中断できないので、その間割り込みが一切受け付けられないからです。割り込み開始が数ステート差のタイミングで重なるケースはレアでしょうが、レアなゆえに問題が無いことを実証することが困難です。 >パルス幅が可変のとき、何か競合が発生するのでしょうか?現在、パルス幅が16bit以上であるとき、 > パルス幅 = (割り込み周期) × (割り込み回数) + (ダウンカウンタ) - (補正値) >という具合に分解しているのですが、ご指摘の危険なタイミングとはどういう状況で発生するのでしょうか? 16bitをぎりぎり超えたとき、うまく計算できますか?心配したのはそのあたりです。 やはり色々と問題がありますので、組み込み機器として考えた場合はこの様にソフト的にパルスを作るのは私なら徹底的に避けます。精度誤差だけで駄目だしされるようなシビアな状況では危険な綱渡りですよ。 回路(CPLD)で作れば、目的の精度のパルスが簡単に出せることを考えるとなんでもソフトでやるのは手間が多く信頼性が低くなります。 最終的にどちらが得なのかの判断は上司がすることですが、ハードの知識が不足しているからと検討もせずにソフトだけでやることは無謀です。

kagiyo
質問者

お礼

回答ありがとうございます。 16bitまで正確に出力できるなら、それ以上は精度が少々落ちても問題にはならないらしいです。 16bitぎりぎりについては、大丈夫なはずですが検証してみます。 >最終的にどちらが得なのかの判断は上司がすることですが、ハード >の知識が不足しているからと検討もせずにソフトだけでやることは無 >謀です。 耳が痛いです。次回までの自分への課題としておきます。

その他の回答 (10)

  • zwi
  • ベストアンサー率56% (730/1282)
回答No.10

R32Cさんの意見も含め考えてみましたが、どの程度の精度のパルス幅まで保障するかでやれる事も変わりますね。 ここまで精度を保障する割り込み処理を組んだことがないですが、他の割り込みがあると、いくら優先度が高くても割り込み例外処理中は(低いレベルの割り込みでも)割り込み禁止になるので割り込みが遅延する可能性があるはずです。たぶん、十数ステートでしょうが。 他の割り込みがまったくなくてカリカリにチューン(割り込み内はアセンブラで、最適化レベルの影響を受けないようにとか)すれば、タイマの1クロック単位の精度が出せそうな気がします。 ただし、パルス幅が可変だと割り込み周期との関係で補正しきれない動作タイミングが出てくるのでパルス幅可変は危険です。もし対応するならパルス幅に合わせて割り込み周期も可変してチャネル10のカウンタ補正値も可変すると言うそうとう面倒な処理が必要そうです。

kagiyo
質問者

お礼

回答ありがとうございます。 SH7050では、ある割り込み処理中に、それより優先順位が高い割り込みが発生すれば自動的に多重割り込みとして処理してくれたと思うのですが、私の覚え違いだったでしょうか?(割り込み検知後、マスクビットや優先順位を判定して処理に分岐するまでの時間のことでしょうか? だとすれば、確かにそれは想定外でした)。 パルス幅が可変のとき、何か競合が発生するのでしょうか?現在、パルス幅が16bit以上であるとき、  パルス幅 = (割り込み周期) × (割り込み回数) + (ダウンカウンタ) - (補正値) という具合に分解しているのですが、ご指摘の危険なタイミングとはどういう状況で発生するのでしょうか?

  • R32C
  • ベストアンサー率39% (115/290)
回答No.9

自己レスですが、 >パルスを出すことが目的なんでしょうか? ソフトでパルスオンオフするなら、設定後オン割り込み後オフ することで可能と思います。 Ano5補足にてソフトでオンオフするようなのでこれはOKのようですので Ano5の補足よりオーバーヘッドは少ないと思いますが それから、Ano5補足について、ソフトでカウント書き換え時間が一定化 することでオーバーヘッド一定にすることは最優先の割り込みなら可能 なことかと思います。現状の方法で問題ないと思っています。 ただそれなら ANo1の方法でも最優先割り込みで実施すれば同様に実現できるようにも 思いますが...

kagiyo
質問者

お礼

ありがとうございます。 社内で「これでいきます」と宣言した後なのですが、考えるほどに提案いただいた「オフセット+ ダウンカウンタ」の方がシンプルで確実に思えてきます。 少なくとも現状の方法によるパルス出力中に、優先順位の低い割り込みを意図的に何度も発生させてパルス出力幅が乱れないか確認が必要ですね。乱れなくとも「オフセット+ ダウンカウンタ」について実験しておくべきなようですね。

  • zwi
  • ベストアンサー率56% (730/1282)
回答No.8

>ベストではないですが、現状これで進めます。もっとシンプルなアイデアがありましたら、引き続きよろしくお願いいたします。 >(実はSH7050は端子入出力とタイマ機能に関しては、今回の質問とは別の機能で埋め尽くされつつあり、あまり自由には使えない状況です)。 確かにベストじゃないですね。 他から割り込まれないのならば、この方法でパルス幅は精度を高く制御できると思います。しかし、逆に割り込まれるとフォロー不能です。他の割り込みがないマイコンの使用用途ってのが思いつかないですが、大丈夫なんでしょうか? 後割り込み禁止のタイミングがあっても破綻しますね。 回路が変えられないのなら、この方法ぐらいしかありませんが出来れば回路設計かCPU選定のをやりなおしを勧めしたいです。

kagiyo
質問者

お礼

回答ありがとうございます。 ダウンカウンタによる割り込みを最優先にしておけば問題ないだろうと考えていたのですが、優先順位が低い割り込みでも致命的でしょうか? 今回の質問に関しては、SH7050を使用しているある用途の後継についての検討ですので、CPUを変えるのは現実的ではないですね。

  • R32C
  • ベストアンサー率39% (115/290)
回答No.7

10.3.6 の引用です。 タイマインタラプトイネーブルレジスタ(TIERF)への設定により、対応するダウンカウンタ (DCNT10A~DCNT10H)が0 になり1 クロック経過した時点で、CPU へ割り込み要求ができます。 --- つまりオフセット+ダウンカウンタ経過後割り込みが発生できる パルスを出すことが目的なんでしょうか? 上記引用にあるとおり、指定時間での割り込みを発生できると思いますが いかがでしょうか?

kagiyo
質問者

お礼

回答ありがとうございます。 提案いただいた方法では、少なくともパルス出力開始は、ダウンカウンタによるタイマ出力とは別の端子を制御することになります。パルス出力終了もその端子をソフトウェアから制御する(ダウンカウンタによるタイマ出力を使用しない)という手もありそうですが、パルス出力幅が16bit以内であればダウンカウンタ単体の機能を使用して正確に出力したいので、  (1)16bit以内の時:ダウンカウンタによる端子出力  (2)16bit超の時 :ソフトウェアで制御する端子出力 を外部回路で合成する必要が出てきます。 しかし、SH7050のタイマ機能の使用法としては、確かにこちらのほうが格段にシンプルですね。

  • zwi
  • ベストアンサー率56% (730/1282)
回答No.6

CPLDやFPGAなどでパルス発生回路を丸々作ってしまうって方法は使えない状況でしょうか?Sh7050側は、CPLDやFPGAのパラメータの設定をするだけになりますけど。 kagiyoさんの求められる精度のパルスをSh7050だけで作り出すのは難しいと思います。周期と幅の両方を精度を高く制御したいんですよね?

kagiyo
質問者

お礼

回答ありがとうございます。 CPLDやFPGAについては、その概念をうっすらと知っている程度で、扱ったことが全くないので、私にはそこまで手を回せません。 昨日私が書き込んだ「ダウンカウンタの値を書き換えることによるパルス幅制御」についてルネサステクノロジに問い合わせたところ「正確なパルス出力はできない」との返答でした。

  • zwi
  • ベストアンサー率56% (730/1282)
回答No.5

#1のzwiです。 訂正します。 すいません、タイマ0をパルス出力に使えないみたいなので精度は無理ですね。 R32Cさんの提案されたオフセット付ワンショットパルス機能だけで周期を精度良くコントロールできなければ、外部回路に頼るしかないでしょう。 どちらにしろ、パルスの周期だけでなくパルス幅とかも精度が必要だと外部回路しか選択肢はたぶん無いです。

kagiyo
質問者

お礼

たびたびアイデアを頂き、ありがとうございます。 チャネル10は外部クロックを選択できないので、外部回路との 接続も工夫が必要になりそうです。

kagiyo
質問者

補足

いろいろと考えていただき、ありがとうございます。 実は、以下のような方法で簡略的に実現しました。 (1)パルス出力幅を、以下二つに分担させる。   ・ダウンカウンタ   ・タイマ割り込み    (2)ダウンカウンタの動作とタイマ割り込み用タイマの動作を開始   →パルス出力開始 (3)タイマ割り込み処理内でダウンカウンタの値を定期的に 一定値に保つ処理を行うことで、   ダウンカウンタのアンダーフローを発生させないようにする。 (4)タイマ割り込みが規定回数に達したら、ダウンカウンタの値を一定値に保つことを停止する (5)ダウンカウンタのアンダーフローが発生し、パルス出力終了 この方法ではソフトウェアの処理時間に影響されてしまいますが、逆に言うと他の割り込み処理が発生したりしなければ、パルス出力幅は一定になります。(ズレはありますが、そのズレが常に一定で変動しないなら、差し引くことである程度は相殺することができます)。 ベストではないですが、現状これで進めます。もっとシンプルなアイデアがありましたら、引き続きよろしくお願いいたします。 (実はSH7050は端子入出力とタイマ機能に関しては、今回の質問とは別の機能で埋め尽くされつつあり、あまり自由には使えない状況です)。

  • zwi
  • ベストアンサー率56% (730/1282)
回答No.4

>急いでいたため質問には書かなかったのですが、パルス出力の確度(時間精度)の点から、プリスケーラで分周したり長周期の外部クロックを使うことが出来ません。 外部の回路が使えないとなると苦しいですね。CPLDが使えれば楽勝ですが。 アイデアとしては、別のタイマーチャンネルでタイマパルス出して、それを再度自分の外部入力クロックとして入れてチャネル10でダウンカウントしてパルスを出すぐらいですかね。当然回路の変更を伴います。

  • R32C
  • ベストアンサー率39% (115/290)
回答No.3

精度が必要ということですので やったことありませんが オフセット付ワンショットパルス機能(10.3.12 ハードウエアマニュアル) というのを使ってみてはどうでしょうか? ダウンカウンタは、プリスケーラで荒く設定し、不足分をオフセットで 補えるように思います。フリーカウンタ(プリスケーラなし) がマッチした時点でダウンカウンタをハードウエアがセットしてスタートします。 詳しくはマニュアルを参照ください。

kagiyo
質問者

お礼

回答ありがとうございます。 もしオフセット付きワンショットパルス機能が、  (1)オフセット付きワンショットパルス機能発動  (2)パルス出力開始(High)  (3)オフセット時間経過  (4)ダウンカウンタのアンダーフロー  (5)パルス出力終了(Low) という順で機能すれば、正確な時間制御を保ちつつ長時間のタイマ出力が可能なのですが、実際にはこの機能は  (1)オフセット付きワンショットパルス機能発動  (2)オフセット時間経過  (3)パルス出力開始(High)  (4)ダウンカウンタのアンダーフロー  (5)パルス出力終了(Low) の順で起動します。つまりパルス出力幅についてはワンショットパルス機能単体と同じなのです。難しいものですね。

  • R32C
  • ベストアンサー率39% (115/290)
回答No.2

2段のプリスケーラを設定すればいいんじゃないですか? PSCR1 φ/32 と TCR10 φ/32 で分周できるはずですが

kagiyo
質問者

お礼

回答、ありがとうございました。 急いでいたため質問には書かなかったのですが、パルス出力の確度(時間精度)の点から、プリスケーラで分周したり長周期の外部クロックを使うことが出来ません。

  • zwi
  • ベストアンサー率56% (730/1282)
回答No.1

16bitタイマで割り込みを発生させて、割り込みごとに変数で8bitの上位桁をカウントすることで事実上24bitにすることは可能ですが、それではだめですか? 処理時間さえ問題なければ、あえて別のタイマでカウントする必要は無いと思いますけど。

kagiyo
質問者

お礼

回答ありがとうございました。 今使おうとしているダウンカウンタでは割り込み要因はアンダーフローのみとなっています。そしてアンダーフローの時点でタイマ出力する仕様なので、そもそもアンダーフローを起こさない必要があるのです。 私の質問に説明不足な点があり、失礼しました。

関連するQ&A