PICでソフトウェアUART(ソフトシリアル通信)の実験

〔USART基本編〕 〔マイコンのトップに戻る〕


以前こちらのページで"USART基本"は書いていますね、基本はそちらを参照しましょう。
このページでは、ソフトウェアによる"UART通信を"実験しています。
因みに、"USART"の"S"は[Synchronous:同期]で"S"のつく物は同期通信(半二重)に対応しているPICです
要するにI2C通信の様な感じです。

この実験の結果、ライブラリを作成し[skSoftUARTlib]と名付けました。
送受信の通信タイミングはタイマー2(TMR2)で行っているので、TMR2の無いPICは使用できません
尚、TMR2を使っているので、TMR2を使う周辺モジュール(PWM等)は使用できなくなります。
又、使用可能システムクロックは4MHz〜64MHz(48MHz含まず)までです。

使用可能ボーレート(600bps〜115200bps)
Fosc
最低ボーレート
最高ボーレート
送信のみなら
4MHz
600bps
9600bps
14400bpsまで
8MHz
1200bps
19200bps
600/38400bpsまで
16MHz
1200bps
38400bps

32MHz
4800bps
57600bps
2400bpsまで
64Mz
4800bps
115200bps
230400bpsまで

送信機能

● 送信を行うピンはデジタル出力ができるピンであればどのピンでもOKです。
  "skSoftUARTlib.h"に
  #define SOFT_UART_TXPIN   LATB4  // 送信を行うピン番号の指定
  が記述してあります、送信を行うピンに合わせて書き換えましょう。

● 送信機能を使用する場合は
  "skSoftUARTlib.h"に
  #define SOFT_UART_USE_TX    // 送信機能は使用する
  が記述してあります生かしましょう、受信のみ使用するならコメントにします。

受信機能

受信機能は、ソフトでポーリングする方法とINTピン割り込みを使用する方法の二通りあります。

ポーリング

● 受信を行うピンはデジタル入力ができるピンであればどのピンでもOKです。
  "skSoftUARTlib.h"に
  #define SOFT_UART_RXPIN   PORTBbits.RB0  // 受信を行うピン番号の指定
  が記述してあります、受信を行うピンに合わせて書き換えましょう。
  又、そのピンはTRISxレジスタでデジタル入力に設定を行います。

● ただぁ、現状は1バイト入力しか対応していません、
  なのでぇ、1バイトコマンドを受けて動作するやり方になるかもぉ。

● ポーリング機能を使用する場合は
  "skSoftUARTlib.h"に記述がしてある
  #define SOFT_UART_USE_RX           // 受信機能は使用する
  //#define SOFT_UART_USE_EXT_INT      // 外部ピン割り込みを使用する
  と、外部ピン割り込みはコメントにします。

INTピン割り込み

● 外部ピン割り込みを使用するピンは、INTに割り当てられているピンのみです。
  "skSoftUARTlib.h"に
  #define SOFT_UART_RXPIN   PORTBbits.RB0  // 受信を行うピン番号の指定
  が記述してあります、INT割り当てピンに合わせて書き換えましょう。
  PPS機能ができるPICがありますが、その場合は他のピンに移動できます。
  又、そのピンはTRISxレジスタでデジタル入力に設定を行います。

● PICによっては、INT0/INT1/INT2と数本ある場合がありますがどれも使用可能です。
  "skSoftUARTlib.h"に下記の記述がしてあります
  #define INTEDG0 INTEDG0
  #define INTF0   INT0IF
  #define INTE0   INT0IE
  #define PEIE0   PEIE
  #define GIE0    GIE
  赤数字"0"を其々に合わせ、"1"/"2"と書き換えましょう。

● 外部ピン割り込み機能を使用する場合は
  "skSoftUARTlib.h"に記述がしてある
  #define SOFT_UART_USE_RX           // 受信機能は使用する
  #define SOFT_UART_USE_EXT_INT      // 外部ピン割り込みを使用する
  と、両方を生かします。

● 受信バッファ
  "skSoftUARTlib.h"に記述がしてある
  #define SOFT_UART_BUFFER_SIZE        32      // ソフトUSARTの受信バッファサイズ
  とあります、データメモリの少ないPICは減らした方が良いでしょう。
  (但し、SOFT_UART_BUFFER_SIZE - 1 の個数だけ受信可能です、それ以上は読み捨てられます。)

データを連続で受信する場合は、データ間は5-10ms程開けないと受信できません

送信/受信共通

● TMR2を利用していますが、PICによってはTMR4/TMR6が使用できます。
  "skSoftUARTlib.h"に下記の記述がしてあります
  #define TMRON   TMR2ON
  #define TMRIF   TMR2IF
  #define TCKPS   T2CONbits.T2CKPS
  #define TOUTPS  T2CONbits.T2OUTPS
  #define TMR     TMR2
  #define PR      PR2
  赤数字"2"を其々に合わせ、"4"/"6"と書き換えましょう。

● もし通信速度の誤差等で通信不可の場合は   "skSoftUARTlib.h"に記述がしてある
  #define SOFT_UART_BRG_ADJUSTEDVALUE  0       // ボーレート値の調整用
  とあります、この値を"1"とかに変えて動作したら嬉しいね。
  (1とした場合は、タイマー2のカウント値:PR2が1増えます)

