RL78/G13でインターバル・タイマーを使ってみる

ようやく、ここまで来た感がある。

タイマーの機能は、複雑なので、機能を理解して、クラスを作るのが難しく、楽しい。

まず、面倒な、データ・レジスタのマッピング・・
これは、SAU(シリアルアレイもそうだったけど)ではまったんだけど、SDR
(シリアル・データ・レジスタ)でも実アドレスが、不規則に並んでいる・・
SAUは8チャネルが2ユニットあるのだけど、SDRだけ、不規則な実アドレスと
なっている。(何でこうなるのか理由は不明だが、仕様なので仕方無い・・)

タイマ・アレイはほぼ同じ構成であるので、テンプレートでクラスを作り、テンプレ
ートパラメーターとして、アドレスのオフセットを加える構成にしてある、しかし、
それだと、不規則なアドレスの変化に対応出来ない為、SDRだけ、別途アドレスを
与えるようにして対応した。

// UOFS: ユニット・オフセット
// CHOFS: チャネル・オフセット
// DRADR: SDRアドレス
template <uint32_t UOFS, uint32_t CHOFS, uint32_t DRADR>
struct tau_t {
.
.
.
};
typedef tau_t<0x00, 0x00, 0xFFF18> TAU00;
typedef tau_t<0x00, 0x02, 0xFFF1A> TAU01;
typedef tau_t<0x00, 0x04, 0xFFF64> TAU02;
typedef tau_t<0x00, 0x06, 0xFFF66> TAU03;
typedef tau_t<0x00, 0x08, 0xFFF68> TAU04;
typedef tau_t<0x00, 0x0A, 0xFFF6A> TAU05;
typedef tau_t<0x00, 0x0C, 0xFFF6C> TAU06;
typedef tau_t<0x00, 0x0E, 0xFFF6E> TAU07;

C++ で作ると、このような、変化に柔軟に対応できて、便利だ、そしてわかり易い。

RL78/G13 tau.hpp

-----
日本製マイコンのタイマー系は、やはり良く考えられて作られている。

まずは、基本のインターバル・タイマーを使って、矩形波を出力する。
インターバルタイマーの矩形波は、タイミングでトグルするので、設定の半分の周期
となる。

※サンプルでは、TO01端子(ポート1のビット6)40番ピンから、5KHz、
デューティー50%の信号を出力する。

TAUを使ったインターバルタイマー出力

今後、機能追加の過程で、仕様は変わるものと思う。