<赤外線コントロール続き>

2012.11.17 更新(78ms→70ms、624μ→600μ、312μ→300μの変更に伴うプログラム変更)

下記のように、送信パターン1から3の送信する波形の600μの中央で受信出来るようにします。
こうすれば、どの送信パターンが送られたか判別出来ます。


SW1を押すとポートRC0に接続しているLEDが点灯します、同じようにSW2→RC1、SW3→RC2のLEDが点灯します。
下記の画像をクリックして見てください。



左より、SW1、SW2、SW3を押した時のパルス波形の測定画像



実験用赤外線送受信回路図


赤外線送受信回路プログラムソース

---------------------- 送信回路 ----------------------

#include <htc.h>

__CONFIG(FCMDIS & IESODIS & BOREN & UNPROTECT & MCLREN & PWRTEN & WDTDIS & HS);

__IDLOC(0001);


   #define _XTAL_FREQ 20000000	/* 20MHz */
   #define LTIME 600

 
ioport();

f_ra0flug();
f_ra1flug();
f_ra2flug();

swra0();
swra1();
swra2();

_600us();
_70ms();

int n=0;
int j=0;
int ra0flug=0;
int ra1flug=0;
int ra2flug=0;

main()
{
	
	ioport();


	while(1){
		
		if(RA0==0 && RA1==1 && RA2==1) f_ra0flug();
		if(RA0==1 && RA1==1 && RA2==1 && ra0flug==1){
			ra0flug=0;
			 swra0();
		}

		if(RA1==0 && RA0==1 && RA2==1 ) f_ra1flug();
		if(RA1==1 && RA0==1 && RA2==1 && ra1flug==1){
			ra1flug=0;
			 swra1();
		}

		if(RA2==0 && RA0==1 && RA1==1 ) f_ra2flug();
		if(RA2==1 && RA0==1 && RA1==1 && ra2flug==1){
			ra2flug=0;
			 swra2();
		}



	}///while
			
}///main

f_ra0flug()
{
ra0flug=1;
}

f_ra1flug()
{
ra1flug=1;
}

f_ra2flug()
{
ra2flug=1;
}

ioport()
{
		ANSEL=0x0;			/* AN4-7はデジタルI/Oモード */
		CMCON0=0x07;
		TRISA=0xFF;			/* RA0-5は入力ピン */
		TRISC=0x03;     	/* RC2-5は出力ピン ,RC0,1は入力ピン*/
		PORTA=0xFF;			/* RA0-5はH */
		PORTC=0x03;			/* RC1-5はL,RC0,1はH */
}

swra0()
{
/// 70ms Hレベル///
    _70ms();

/// 600us Lレベル///
	__delay_us(LTIME);
		
/// 600us Hレベル///
		_600us();

/// 600us Lレベル///
	__delay_us(LTIME);

/// 600us Lレベル///
	__delay_us(LTIME);

/// 600us Lレベル///
	__delay_us(LTIME);

/// 600us Lレベル///
	__delay_us(LTIME);
}

swra1()
{
/// 70ms Hレベル///
_70ms();

/// 600us Lレベル///
	__delay_us(LTIME);
		
/// 600us Lレベル///
	__delay_us(LTIME);
					
/// 600us Lレベル///
	__delay_us(LTIME);

/// 600us Hレベル///
		_600us();

/// 600us Lレベル///
	__delay_us(LTIME);

/// 600us Lレベル///
	__delay_us(LTIME);
}

swra2()
{
/// 70ms Hレベル///
_70ms();

/// 600us Lレベル///
	__delay_us(LTIME);
		
/// 600us Lレベル///
	__delay_us(LTIME);
					
/// 600us Lレベル///
	__delay_us(LTIME);

/// 600us Hレベル///
	__delay_us(LTIME);

/// 600us Lレベル///
	__delay_us(LTIME);

/// 600us Lレベル///
		_600us();
}

_600us()
{
			for(n=0;n<24;++n){
			
				RC2=1;	
					__delay_us(9);
				RC2=0;
					__delay_us(9);
			}
}

_70ms()
{
/// 70ms Hレベル///
		for(j=0;j<73;++j){				//このforのj=0;n<83;++j)で80ms
								//パルス巾70ms:73
			for(n=0;n<41;++n){			//このforのn=0;n<41;++n)で1ms
								
				RC2=1;				
					__delay_us(9);		//上のforのn=0;n<25;++n)で600μs
				RC2=0;			
					__delay_us(9);		
			}							
		}
					
}
---------------------- 受信回路 ----------------------

#include <htc.h>

__CONFIG(FCMDIS & IESODIS & BOREN & UNPROTECT & MCLREN & PWRTEN & WDTDIS & HS);

__IDLOC(0001);

   #define _XTAL_FREQ 20000000	/* 20MHz */

ioport();
kaiseki();

int j=0;
int n=0;
int t1=0;
int t2=0;
int t3=0;

main()
{
	
	ioport();


	while(1){



			if(RA2==1){
				kaiseki();
			}



	}///while
			
}///main

kaiseki()
{
///t1check
		
	__delay_ms(70);   
		

	__delay_us(600); 	

	__delay_us(300); 

		if(RA2==1) t1=1;
			else t1=0;


///t2check
	__delay_us(1200);

		if(RA2==1) t2=1;
			else t2=0;


///t3check
	__delay_us(1200);

		if(RA2==1) t3=1;
			else t3=0;

///RC0 LED ON

	if(t1==1){
			RC0=1;
			RC1=0;
			RC2=0;
	}





///RC1 LED ON

	if(t2==1){

			RC0=0;
			RC1=1;
			RC2=0;
	}


///RC2 LED ON

	if(t3==1){

			RC0=0;
			RC1=0;
			RC2=1;
	}



}

ioport()
{
		ANSEL=0x0;			/* AN4-7はデジタルI/Oモード */
		CMCON0=0x07;
		TRISA=0xFF;			/* RA2-5は入力ピン */
		TRISC=0x00;             	/* RC0-5は出力ピン */
		PORTA=0x00;			/* RA2-5はL */
		PORTC=0x00;			/* RC0-5はL */
}