PIC16F1705でのシリアル通信のテストをします。
いつものように、USBシリアル変換モジュールFT234Xを使い、パソコンの通信ソフトTeraTermとの間でのシリアル通信テストです。電源(5V)もFT234Xから供給します。
PIC16F1705の特徴の一つは、PPSモジュールを内蔵していることです。PPSとは、Peripheral Pin Selectのことで、各機能の入出力ピンを自由に設定できるのです。(デジタルI/Oのみ)
今回は、USARTのTX(出力)をRA0に、RX(入力)をRA1に割り当ててみます。PPSについては、PIC16F1705の説明書のP137とP139とP141に説明があるのですが、英文のこともあり、今一つ分かりませんでしたが、「きむ茶工房ガレージハウス」の16F1705覚書を読んで、ようやく理解できました。
設定の方法です。
まず、入力ピンの選択は、XXXPPSレジスタ群で行います。XXXは、入力機能でINT,T0CKI,T1CKI,T1G,CCP1,CCP2,COG,SSPCLK,SSPDAT,SSPSS,RX,CK,CLCIN0,CLCIN1,CLCIN2,CLCIN3です。
RXをRA1に割り当てる場合は、RXCCP = 0x01;とします。(0x01は、RA1を指定する値です。説明書のP139を参照)
次に出力の選択は、RxyPPSレジスタ群で行います。Rxyはピンの名称で、RA0,RA1,RA2,RA4,RA5,RC0,RC1,RC2,RC3,RC4,RC5です。(RA3はありません。)
RA0にTXを割り当てる場合は、RA0CCP = 0x14;とします。(数値は、TXを指定する値です。説明書のP141を参照)
回路図です。
ブレッドボードです。
TeraTermの画面です。(キーボードからのエコーバックです)
プログラムです。
以下のプログラムで、通信速度300bps~230400bpsで通信できることを確認しました。
--------------------------------------------------------------
* File: main.c
* Author: Keiji
* PIC16F1705 シリアル通信テスト
* Created on 2019/04/04
*/
#include <stdlib.h>
#include <xc.h>
#pragma config FOSC = INTOSC //内部クロックを使う
#pragma config WDTE = OFF //ウォッチドックタイマー無効
#pragma config PWRTE = ON //パワーアップタイマーを有効にする
#pragma config MCLRE = OFF //MCLRピンをRA3として使用する
#pragma config CP = OFF //プログラムメモリを保護しない
#pragma config BOREN = ON //ブラウンアウトリセットを有効にする
#pragma config CLKOUTEN = OFF //クロック出力を無効とし、RA4ピンとして使用する
#pragma config IESO = OFF //内部・外部クロックの切り替えでの起動を行わない
#pragma config FCMEN = OFF //外部クロックを監視しない
#pragma config WRT = OFF //フラッシュメモリを保護しない
#pragma config PPS1WAY = OFF //ロック解除シーケンスで何度でもPPSLOCKをセット/クリアできる
#pragma config ZCDDIS = ON //ゼロクロス検出回路無効
#pragma config PLLEN = ON //×4PLLを動作させる
#pragma config STVREN = ON //スタックオーバーフローリセットを行う
#pragma config BORV = HI //ブラウンアウトリセット電圧を高(2.7V)に設定
#pragma config LPBOR = OFF //低消費電力ブラウンアウトリセット無効
#pragma config LVP = OFF //低電圧プログラミングを行わない
TX1STA = 0x24; //SYNC=0 TXEN = 1 BRGH = 1
BRG16 = 1; //BRG 16bit mode
RC1STA = 0x90; //非同期、継続受信可
unsigned int X= _XTAL_FREQ/BR/4 - 1;
SP1BRGH = X / 256;
SP1BRGL = X % 256;
}
while(!TXIF);
TX1REG = byte;
}
while(!RCIF);
return RC1REG;
}
unsigned char c;
c = getch();
putch(c);
return c;
}
OSCCON = 0b01110000 ; // 内部クロック8MHz ×4=32MHz
ANSELA = 0b00000000 ; // AN0-AN3を使わない
ANSELC = 0b00000000 ; // AN4-AN6を使わない
TRISA = 0b00000010 ; // RA1は入力他は出力
TRISC = 0b00000000 ; // 全て出力
PORTA = 0b00000000 ; // PORTAクリア
PORTC = 0b00000000 ; // PORTCクリア
/* TX RXピンの割り当て*/
RA0PPS = 0x14; //RA0にTXを割り当てる。
RXPPS = 0x01; //RXをRA1に割り当てる。
serial_init(9600); // Serial通信初期化とBaud Rateの設定
while(1){
getche();
}
}
※コメント投稿者のブログIDはブログ作成者のみに通知されます