2014/09/29 Arduino-PICでUSART通信

PIC/Arduino

こんにちは。
今回は、PIC16F877とArduino UNOを使用してUSART通信のテストプログラムをつくります。
目標としては、PICのPORTBにLEDを差し、ArduinoからPICへ点灯パターンを送信するというものです。

Arduino側の設定

はじめに、送信側(Arduino)の回路、プログラムなどの解説をします。
Arduinoには、ハードウェアシリアルという(0ピン-RX,1ピン-TX)ものがついています。
これを利用して、PICのPORTCの7ピン(RC7)と6ピン(RC6)に差してあげます。
このとき、RX(Arduino)-TX(PIC)のように、送信-受信ピンを対応させ回路を組みましょう。
Arduino側の回路に関しては、0,1ピンからジャンパを接続し、PICのPORTCに繋ぐだけで完成です。

Arduinoソースコード

さてソースコードですが、Arduinoはライブラリが豊富ですので至ってシンプルです。
ライブラリは、煩わしい設定が必要なものを全てやってくれて、やりたいことを関数として用意してくれます。
以下、ソースコードです。

								
void setup() {
  Serial.begin(9600); // シリアルポートを9600bpsで開く
}

void loop() {
  Serial.write(0xf0);//点灯パターン 8bit
  delay(1000);  //1秒待ち
}
			    				
							
と、このような感じです。
簡単に解説しますと、Serial.beginで通信を開始します。
loop内で、Serial.writeで点灯パターンを出力するといった感じです。

PIC側の設定

では、PIC側の設定に移ります。
PIC側に関しましては、こちらのソースを使わせていただきました。
とても参考になります。
回路の設定に関しましては、PICの基本動作(セラロック、水晶をつける),コンフィギュレーションビットなどの設定を済ませた上での話をします。
PIC16F877のPORTBに8bitを表すため、8個のLEDをさします。
これでハード的には完成です。

PICソースコード

基本的には、先ほどのサイトと同じではありますが、一部改変した箇所もありますので、ソースコードをのせます。
以下、ソースコードです。
								
#include "stdio.h"      //standard_i/o
#include "xc.h"         // for __delay_ms
#include "pic16f877.h" 
#define _XTAL_FREQ 20000000 // 20MHz
/*configuration bits*/
#pragma config BOREN=OFF//4V blown_out_reset OFF
#pragma config FOSC =HS //4MHz~20MHz High OS
#pragma config WDTE =OFF//watch_dog_timer off
#pragma config PWRTE=ON//power watch reset ON
#pragma config LVP  =OFF//low voltage programming OFF
#pragma config CPD  =OFF//code protection OFF
#pragma config CP   =OFF//flash bot off
#pragma config WRT  =OFF//flash memory write
#pragma config DEBUG=OFF//debug OFF

unsigned char RCV_Buff ;       // データ受信バッファ
int Flag ;                     // データ受信フラグ 1:受信した 0:未受信

// USART通信の受信割込み処理
void interrupt InterReceiver( void )
{
     if (RCIF == 1) {          // 割込みはUSART通信の受信か?
          RCV_Buff = RCREG ;   // レジスタからデータを受信
          Flag = 1 ;           // データを受信
          RCIF = 0 ;           // 割込み受信フラグをリセット
     }
}
// メインの処理
void main()
{
     TRISB  = 0x00 ;           // 全てoutput
     TRISC  = 0b10000000 ;     // 7bit(RX)のみINPUT

     PORTB  = 0x00 ;              // B出力ポートの初期化
     PORTC  = 0x00 ;              // C出力ポートの初期化
     // USART機能の設定を行う
     TXSTA  = 0b00100100 ;     // 送信情報設定:非同期モード 8ビット・ノンパリティ
     RCSTA  = 0b10010000 ;     // 受信情報設定
     SPBRG  = 129 ;            // ボーレートを9600(高速モード)に設定
     RCIF = 0 ;                // USART割込み受信フラグの初期化
     RCIE = 1 ;                // USART割込み受信を有効にする
     PEIE = 1 ;                // 周辺装置割込みを有効にする
     GIE  = 1 ;                // 全割込み処理を許可する
     Flag = 0 ;                // データ受信フラグのリセット

     while(1) {
          // USARTからデータが送られてきたら処理する
          if (Flag == 1) {
               PORTB=0x00;
               // モニターに受信データを送る
               PORTB = RCV_Buff ;
               __delay_us(500);
               // 受信データ処理
               Flag = 0 ;
          }
     }
}
			    				
							
こちらのサイト様のおかげてUSART通信のテストができたので感謝です。
さて、これにて完成です。
早速動かしてみましょう。
テストプログラムを動かすとこのような感じになりました。