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

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

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

SFoscとボーレートの関連

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

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

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