赤外線通信は終わっていませんでした。
時間がたつと周期がずれて通信できなくなります。
安定させようとしてプログラムを書き直したのですが何度やってもできません。
見てみておかしいとこあったらコメントしてください。疲れました。
送信
#include<16F648A.h>
#fuses HS, NOWDT, PUT, NOPROTECT, BROWNOUT, MCLR, NOLVP, NOCPD
#use fast_io(A)
#use fast_io(B)
#use delay(clock=20000000)
//1bitの長さ494us
void init(void)
{
set_tris_a(0x00);
set_tris_b(0x00);
output_a(0x00);
output_b(0x00);
}
void high (void)
{
int j;
for(j=0; j<19; j++)
{
output_high(PIN_B7);
delay_us(13);
output_low(PIN_B7);
delay_us(13);
}
}
void low (void)
{
int j;
for(j=0; j<19; j++)
{
output_low(PIN_B7);
delay_us(13);
output_low(PIN_B7);
delay_us(13);
}
}
void bit (int wave)
{
int i;
for(i=0; i<8; i++)
{
if(bit_test(wave, i) == 1)
{
high();
}
else
{
low();
}
}
}
void send (int signal)
{ //スタートビット
const int startbit = 0xC0;
//デバイスコード
const int device = 0xaa;
//エンドビット
const int endbit = 0x0F;
//
int i,k,j;
//スタートビット送信
bit(startbit);
//デバイスコード送信
bit(device);
//データ送信
bit(signal);
//エンドビット送信
bit(endbit);
}
void main(void)
{
//LEDの数注意
const int data1 = 0x5A;
const int data2 = 0x05;
const int data3 = 0x00;
//初期化関数
init();
while(1)
{
send(data1);
/* delay_ms(1000);
send(data3);
delay_ms(1000);
send(data2);
delay_ms(1000);
send(data3);
delay_ms(1000);*/
}
}
受信
#include<16F648A.h>
#fuses HS, NOWDT, PUT, NOPROTECT, BROWNOUT, MCLR, NOLVP, NOCPD
#use fast_io(A)
#use fast_io(B)
#use delay(clock=20000000)
void init(void) //初期化のための関数
{
set_tris_a(0x00);
set_tris_b(0xFF);
output_a(0x00);
output_b(0x00);
}
int bitread (void) //データ受信関数
{
int i,wave;
wave=0;
for(i=0; i<8; i++){
if(input(PIN_B0))
{
bit_clear(wave, i); //赤外線送信のモジュールが負論理でデータが送られてくるので,反転して受信してあげる。
}
else
{
bit_set(wave, i);
}
delay_us(494);
}
return wave;
}
int recieve (void) //データの受信,判定関数
{
int judge1,signal;
//スタートビット
const int startbit = 0xC0;
//デバイスコード
const int device = 0xaa;
//エンドビット
const int endbit = 0x00;
while(PIN_B0)
{
continue;
}
delay_us(247);
if(input(PIN_B0)==0) //スタートビット受信
{
delay_us(497);
if(input(PIN_B0)==0)
{
delay_us(497);
//デバイスコード受信
judge1 = bitread();
//データ受信
signal = bitread();
//エンドビット受信
if(input(PIN_B0))
{
//デバイスコードが正しいかどうかの判定
//正しければmain関数に受信したデータを返す
if (judge1 == 0xaa)
{
return signal;
}
}
}
}
return 0;
}
void main(void)
{
int data;
init();
output_high(PIN_A0);
output_high(PIN_A1);
while(1)
{
data = recieve();
switch(data)
{
case 0x5A:
output_low(PIN_A1);
delay_ms(1000);
break;
case 0x05:
output_a(data);
break;
default: //何もこない,または該当しないデータが送られてきた場合の処理
output_high(PIN_A1);
break;
}
}
}
PR