開発環境

基盤

  • SPPBoard(dsPIC30F3014使用)

コンパイラ

  • C30

XBee

  • XB24-Z7PIT-004

はじめに

XBeeの通信方式はシリアル通信なのでdsPICのUARTに直結することができます。

そこで、今回はXBeeによるdsPIC/PC間通信を題材にUARTを用いてシリアル通信を実装する方法について解説したいと思います。

dsPIC - XBee(A) <--> XBee(B) - PC

XBeeはXB24-Z7PIT-004(PCBアンテナタイプ)を使用します。


UARTとは

単位時間あたり1bitずつ送られてくるシリアルデータをその都度シフトして適当なパラレルデータに変換する回路のことです。

回路の基礎知識

RX: 受信
TX: 送信

dsPIC側のXBee

UART2の端子を使用します。

UART_pin

PC側のXBee

PCからXBeeへの接続方法はUSBで接続するだけで済むようにしたいと思います。

そのために今回はFT232RL_MODULEという変換モジュールを使用します。

これはUSBの信号をXBeeに接続可能なTLLレベルに変換してくれるものです。

FT232RL_MODULE  <-->  XBee
1  TXD          <-->  3  DIN/-CONFIG
5  RXD          <-->  2  DOUT
24 GND          <-->  10 GND
19 3V3          <-->  1  VCC

XBeeの設定

PC側のXBee

ボーレート  115200bps
FunctionSet ZIGBEECOORDINATOR AT
PANID       500
DH          13A200
DL          406E8886

dsPIC側のXBee

ボーレート  115200bps
FunctionSet ZIGBEEROUTER AT
PANID       500
DH          13A200
DL          40625D41

サンプルプログラム

C30コンパイラのバグでUARTで使用するピンはこちら側で定義する必要があります。

#define UART_RX_TX 0xFBE7
#define UART_ALTRX_ALTTX 0xFFE7

(注)dsPIC30F3014はuart.hに上の定義がありません。

送信完了待ち関数

void WaitSendString(const short UartChannel){
    switch(UartChannel){
        case UART1:
            while(BusyUART1());
            break;
        case UART2:
            while(BusyUART2());
            break;
    }
}
  • BusyUARTx()

    送信中なら1、送信完了なら0を返す

データ送信関数

void SendString(const short UartChannel, unsigned int *string){
    switch(UartChannel){
        case UART1:
            putsUART1(string);
            break;
        case UART2:
            putsUART2(string);
            break;
    }
    WaitSendString(UartChannel);
}

受信完了待ち関数

void WaitGetString(const short UartChannel){
    switch(UartChannel){
        case UART1:
            while(!DataRdyUART1());
            break;
        case UART2:
            while(!DataRdyUART2());
            break;
    }
}
  • DataRdyUARTx()

    受信中なら0、受信完了なら1を返す

コマンド受信関数

char *GetCommand(const short UartChannel){
    unsigned char moji;
    int count = 0;
    static char string[MAX_UARTWORD];

    WaitGetString(UartChannel);

    switch(UartChannel){
        case UART1:
            moji = ReadUART1();
            break;
        case UART2:
            moji = ReadUART2();
            break;
    }

    while((moji != '\r') && (count < MAX_UARTWORD)){
        string[count] = moji;
        count++;
        WaitGetString(UartChannel);
        switch(UartChannel){
            case UART1:
                moji = ReadUART1();
                break;
            case UART2:
                moji = ReadUART2();
                break;
        }
    }

    string[count] = 0x00;
    return string;
}
  • ReadUARTx() 1文字の受信関数

UART初期化関数

void UartInitFunc(void){
    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;

    OpenUART1(config1, config2, 10);
    OpenUART2(config1, config2, 10); //115kbps

    /*受信割り込み禁止、送信割り込み禁止*/
    ConfigIntUART1(UART_RX_INT_DIS & UART_TX_INT_DIS);
    ConfigIntUART2(UART_RX_INT_DIS & UART_TX_INT_DIS);

}
  • OpenUARTx(unsigned int config1, unsigned int config2, unsigned int ubrg)

    ubrg(UxBRG) = FCY / (16 * BaudRate) - 1

    FCYとはFOSCを1/2倍したものです。

    FOSCは実際の命令周波数なので、クロック生成部分で出力される周波数の1/2となります。(PICは2つのクロックで1個の命令が実行されるため)

    システムクロック80MHzで115kbpsのボーレートを得たい場合
    UxBRG = 20000 / (16 * 115) - 1
    UxBRG = 0.987
    ubrgに10を渡せば良いことがわかります。
    
  • UART_EN or UART_DIS

    UARTモジュールを有効/無効

  • UART_IDLE_CON or UART_IDLE_STOP

    アイドル中動作継続/停止

  • UART_ALTRX_ALTTX or UART_RX_TX

    代替/通常ピンを使用

  • UART_NO_PAR_9BIT or UART_ODD_PAR_8BIT or UART_EVEN_PAR_8BIT or UART_NO_PAR_8BIT

    9ビットデータ + パリティなし

    8ビットデータ + 奇数パリティ

    8ビットデータ + 偶数パリティ

    8ビットデータ + パリティなし

    念のためパリティビットについての復習
    
    パリティビットとはデータが正常に送られたかを検査するために使用されるビットです。
    偶数パリティ、奇数パリティの2種類が存在し、これは送信するデータの1の数が偶数または奇数になるようにパリティビットで調整されます。
    
    (例)
    1000 0010 'A'というASCIIコードを送信する
    
    偶数パリティ
    1000 00100
    
    奇数パリティ
    1000 00101
    
  • UART_2STOPBITS or UART_1STOPBIT

    ストップビット長を2ビット/1ビットに設定

  • UART_DIS_WAKE

    SLEEP中にスタートビットが来た時のウェイクアップを有効化

  • UART_EN_LOOPBACK or UART_DIS_LOOPBACK

    ループバックモード(送信したデータを自分に戻してテストする機能)を有効/無効

  • UART_EN_ABAUD or UART_DIS_ABAUD

    ボーレートの自動検出を有効/無効

  • UART_INT_TX_BUF_EMPTY or UART_INT_TX

    送信バッファが完全に空になったら/空きがあれば割り込む

  • UART_TX_PIN_NORMAL or UART_TX_PIN_LOW

    通常動作/ブレーク

    ブレーク信号とは中断信号のことです。
    通信を強制的に中断して初期状態に戻したりする際に用いられます。
    
  • UART_TX_ENABLE or UART_TX_DISABLE

    送信有効/無効

  • UART_INT_RX_CHAR

    文字を受信する度に割り込む

  • UART_ADR_DETECT_DIS

    アドレス文字を検出しない

  • UART_RX_OVERRUN_CLEAR

    オーバーランした場合はビットクリアする


以上でUARTを用いたシリアル通信のサンプルプログラムの完成です。



blog comments powered by Disqus

Published

24 November 2013

Category

SPPBoard

Tags

Profile

千葉工大産のロボットナビゲーションエンジニア

ros-jpの勉強会の主催やロボカップ世界大会優勝チームのリーダをやってました。


 
badge_description about badge's

 

Follow me on Github

Follow me on Qiita

総訪問者数

アクセスカウンター