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