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通信のテストができたので感謝です。さて、これにて完成です。
早速動かしてみましょう。
テストプログラムを動かすとこのような感じになりました。