● システムクロックを変えた場合は   "skSoftUARTlib.h"に記述がしてある
  #define _XTAL_FREQ 64000000   // 使用するPIC等により動作周波数値を設定する
  とあります、この値を変えましょう。

《ダウンロードプログラムについて》


ここでの実験は、PIC12F1822/18F26K22のみ動作させていますがTMR2のあるPICなら動作可能でしょう
ただぁ、PIC24E/24Fは必要ないだろうの判断で作成はしていません。m(_ _)m。
↓ここからサンプルプログラムソースファイルをダウンロードして下さい。
SoftUART.zip

プログラムソースをダウンロードしたら、MPLAB Xにてプロジェクトを作成します。
以下のファイルをプロジェクトディレクトリにコピーしてプロジェクトに取込んで下さい。
次にコンパイルPIC書き込みを実行して下さい。
MPLAB(R) XC8 C Compiler Version 2.00コンパイラ
を使用しています。

ダウンロードしたら解凍して下さい、以下のファイル構成です。
 SoftUARTlib.c・・・・・・・・ソフトUART関数ライブラリファイル
 SoftUARTlib.h・・・・・・・・ソフトUART関数ライブラリのヘッダファイル
 SoftUART.c・・・・・・・・・・・ソフトUARTテストサンプルプログラム(PIC18F26K22用)

 尚、CPUのクロックは64MHzを想定しています。

参考

因みにPIC12F1822でコンパイルした時のプログラム容量です。
全部コンパイル 760ワード程使っている
送信のみコンパイル 503ワード程使っている
受信のみコンパイル 633ワード程使っている
受信のポーリングのみコンパイル 472ワード程使っている
送信とポーリングのみコンパイル 592ワード程使っている
1Kワードの非力なPICは、全部コンパイルはきついかもしれない。

SoftUART.c

PIC18F26K22を使ったサンプルでソフトUARTのテストプログラムです。
動作はPCのシリアル端末(TeraTerm等)からデータを受けて、そのデータに+1を加えて返します。
注意)
連続データを送る場合は、データ間を5-10ms開けないとダメだと言う事です。

skSoftUARTlib.h

ソフトUART機能にアクセスする為のライブラリ用のヘッダファイルです。
"SoftUARTlib.c"を利用する場合に
#include "SoftUARTlib.h" をメインプログラムの先頭で記述して下さい。

skSoftUARTlib.c

このライブラリはソフトウェアでUART通信を行う為の関数集です。
ソフトUARTにアクセスを行う関数の使い方を説明します。

 InitSoftUART(long speed)
  ソフトUART通信の初期化を行う処理
  初期化は非同期モード 8ビット・ノンパリティでの設定です。
   speed :使用する通信速度(600bps〜115200bps)を指定します

   例) InitSoftUART(9600)

 SoftUART_Send(const char *dt,int num)
  相手に指定した個数のデータを送信する処理
   *dt :送信するデータを格納した配列を指定します
   num:送信するデータの個数を指定します

 SoftUART_Write(char dt)
  相手に1バイトのデータを送信する処理
   dt:送信するデータを指定します

 int ans = SoftUART_Available(void)
  受信しているデータの個数を返す処理
   ans:受信バッファ内のデータの個数を返します、受信データがなければ0を返します

 unsigned int ans = SoftUART_Read(void)
  受信バッファからデータを1バイト読み込む処理
   ans:受信したデータを返します、0xffffを返したら受信データは空です
  例)
     char dt ;

     if (SoftUART_Available() != 0) {
          dt = SoftUART_Read() ;    // 1バイトデータを受信する
          SoftUART_Write(dt) ;      // 1バイトデータを送信する
     }
 SoftUART_Flush(void)
  受信バッファをクリアする処理
  受信バッファにデータを受信していてもこの関数を実行させればデータはなくなります。

 char ans = SoftUART_PinRead(void)
  受信ピンからデータを1バイト読み込む処理
  この関数を呼出す時は、割込みを使用しないで直接受信ピンをポーリングする時のみ使いましょう。
   ans:読み取ったデータを返します
  例)
       while(1) {
          ans = SoftUART_PinRead() ; // 何か受信するまで待つ
          switch(ans) {
          case '0': // LED OFF
                    LATA0 = 0 ;
                    break ;
          case '1': // LED ON
                    LATA0 = 1 ;
                    break ;
          }
       }
 InterSoftUART(void)
  ソフトUART関連の割り込み処理です。
  受信を行う場合は、メインプログラム(例"SoftUART.c")の割込み処理で必ず呼びます。
  例)
     void interrupt InterFunction( void )
     {
          // UART関連の割り込み処理
          InterSoftUART() ;
     }

skUARTlib

"skUARTlib"はPICのハードウェアでシリアル通信を行うライブラリです。
ライブラリのダウンロードはここにあります。

"skUARTlib"の説明はこちらのページを参照願います。

skUART2lib

上の"skUARTlib"はUART1/UART2の何れかを利用する用に出来ていましたが、
"skUART2lib"は"skUARTlib"をUART2専用にした物ですので使い方は同じです。
ですので、"skUARTlib"でUART1にして"skUART2lib"でUART2を使用する事が出来ます。
ライブラリのダウンロードはここにあります。




【きむ茶工房ガレージハウス】
Copyright (C) 2006-2020 Shigehiro Kimura All Rights Reserved.