MC9RS08KA8シミュレータでMTIMモジュールの誤った実装を見つけた [CodeWarrior]
このレポートは、MC9RS08KA8 の Full Chip Simulation で見つけた MTIM モジュールの誤った実装に関するものです。
法とモジュロ・レジスタの関係
MTIM モジュールは、周期的にイベントや割り込みを発生させる簡単なタイマです。 MTIM モジュロ・レジスタ (MTIMMOD) と名づけられた8ビットのレジスタがあり、イベントの発生周期を決めます。 MTIM モジュールは、8ビットのカウンタ (MTIMCNT) の値と MTIMMOD の値を比較し、 MTIMCNT の値が MTIMMOD の値が一致したときにプリスケーラからのクロックが来たら、オーバーフロー・イベントを発生します。 このため、イベントの発生周期は、 (MTIMMOD + 1) にプリスケーラ・クロックの周期を掛けたものになります。
シミュレーションでイベント発生周期を確認した
パラメータで指定した100µ秒単位の待ち時間をつくる関数を作成しました。
void wait_100us(byte n) { MTIM2SC = 0x30; // Stop & Reset MTIM MTIM2CLK = 0x01; // Prescale BUSCLK*2 MTIM2MOD = 249; // 100usec MTIM2SC = 0x00; // Start MTIM while (n-- > 0) { while (!MTIM2SC_TOF) ; // Wait for the flag MTIM2SC_TOF = 0; // Clear the flag } }
BUSCLK が 5MHz に調節されていれば、 MTIM イベントは、 100µ秒ごとに発生します。 マイコンにプログラムを書き込む前にシミュレーションで MTIM イベント発生周期を確認しました。 "MTIM2SC_TOF = 0;" にブレーク・ポイントをしかけると、以下のサイクルでシミュレーションがとまりました。
CPU Cycles | Difference |
---|---|
745 | - |
1243 | 498 |
1741 | 498 |
2239 | 498 |
2737 | 498 |
3235 | 498 |
3733 | 498 |
クロック数の差分は、500になることが期待されたのですが、実際には、498になってしまいました。 変ですね。
MTIMCNT が、 (MTIMMOD - 1) の時に切れる
プリスケーラ・クロックの周期を長くすることで、 MTIMCNT カウンタが (MTIMMOD - 1) から 0 に戻っている事を確認しました。 これは、 MC9RS08KA8 データシートにある MITM モジュールの "Functional Description" に反する誤った実装です。
MC9RS08KA8には、二つの MTIM モジュール MTIM1 と MTIM2 があります。 どちらの MTIM モジュールも誤った実装をされていることを確認しました。
2009-03-25 追記
Service Request からの報告によると、この問題は追跡番号 MTWX34191 としてバグとして認定されたとのことです。
参考文献
HCS08 Unleashed: Designer's Guide to the HCS08 Microcontrollers
- 作者: Fabio Pereira
- 出版社/メーカー: Booksurge Llc
- 発売日: 2007/11/13
- メディア: ペーパーバック
コメント 0