<赤外線コントロール続き>
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 */
}