CS+のタイマ・アレイ・ユニットのインターバル時間の単位をms、μs、nsと変更した場合にINTTM00のHighの時間は変わるものでしょうか?
目標としているのはLEDチカチカのSllepさせておく時間をビシーッと決めれたらと思っているのですが、どうもうまくいきません。
ちなみにsleep関数は下のような感じです。ご指導お願いします。
void sleep(long t){ int ms; R_TAU0_Channel0_Start(); for(ms=0;ms<=t;ms++){ while(INTTM00==0x00){ } } R_TAU0_Channel0_Stop(); }
チョコです。
使用しているデバイスはRL78で、CS+のコード生成でインターバル・タイマを使おうとしているとの理解でよろしいでしょうか。
RL78のINTTM00はハードウェアの信号名であり、ソフトで確認できる信号ではありません。例えば、RL78/G13では、INTTM00はiodefine.hで割り込みのベクタアドレスとして、以下のように定義されています。
つまり、INTTM00は定数であり、変化する値ではないので…
>HALT()にしたら、思っていたのに近い感じになってきました。
>停止する。割り込みの中止みたい感じのようで今一つ理解はまだできていませんが・・・。
RL78では、HALT()(スタンバイ)は割り込み待ちで使っています。本当は、INTTM00割り込み処理の中で割り込み回数をカウントするのが、分かり易いのかもしれませんが、割り込み処理のプログラムなしで質問のプログラムに近いするためにHALT…
つまり、INTTM00は定数であり、変化する値ではないので、質問のような使い方はできません。
インターバル・タイマであれば、指定したインターバルでINTTM00割り込みが発生するので、「while(INTTM00==0x00){}」の代わりにHALT();としておけば、INTTM00割り込みが発生するごとにHALTが解除されるので、インターバル時間×tの時間待たせることはできると思います。
もっとも、引数とmsの型が異なるので、要注意ですが。
インターバル・タイマについては、以下のリンクを参照してみてください。
https://community-ja.renesas.com/cafe_rene/b/rl78-classroom/posts/rl78-5
以上
ご回答ありがとうございます。
RL78です。
INTTM00はハードウェアの信号名であり、ソフトで確認できる信号ではないですか。
0x002Cですか。ポインタにアドレスをいれたらと思わず感じて
void sleep(long t){ int ms; unsigned char* pINTTM; pINTTM=(unsigned char *)INTTM00; R_TAU0_Channel0_Start(); for(ms=0;ms<=t;ms++){ while(*pINTTM==0x00); //HALT(); } R_TAU0_Channel0_Stop(); }
としてみましたが駄目ですね。
ご指導頂いた
HALT()にしたら、思っていたのに近い感じになってきました。
停止する。割り込みの中止みたい感じのようで今一つ理解はまだできていませんが・・・。
RL78では、HALT()(スタンバイ)は割り込み待ちで使っています。本当は、INTTM00割り込み処理の中で割り込み回数をカウントするのが、分かり易いのかもしれませんが、割り込み処理のプログラムなしで質問のプログラムに近いするためにHALT()を使ったものです。
インターバル・タイマの動きを理解してください。そのためには、前回紹介したリンク等で調べてください。
または、追加での問い合わせをしてください。