---
---
18F14K50には、シリアル通信を行うためのEUSART(Enhanced Universal Synchronous Asynchronous Receiver Transmitter )が組み込まれています。EUSARTには、同期および非同期のシリアル送受信を行う機能がありますが、ここでは、非同期の受信にかかわる機能の説明です。 非同期の受信は、RCDTピンから入力されたデータをRSR レジスタに読み込み、1ワード分の処理が終わると、受信内容を2本のFIFO(受信バッファ)に取り込みます。同時に準備ができたこと(RCIF = 1)で通知します。このとき受信インタラプト(RCIE =1)が許可されているとインタラプトが発生します。 非同期の受信に必要なシフトクロックは、システムクロックを送信と共有のBaud Rate Genaratorで分周して発生させます。非同期の受信に関連するレジスター一覧を下表に示します。また、
*注意*
RX/DT(RB5)ピンは、TRISで入力にセット(TRISbits.TRISB5 = 1;) し、ANSELHもデジタルにリセット(ANSELHbits.ANS11 = 0;)する必要があります。
| ボーレート | SYNC = 0, BRGH = 1, BRG16 = 1 | |||||
|---|---|---|---|---|---|---|
| 4M | 8M | 48M | ||||
| SPBRG | % Error | SPBRG | % Error | SPBRG | % Error | |
| 2400 | 416 | 0.08 | 832 | 0.04 | 4999 | 0.00 |
| 9600 | 103 | 0.16 | 207 | 0.16 | 1249 | 0.00 |
| 19.2K | 51 | 0.16 | 103 | 0.16 | 624 | 0.00 |
| レジスタ | bit7 | bit6 | bit5 | bit4 | bit3 | bit2 | bit1 | bit0 |
|---|---|---|---|---|---|---|---|---|
| RCON | IPEN | SBOREN | — | RI | TO | PD | POR | BOR |
| INTCON | GIEH | GIEL | TMR0IE | INTE | IOCIE | TMR0IF | INTF | IOCIF |
| PIE1 | TMR1GIE | ADIE | RCIE | TXIE | SSP1IE | SSP1IE | TMR2IE | TMR1IE |
| PIR1 | TMR1GIF | ADIF | RCIF | TXIF | SSP1IF | SSP1IF | TMR2IF | TMR1IF |
| IPR1 | — | ADIP | RCIP | TXIP | SSPIP | CCP1IP | TMR2IP | TMR1IP |
| RCSTA | SPEN | RX9 | SREN | CREN | ADDEN | FERR | OERR | RX9D |
| TXSTA | CSRC | TX9 | TXEN | SYNC | SENDB | BRGH | TRMT | TX9D |
| TXREG | EUSART Transmit Data Register | |||||||
| BAUDCON | ABDOVF | RCIDL | DTRXP | CKTXP | BRG16 | - | WUE | ABDEN |
| SPBRGH | Baud Rate Generator<15:8> | |||||||
| SPBRG | Baud Rate Generator< 7:0> | |||||||
| レジスタ | BIT | 名 | 内容 | 1 | 0 |
|---|---|---|---|---|---|
| RCON | 7 | IPEN | 2レベルのインタラプト優先度 | 使用 | 不 |
| INTCON | 7 | GIEH | 高優先度インタラプトを使用許可 | 許可 | 不 |
| 6 | GIEL | 低優先度インタラプトを使用許可 | 許可 | 不 | |
| PIR1 | 5 | RCIF | 受信バッファ フラグ | 空 | 待ち |
| PIE1 | 5 | RCIE | インタラプトを使用許可 | 許可 | 不 |
| IPR1 | 5 | RCIP | インタラプト優先度 | 高 | 低 |
| RCSTA | 7 | SPEN | 出力ピンのシリアル設定 | ON | OFF |
| 6 | RX9 | 9 ビット受信 | 9bit | 8bit | |
| 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) | |||
| TXSTA | 4 | SYNC | 同期モード | 同期 | 非同期 |
| 2 | BRGH | High Baud Rate選択 | High | Low | |
| BAUDCON | 7 | ABDOVF | 自動baud レート検出オーバーフロー (Read Only) | あり | なし |
| 6 | RCIDL | 受信アイドル (Read Only) | アイドル | 作動中 | |
| 5 | CKTXP | 受信極性 | 反転出力 | 正論理 | |
| 3 | BRG16 | Baud Rate Generatorのビット長 | 16bit | 8bit | |
| 1 | WUE | ウェイクアップ | ON | OFF | |
| 0 | ABDEN: | 自動baud レート検出 | ON | OFF |
非同期8ビットシリアル、パリティーなし、9600bpsで受信するプログラムを作成しました。 受信したASCII文字データにより、指定された回数LEDを点滅します。
<回路図>
シリアル信号をPICに加える信号源に、PICkit2 のUART機能を使用しています。
<プログラム>
//*********************************************************
// PIC18F14K50 UART 受信 Program// : MPLABX XC8
// 内部クロック4Mhz Baud Rate:9600BPS, 16-bit Baud Rate
// シリアルデータの受信で以下の動作をする
// 受信データ、
// 1 : LED0 ON
// 2 : LED1 ON
// 3 : LED2 ON
// 4 : LED3 ON
// 上記以外 : 全LED OFF
// ポートの設定
// UART Input : RB5
//*********************************************************
#include <xc.h>
#define LED0 LATCbits.LATC0
#define LED1 LATCbits.LATC1
#define LED2 LATCbits.LATC2
#define LED3 LATCbits.LATC3
//-------------- コンフィグレーション -----------------------
#pragma config FOSC = IRC // 内部クロック
#pragma config USBDIV = OFF, CPUDIV = NOCLKDIV
#pragma config IESO = OFF, FCMEN = OFF, PLLEN = ON
#pragma config BORV = 30, BOREN = OFF, PWRTEN = OFF
#pragma config WDTPS = 32768, WDTEN = OFF
#pragma config MCLRE = OFF, HFOFST = OFF, XINST = OFF
#pragma config BBSIZ = OFF, LVP = OFF, STVREN = ON
#pragma config CP1 = OFF, CP0 = OFF, CPD = OFF, CPB = OFF
#pragma config WRT1 = OFF, WRT0 = OFF, WRTB = OFF, WRTC = OFF
#pragma config EBTR1 = OFF, EBTR0 = OFF, EBTRB = OFF
//*********************************************************
void main(void){
char RxData;
OSCCON = 0b01010010; // 内部クロック4Mhz
ANSEL = 0; // Port をデジタルで使用
ANSELH = 0;
LATC = 0;
TRISC = 0xF0;
// UART関連レジスタは以下のように設定される
RCSTA = 0b10010000;
TXSTA = 0b00000100;
BAUDCON = 0b00001000;
SPBRGH = 0;
SPBRG = 103;
while(1){
while (!PIR1bits.RCIF); // 受信するまで待つ
RxData = RCREG; // 受信データを取り込む
switch(RxData){
case '1':
LED0 = 1;
LED1 = 0;
LED2 = 0;
LED3 = 0;
break;
case '2':
LED0 = 0;
LED1 = 1;
LED2 = 0;
LED3 = 0;
break;
case '3':
LED0 = 0;
LED1 = 0;
LED2 = 1;
LED3 = 0;
break;
case '4':
LED0 = 0;
LED1 = 0;
LED2 = 0;
LED3 = 1;
break;
default:
LED0 = 0;
LED1 = 0;
LED2 = 0;
LED3 = 0;
break;
}
}
}
SFoscとボーレートの関連