USARTの実験

 USARTはUniversal Synchronous Asynchronous Receiver Transmitterの略称で同期式
と非同期式がありますが、ここでは非同期式について検討しました。非同期式は調歩同期
通信方式とも言われています。フォーマットは下図のようになっています。



    
スタートビット  b0   b1   b2   b3   b4   b5   b6   b7    ストップビット

 通信の検証はPIC16F84AとPIC16F18857の2種類でC言語を使用し前者はCCS、後者は
xc-8を,ターミナルソフトはTeraTermdを使用しました。
どちらもPICからRS232CでPCに入力を促すメッセージを送り、PCで入力するとPICでこれを
判別し対応した内容をPCのモニタ上に表示するというものです。

PIC16F84AのCCSのソースは下記です。
#include <16f84a.h>
#fuses HS,NOWDT,NOPROTECT
#use delay(CLOCK=10000000)
#use rs232(BAUD=19200,XMIT=PIN_A3,RCV=PIN_A2)
void main()
 {
   int keyin,i;
   while(1)
   {   printf("\r\nKeyInput= ");    ;入力を促す表示
      keyin=getc();
      if(keyin=='A' || keyin=='a')   ;A又はaを入力
      { for(i='A';i<0x46;i++)     ;ABCDEを表示
       printf("%C",i); }
      else
      { if(keyin=='S' || keyin=='s') ;S又はsを入力
        { for(i='0';i<0x34;i++)   ;123を表示
          printf("%C",i); }
      else
        printf("OUT"); }      ;OUTを表示
   }
 }

 RS232の設定は#useで行います。これをコンパイルし実行すると、PCに"KeyInput="と表
示されるので"A"又は"a"を入力するとAからEまで表示し、"S"又は"s"を入力すると0から
3まで表示します。その他の文字を入力すると"OUT"が表示されるようになっています。

 同じことをさせるためのxc-8で記述されたPIC16F18857のソースは以下のとおりです。
#include <stdio.h>
int i;
char nyu,hyouji;
char Msg[]="\r\nKeyInput=";
void main()
{  SYSTEM_Initialize();
  INTERRUPT_GlobalInterruptEnable();
  INTERRUPT_PeripheralInterruptEnable();
  while(1)
  { i=0:
   while(Msg[i]!=0)
    EUSART_Write(Msg[i++]);
   nyu=EUSART_Read();
   if((nyu=='a')||(nyu=='A'))
    { for(hyouji='A';hyouji <='E;hyouji++)
     EUSART_Write(hyouji); }
   else if((nyu=='s')||(nyu=='S'))
    { for(hyouji=='0';hyouji<='3';hyouji++)
     EUSART_Write(hyouji); }
     else
      EUSART_Write('OUT') }

 論理は負論理になっています。PIC16F84Aでは基板内にMAX232を使用しているので負
論理であり、そのままの出力で良いのですが、PIC16F18857ではEUSARTモジュールを内
蔵しているのですが出力は正論理であるためインバーター回路を付加しました。入力側に
も必要です。


     

トップページに戻る