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モジュールを内
蔵しているのですが出力は正論理であるためインバーター回路を付加しました。入力側に
も必要です。