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

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

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」にする必要があります。

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

非同期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");    // 開始のメッセージ
            }
        }
    }
}


同じ動作のアセンブラプログラムは、[こちら