PIC16F18346には、シリアル通信を行うためのEUSART(Enhanced Universal Synchronous Asynchronous Receiver Transmitter )が組み込まれています。EUSARTには、同期および非同期のシリアル送受信を行う機能がありますが、ここでは、非同期の送受信にかかわるプログラムの説明です。
*注意*
TX/CKをどのピンにするかは、PPS機能の希望するピンのRxyPPSレジスターに、”TX/CK"を表す"20(0x14)"を書き込み指示します。また、指示したピンの TRISは「1」入力、ANSELは「0」デジタルにする必要があります。
*注意*
RX/DTピンは、PPS機能を利用し他に変更することが可能です。また、RXピンの、TRISは「1」、ANSELは「0」にする必要があります。
非同期8ビットシリアル、パリティーなし、9600bpsで受信するプログラムを作成しました。 リセット直後にSWを押すと開始メッセージ。その後 SWを押すたびに、「SW OK」と送信します。また、データを受信すると、値を +1 して送り返します。
*参考*
内蔵クロック 32MHz、シリアル速度 115200bpsに変更するには、以下の3行を変更します。
#define _XTAL_FREQ 1000000 | --> #define _XTAL_FREQ 32000000 |
RSTOSC = HFINT1 | --> RSTOSC = HFINT32 |
SP1BRG = 25; | --> SP1BRG = 68; |
<回路図>
Criosity開発ボードにシリアルUSB変換モジュールを取り付けて使用しています。
<プログラム>
/************************************* * File: UART TXRX sample * System ClockはConfigで内部1MHzに設定 * UARTでデータを送受信する。 * SWを押すと開始メッセージ。その後 SWを押すたびに、「SW OK」 * データを受信すると、値を +1 して送り返す * PIC16F18325 --> PIC16F18346 * 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 = ON,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 = ON,CP = OFF,CPD = OFF #define pushSW PORTCbits.RC4 // ================= printf関数を使用するための定義 ================= void putch(unsigned char ch) { while (!TXIF); //送信終了待ち TX1REG = ch; } // ******************* main ************************************* void main() { char RxData; char SWstate = 0; // SWの状態 TRISA = 0b111111; // Port すべて入力 TRISB = 0b11111111; // Port すべて入力 TRISC = 0b11111111; // Port すべて入力 ANSELA = 0; // すべてデジタル ANSELB = 0; // すべてデジタル ANSELC = 0; // すべてデジタル WPUA = 0b001000; // RA3 弱プルアップ ON WPUC = 0b00010000; // RC4 弱プルアップ ON // RC4PPS = 20; // RC4をTX出力とする // RXPPS = 0x15; // RC5をRX入力とする RXPPS = 0x0D; //RB5->EUSART:RX; RB7PPS = 0x14; //RB7->EUSART:TX; //------------ Initialize UART ---------------------------------- RC1STA = 0b10010000; // 8 bit 連続受信 TX1STA = 0b00100100; // 非同期送受信 High Baud Rate選択 BAUD1CON = 0b00001000; SP1BRGH = 0; SP1BRG = 25; while(pushSW); // SWが押されるのを待つ printf("Hello OK\r\n"); // 開始のメッセージ // ----------- 繰返し -------------------------------------------- while(1){ // ------ 受信 ------------------------------------------------ if(RCIF){ RxData = RC1REG; // 受信データを取り込む switch(RxData){ // データ内容で、On/Off case 0x0A: case 0x0D: while (!TXIF); //送信終了待ち TX1REG = RxData; break; default: while (!TXIF); //送信終了待ち TX1REG = RxData + 1; break; } } // ------ 送信 ------------------------------------------------ if(pushSW != SWstate){ // SWの状態が変化したら __delay_ms(10); // 10mS遅延 SWstate = pushSW; // 新しい状態を記録 if(pushSW == 0){ // SWが押されたのなら printf("SW ON\r\n"); // 開始のメッセージ } } } }
同じ動作のアセンブラプログラムは、[こちら]