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

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

16F145xには、シリアル通信を行うためのEUSART(Enhanced Universal Synchronous Asynchronous Receiver Transmitter )が組み込まれています。EUSARTには、同期および非同期のシリアル送受信を行う機能がありますが、このページでは、非同期の送信にかかわる機能だけの説明です。 非同期の送信は、TXIFの内容を読み込みTXREG(送信バッファ)の準備ができたこと(TXIF = 1)を確認し、送信データをTXREGに書き込みます。Tx Shift Registor(TSR)の内容が送り出されるとTXREGの内容が、TSRに移され、TXIFが1になります。このとき送信インタラプト(TXIE =1)が許可されているとインタラプトが発生します。非同期の送信に必要なシフトクロックは、システムクロックをBaud Rate Genaratorで分周して発生させます。サンプルで作成したプログラムは、8ビット、パリティなし、9600bps で「Hello OK」と送信します。非同期の送信に関連するレジスター一覧を下表に示します。

*注意*
SPEN ビットをセットすると、TX/CKピンRC4(1459はRB7)は、UARTの出力に設定されますが、このピンを汎用デジタル出力に使用することはできせん。

ボーレート 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

Foscとボーレートの関連

レジスタ 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
TXREG EUSART Transmit Data Register
BAUDCON ABDOVF RCIDL SCKP BRG16 WUE ABDEN
SPBRGH Baud Rate Generator<15:8>
SPBRGL Baud Rate Generator< 7:0>
レジスタ BIT 内容 1 0
INTCON 7 GIE 全インタラプトの使用許可 許可
6 PEIE 周辺機能インタラプトの使用許可 許可
PIE1 4 TXIE シリアル送信のインタラプト許可 許可
PIR1 4 TXIF シリアル送信バッファフラグ 使用中
ADCON0 0 ADON ADモジュール On/Off ON OFF
RCSTA 7 SPEN 出力ピンのシリアル設定 ON OFF
TXSTA 7 CSRC Clock Source Select (同期モードのみ) - -
6 TX9 9 ビット送信 9 bit 8 bit
5 TXEN 送信許可 許可
4 SYNC 同期モード 同期 非同期
3 SENDB Break文字を送信 送信 完了
2 BRGH High Baud Rate選択 High Low
1 TRMT TSRステイタス(Read Only) 使用中
0 TX9D 9 ビット目送信データ 1 0
BAUDCON 4 SCKP 送信極性 反転出力 正論理
3 BRG16 Baud Rate Generatorのビット長 16bit 8bit

シリアルUART出力のプログラム例

RA5に続されたPushSWを押すと「Hello OK>」を送信、 その後、押すたびに 1234・・・と9600ボーのシリアル送信をするプログラムです。
<回路図>

<プログラム>

//  UART 送信 Program
//  内部クロック4Mhz
//  Baud Rate:9600BPS, 16-bit Baud Rate
//  PushSWを押すと「Hello OK>」を送信、
//       その後、押すたびに AB・・・と送信、
//      PushSW      : RA5
//      UART Output : RC4
//    Language: MPLABX XC8
//    Target:   PIC16F1455
// -------------------------------------------------------------------------

#include <xc.h>
#define _XTAL_FREQ 4000000          // delay_ms(x) のための定義
#define pushSW     RA5

#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 strOutRomUSART(const char *);  // ROMエリア文字列出力

// -------- メイン -----------------------------------------
void main(void){
    char char_data = 0x41;           // 'A'
    OSCCON = 0b00110100;             // 内部クロック4Mhz
    WPUA5  = 1;                      // RA5 弱プルアップ
    nWPUEN = 0;
    // ----------- UART 初期化 -----------------------------
    RCSTA   = 0b10010000;            // UART送受信を有効
    TXSTA   = 0b00100100;            // 8Bit非同期送受信
    BAUDCON = 0b00001000;            // HI-16Bitボーレート
    SPBRGH  = 0;                     // 9600
    SPBRGL  = 103;
    while(pushSW);                   // pushSWが押されるのを待つ
    strOutRomUSART("Hello OK>¥r¥n"); // 開始のメッセージ
    // ----------- 繰返し ----------------------------------
    while(1){
        while(!pushSW);              // SWが離れるのを待つ
        __delay_ms(10);              // 10mS遅延
        while(pushSW);               // SWが押されるのを待つ
        __delay_ms(10);              // 10mS遅延
        TXREG = char_data++;         // AB・・・と送信
    }
}
// -------- ROM文字列出力 ----------------------------------
void strOutRomUSART(const char *str){
    while(*str){                     //文字列の終わり(00)まで継続
        while (!TXIF);               //送信終了待ち
        TXREG = *str++;              //文字出力しポインタ+1
    }
}