トップページ > 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();   
   
   }
  }
 }
}
//********************************************************************






前へ   次へ