PICを単品で使うのもいいのですが、PICとパソコン、PICとマイコンなどのように色々な機器と通信ができると非常に便利です。ということで今回はシリアル通信(ウィキペディア)です。まずはコンピュータから送ったデータを受け取り、同じデータをコンピュータに送り返す、オウム返しを行います。
1.今回使用するPICについて
今回使用するPICは「PIC12F1822」です。
2.回路
シリアル通信で使用するピンについて
RA4:TxD(送信)
RA5:RxD(受信)
(PICのRxDとコンピュータのTxDとつなげます)
パソコンとつなげているシリアル通信の機器は「AE-UM232RL」です。
(参考までに販売サイト紹介:秋月電子通商:AE-UM232RL製品サイト)
3.プログラム
1.基本設定
ANSELA = 0b00000000 ; // すべてデジタルI/Oに割当てる TRISA = 0b00101000 ; // RA3,5を入力とする PORTA = 0b00000000 ; // ピン状態初期化 RXDTSEL = 1; // RA5を受信とする TXCKSEL = 1; // RA4を送信とする
53行目
シリアル通信を行うための設定を行います。初めにポートをデジタルI/Oに設定します。
ANSELA = 0b00000000;
54行目
RA5は受信に使うので、入力に設定します。
TRISA = 0b00101000;
55行目
ピンの状態を初期化しておきます。
PORTA = 0b00000000;
57行目
RA5をRxDにするので、以下のように設定します。
RXDTSEL = 1;
58行目
RA4をTxDにするので、以下のように設定します。
TXCKSEL = 1;
2.シリアル通信の送信設定
TXSTA = 0x24; // 非同期/8ビット/パリティなし
送信の制御に関する設定を行います。
bit | 名前 | 設定値 | 内容 |
bit2 | BRGH | 1 | ハイスピード |
bit4 | SYNC | 0 | 非同期モード |
bit5 | TXEN | 1 | 送信を有効にする |
bit6 | TX9 | 0 | 8ビット送信 |
TXSTA = 0b00100100;
(プログラムでは16進数で「0x24」としています)
3.シリアル通信の受信設定
RCSTA = 0x90; // シリアルポート使用/連続受信あり
受信の制御に関する設定を行います。
bit | 名前 | 設定値 | 内容 |
bit3 | ADDEN | 0 | 8ビットなので |
bit4 | CREN | 1 | 連続受信を有効にする |
bit6 | RX9 | 0 | 8ビット受信 |
bit7 | SPEN | 0 | シリアルポートを有効にする |
RCSTA = 0b10010000;
(プログラムでは16進数で「0x90」としています)
4.シリアル通信の通信速度の設定
BAUDCON = 0x08; // 16bitモード // 16Bitモードで設定 SPBRG = 0x40; // ボーレートを9600に設定(下位8bit) SPBRGH = 0x03; // ボーレートを9600に設定(上位8bit)
baudレート(通信速度)に関する設定を行います。(ちなみにボーレートと読みます)
bit | 名前 | 設定値 | 内容 |
bit3 | BRG16 | 1 | 16ビットbaudレートジェネレータを使用する |
RCSTA = 0b00001000;
(プログラムでは16進数で「0x08」としています)
続いてbaudレートの設定を行います。計算方法ですが、ここまでの設定で
SYNC:0
BRG16:1
BRGH:1
としているので、計算式は
baudレート = Fosc / (4 * (n + 1))
となります。nを求めたいので、
n = Fosc / (4 * baudレート) – 1
となり、値を入れて計算すると
Fosc:32[MHz]
baudレート:9600
n = 32000000 / (4 * 9600) – 1
n = 832.33
となり、設定する値は832となります。これを16進数に変更すると「0x0340」となります。プログラムは以下のようにします。
下位8ビット
SPBRG = 0x40;
上位8ビット
SPBRGH = 0x03;
5.シリアル通信の受信割り込みの設定
RCIF = 0; // シリアル割込みの受信フラグを初期化 RCIE = 1; // シリアル割込みの受信を有効 PEIE = 1; // 周辺装置割込みを有効 GIE = 1; // 全割込み処理を許可
シリアル通信で受信データが来た時の割り込みの設定を行います。割り込みについては「PIC12F1822の割り込み処理について」を参照してください。基本は同様です。
68行目
シリアル通信受信の割り込みフラグを初期化
RCIF = 0;
69行目
シリアル通信受信の割り込みを有効にする
RCIE = 1;
70行目
周辺機能割り込みを有効にする
PEIE = 1;
71行目
割り込みを有効にする
GIE = 1;
6.割り込み時のプログラム
void interrupt rx_uart0( void ) { if( RCIF ) { rx_data = RCREG; // レジスタからデータ格納 rx_flg = true; RCIF = 0; // 割込受信フラグをリセット } }
40行目:if( RCIF )
割り込みが発生し、シリアル通信受信の割り込みフラグ(RCIF)が真のときに処理を行うようにします。
42行目
受信したデータをレジスタから取り出します。
rx_data = RCREG;
43行目
受信したデータがあることをメインプログラムに知らせるために、受信データがあるフラグを立てます。
rx_flg = true;
44行目
シリアル通信受信の割り込みフラグをリセットします。
RCIF = 0;
7.メイン
for(;;) { // データを受信したか? if( rx_flg ) { // 送信可能か? if( TXIF ) { TXREG = rx_data; // 送信レジスタへデータをセットする rx_flg = false; } } }
76行目:if( rx_flg )
メインのプログラムでは、受信データがある場合、そのデータを送信する処理を作ります。データを受信すると、割り込み処理でrx_flgを真にするので、真のときに送信処理を行うようにします。
79行目:if( TXIF )
送信が可能かレジスタのチェックを行います。TXREGに何かが入っていると0になります(簡単に言うと、送信中のデータがあるとTXIFは0になるということです)。
81行目
送信レジスタに受信したデータをセットします。
TXREG = rx_data;
82行目
受信したデータを送信したので、受信データがあるフラグを下ろします。
rx_flg = false;
ソースコード
プログラムの全文を掲載します。
<注意>
本サイトの注意事項を確認してください。
ソースコードや回路図などを使用する場合、上記注意とともに、自己責任でお願いします。
3.動作確認
PCとPICを接続し、PCからシリアル通信でデータを送ってください。すると、PICから送信したのと同じデータが送信されてきます。
注:PCでシリアル通信を行う場合、シリアルポートとシリアル通信を行うソフトが必要になります。
(参考ソフト:Tera Term)
<更新履歴>
新規作成:2015年4月12日
第2版:2016年9月30日:フォーマット変更(内容の変更はなし)
わかりやすい
ありがとう
Tera Term側のプログラムはどうなっていますか?
Tera Termでは文字を送受信しているだけなので、特別なことは何もしていません。
また、Tera Termはシリアルポートを選択している程度で、
ボー・レートなども標準で9600になってると思うので、そのままです。
質問の意図とあっていますか?
解決しました
どうやらbaudレートの値が間違えていたようで文字化けしていたので…
レートを見直せば直りました!アドバイスありがとうございます