RL78

RL78マイコン タイマアレイ ワンショット動作

かふぇルネにも投稿しましたが、RL78のタイマアレイユニット(TAU)、ワンショット動作について私の誤解がありました。

一般的にタイマはタイマスタート(TS)をセットすると動作開始するのですが、RL78のタイマアレイユニットでは動作モードによってスタートフラグセット時の動きが異なります。RL78はタイマイネーブル(TE)との絡みがあるためです。

今回取り上げたワンショット動作(U0 CH2:master/CH3:slave SoftTriger)についてはCubeSuite+のコード生成は

以上のように出力します。これはマニュアルの

によるものです。
R_TAU0_Channel2_Start()内で直接タイマイネーブル(TE)を制御したいところですが、このレジスタはReadOnlyのため、そうもいかないようです。

実際にワンショット動作として稼働させるには

  1. R_TAU0_Channel2_Start()
  2. タイマイネーブル(TE)のセット

  3. R_TAU0_Channel2_Set_SoftwareTriggerOn()
  4. ワンショットタイマのスタート

の順番で呼び出す必要があります。
中身を見ると同じタイマスタート(TS)レジスタを操作しているわけですが、前述の通り、1回目のタイマスタート(TS)のセットはタイマイネーブル(TE)をセットしタイマを動作可能状態にするだけで実際にはタイマは動いていません。2回目以降のタイマスタート(TS)のセットでワンショット動作が始まります。尚、ワンショット動作はCH2をmasterに、CH3をslaveに設定しているため2回目以降にセットするのはCH2だけです。
rl78_tau_os

仮に2回目以降もR_TAU0_Channel2_Start()をcallしてCH2/CH3のタイマスタート(TS)をセットすると下記動作になってしまいます。
rl78_tau_os2

本来ならActtiveがCH2、in-ActiveがCH3であるのに対し、CH2/CH3が同時にスタートしているので必要な時間がとれなくなっています。

皆様もタイマアレイユニット(TAU)を利用する際はご注意ください。

スイッチ操作

マイコンは電圧の高い、低いを検知したり、出力したりします。

一般的にスイッチはマイコンへの電圧を機械的にonしたり、offしたりするものです。

スイッチoffでは電源からマイコンへ流れ込むため、マイコンから見たときHighが見えます。
sw off

スイッチonでは電源は接地(GND)へ流れるため、マイコンから見たときLowが見えます。
sw on

プロモーションボードの回路図ではこんな風に記載されています。
YRPBRL78L12 SW

さて、このスイッチ。実は困った問題を抱えています。
機械を操作すると振動が起こりますので、機械の微小震動:チャタリングといった現象が発生します。
chattering

チャタリングの回避には
1.抵抗とコンデンサを利用してチャタリングを除去する。
2.ソフトウェアで2度読みして、2回とも同じ値(電圧)ならこれを採用する。
があります。

1.抵抗とコンデンサ
抵抗とコンデンサは時定数τ=CRの関係があります。つまり、電圧変動を時定数をもってチャタリングを平滑化する方式です。こちらの問題は部品点数が多くなり、コストが上昇することと、時定数が大きくなることによって電圧の応答が遅くなってしまうことです。

2.ソフトウェアの2度読み
一方、ソフトウェアでは2度読みを行います。
電圧がふらついている時に読み取りに行くと、1回目はHigh、2回目はLowだとすると、「これはチャタリングだな」と認識し、採用しません。
1回目がHigh、2回目もHigh、もしくは1回目・2回目ともLowであった時にスイッチが離された、もしくはスイッチが押されたと認識します。
こちらの欠点はチャタリング期間中に2度読みしても効果はないので、チャタリングがどのくらいの時間続くのかを把握する必要があります。
しかし、実際には測定することは少なく、数ms~10msくらいの間隔で2度読みをしていると思います。

先ほどの回路図を見ると、プロモーションボードにはコンデンサはついていないので、チャタリングの除去はソフトウェアで行う必要があります。

数msに一度呼ばれる関数を想定してみます。

C言語における「static」は自動変数としないことを明示するものです。一般に関数内で定義された変数は自動変数として扱われるため、関数が終了した時点で参照できなくなりすし、値も保存されません。しかし「static」を指示しておくと値が保存されます。これで過去の状態を比較できるようになります。
「^」は排他的論理和を意味するので、sw_levelとportの組み合わせが「0,1」「1,0」の時のみsw_edgeが1になり、その他は0になります。これで立ち上がり、もしくは立ち下がりを検出します。
例では立ち上がりを検出した時にsw有効としていますが、実際は稼働するシステムに合わせます。

組み込みソフトウェアを体験してみる。

お仕事とは別に手持ちの基板で少しずつですがソフトについて触れていきたいと思います。

そんな基板で遊んじゃえ企画の第一弾はルネサスさんのセミナーでいただいたプロモーションボードYRPBRL78L12です。
YRPBRL78L12

こちらはスイッチ、ボリューム、LCDLEDと基本的な部品が搭載されているので、組み込みソフトウェアの手始めにはいいボードですね。

フラッシュROMも32kBと評価ボードにしては多いくらい。

このボードを使って開発環境の準備から、プログラミング、デバッグの仕方、単独動作まで順を追って説明していきたいと思います。組み込みソフトウェアにこれから触れる方には、どんな手順で開発を行うのかをイメージできるようになったら幸いです。

では不定期更新になると思いますが、よろしくお付き合いください。