電子工作の知恵袋

 
 

 

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


 

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


電子工作の知恵袋


汎用Cソースコードの説明2

 

 

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

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

     

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

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

     

     

     

     

     

     ソースコード1 からの続き。

     

     

     

     

    (g)ポートの設定と初期化エリア

     

        //ポートの設定と初期化--------------------------------------

        TRISA=0xff; //PORTA設定 固定(0:出力 1:入力)

        TRISB=0xff; //PORTB設定(0:出力 1:入力)

        TRISC=0xff; //PORTC設定(0:出力 1:入力)

     

        //PORTA=0x00;   //Lに初期化 

        //PORTB=0x00;   //Lに初期化

        PORTC=0x00;     //Lに初期化

        

    PICにはポートと呼ばれる入出力端子があり、いろいろな機能をソフトウエアで設定することができます。

     

     

     (PIC16F690 Data Sheetより抜粋)

     

     

    上の表はその設定可能な機能と実際のピン番号の対比をするためデータシートより抜粋したものです。

    I/Oと書かれている部分がそのビット名で、この表現方法はHI-TECHのCコンパイラーでも使用します。

    例えば、RA0 のI/OはポートAのビット0ということを表しています。

    AnalogはAN0からAN11まであり、表のように割り当てられています。

    このAnalogは電圧をA/D変換する機能です。

    そして、Pinはそれらに対応するICの足番号です。

     

     

    このエリアでは各ポートを入力で使用するのか出力で使用するのかを設定し、出力の場合はPICが起動した直後に出力をH/Lのどちらにしておくかということを決定します。

    尚、当店マイコンモジュールの場合は、既に回路機能が割りつけられているのでPORTAは変更しないでください。

     

     

     

     

    (h)A/D機能の初期化エリア

     

        //AD機能の初期化------------------------------------------

        adinit(0x00,0x04);  //左バイトANSELH、右バイトANSEL

                            //(注)実行でADに設定した対応するポートは入力に自動設定される

                            //ポートのDIOの設定も自動で行うため必ず実行すること

     

     

    ポートにA/D機能を割り当てたい場合にこの関数で指定します。

    尚、A/D機能を使用しない場合は、デフォルト値のままとしてください。

    指定の仕方は、PICのANSELレジスタとANSELHレジスタの値を指定します。

     

     

    ANSELレジスタ

bit7

bit6

bit5

bit4

bit3

bit2

bit1

bit0

AN7

AN6

AN5

AN4

AN3

AN2

AN1

AN0

PORTC

-bit3

PORTC

-bit2

PORTC

-bit1

PORTC

-bit0

PORTA

-bit4

PORTA

-bit2

*1固定

PORTA

-bit1

PORTA

-bit0

 

    ANSELHレジスタ

bit7

bit6

bit5

bit4

bit3

bit2

bit1

bit0

 

 

 

 

AN11

AN10

AN9

AN8

 

 

 

 

PORTB

-bit5

PORTB

-bit4

PORTC

-bit7

PORTC

-bit6

              *空白は1または0どちらでも可

    ANxはPICのポートに割り付けられているA/Dポートの名前です。

    その下に対応するポート名とどのビットなのかを表記しています。

    A/Dとして使うビットを1、使わないビットは0として値を決めます。

     

    例えば、PORTCのビット0をA/D入力端子として使用したい場合は、

     

      ANSEL=0x14、ANSELH=0x00

     

    となります。

     

     

     

     

     

     

    (i)タイマー1・タイマー2の初期化エリア

      

        //タイマー1・タイマー2の初期化(固定)------------------

        timerinit();    

     

    本ソースコードでは、PICに内蔵されているタイマー機能のうちタイマー1とタイマー2を使用します。

    タイマー1は1mSの周期割り込み用、タイマー2はRC5から出力するPWM用です。

    このエリアは変更しないでください。

     

     

     

     

    (j)USARTの設定エリア

     

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

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

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

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

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

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

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

     

     

    UART調歩同期式で外部と通信する場合に、usartinit(xx)を実行します。

    UARTの機能はRB5が受信RX、RB7が送信TXに割り当てられます。

    xx 部分には、通信速度と対比する値(1バイト)を指定します。

    指定値は10進 207は9600bps、103は19.1kbpsなどです

    速度以外の通信パラメータは固定です。

    UARTを使用する場合は、usartini()の頭の注釈//を取り去ってください。

     

    尚、この関数で初期化すると、前述のポートの入出力設定にかかわらず、実行した時点で自動的にRB5を入力ポートに、RB7が出力ポートに設定されます。

     

    このUARTはMAX232等の変換ICに接続すると、そのままでRS232Cとなります。

    PCで通信したい場合や、比較的長距離の通信を行う場合など便利です。

     

     

     

     

    (k)PWMの設定エリア

     

        //PWMの設定-----------------------------------------------

        pwmportinit();              //(注)実行でRC5が出力&PWMに自動設定される

        pwmsetfreq(2,0xfe);         //PWM初期周波数490Hz

        pwmsetduty(0x00);           //PWM初期デューティ0%に設定

     

     

     このエリアはRC5からPWMを出力するかどうかの設定とそのPWMのパラメータの設定を行います。

    pwmportinit()の実行でPWM波形がRC5ポートから出力できるよう初期化されます。

    前述のポートの入出力の設定にかかわらずRC5は自動で出力となります。

     

    pwmsetfreq(x,y)は出力するPWMの周波数を決定するパラメータを指定します。

    xとyの値はPICのプリスケーラー値とPR2レジスタの値ですが、分かりにくいので以下の表で設定を行うことをお勧めします。

    より詳しい説明は、bios16f690.c の説明で行います。

     

