シリアル通信のイメージ図
送信は[スタート]+[データ]+[パリティ]+[ストップ]
秋月通商のLCDオシロスコープキットで通信波形を表示させて見ました。
シリアル通信の接続概略図
PICのUSART受信概要
PICのUSART送信概要

PIC12F1822のピン構成図です。
この様に配線し、
| ビット | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
| 機能 | CSRC | TX9 | TXEN | SYNC | SENDB | BRGH | TRMT | TX9D |
| ビット | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
| 機能 | SPEN | RX9 | SREN | CREN | ADDEN | FERR | OERR | RX9D |
---------------------------------------------------------------------
#include <xc.h>
#define _XTAL_FREQ 8000000 // delay用(クロック8MHzで動作時)
// コンフィギュレーション1の設定
// CLKOUTピンをRA4ピンで使用する(CLKOUTEN_OFF):内部クロック使用する(INTIO)
// 外部クロック監視しない(FCMEN_OFF):外部・内部クロックの切替えでの起動はなし(IESO_OFF)
// 電源電圧降下常時監視機能ON(BOREN_ON):電源ONから64ms後にプログラムを開始する(PWRTEN_ON)
// ウオッチドッグタイマー無し(WDTE_OFF):
// 外部リセット信号は使用せずにデジタル入力(RA3)ピンとする(MCLRE_OFF)
// プログラムメモリーを保護しない(CP_OFF):データメモリーを保護しない(CPD_OFF)
__CONFIG(CLKOUTEN_OFF & FOSC_INTOSC & FCMEN_OFF & IESO_OFF & BOREN_ON &
PWRTE_ON & WDTE_OFF & MCLRE_OFF & CP_OFF & CPD_OFF) ;
// コンフィギュレーション2の設定
// 動作クロックを32MHzでは動作させない(PLLEN_OFF)
// スタックがオーバフローやアンダーフローしたらリセットをする(STVREN_ON)
// 低電圧プログラミング機能使用しない(LVP_OFF)
// Flashメモリーを保護しない(WRT_OFF):電源電圧降下常時監視電圧(2.5V)設定(BORV_HI)
__CONFIG(PLLEN_OFF & STVREN_ON & WRT_OFF & BORV_HI & LVP_OFF);
// 指定した時間(num x 10ms)だけウエイトを行う処理関数
void Wait(unsigned int num)
{
int i ;
// numで指定した回数だけ繰り返す
for (i=0 ; i < num ; i++) {
__delay_ms(10) ; // 10msプログラムの一時停止
}
}
// メインの処理
void main()
{
char i ;
OSCCON = 0b01110010 ; // 内部クロックは8MHzとする
ANSELA = 0b00000000 ; // アナログは使用しない(すべてデジタルI/Oに割当てる)
TRISA = 0b00001000 ; // ピンは全て出力に割当てる(RA3は入力専用)
PORTA = 0b00000000 ; // 出力ピンの初期化(全てLOWにする)
// USART機能の設定を行う
RXDTSEL = 1 ; // 2番ピン(RA5)をRX受信ピンとする
TXCKSEL = 1 ; // 3番ピン(RA4)をTX送信ピンとする
TXSTA = 0b00100100 ; // 送信情報設定:非同期モード 8ビット・ノンパリティ
RCSTA = 0b10010000 ; // 受信情報設定
SPBRG = 51 ; // ボーレートを9600(高速モード)に設定
Wait(500) ; // 5秒後に開始する
i = 0x30 ;
while(1) {
while(TXIF==0) ; // 送信可能になるまで待つ *1)
TXREG = i ; // 送信する
// 送信データを作成する(モニターに表示しやすい用に文字データを作成)
i++ ;
if (i > 0x7b) i=0x30 ;
Wait(100) ; // 1秒後に処理を繰り返す
}
}
---------------------------------------------------------------------
*1) 送信可能になるまで待つ処理を変更。(連続で続けて送信する場合に不具合が有った為)
---------------------------------------------------------------------
#include <xc.h>
#include "skMonitorLCD.h" // これはLCDモニター用です
#define _XTAL_FREQ 20000000 // delay用(クロック20MHzで動作時)
unsigned char RCV_Buff ; // データ受信バッファ
int Flag ; // データ受信フラグ 1:受信した 0:未受信
// 低電圧プログラミング機能使用しない(LVPDIS)
// メモリを保護しない(UNPROTECT):外部リセット信号は使用せずにデジタル入力(RA5)ピンとする(MCLRDIS)
// 電源電圧降下常時監視機能ON(BOREN):電源ONから72ms後にプログラムを開始する(PWRTEN)
// ウオッチドックタイマ無し(WDTDIS):外部クロックを使用する(HS)
__CONFIG(LVPDIS & UNPROTECT & MCLRDIS & BOREN & PWRTEN & WDTDIS & HS) ;
// USART通信の受信割込み処理
void interrupt InterReceiver( void )
{
if (RCIF == 1) { // 割込みはUSART通信の受信か?
RCV_Buff = RCREG ; // レジスタからデータを受信
Flag = 1 ; // データを受信したぞっとぉ
RCIF = 0 ; // 割込み受信フラグをリセット
}
}
// メインの処理
void main()
{
CMCON = 0b00000111 ; // コンパレータは使用しない(RA0-RA4はデジタルピンで使用)
VRCON = 0b00000000 ; // RA2はデジタルピンで使用
TRISA = 0b00100000 ; // 1でINPUT 0でOUTPUT RA5はINPUT Only
TRISB = 0b00001010 ; // RB3/RB1(RX)はINPUT RB2(TX)とその他は全てOUTPUT
PORTA = 0 ; // A出力ポートの初期化
PORTB = 0 ; // B出力ポートの初期化
// USART機能の設定を行う
TXSTA = 0b00100100 ; // 送信情報設定:非同期モード 8ビット・ノンパリティ
RCSTA = 0b10010000 ; // 受信情報設定
SPBRG = 129 ; // ボーレートを9600(高速モード)に設定
RCIF = 0 ; // USART割込み受信フラグの初期化
RCIE = 1 ; // USART割込み受信を有効にする
PEIE = 1 ; // 周辺装置割込みを有効にする
GIE = 1 ; // 全割込み処理を許可する
Flag = 0 ; // データ受信フラグのリセット
// LCDモニターを使用する為の初期化処理 *2)
MonitorInit() ;
while(1) {
// USARTからデータが送られてきたら処理する
if (Flag == 1) {
// モニターの表示エリアをクリアする
MonitorPutc(0x11) ;
MonitorPuts(" ") ;
MonitorPutc(0x11) ;
// モニターに受信データを送る
MonitorPutc(RCV_Buff) ;
// 受信データは処理したぞっとぉ
Flag = 0 ;
}
}
}
---------------------------------------------------------------------
こんな感じでテストしました。
一部追記(*3) 2017/02/02
記事見直し(*2) 2014/09/23
追記&変更(*1) 2013/01/21
【きむ茶工房ガレージハウス】
Copyright (C) 2006-2020 Shigehiro Kimura All Rights Reserved.