2017年1月24日火曜日

RX621で遊ぶ CMT割り込み,ブザー,シリアル(送信のみ)

RX621関連のその他のメモ

・CMT0割り込み

RXで割り込みを発生させるには,さまざまな方法がありますが,
最もシンプルな方法はCMT(コンペアマッチタイマ)であると思います.

以下はCMT0で1msで割り込みをかけるサンプル

//CMT0初期設定
void CMT0_init( void ){
  SYSTEM.MSTPCRA.BIT.MSTPA15 = 0; //モジュールストップ状態の解除 CMTユニット0
  CMT.CMSTR0.BIT.STR0 = 0; //カウント動作停止
  CMT0.CMCR.BIT.CKS = 1;   // PCLK/32 
  CMT0.CMCOR = 1499;     // 1ms/(32/48MHz)-1
  CMT0.CMCNT = 0; // カウントクリア
  ICU.IER[0x03].BIT.IEN4 = 1; // 割り込み要求許可
  ICU.IPR[0x04].BIT.IPR = 0x05; // 割り込み優先レベル 
  CMT0.CMCR.BIT.CMIE = 1; //割り込み許可
  CMT.CMSTR0.BIT.STR0 = 1; //割り込み開始
}

CS+では割り込み先関数がintprg.cに作成されます.
私はその中に実行する関数を書いています.

//intprg内  CMT0_Tick:実行したい関数
void Excep_CMT0_CMI0(void){
  CMT0_Tick();
}



・ブザーを鳴らす

ブザーは個人的にロボットのデバックには必須だと思っています.
動いている状態を目で追いつつ音で内部処理がわかるからです.
周波数が低いのでソフトウェアでもいけると思いますが,今回はMTU2を使用しました.

それだけでは面白くないので,トリガで割り込みをかけることでバックグラウンドで
再生できるようにしました.これは地味に便利です.
使ったのは一般的な圧電ブザーのこれ

#include"iodefine.h"
#include "vect.h"

static long buz_timer;

//MTU0初期設定
void buz_init( void ){
SYSTEM.MSTPCRA.BIT.MSTPA9 = 0; //モジュールストップ状態の解除 MTU2
MTU0.TCR.BIT.TPSC =2;       //PCLK/16
MTU0.TCR.BIT.CCLR = 1; //TGRAでカウントクリア
MTU0.TMDR.BIT.MD = 2; //PWMモード1
MTU0.TIORH.BIT.IOA = 2; //初期値LOWコンペマッチでHIGH出力
MTU0.TIORH.BIT.IOB = 1; //コンペアマッチでLOW出力
MTU0.TGRA = 2999; //1kHz
MTU0.TGRB = 1500;
IR(MTU0,TGIA0) = 0; //MTU0フラグクリア
IEN(MTU0,TGIA0) = 1; //MTU0割り込み許可
IPR(MTU0,TGIA0) = 0x01; //割り込み優先度設定
MTU0.TIER.BIT.TGIEA = 1; //割り込み許可
}

//ブザーセット
void buz_set( int hz , int t){
if( hz <= 0 ) MTUA.TSTR.BIT.CST0 = 0; //カウント動作停止
else{
MTU0.TGRA = 1500000/hz; //カウンタ設定
MTU0.TGRB = MTU0.TGRA/2; //TGRBはTGRAの半分
MTUA.TSTR.BIT.CST0 = 1; //カウント動作開始
buz_timer = hz*t/1000;
}
}

//TRGA割り込み
void Excep_MTU0_TGIA0(void){ 
buz_timer--;
if(buz_timer < 0){
buz_timer=0;
MTUA.TSTR.BIT.CST0 = 0;
}
}



P34から出力されます.
あとで気づきましたが,TMR(8ビットタイマ)でも波形を出せるみたい.
ブザーのような単純なモジュールは,こっちのほうが最適かもしれません.
しかし,私の配線ではピンがすべてかぶってしまっていました.


・シリアル通信

割り込みを使わない送信のみなら以下のプログラムで可能です.
PC等と相互に通信させたいなら,受信割り込みなどを使用する必要が
あります.ここはいずれキチンとしたヘッダとしてまとめたい所です.

//シリアル初期化(PCLKを別定義)
void sci1_init( unsigned short bps)
{
SYSTEM.MSTPCRB.BIT.MSTPB30 = 0; //SCI1ストップ解除
SCI1.SCR.BYTE = 0x00u; //SCI1停止
SCI1.SMR.BYTE = 0x00u; //PCLK分周無し、ストップビット1、パリティ無し、データ8bit、調歩同期式
SCI1.BRR = (PCLOCK / (16 * bps) + 1) / 2 - 1;
SCI1.SEMR.BYTE = 0x20u; //1bit=16ClockCycle、ノイズ除去機能有効、スタートビットはLOWレベルで検出
for(Cnt=0;Cnt<10000;Cnt++); //Wait

SCI1.SSR.BYTE &= ~0x78u;     //エラーフラグクリア
SCI1.SCR.BIT.TE = 1;         //送信許可
SCI1.SCR.BIT.RE = 1;         //受信許可

}

//1byte送信
short sci1_putc(char data)
{
while(SCI1.SSR.BIT.TDRE == 0);     //未送信データが送られるまで待つ
      SCI1.TDR = data;                    //送信データのセット 
      return(0);
}


0 件のコメント:

コメントを投稿