x

y

PWM周波数

0

0xfe

7843Hz

1

0xfe

1960Hz

2

0xfe

490Hz

     

    pwmsetduty(z) はPWMのオンデューティ比を8ビット値で指定します。

z

オンデューティ比(%)

0x00

(略)

0x7f

 49.8

(略)

0xff

100

     

     

      

     

    (l)全割り込みの許可エリア

     

        //全割り込みの許可(固定)---------------------------------

        PEIE=1;     //INTCONレジスタのPIC内蔵モジュール割り込み許可フラグをセット   

        GIE=1;      //INTCONレジスタのグローバル割り込み制御ビット有効

     

    割り込みの許可等を行います。

    割り込み処理が問題になる場合以外は変更しないでください。

     

     

     

     

     

    (m)その他最終処理エリア

     

        //その他最終処理-------------------------------------------

        TMR1ON=1;   //タイマー1(1mS基準タイマー)開始(0:停止 1:開始)

        //pwmstart();   //PWM開始 使用する場合は注釈をとること

     

    タイマー1とPWMを開始するかどうかの設定を行います。

    タイマー1の開始処理は問題になる場合以外は変更しないでください。

    PWMを開始したい場合は、pwmstart()の//を取り去ってください。

    尚、PWMの開始はこのエリアである必要はありません。

    次のメインルーチン内など、必要なタイミングで開始してください。

     

     

     

     

     

    (3)自分のプログラムを書く部分

     

     

    (a)メインルーチン記載エリア

     

         while(1){

        //メインルーチン記載エリア---------------------------------

     

     

     

     

     

     

     

     

     

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

     

        }

     

    ご自分のプログラムの本体をこのエリア内に記載してください。

    この中の処理は永久にwhileでループするよう設定されています。

     

     

     

     

     

     

     

     

    (4)割り込みの処理を書く部分 

     

    PIC16F690の割り込みは色々な要因で発生させることが可能です。

    ただ、それらの割り込みは全て同じ場所のプログラムを実行するようになっており、プログラム側で何の割り込みが発生したのかをいちいち検査しなくてはなりません。

    本ソースコードでは、割り込みが1mS毎とUARTの受信時に自動で発生するように設定していますので、まずはその2つを検査しています。

    その他の割り込み要因については検査していませんので、割り込み要因を設定した場合は、ご自分で検査部分を追加してください。

     

    尚、作法例として、どうしても急ぐ処理だけを割り込みエリアに記載し、そうでない処理はグローバルな変数を使ってメインルーチンに通知し、メインルーチン内でその変数を確認して必要なら処理をするようにします。

     

     

     

    (a)タイマー1の割り込み判定エリア

     

        //タイマー1の割り込み判定

        if(TMR1IF==1){      //PIR1レジスタの割り込みフラグ判定

            TMR1H=TMR1H_init;       //カウント値初期化  

            TMR1L=TMR1L_init;       //カウント値初期化

            TMR1IF=0;               //PIR1レジスタの割り込みフラグクリア

     

            //1mSタイマー毎の処理がある場合の記載エリア------

     

     

     

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

        }

     

    上記は、1mS毎に割り込みが発生するタイマー1用の処理エリアです。

    1mS毎に処理することがない場合は、このままにします。

    処理を記載する場合は線で挟まれているエリアに記載してください。

    1mSの割り込みをカウントすることで、長期のタイマー(例えば100mSや1秒タイマー)をご自分で作るなどに利用できます。

    割り込みに伴う必要なレジスタの処理は行っていますので、ご自分の処理を記載すればOKです。

     

     

     

     

    (b)UASRT受信割り込み判定エリア

     

        //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バイト通信時間より長い処理は記載しないこと

     

     

     

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

            }

        }

     

    UARTで1バイトのデータを受信する毎にこのエリアにプログラムの実行が移ります。

    1バイト毎に必ず割り込みが発生しますので、1バイト毎に受信データを処理してください。

    受信したデータはrxdata変数に格納されています。

    線で挟まれたエリア内に処理を記載します。

    このエリアでは他にも受信時のエラー判定と復旧も同時に行っていますが、エラーに関しては特別必要でなければこのままにしておいても問題ない場合がほとんどです。

     

    尚、処理はなるべく簡単にすることが必要です。

    次の1バイトを受信するまでに割り込み処理を終了させないと、再度割り込みが処理中にかかってしまいメインルーチンの処理ができなくなったりデータが抜け落ちたりする恐れがあります。

     

     

     

     

     

     

    (c)他の割り込み判定記載エリア

     

        //他の割り込み判定記載エリア-----------------

     

     

     

     

     

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

     

    }

     

    タイマー1とUSART受信以外の割り込み要因をご自分で設定した場合や不測の割り込みが発生した時の緊急処理なのをこのエリアに記載してください。

     

     

     

     

     

    次は、bios16f690.c の説明です。

     


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

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