PIC16F84Aでシリアル通信PIC16F84Aでシリアル通信------------準備中------------- すみません. 私の勘違いで,以下の記述の信号はアイドル状態,スタート・ストップビットが反転してます. ですので,取り込んでいるデータは正確ではありません. とりあえず,作るものを作ってしまってから,書き直します. -------------------------------- 可能な限り簡単にシリアル通信で外部からPCに信号を取り込みたいと思って, PICを使ったシリアル通信をやってみました. 使用したのは,PIC16F84A,USARTは付いてません. なので,シリアル通信のパターンをプログラムで作成して送信します. 回路図は,こんな感じ.レベル変換用のMAX232などは使用せず,トランジスタと抵抗分割で,0±約5V(電源電圧に依存)の信号をつくりましたが,PC側がうまく受信してくれました. (なぜなら,手持ちが無かったし安くすませたいから) ![]() 回路をブレッドボードで作成したところ. ![]() 信号の波形例 ![]() PCに接続して,ターミナルアプリを起動します. ![]() 通信速度は,19200bps,バイナリモードで信号を取り込むと,このように,スイッチのON-OFFで読み込まれるデータが変化しました. ![]() プログラムはこの位です. MPLAB上でC言語による開発,コンパイラはPICC-LITEです. ![]() インデントなしですがリストはこちら. #include "pic.h" #include "delay.h" __CONFIG(HS & WDTDIS & PWRTDIS & UNPROTECT); unsigned char i,d; // RA0: input mode 0(serial output every 10ms) or 1(serial output when sensor changed) // RA1: reserved // RA2: start sensor // RA3: goal sensor 1 // RA4: goal sensor 2 // RB0: serial out txd // RB1: inverted RB0 serialout(){ RB0=0; RB1=1; // start bit DelayUs(52); if (RA1){RB0=1; RB1=0;} else {RB0=0; RB1=1;} // signal out from LSB to MSB DelayUs(52); if (RA2){RB0=1; RB1=0;} else {RB0=0; RB1=1;} DelayUs(52); if (RA3){RB0=1; RB1=0;} else {RB0=0; RB1=1;} DelayUs(52); if (RA4){RB0=1; RB1=0;} else {RB0=0; RB1=1;} DelayUs(52); RB0=1; RB1=0; // default signal is 1 DelayUs(52); RB0=1; RB1=0; DelayUs(52); RB0=1; RB1=0; DelayUs(52); RB0=1; RB1=0; DelayUs(52); RB0=1; RB1=0; // stop bit DelayUs(52); for(i=0;i<38;i++) DelayUs(250); // interval 10ms } main(){ TRISA=0b11111111; TRISB=0b00000000; RB0=1; RB1=0; for(i=0;i<38;i++) DelayUs(250); // interval 10ms while (1){ if (RA0==0) serialout(); else if (d != PORTA){d=PORTA; serialout();} } } |