トップページ > dsPIC入門 > シリアル通信のプログラム(応用)
ハイパーターミナルへ入力した文字をdsPICへ送って、その文字が設定されたコードであれば
LEDの動きを変更する…というプログラムを作ります。タイマー割り込みの処理は、
前にタイマーの使い方を解説した際に作ったプログラムそのまんまです。逆方向にもLEDが流れるように、
少し付け足していますが…。回路はこれまでの実験につかってきた物です。
strcmp(string1,stging2)は、C標準ライブラリ関数で2つの文字列が一致した場合は0を返します。
rightと入力してEnterキーを押すと、LEDは右へ(基盤の上下にもよりますが…)動きます。 leftと入力してEnterキーを押すと、LEDは左へ流れます。stopと入力するとLEDは全部消えます。
//******************************************************************** //ハイパーターミナルからLEDを制御 @dsPIC30F4012 //******************************************************************** //==================================================================== //ヘッダファイル #include "p30f4012.h" #include "uart.h" #include "timer.h" //==================================================================== //コンフィギュレーション _FOSC(CSW_FSCM_OFF & XT_PLL8); //10MHzセラロックを使っているのでクロックは80MHz。 _FWDT(WDT_OFF); _FBORPOR(PBOR_ON & BORV_20 & PWRT_64 & MCLR_EN); _FGS(CODE_PROT_OFF); //UARTのコンフィグ unsigned int config1 = UART_EN & UART_IDLE_CON & UART_ALTRX_ALTTX & UART_NO_PAR_8BIT & UART_1STOPBIT & UART_DIS_WAKE & UART_DIS_LOOPBACK & UART_DIS_ABAUD; unsigned int config2 = UART_INT_TX_BUF_EMPTY & UART_TX_PIN_NORMAL & UART_TX_ENABLE & UART_INT_RX_CHAR & UART_ADR_DETECT_DIS & UART_RX_OVERRUN_CLEAR; //==================================================================== //グローバル変数 char string[100]; int mode=0; int a=0x00; int flag=0; int cnt=0; //==================================================================== //改行関数 void newline(void) { putsUART1("\n"); while(BusyUART1()); putsUART1("\r"); while(BusyUART1()); } //==================================================================== //文字列クリア関数 void str_clear(void) { int i; for(i=0;i<100;i++) { string[i]=0; } } //==================================================================== //タイマー割り込み関数 void _ISR _T1Interrupt(void) { //タイマー割り込みフラグをOFFにしておく。(同時にカウンタもリセットされる) IFS0bits.T1IF = 0; //------------------------------------------------------------------- //左へ動かす if(mode==1) { //PORTBで6回シフト if(flag==0) { //PORTEは消しとく PORTE=0; //表示して、シフト PORTB = a; a = a << 1; //シフト回数をカウント cnt++; //もしPORTBの左ハジまでいったら… if(cnt==6) { cnt=0; a=0x01; //flagの値を変えて、次に呼ばれた時は別な処理を実行する flag=1; return; } return; } //PORTEの0ビット点灯 if(flag==1) { PORTB=0; PORTE = 0x01; //flagの値を変えて、次の処理へ flag=2; return; } //PORTEの1ビット点灯 if(flag==2) { PORTE=0x02; //flagの処理を変えて、次の処理へ flag=0; return; } } //------------------------------------------------------------------- //右へ動かす if(mode==2) { //PORTBで6回シフト if(flag==2) { //PORTEは消しとく PORTE=0; //表示して、シフト PORTB = a; a = a >>1; //シフト回数をカウント cnt++; //もしPORTBの左ハジまでいったら… if(cnt==6) { cnt=0; a=0x20; //flagの値を変えて、次に呼ばれた時は別な処理を実行する flag=0; return; } return; } //PORTEの0ビット点灯 if(flag==1) { PORTB=0; PORTE = 0x01; a=0x20; //flagの値を変えて、次の処理へ flag=2; return; } //PORTEの1ビット点灯 if(flag==0) { PORTB=0x00; PORTE=0x02; //flagの処理を変えて、次の処理へ flag=1; return; } } } //==================================================================== //メイン関数 int main(void) { int cnt = 0; int i; char temp; //------------------------------------------------------------------- //ポート初期設定 TRISB=0x00; TRISE=0x00; PORTB=0x00; PORTE=0x00; //------------------------------------------------------------------- //タイマーの設定&タイマー割り込みを許可 OpenTimer1(T1_ON & T1_GATE_OFF & T1_PS_1_64 & T1_SYNC_EXT_OFF & T1_SOURCE_INT,10000); ConfigIntTimer1(T1_INT_PRIOR_5 & T1_INT_ON); //------------------------------------------------------------------- //UART初期設定 //速度は115kbpsとします(80MHzクロックでは実用的に最も速い設定) OpenUART1(config1,config2,10); //------------------------------------------------------------------- //文字列の検出(メインループ) while(1) { //受信待ち while(!DataRdyUART1()); temp = ReadUART1(); //Enterキーは押されていない if(temp != '\r') { string[cnt] = temp; cnt++; } //Enterキーが押された else { newline(); //null文字挿入 string[cnt]=0; //文字列として表示 putsUART1(string); while(BusyUART1()); newline(); newline(); cnt=0; //----------------------------------------------------------------- //右 if(!strcmp(string,"right")) { putsUART1("the code was accepted..."); while(BusyUART1()); newline(); putsUART1("mode = right-rotation"); newline(); newline(); mode=2; str_clear(); } //----------------------------------------------------------------- //左 else if(!strcmp(string,"left")) { putsUART1("the code was accepted..."); while(BusyUART1()); newline(); putsUART1("mode = left-rotation"); newline(); newline(); mode=1; str_clear(); } //----------------------------------------------------------------- //停止 else if(!strcmp(string,"stop")) { putsUART1("the code was accepted..."); while(BusyUART1()); newline(); putsUART1("mode = stop"); newline(); newline(); mode=0; PORTB=0; PORTE=0; str_clear(); } } } } //********************************************************************