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 |
レジスタ | 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 |
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・・・と送信 } }
Foscとボーレートの関連