PIC16F18325には、シリアル通信を行うためのEUSART(Enhanced Universal Synchronous Asynchronous Receiver Transmitter )が組み込まれています。EUSARTには、同期および非同期のシリアル送受信を行う機能がありますが、ここでは、非同期の受信にかかわる機能の説明です。
非同期の受信は、RCDTピンから入力されたデータをRSR レジスタに読み込み、1ワード分の処理が終わると、受信内容を2本のFIFO(受信バッファ)に取り込みます。同時に準備ができたこと(RCIF = 1)で通知します。このとき受信インタラプト(RCIE =1)が許可されているとインタラプトが発生します。RC1REGから受信データを読み出し、FIFOバッファにデータがなくなるとRCIFはシステムがクリアするため、ユーザーがソフトウエアでクリアする必要はありません。
非同期の受信に必要なシフトクロックは、システムクロックを送信と共有のBaud Rate Genaratorで分周して発生させます。非同期の受信に関連するレジスター一覧を下表に示します。
*注意*
RX/DTピンは、RC5に設定されていますが、PPS機能を利用し他に変更することが可能です。また、RXピンの、TRISは「1」、ANSELは「0」にする必要があります。
| ボーレート | SYNC = 0, BRGH = 1, BRG16 = 1 | |||||||
|---|---|---|---|---|---|---|---|---|
| 1M | 4M | 8M | 32M | |||||
| SP1BRG | % Error | SP1BRG | % Error | SP1BRG | % Error | SP1BRG | % Error | |
| 2400 | 103 | 0.16 | 416 | 0.08 | 832 | 0.04 | 3332 | 0.01 |
| 9600 | 25 | 0.16 | 103 | 0.16 | 207 | 0.16 | 832 | 0.04 |
| 19.2K | 12 | 0.16 | 51 | 0.16 | 103 | 0.16 | 416 | -0.08 |
| レジスタ | bit7 | bit6 | bit5 | bit4 | bit3 | bit2 | bit1 | bit0 |
|---|---|---|---|---|---|---|---|---|
| INTCON | GIE | PEIE | - | - | - | - | - | INTEDG |
| PIE1 | TMR1GIE | ADIE | RCIE | TXIE | BCL1IE | BCL1IE | TMR2IE | TMR1IE |
| PIR1 | TMR1GIF | ADIF | RCIF | TXIF | SSP1IF | BCL1IF | TMR2IF | TMR1IF |
| RC1STA | SPEN | RX9 | SREN | CREN | ADDEN | FERR | OERR | RX9D |
| TX1STA | CSRC | TX9 | TXEN | SYNC | SENDB | BRGH | trMT | TX9D |
| RC1REG | EUSART Receive Data Register | |||||||
| BAUD1CON | ABDOVF | RCIDL | - | SCKP | BRG16 | - | WUE | ABDEN |
| SP1BRGH | BRG<15:8> | |||||||
| SP1BRGL | RG<7:0> | |||||||
| TRISC | TRISC5 | TRISC4 | TRISC3 | TRISC2 | TRISC1 | TRISC0 | ||
| レジスタ | BIT | 名 | 内容 | 1 | 0 |
|---|---|---|---|---|---|
| INTCON | 7 | GIE | 全インタラプトの使用許可 | 許可 | 否 |
| 6 | PEIE | 周辺機能インタラプトの使用許可 | 許可 | 否 | |
| PIE1 | 5 | RCIE | シリアル送信のインタラプト許可 | 許可 | 否 |
| PIR1 | 5 | RCIF | シリアル送信バッファフラグ | 空 | 使用中 |
| RC1STA | 7 | SPEN | 入出力ピンのシリアル設定 | ON | OFF |
| 6 | RX9 | 9 ビット受信 | 9 bit | 8 bit | |
| 5 | SREN | シングル受信 (同期モードのみ) | ON | OFF | |
| 4 | CREN | 連続受信 | ON | OFF | |
| 3 | ADDEN | アドレス検出 (RX9 = 0では使用しない | ON | OFF | |
| 2 | FERR | フレーミング エラー (Read Only) | あり | なし | |
| 1 | OERR | オーバーランエラー (Read Only) | あり | なし | |
| 0 | RX9D | 受信データの9 ビット目 (Read Only) | 1 | 0 | |
| TX1STA | 4 | SYNC | 同期モード | 同期 | 非同期 |
| 2 | BRGH | High Baud Rate選択 | High | Low | |
| BAUD1CON | 4 | SCKP | 送信極性 | 反転出力 | 正論理 |
| 3 | BRG16 | Baud Rate Generatorのビット長 | 16bit | 8bit |
非同期8ビットシリアル、パリティーなし、9600bpsで受信するプログラムを作成しました。 受信したASCII文字データにより、指定されたLEDを点滅します。
<回路図>
シリアル信号をPICに加える信号源に、PICkit2 のUART機能を使用しています。
<プログラム>
/*************************************
* File: UART RX sample
* System ClockはConfigで内部1MHzに設定
* UARTで受信したシリアルデータで以下pinをONにする
* 1:RC0 2:RC1 3:RC2 4:RC3
* 0:全てOFF
*
* PIC16F18325
* Created on Sep 2, 2017, 2:37 PM
**************************************/
#include <xc.h>
#pragma config FEXTOSC = OFF,RSTOSC = HFINT1 // HFINTOSC (1MHz)
#pragma config CLKOUTEN = OFF,CSWEN = OFF,FCMEN = OFF
#pragma config MCLRE = OFF,PWRTE = OFF,WDTE = OFF,LPBOREN = OFF
#pragma config BOREN = OFF,BORV = LOW,PPS1WAY = OFF,STVREN = ON
#pragma config DEBUG = OFF
#pragma config WRT = OFF,LVP = OFF,CP = OFF,CPD = OFF
// ******************* main *************************************
void main() {
char RxData;
TRISA = 0b111111; // Port すべて入力
TRISC = 0b110000; // RC0-RC3 出力
ANSELA = 0; // すべてデジタル
ANSELC = 0; // すべてデジタル
// RXPPS = 0x15; // RC5をRX入力とする
//------------ Initialize UART ----------------------------------
RC1STA = 0b10010000; // 8 bit 連続受信
TX1STA = 0b00000100; // 非同期受信 High Baud Rate選択
BAUD1CON = 0b00001000; // 16 bit SPBRG
SP1BRGH = 0; // 9600bps
SP1BRGL = 25;
// ----------- 繰返し --------------------------------------------
while(1){
while (!RCIF); // 受信するまで待つ
RxData = RC1REG; // 受信データを取り込む
switch(RxData){ // データ内容で、On/Off
case '0': LATC = 0; break;
case '1': LATC = 1; break;
case '2': LATC = 2; break;
case '3': LATC = 4; break;
case '4': LATC = 8; break;
default: break;
}
}
}
Foscとボーレートの関連