電子工作の知恵袋

 
 

 

PixiModule UART
USB-UART変換ケーブル
実動デモ


 

    *コンテンツはお客様ご自身のご判断と責任においてご利用ください。
     また、掲載内容を他に流用・転載することは一部・全てを問わず固くお断りいたします。
     引用する場合はリンク表示にてお願いいたします。
     


電子工作の知恵袋


PIC16F690のUARTの使い方

 

 

    マイコンを使うと、どうしても外部とシリアル通信をしたくなる時があります。

    このPIC16F690にはUART機能が内蔵されており、外部とシリアル通信が可能です。

    MAX232などの変換ICを使えばRS232Cでの通信を簡単に実現でき、使い方によっては、LINやCANなどにも応用がきく幅の広い通信方法です。

    ぜひ、マスターしましょう

     

     


     

     

    このページでは、当店提供の汎用Cソースコードを使います。

    PIC16F690マイコンモジュールで使用することができる各種Cソースコードはユーザーサポートページからダウンロードできます。

     

    また、ここでご説明する内容は当店の商品であるPIC16F690マイコンモジュールを前提としています。

    他社製マイコンボードでの作動は一切関知していませんのでご注意ください。 

     

     

     

      

     

 

    (1)使用するボードと配線の一例

     

    PIC16F690マイコンモジュール(*例に挙げているマイコンモジュールは販売終了しました。)は、ポート機能の他にUART機能も割り当てることができるようになっています。

    UART機能はIO1がTX(マイコンボードから外部への送信)、IO2がRX(受信)となります。  

     

    UARTとは何か?

    このUARTというのは Universal Asynchronous Receiver Transmitter の略でシリアル通信装置の一種です。

    8ビット(1バイト)のデータを1本の電線で送るために、時系列にデータを分解して、1ビットづつ出力(送信)または入力(受信)します。

    最近のほとんどのマイコンには、UART機能が搭載されていますのでマイコン間のデータ交換や、変換ICを使用しRS232C規格の通信としてパソコンとデータのやり取りをすることも可能です。

     

    詳しいフォーマット・ビットの割り付けや電位などはこちらに譲るとして、今回説明するPIC16F690は、UARTを1ch内蔵、転送フォーマットはスタートビット1、データビット8、ストップビット1に固定設定されています。

    良く使われる転送の速度(ボーレート)はほぼ全て設定可能です。

     

     

     

     

     

     

     

    以下は、今回説明で使用するマイコンボードの大まかなブロック図です。

     

     

     

     

    今回の説明では、既に説明してあるSW入力の回路にUARTを追加して使います。

     

     

     

    機能は、

     

     ・SWのオンオフをUARTで外部に送信。

     ・UARTでLEDの点消灯データを受信して、データに従ってLEDを点消灯させる

     

    というものを考えてみます。

     

     

    (2)ソフトウエア

     

    PIC16F690のUARTモジュールの設定は、使用する汎用Cソースコードのbios16f690.c にある関数を使用します。

     

     

     (今回の想定機能)

    SWの変化を検出したら、時間をおいて再度読み取り、UARTで送信します。

    SWオンで送信データは0xff、SWオフで0x00とします。

    SWはIO0=ポートCの0ビットに接続されていますので、RC0の値をチェックします。

     

     

     

    まず、UARTを使用できるように初期化します。

    汎用関数usartinit()がありますので、今回は9600bpsの転送速度に設定します。

    速度を変えたい場合は、()内の数値を例に従って変更するだけでOKです。

        //USARTの設定---------------------------------------------

        usartinit(207);   //使用する場合は注釈をとること

                            //9600bpc(ボーレート 207:9600bps 103:19.1kbps 34:57.6kbps 16:115.2kbps 他も可)

                            //スタート1ビット、データ8ビット、ストップ1ビット、ノンパリティ

                            //(注)実行でRB5が入力 RB7が出力に自動設定される

                            //(注)ポートがプルダウンされているため電源オン時に受信側がスタートビット検出し、

                            //   1バイト0x00を受信。RXのR12をオープンにすると改善。

     

     

     

     

     

    次にメインルーチンエリアにSWの処理を記載します。

    SWの読み取りはSW処理の項で説明した2回一致方式です。

    UARTを用いた送信は汎用関数tx1byte()を使用します。

    ()内に送信したい1バイトデータを記載し関数を実行するだけで、即送信を開始します。

     

    unsigned char temp=0;    //テンポラリー変数

    unsigned char qportc=0;    //過去値記憶用

     

    //メインルーチン開始------------------------------------------

     

        while(1){

     

            while(temp==(qportc & 0x01)){            //信号変化街待ち

                   temp=PORTC & 0x01;

            }

     

            wait(30);                       //30mS待機

     

            if((PORTC & 0x01) != temp){

                   break;                   //一致しない場合は、最初に戻る

            }

     

            qportc=temp; //過去値更新

     

       

            if(temp==0x01){

                tx1byte(0xff);               //オンデータ送信

            }

            else{

                tx1byte(0x00);              //オフデータ送信

            }

     

        }

     

        //メインルーチン終了------------------------------------------

     

     

    次に、UARTでLEDの点消灯データを受信します。

    0xffのデータを受信したらLEDを点灯させ、0x00のデータを受信したらLEDを消灯させます。

    上記以外のデータ受信は無視します。

     

    LEDはマイコンボードの回路図からボード上のドライバー回路に接続されているRC5でオンオフを制御できますので、直接RC5を出力ポートに設定して制御するか、汎用Cソースコードの関数にあるRC5のPWM出力を100%または0%のデューティにするかのどちらかで制御します。

    今回は、明るさを調整できるPWMを使って制御します。

    尚、PWMで制御する場合は、PWMの項で説明したように初期化が必要ですので、そちらを良く読んで設定してください。

     

     

    さて、受信処理は割り込みを用います。

    以下の汎用Cソースコードにある割り込みエリアに処理を追加します。

     

     

        //USART受信割り込み判定

        if(RCIF==1){            //受信割り込みフラグ判定

            unsigned char tempusart=0x00;

            if(FERR==1){        //フレーミングエラー判定

                tempusart=rx1byte();    //空読み エラーフラグクリア処理 RCIFクリア

            }

            else if(OERR==1){       //オーバーランエラー判定

                CREN=0;CREN=1;      //エラーフラグクリア処理

                tempusart=rx1byte();    //空読み RCIFクリア

            }

            else{

                rxdata=rx1byte();   //受信データ取り込み&RCIFクリア

                //処理エリア-------------------------

                //1バイト通信時間より長い処理は記載しないこと

     

               if(rxdata==0xff){

                      pwmsetduty(0xff);      //LEDを点灯

                }

                else if(rxdata==0x00){

                      pwmsetduty(0x00);     //LED消灯

                }

     

     

                //-----------------------------------

            }

        } 

     

     

    割り込みエリアの赤文字部分が追記した処理です。

    pwmsetduty()の数値を変えることで、うす暗く点灯させることも可能です。

     

     

     

    シリアル通信を使うことができれば、応用の範囲をグンと拡がります。

    ぜひマスターしておきましょう。

     

     

     


RS232C、USB ⇔ UARTの

面倒な変換もこれ1つで解決

 

 ポン付けUART変換シリーズ



       






カテゴリ
電子工作の知恵袋 最新情報

  電子工作大好き社員募集中! 株式会社ヌマタR&D