hiraコメントするR8C関係のリソースもかなり色々揃って来ました。組み込みマイコンでは、外せないPWM機能の実装です。一般的に、組み込みマイコンのハードウェアータイマーの機能は、多機能で、複雑です。R8C/M120の、タイマーCでも、PWMは二通りのモードがあり、その他に、インプットキャプチャなど色々な機能があります。今回は、3チャネルの出力が可能な、PWMモードの実装を行いました。※今後必要になったら、PWMモード2や、インプットキャプチャーなど、他の設定も組み込む予定です。PWMの場合、デューティ可変範囲を切りのよい2のn乗にしたい場合と、あくまでも周波数(周期)で設定したい場合がありますので、引数の違う2つの設定を用意してあります。今回、必要無かったので、割り込みを使っていません。このタイマーCのPWM出力は、設定値とカウンターの一致を利用しているので、設定値を書き換えるタイミングに注意する必要がありますが、現状の実装では考慮されていません。}↑の例では、PWM周波数を10KHzとしています。B出力には25%、C出力には75%のデューティで出力します。}又、C出力にはLEDが接続してあるので、AN1入力にボリュームを繋げて、0~100%までデューティを変化させられますのでLEDの明るさが変化します。—–I/Oポートの定義を見直し、ポートのマッピングに「固有の型」を導入しています。その為、設定が判りやすく、誤設定も減ると思います。class」を使っている為、C++11対応コンパイラでコンパイルする必要があります。「-std=c++0x」オプションを使っています。PWM_testGitHubにソースをプッシュしました。hiraコメントするさて、今回はデータフラッシュメモリーを扱います。R8Cには、プログラムフラッシュとは別に、データの記録用の小規模なフラッシュメモリーが別にあります。3000番地から始まり、容量2048バイトです。※1024バイト毎にバンク0、バンク1と分かれています。フラッシュメモリーは、「1」のビットを「0」にする事は出来ますが、「0」のビットを「1」にする場合は、バンク毎にイレースコマンドを発行して、全て「1」の状態に戻します。この辺りのマネージメントが、多少難しいのですが、電源を切っても、記録を残す事が出来るので、非常に有益なメモリーと言えます。テストプログラムでは、バイト単位での読み出し、書き込み、イレースなどが対話形式で行えるようにしてあります。※シリアルポートにターミナルを接続します。領域です※値は全て16進数で行います本来は、プログラム領域の操作関数も含めたいところですが、それは、また次の機会(必要になったら)とします。—–R8Cへのプログラム書き込みには、ルネサスのFDTを使っていましたが、コマンドラインから気軽にプログラム出来れば便利です。用プログラムコマンドが公開されました。対応したものですが、使いやすいように、その他の小規模な改造も行っており、安定性も増しています。版も用意されており、シンプルで良く精査されたシンプルな設計により、予備知識が無くても直ぐに使えるようになっています。対応可能と思います、こちらは、時間が出来たら挑戦してみるつもりです。hiraコメントするADCを動作検証するサンプルで、UARTとタイマーの割り込みを使うようになった。割り込み制御レジスタは、そのレジスタに対応する割り込み要求が発生しない箇所で変更してください。割り込み要求が発生する可能性がある場合は、割り込みを禁止した後、割り込み制御レジスタを変更してください。割り込みを禁止して割り込み制御レジスタを変更する場合、使用する命令に注意してください。ビットが“1”(割り込み要求あり)にならず、割り込みが無視されることがあります。このことが問題になる場合は、次の命令を使用してレジスタを変更してください。ビットが“0”にならないことがあります。命令を使用して“0”にしてください。は!?、うーーーん、そうか・・・これは、要するに、リードモディファイライト命令など、リードからライトへの遅延が短い場合に、フラグのリセットに失敗するのだろう、しかし、わかり難いのは、常に失敗する訳では無く、何かの条件が重なると失敗するようだ。したらコレかもしれない、そこで、割り込みフラグのリセットを全般的に書き換えた。TRBIR.TRBIE.b());とした。※同じように、UARTの制御クラスにも修正を加えた。命令とかでI/Oを直接書き換えるようなコードが出てしまう。この検証には時間がかかる・・・24時間走らせたが、今度は順調なので、多分解消されたと思う。割り込みフラグを「消す」場合には注意が必要だ・・ただ、コンパイルされたアセンブリコードには多少無駄な部分がある、しかしこれはコントロールが難しいので、我慢するか、アセンブラで書き直すしかない。活用しているので、まぁ我慢しておく事にする。hiraコメントするR8CのA/D変換も出来ました。別の部分で、工夫が必要な事が判りました。問題になってるのは「format」クラスです。このクラスは、「printf」に代わるものとして実装した物ですが、16キロバイトにもなります。フラッシュメモリーは32キロまで使えるとは言え、流石に半分も消費するのでは問題です。動作は、設計の通りですが、小さくする工夫をする必要があります。巨大になるので、縮小版を作る人が多いですが、自分もその口です。意図しない微妙な動きになる場合があります。コンパイラーが整合性をチェックしますが、完全ではありません。C++では、そんな危険を冒さなくても、安全な方法が色々あります。必要な為、バイナリーが肥大化して使えませんので、縮小版です。i;のように書けます。※「%」オペレーターをオーバーロードしています。調べると、現在の実装では、文字の出力や、定型サイズなどをテンプレートの引数として受け取るのですが、これが肥大化の要因のようです。そこで、テンプレートをやめ、通常のクラスとして定義しなおし、エラーレポートもオフにしてみました、その結果、半分以下になりました。※R8Cでは、フラッシュは64キロ以内なので、64キロを超えてジャンプする機構は必要無いのですが、コンパイルされたマシンコードには、そのキックコードが含まれています、コンパイラのスイッチで排除出来ると思いますが、少し調べた限りでは判りませんでした・・さて、本題はA/D変換です、R8Cに内臓されているA/Dコンバーターは10ビットの分解能で、2チャネル、アナログ入力は6チャネルあります。変換速度は高速で、最大で2.3uSです。アナログ用電源はピン数の制限から、デジタル電源と共通ですが、ルネサス系のCPUは電源ノイズも少なく、A/D変換の精度もAVR系より優れている感覚があります。※AVR系ではサンプルホールドが無い為、変換結果に誤差が乗り易く、正確な変換を行うのが難しいと思えます。%y」を実装してあります。1023の場合に「5.00」と表示できます。A/D変換のサンプルコード浮動小数点の計算は、リソースを食うし、FPUが無いとスピードも出ませんので、固定小数点の計算を簡単に行えると便利だと思います。※何故10倍して8で割っているのか、良く考えれば判ります。型指定子にどんなものが使えるか、「format.hpp」を観れば直ぐに解ると思います。※8進数は、通常あまり使わないので、オプションとしています。タイマー関係の定義が出来ました。3つのタイマーモジュールが内臓されています。高機能で、AVRと両方使って思うのは、ルネサス系のタイマーの方が、細かい部分が良くできている点です。多くの場面を想定していて、十分な使い方が出来ます。この中で、比較的単純な構造なのはRBです。単純と言っても、色々な仕組みがあるのですが、とりあえず、16ビットのタイマーとして使い、周期的に割り込みをかけるのに使う事にします。タイマークラスでは、登録した関数を割り込み内から呼び出す仕組みを設けてありますが、通常「禁止」としています。これを「有効」にすると、ライブラリー関数の静的変数を全てスタックへ退避するコードが追加される為、注意が必要です。※そうしないと、メイン側で、あるライブラリー関数を実行していた場合、それを、割り込み側でも呼ぶと、問題が起こります。周期的な割り込みを使うと、プログラム全体の時間管理が単純に行えるので便利です。これは、同期式とも言います、ゲームなどに向いた方法で、画像の表示、書き換えを同期させ、常に一定の速度で全体を動作させます。シングルタスクでありながら、マルチタスク的な並列動作を行うのに便利な方式です。※厳密な意味での「並列」ではありませんが。組み込みでも、「同期式」は、色々な面で、都合が良い場合が多くあります。簡易的なマルチタスク的な動作が出来ます。一つの例として、スイッチのチャタリング除去などが上げられます。ポートの値を読み込む事で、デジタルフィルター的な効果が付加され、結果的にチャタリングを除去します。この周期はスイッチの機械的特性によりますが、60Hz~100Hzくらいが適当です。※スクリーンのリフレッシュレートが60Hzなので、その値が使われます。当然ながら、1秒に60回以上のOn/Offを検出出来なくなりますが、通常は問題ありません。個々の処理を時分割で動作するように実装して、それを周期的に呼び出す事で、並列動作が実現出来ます。「同期式」でも十分な場合があります。ゲームを作っている人には、常識的な実装ですが、初めて触れる人には新鮮で、判り難いかもしれませんが、馴れておくと良いと思います。今まで、複雑で、難解な実装が、シンプルに出来る場合があり、モジュール的に他の処理と分離する事ができます。ここで、今までに実装したR8C関係クラスなどをまとめておきます。タイマRJI/O制御関係では、以下のファイルがあります。タイマRB制御クラス各デバイス毎にテストしたプロジェクトがあります。タイマーRBのテスト(ポーリング、割り込み)これからも、随時追加していく予定です。