2017-08-03 5 views
0

HCS12のタイマ出力比較割り込みに問題があります。問題は、私がを計算していると思われます。の値は、イミディエートではなく、出力比較レジスタになります。つまり、...HCS12埋め込み:カウンタタイマと計算された出力比較値

OCval = x + y; ldd OC1、OCval; //何をする必要があるか

ldd OC1、#3000; //何が効きますか

計算された値では、タイマーの割り込みが異常です。これは私のアプリケーションでは受け入れられません。この問題は、タイマーとOCレジスタに1サイクルでアクセスするための文書化された要件に固執しており、即時書き込み以外はこれに違反しています。私はまた、Web上のすべてのサンプルコードが即時の操作を使用することにも注意します。

ソフトウェアの回避策があるかどうかは疑問です。私はカウンタがフリーラン(すなわち、リセットなし)になるようにする必要があります。これは、他の出力が即時書き込みと比較して動作しなければならないためです。割り込みのうち2つだけを計算する必要があります。

私が見ることができる唯一の他のオプションは、動的なタイミングを扱うために追加のハードウェアを必要とするので、ソフトウェア修正がうまくいくでしょう。 TIA

+0

これは、コードの提供なしでは答えにくいです。コードはC言語で書かれていると思いますか?その場合、実際に生成されたコードを確認するために逆アセンブリを表示する必要があります。どのコンパイラを使用していますか?一般に、C言語で望ましくない操作が発生した場合は、 'volatile uint16_t result = x + y;などのいくつかの手順でCコードを記述する必要があります。 OCval =結果; – Lundin

+0

特にHCS12では、タイマーフラグをクリアするときにCコードが誤ったアセンブラを生成することがよくあります。コンパイラに関係なくタイマーフラグをクリアするためのコードを逆アセンブルして、意図したとおりに動作することを確認してください。一般的なバグは 'FLAGREG | = MASK;のようなものがあり、" FLAGREGを読み込み、結果をアキュムレータに格納し、マスクを追加し、結果を書き戻す "という結果になるときです。そして、フラグを1に書き込んでフラグをクリアすると、同じレジスタ内の他のフラグもすべて破棄されます。適切なアセンブラコード(BSET)を得るには、通常、 'FLAGREG = MASK; 'が正しい指示を出します。コンパイラに依存します。 – Lundin

+0

お返事ありがとうございます。あなたは、フラグのクリアに関する正しいです、この場合、ASMのリストにはそれは問題ではないことが示されました。テストでは、以来、問題が複数のサイクルにわたって比較レジスターに値を書き込んでいることが明らかになりました。その機能をモジュラーダウンカウンターに移すことでアプリが安定しました。 – BruceV

答えて

0

これは少し暫定ですが、初期のテストは奨励しています。問題の割り込みをメインタイマーからモジュロダウンカウンタに移動しました。これはクロックド割り込みも提供します。ドキュメントには、カウントレジスタの設定には同じ単一サイクル書き込みルールが適用されると記載されていますが、メインタイマーでの広範なテストでは、新しい設定でカウンタをしばらく実行するまで問題は起こりにくいことが示されます。新しいアプローチの利点は、書き換えを何度も何度も実行する必要のあるメインタイマーとは異なり、最初に時間値を設定する際に、値を1回だけ書き込む必要があることです。

場合によっては、書き込みを行う前にカウンタを停止してから再起動します。

関連する問題