---
---
16F145xには、シリアル通信を行うためのEUSART(Enhanced Universal Synchronous Asynchronous Receiver Transmitter )が組み込まれています。EUSARTには、同期および非同期のシリアル送受信を行う機能がありますが、ここでは、非同期の受信にかかわる機能の説明です。
非同期の受信は、RCDTピンから入力されたデータをRSR レジスタに読み込み、1ワード分の処理が終わると、受信内容を2本のFIFO(受信バッファ)に取り込みます。同時に準備ができたこと(RCIF = 1)で通知します。このとき受信インタラプト(RCIE =1)が許可されているとインタラプトが発生します 非同期の受信に必要なシフトクロックは、システムクロックを送信と共有のBaud Rate Genaratorで分周して発生させます。非同期の受信に関連するレジスター一覧を下表に示します。
*注意*
RX/DTピンRC5を有効にするために、TRISで入力「1」にセットする必要があります。
ボーレート | SYNC = 0, BRGH = 1, BRG16 = 1 | |||||||
---|---|---|---|---|---|---|---|---|
4M | 8M | 32M | 48M | |||||
SPBRG | % Error | SPBRG | % Error | SPBRG | % Error | SPBRG | % Error | |
2400 | 416 | 0.08 | 832 | 0.04 | 3332 | 0.01 | 4999 | 0.00 |
9600 | 103 | 0.16 | 207 | 0.16 | 832 | 0.04 | 1249 | 0.00 |
19.2K | 51 | 0.16 | 103 | 0.16 | 416 | -0.08 | 624 | 0.00 |
レジスタ | bit7 | bit6 | bit5 | bit4 | bit3 | bit2 | bit1 | bit0 |
---|---|---|---|---|---|---|---|---|
INTCON | GIE | PEIE | TMR0IE | INTE | IOCIE | TMR0IF | INTF | IOCIF |
PIE1 | TMR1GIE | ADIE | RCIE | TXIE | SSP1IE | SSP1IE | TMR2IE | TMR1IE |
PIR1 | TMR1GIF | ADIF | RCIF | TXIF | SSP1IF | SSP1IF | TMR2IF | TMR1IF |
RCSTA | SPEN | RX9 | SREN | CREN | ADDEN | FERR | OERR | RX9D |
TXSTA | CSRC | TX9 | TXEN | SYNC | SENDB | BRGH | trMT | TX9D |
RCREG | EUSART Receive Data Register | |||||||
BAUDCON | ABDOVF | RCIDL | - | SCKP | BRG16 | - | WUE | ABDEN |
SPBRGH | BRG<15:8> | |||||||
SPBRGL | RG<7:0> | |||||||
TRISC | TRISC5 | TRISC4 | TRISC3 | TRISC2 | TRISC1 | TRISC0 |
レジスタ | BIT | 名 | 内容 | 1 | 0 |
---|---|---|---|---|---|
INTCON | 7 | GIE | 全インタラプトの使用許可 | 許可 | 否 |
6 | PEIE | 周辺機能インタラプトの使用許可 | 許可 | 否 | |
PIE1 | 5 | RCIE | シリアル送信のインタラプト許可 | 許可 | 否 |
PIR1 | 5 | RCIF | シリアル送信バッファフラグ | 空 | 使用中 |
RCSTA | 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 | |
TXSTA | 4 | SYNC | 同期モード | 同期 | 非同期 |
2 | BRGH | High Baud Rate選択 | High | Low | |
BAUDCON | 4 | SCKP | 送信極性 | 反転出力 | 正論理 |
3 | BRG16 | Baud Rate Generatorのビット長 | 16bit | 8bit |
非同期8ビットシリアル、パリティーなし、9600bpsで受信するプログラムを作成しました。 受信したASCII文字データにより、指定された回数LEDを点滅します。
<回路図>
シリアル信号をPICに加える信号源に、PICkit2 のUART機能を使用しています。
<プログラム>
// UART 受信 Program // 内部クロック4Mhz Baud Rate:9600BPS, 16-bit Baud Rate // 受信したシリアルデータの内容で以下の動作をする // 受信データ 点灯するLED // 1 : LED0 ON // 2 : LED1 ON // 3 : LED2 ON // 4 : LED3 ON // 上記以外 : 全LED OFF // // Notes: 4MHz内部クロック // UART 入力 : RC5 // LED0 : RC0 // LED1 : RC1 // LED2 : RC2 // LED3 : RC3 // Language: MPLABX XC8 // Target: PIC16F1455 // ------------------------------------------------------------------------- #include <xc.h> #define LED LATC #pragma config FOSC = INTOSC, WDTE = OFF, PWRTE = OFF, MCLRE = OFF, CP = OFF #pragma config BOREN = ON, CLKOUTEN = OFF, IESO = OFF, FCMEN = OFF #pragma config WRT = OFF, CPUDIV = NOCLKDIV, USBLSCLK = 48MHz, PLLMULT = 3x #pragma config PLLEN = DISABLED, STVREN = ON, BORV = LO, LPBOR = OFF, LVP = OFF void main(void){ char RxData; OSCCON = 0b00110110; // 内部クロック4Mhz ANSELC = 0; // Port をデジタルで使用 LATC = 0; TRISC = 0b11110000; // LED0-LED3端子を出力に設定 // UART関連レジスタ設定 RCSTA = 0b10010000; // 8 bit 連続受信 TXSTA = 0b00000100; // 非同期受信 High Baud Rate選択 BAUDCON = 0b00001000; // 16 bit SPBRG SPBRGH = 0; // 9600bps SPBRGL = 103; while(1){ while (!RCIF); // 受信するまで待つ RxData = RCREG; // 受信データを取り込む switch(RxData){ // データ内容が case '1': // '1'なら LED = 0b00000001; // LED0を点灯 break; // 他は消灯 case '2': // '2'なら LED = 0b00000010; // LED1を点灯 break; // 他は消灯 case '3': // '3'なら LED = 0b00000100; // LED2を点灯 break; // 他は消灯 case '4': // '4'なら LED = 0b00001000; // LED3を点灯 break; // 他は消灯 default: // その他は、 LED = 0b00000000; // すべて消灯 break; } } }
SFoscとボーレートの関連