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();}
}
}