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

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

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

SFoscとボーレートの関連

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

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

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