PIC16F18325の基本動作から応用プログラムまでを学びます。

ホーム
12F1822
16F1455
16F1459
18F14K50
18F26J50
dsPIC
その他
    
16F18313
16F18325
16F18346
16F1619
Curiosity
---
---
シリアル受信
2017-09-05

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

Foscとボーレートの関連

レジスタ 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

シリアルUART受信のプログラム例

非同期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;
        }
    }
}