Renesas Synergy™

FAQ 1006565 : 数十m秒程度の単位で出力を変更して、繰り返しが1秒程度の場合にはどうか。

時間の精度もそれほど必要ないと考えられますので、割り込みを用いて十分処理できると考えられます。
[処理の考え方]
インターバル・タイマ機能を用いて、数十m秒のインターバルで割り込みを発生させます。その処理の中で1秒分のデータ・パターンを順次出力していく方法が考えられます。
この方法の考え方を図に示します。タイマ割り込みが発生すると、前もってデータ・テーブルとして準備してある1秒分の出力データの中から出力するデータを順に読み出して出力ポートに出力します。

[実現方法]
78K0S/KY1+を例にして、約25m秒間隔でポート4の8ビットに出力していく場合についての具体的な実現方法を示します。
8ビット・タイマH1を用いて、8MHzの内蔵周辺クロックから約25m秒のインターバル割り込みを発生させます。このときのタイマ80の設定は以下のようになります。

TMHMD1 : 01000000   1/4096に分周したクロックで動作
CMP01 : 48   49カウント


割り込み処理ではできるだけ処理時間が変動しないように、次回に出力するデータはRAMに準備しておき、割り込みが起動されると、そのデータを出力ポート 出力します。その後、次に出力するデータをROMから読み出し、RAMにセットします。このとき、テーブルの最後までいった場合にはテーブルの先頭に戻し ます(この部分は処理時間が変動する可能性があります)。

[プログラム例]
C言語で記述する場合には先ず、以下の宣言を行なう必要があります。ここでは、SFR名称を使うことや割り込みを使用することの宣言、内部で使用する変数を宣言します。

#define DATANUMBER 40
#pragma SFR
#pragma NOP
#pragma EI
#pragma DI
#pragma INTERRUPT INTTMH1 TMH1INT
__interrupt void        TMH1INT (void);
sreg static unsigned char NEXTDATA;
sreg static unsigned char OFFSET;
extern const unsigned char DATATABLE[DATANUMBER];

次に、使用するタイマ関係の初期設定を行ないます。
なお、ここでは簡単のために、ウォッチドッグ・タイマは停止させておくものとします。
タイマ80を25m秒周期で割り込みが発生するように設定し、出力データの初期値を設定しておきます。

/*
TMH1 mode set
*/
TMHMD1 = 0b01000000;    /* set count clock      */
CMP01 = 48;             /* set interval time    */
P4 = DATATABLE[0];      /* set initial data     */
PM4 = 0;                /* set port to output   */
NEXTDATA = DATATABLE[1];
OFFSET = 2;

後はタイマを起動するだけになります。

TMHE1 = 1;                      /* start 25msec timer   */
TMIFH1 = 0;                     /* clear INTTMH1                */
TMMKH1 = 0;                     /* enable INTTMH1               */
EI();                           /* enable interrupt             */

インターバル・タイマ割り込みが発生すると、以下の割り込み処理関数が起動され、出力を更新し、次のデータを準備します。

__interrupt void        TM H1INT (void){
P4 = NEXTDATA;                  /* set data to the port */
NEXTDATA = DATATABLE[OFFSET];   /* get next data        */
OFFSET++;                       /* go next data */
if (OFFSET >= DATANUMBER ) OFFSET = 0;
}

このプログラムで使用するデータは以下の例のように定義しています。

public  _DATATABLE
cseg
_DATATABLE:
DB      10100000b,10100001b,10100000b,10100001b
DB      10100000b,10100001b,10100000b,10100001b
DB      10100000b,10100001b,10010010b,10010011b
DB      10010010b,10010011b,10010010b,10010011b
DB      10010010b,10010011b,10010010b,10010011b
DB      01001010b,01001011b,01001010b,01001011b
DB      01001010b,01001011b,01001010b,01001011b
DB      01001010b,01001011b,01000110b,01000111b
DB      01000110b,01000111b,01000110b,01000111b
DB      01000110b,01000111b,01000110b,01000111b
END

このデータはビット0が毎回反転、ビット1は75%がハイで25%ロー、ビット2~5は25%がハイで75%がローで各々位相をずらしたデータになってい ます。この6ビットをシミュレータのタイミングチャートで確認したときの画面イメージを以下に示します。(なお、この画面イメージでは25m秒ごとでは時 間が長すぎてきちんとした波形が見えないので、TMHMD1 = 0b00110000; として時間を短縮しています。)
このことからも分かるように、このプログラムは1m秒ごと程度の速度の処理にも対応できます。

他にご質問がございましたら、リクエストを送信してください