HCS12のタイマ出力比較割り込みに問題があります。問題は、私がを計算していると思われます。の値は、イミディエートではなく、出力比較レジスタになります。つまり、...HCS12埋め込み:カウンタタイマと計算された出力比較値
OCval = x + y; ldd OC1、OCval; //何をする必要があるか
ldd OC1、#3000; //何が効きますか
計算された値では、タイマーの割り込みが異常です。これは私のアプリケーションでは受け入れられません。この問題は、タイマーとOCレジスタに1サイクルでアクセスするための文書化された要件に固執しており、即時書き込み以外はこれに違反しています。私はまた、Web上のすべてのサンプルコードが即時の操作を使用することにも注意します。
ソフトウェアの回避策があるかどうかは疑問です。私はカウンタがフリーラン(すなわち、リセットなし)になるようにする必要があります。これは、他の出力が即時書き込みと比較して動作しなければならないためです。割り込みのうち2つだけを計算する必要があります。
私が見ることができる唯一の他のオプションは、動的なタイミングを扱うために追加のハードウェアを必要とするので、ソフトウェア修正がうまくいくでしょう。 TIA
これは、コードの提供なしでは答えにくいです。コードはC言語で書かれていると思いますか?その場合、実際に生成されたコードを確認するために逆アセンブリを表示する必要があります。どのコンパイラを使用していますか?一般に、C言語で望ましくない操作が発生した場合は、 'volatile uint16_t result = x + y;などのいくつかの手順でCコードを記述する必要があります。 OCval =結果; – Lundin
特にHCS12では、タイマーフラグをクリアするときにCコードが誤ったアセンブラを生成することがよくあります。コンパイラに関係なくタイマーフラグをクリアするためのコードを逆アセンブルして、意図したとおりに動作することを確認してください。一般的なバグは 'FLAGREG | = MASK;のようなものがあり、" FLAGREGを読み込み、結果をアキュムレータに格納し、マスクを追加し、結果を書き戻す "という結果になるときです。そして、フラグを1に書き込んでフラグをクリアすると、同じレジスタ内の他のフラグもすべて破棄されます。適切なアセンブラコード(BSET)を得るには、通常、 'FLAGREG = MASK; 'が正しい指示を出します。コンパイラに依存します。 – Lundin
お返事ありがとうございます。あなたは、フラグのクリアに関する正しいです、この場合、ASMのリストにはそれは問題ではないことが示されました。テストでは、以来、問題が複数のサイクルにわたって比較レジスターに値を書き込んでいることが明らかになりました。その機能をモジュラーダウンカウンターに移すことでアプリが安定しました。 – BruceV