• 目次 -Page-
  • コンテンツ -Menu-
  • リンク -link-
  • パソコンと通信するには RS−232 回路編
  • RS−232という規格で接続するのが一般的です。 規格のバージョンがC版が長く使われたことでRS−232Cと呼ばれている通信方式です。 一度は聞いて事があるのではないでしょうか?昔はNECのPC−98シリーズについていた25ピンのコネクタとDOS/V機の9ピンタイプがありました。 今は9ピンのコネクタが着いたパソコンばかりではないでしょうか?このパソコンについている9ピンのコネクタをD−Subと読んでいます。 9ピンだとD−Sub9ピンと言えば理解されます(コネクタにはオスとメスがあります)。 このインターフェースを利用してPICマイコンと通信が可能です。
     

     
    パソコン側のD−Sub9ピンとPICマイコンを繋ぐ場合はこのような回路で構成します。 PICマイコンとパソコンの間に一つICが入っています。これをトランシーバーと呼びます。 またはレベル変換ICと呼ぶ場合もあります。 RS−232の仕様が±15Vである為、マイコンと直結出来ない為に電圧を変換するチップです。 以前はマキシムのMAX232というICを多様していましたが、秋月電子通商から電源電圧3.0V−5.0Vという製品が販売されてるのを知りそれを使うようになりました。 SipexのSP3232というICです。周辺回路もMAX232が10μFのコンデンサが必要だったのに対し、104で賄えるのも魅力となりました。 この回路が組めると後はプログラムだけの問題となります。
     

     
    ハイパーターミナルと繋ぐときの設定です。ここで躓く人が結構いるので載せておきました。 制御信号を何も使っていないので制御信号を使うように設定すると通信が行えません。 また、パソコン側のコネクタで信号同士を短絡する方法もあります。
  • パソコンと通信するには RS−232 プログラム編 CCS−C
  • シリアル通信と言っても沢山の種類があります。今回使用するのはUSARTと呼ばれるものです。 参考書籍などを見る場合はSPIやI2Cと違うので注意が必要です。
     
    さて、通信のプログラムは下記のようになりました。
     

     
    まず「#use delay」でCPUのクロックを設定します。この値が正しくないと信号が合いません。 そして「#use rs232」で通信の設定します。速度と使用するピンを設定すると通信できます。 場合によってはパリティなどの設定をしましょう。 使用するピンはPICのシリアル通信の機能を持ったピンを選択するとハードで通信し、 機能とは違うピンを選ぶとソフトウェアで通信するようにコンパイルされます。 よって、シリアル機能がないPICでもシリアル通信が出来るということです。 「xmit」が送信用ピンで「rcv」が受信用のピン設定となります。
     
    メインルーチンで「int_rda」を使用するように設定しています。これはシリアル受信での割り込みを行うという設定です。 実際の割り込み許可は「global」で行うのでこの設定がないと割り込みが発生しません。 ちょいちょい記載漏れが発生するので注意が必要です。
     
    シリアルデータを受信すると割り込みルーチンが呼び出されます。 今回のプログラムでは受信したデータ「getc()」を「data」変数に格納しただけです。 処理はメインのループ処理で行っています。受信したデータが「0x31(1)」であった場合にLED1を点灯し、 以外の場合は消灯するようにプログラムされています。
     
    送信は「prinf文」で行います。送りたいデータの形式にそったフォーマットで送信する必要があります。 「\r\n」は改行コードです。これを送ると改行してくれます。
     
    全体的な動作では「ハイパーターミナル上で「1キー」を押すとLEDが点灯する。 それ以外のキーを押すとLEDは消灯する。スイッチを押すと「0x00〜0xff」まで1ずつ繰り上げて送信する」 と、いうような感じのプログラムです。以下にprintf文のフォーマットを記載しておきます。
     
    %C:文字
    %S:文字列か文字
    %u:符号なし整数
    %x:小文字の16進数 0x00-0xff
    %X:大文字の16進数 0x00-0xFF
    %d:符号付10進数
    %e:実数の指数
    %f:浮動小数点の実数
    %Lx:Long型の小文字の16進数 0x0000-0xffff
    %LX:Long型の大文字の16進数 0x0000-0xFFFF
    %lu:Long型の符号なし10進数
    %ld:Long型の符号あり10進数
    %%:文字列そのもの
  • パソコンと通信するには RS−232 プログラム編 MPLAB−C18
  • C18でUSART割り込みを行う方法の質問があったのでここに記載しておきます。
     
    MPLAB-C18でUSARTを使用するときには「usart.h」を読み込んでおく必要があります。
     
    次にレジスタの設定です。 USARTの割込みを使用するのに設定が必要なレジスタが多々あります。 それらの設定が割込みを使う際の障害(習得へのネック)となる事がありますが、 一つ一つ理解すればそれほど難しいことではありません。 ここにUSARTの割込みに必要なレジスタを列挙します。
     
     割込み優先レベルの有効・無効の設定
     RCONbits.IPEN (RCONの7bit目)
     例:
     RCONbits.IPEN = 0;//優先順位なし
     RCONbits.IPEN = 1;//優先順位あり
      
     USART割込みレベル設定(受信)
     IPRbits.RCIP (IPRの5bit目)
     例:
     IPRbits.RCIP = 0;//受信割込み低位
     IPRbits.RCIP = 1;//受信割込み高位
      
     USART割込みレベル設定(送信)
     IPRbits.TXIP (IPRの4bit目)
     例:
     IPRbits.TXIP = 0;//送信割込み低位
     IPRbits.TXIP = 1;//送信割込み高位
      
     USART割込み制御(受信)
     PIEbits.RCIE (PIEの5bit目)
     例:
     PIEbits.RCIE = 0;//受信割込み禁止
     PIEbits.RCIE = 1;//受信割込み許可
      
     USART割込み制御(送信)
     PIEbits.TXIE (PIEの4bit目)
     例:
     PIEbits.TXIE = 0;//送信割込み禁止
     PIEbits.TXiE = 1;//送信割込み許可
      
     USART割込み発生時のフラグ
     PIRbits.RCIF (PIRの5bit目)
     PIRbits.TXIF (PIRの4bit目)
     1:割込み中 0:割込みなし
      
    他にはINTOCNレジスタの設定が必要になります。 このレジスタにより全割り込みや周辺割り込みの許可や禁止が設定できます。 割込みを使用する場合はここを許可しないと割り込みが発生しません。 しかしPIC16Fと異なり少し使い方が違います。
     
    RCONレジスタのIPENを0にしたのか1にしたのかにより設定する内容が変わります。 つまりは割り込みに優先順位があるのかないのかにより設定する内容が変わるということです。
     
     IPEN=0の時のINTCONレジスタの設定内容:
     全割込み設定
     INTCONbits.GIE (INTCONの7bit目)
     例:  INTCONbits.GIE = 0;//全割込み禁止
     INTCONbits.GIE = 1;//全割込み許可
      
     周辺割込みの設定
     INTCONbits.PEIE (INTCONの6bit目)
     例:  INTCONbits.PEIE = 0;//周辺割込み禁止
     INTCONbits.PEIE = 1;//周辺割込み許可
      
    上記の通り、IPENが0の時は全割込みと周辺割込みの設定となっています。 ではIPENが1の時はどうなるのか書いてみます。
     
     IPEN=1の時のINTCONレジスタの設定内容:
     高位設定
     INTCONbits.GIEH (INTCONの7bit目)
     例:  INTCONbits.GIEH = 0;//高位割込み禁止
     INTCONbits.GIEH = 1;//高位割込み許可
      
     低位割込み設定
     INTCONbits.GIEL (INTCONの6bit目)
     例:  INTCONbits.GIEL = 0;//低位割込み禁止
     INTCONbits.GIEL = 1;//低位割込み許可
     
    と、なります。IPENを1にすると全割込みや周辺割り込みの設定ではなく、高位・低位の割込みを許可するかどうかの設定となります。
     
    ポートの設定はTRISCとなります。7bit目が受信、6bit目が送信なので他のポートを使用しない場合は下記のようになります。
     
     TRISC = 0x80;// RC6=0:OUT:TX | RC7=1:IN:RX
     
    次はUSARTの設定です。設定はいっぺんに行えます
     
     OpenUSART(USART_TX_INT_OFF & USART_RX_INT_ON &
          USART_ASYNCH_MODE & USART_EIGHT_BIT &
          USART_CONT_RX & USART_BRGH_HIGH, 129);
     
    上記が設定の例です。送信割込みを禁止にして受信割込みのみを有効としています。 2行目は送信モードとbitの設定です。8ビットに設定しています。 3行目はボーレートとSPBRGの設定です。今回は40MHzで19.2kbpsでの通信を行うので129と設定しています。
     
    ここまでくればもう後は簡単だと思います。 USART割り込みを高位に、INT0割り込みも高位、INT1割り込みを低位に設定して動作確認をおこなっている例を示します。 多々コメントアウトしていますが、必要な部分だけを読んでください。
     
    参考ファイルはこちら
    Design & Programming - 天姫 -
    Copyright (c) 2007-2009 amahime All Rights Reserved.