HOME > PIC16F84Aでシリアル通信

 PIC16F84Aでシリアル通信 

------------準備中-------------

すみません.
私の勘違いで,以下の記述の信号はアイドル状態,スタート・ストップビットが反転してます. ですので,取り込んでいるデータは正確ではありません.
とりあえず,作るものを作ってしまってから,書き直します.

--------------------------------

可能な限り簡単にシリアル通信で外部からPCに信号を取り込みたいと思って, PICを使ったシリアル通信をやってみました.

使用したのは,PIC16F84A,USARTは付いてません. なので,シリアル通信のパターンをプログラムで作成して送信します.
回路図は,こんな感じ.レベル変換用のMAX232などは使用せず,トランジスタと抵抗分割で, 0±約5V(電源電圧に依存)の信号をつくりましたが,PC側がうまく受信してくれました.
(なぜなら,手持ちが無かったし安くすませたいから)
DSC00794.JPG

回路をブレッドボードで作成したところ.
DSC00791.JPG

信号の波形例

Copy_3.JPG

PCに接続して,ターミナルアプリを起動します.

DSC00786.JPG

通信速度は,19200bps,バイナリモードで信号を取り込むと,このように,スイッチのON-OFFで 読み込まれるデータが変化しました.

DSC00789.JPG

プログラムはこの位です. MPLAB上でC言語による開発,コンパイラはPICC-LITEです.

DSC00797.JPG

リストはこちら

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

< 前の記事へ次の記事へ >


ページトップに戻る



ESP32 Wifi Bluetooth開発ボード

Arduino Nano Every
​​
Raspberry Pi pico

FPGA XILINX Artix-7