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

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

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

*注意*
TX/CKをどのピンにするかは、PPS機能の希望するピンのRxyPPSレジスターに、”TX/CK"を表す"20"を書き込み指示します。また、指示したピンのTRIS、ANSELは、デジタル入力に設定します。

ボーレート 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 SSP1IE 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
TX1REG EUSART Transmit Data Register
BAUD1CON ABDOVF RCIDL SCKP BRG16 WUE ABDEN
SP1BRGH Baud Rate Generator<15:8>
SP1BRGL 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
RC1STA 7 SPEN 出力ピンのシリアル設定 ON OFF
TX1STA 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
BAUD1CON 4 SCKP 送信極性 反転出力 正論理
3 BRG16 Baud Rate Generatorのビット長 16bit 8bit

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

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

<プログラム>

/*************************************
 * File: UART TX sample
 * System ClockはConfigで内部1MHzに設定
 * UARTでデータを送信する。
 * SWを押すと開始メッセージ。その後 SWを押すたびに、カウントUP
 * PIC16F18325
 * Created on Aug 22, 2017, 2:37 PM
 **************************************/

#include <xc.h>
#include <stdio.h>
#define _XTAL_FREQ 1000000      // delay_ms(x) のための定義

#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

#define pushSW  PORTAbits.RA5

// ================= printf関数を使用するための定義 =================
void putch(unsigned char ch) {
    while (!TXIF);              //送信終了待ち
        TX1REG = ch;
}

// ******************* main *************************************
void main() {
    char num = 10;

    TRISA  = 0b111111;          // Port すべて入力
    TRISC  = 0b111111;          // Port すべて入力
    ANSELA = 0;                 // すべてデジタル
    ANSELC = 0;                 // すべてデジタル
    WPUA   = 0b100000;          // RA5 弱プルアップ ON
    RC4PPS = 20;                // RC4をTX出力とする

//------------ Initialize UART ----------------------------------
    RC1STA   = 0b10000000;      // 非同期送信 9600baud
    TX1STA   = 0b00100100;
    BAUD1CON = 0b00001000;
    SP1BRGH  = 0;
    SP1BRG   = 25;

    while(pushSW);              // SWが押されるのを待つ
    printf("Hello OK\r\n");     // 開始のメッセージ

    // ----------- 繰返し --------------------------------------------
    while(1){
        while(!pushSW);         // SWが離れるのを待つ
        __delay_ms(10);         // 10mS遅延
        while(pushSW);          // SWが押されるのを待つ
        __delay_ms(10);         // 10mS遅延
        printf("%d\r\n",num++); // 0123・・・と送信
    }
}