暇をみて、I/O関係の定義を粛々と実装しているけど、まずはシリアル通信だろう~
※I/Oポートの定義は実装した。
早速、SAU(シリアル・アレイ・ユニット)の定義を作った。
RXマイコンやR8Cのハードウェアーマニュアルでは、レジスター名の命名は、規則的
で、一貫性があり、作りやすいのだけど、RL78は、一貫性が無く、ハードウェアー
マニュアルと乖離しないように、考えながら実装しないと駄目な感じで疲れる。
※R8Cは、多少古いので、部分的に微妙な部分もあるけど・・
例えば、I/Oポート:
「P1」はP1グループ(P10~P17)を指す。
「P10」は、「P1」ポートの「0」ビットなんだけど・・・
P10グループ(P100~P107)のポートも同時に存在する為、「当たる」・・・
従って、ビット指定の令名はプログラム上から行えない。
なので、「P1.B0」とするようにした、これは、RXやR8Cもそうしているので、
問題ないけど・・、何でそうなるの?、作った人って何考えてるか・・・
I/Oポートでそんな感じだから、他も、かなり酷い、でもまぁ仕方無い、なるべく、
ハードウェアーマニュアルの記述を取り込むように、考えながら実装してみた。
それで、早速UART0を使った、送信、受信のクラスを書いてみた。
RXともR8Cとも違う構成のレジスター郡で、RL78はNEC系なんだと思うが、
理解と動作するまでに、それなりに時間がかかった・・・
文字列を出力する簡単なプログラムが、思ったように動作しない事が主な原因だった。
※この問題は、「RL78のミラー領域」で詳細を解説してある。
とりあえず、ポーリングによる実装のみしてあり、これから、割り込みを使った物や
DMAを使った実装を行いたい。
追記:
割り込みを使った実装を行った、以前に書いた、R8C用のコードをほぼそのまま
使ったが、問題無く動作する。
この辺り、C++は、再利用性が高い、これは、実装段階で、再利用を考えながら
ハードの依存を極力減らして書いている事が大きいのだけど・・・
DMAは、転送量があまり多く無いシリアル通信の為に使うと、もったいない気が
する、SDカードの読み書き、LCDへの転送など、転送量が多いデバイス用に確
保する方が良いと思った、また、DMAでは、結局、同期を取ったり、その他の部
分のマネージメントが色々ありそうなので、とりあえず保留とする事にした。
-----
RL78内蔵の「シリアル・アレイ・ユニット」は、このデバイスでは、2ユニット
、6チャネルの通信回路が使えて、UART回線なら3回線を同時に使える。
「G13/sau.hpp、common/uart_io.hpp」テンプレートでは、これを扱えるように工夫
してある。
RL78/G13 では、シリアル通信は、偶数チャネルで送信動作、奇数チャネルで受信動
作を行う為、送信チャネル、受信チャネルを別々に指定する。
※制限もあるので、複数チャネルを使う場合には注意が必要。
UART0を宣言する場合は以下のようにする。
※現在は使われていないが、送信バッファと受信バッファの大きさを指定する。
device::uart_io<device::SAU00, device::SAU01, 128, 128> uart0_io_;
他のチャネルは動作テストはしていないけど、同じように扱う事が出来ると思う。
device::uart_io<device::SAU02, device::SAU03, 128, 128> uart1_io_; device::uart_io<device::SAU10, device::SAU11, 128, 128> uart2_io_;
-----
フラッシュへのプログラムと、UARTとの通信では、共に、RxD,TxDなどを
使う、これらの切り替えを出来るように、2回路のスイッチを設けて、書き込み回路
もテスト基板に追加した。
※書き込み器は、デバイスの「/RESET」信号を制御するので、「RTS」信号を必要とす
る。