・CMT0割り込み
RXで割り込みを発生させるには,さまざまな方法がありますが,
最もシンプルな方法はCMT(コンペアマッチタイマ)であると思います.
以下はCMT0で1msで割り込みをかけるサンプル
//CMT0初期設定
void CMT0_init( void ){
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();
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 件のコメント:
コメントを投稿