frame_decoration

ランレングス法を使用した受信アルゴリズム



RAMを96%くらい使うのでこれ以上は変数を追加できません(たぶん
送信の変調パターンは確か110で1、100で0だったような・・・
精度は理論限界値の8倍に設定してあります
56.9KHzに変調してこれを使えば完璧!

#include <16f648a.h>
#include <string.h>
#include <stdlib.h>
#use delay(CLOCK=20000000)
#use RS232(BAUD=9600,XMIT=PIN_B6)
#byte port_a=5
#byte port_b=6
#use fast_io(a)
#use fast_io(b)
#fuses HS,NOWDT,PUT
#define DEVICE_CODE 0xa0
#define THRESHOLD 25


struct int2bit{
	unsigned int a :	1;
	unsigned int b :	1;
	unsigned int c :	1;
	unsigned int d :	1;
	unsigned int e :	1;
	unsigned int f :	1;
	unsigned int g :	1;
	unsigned int h :	1;
};


void rcv_data(struct int2bit *data){
	int i,j,count0;
	for(j=0;j<63;j++){
		for(i=1;i<=8;i++){
			switch(i){
				case 1 : data[j].a=input(PIN_A4);break;
				case 2 : data[j].b=input(PIN_A4);break;
				case 3 : data[j].c=input(PIN_A4);break;
				case 4 : data[j].d=input(PIN_A4);break;
				case 5 : data[j].e=input(PIN_A4);break;
				case 6 : data[j].f=input(PIN_A4);break;
				case 7 : data[j].g=input(PIN_A4);break;
				case 8 : data[j].h=input(PIN_A4);break;
			}
			delay_us(25);
		}
	}
}
void display_data(struct int2bit *data){
	int i,j;
	char temp;
	for(j=0;j<63;j++){
		for(i=1;i<=8;i++){
			temp='_';
			switch(i){
				case 1 : if(data[j].a)temp='|';break;
				case 2 : if(data[j].b)temp='|';break;
				case 3 : if(data[j].c)temp='|';break;
				case 4 : if(data[j].d)temp='|';break;
				case 5 : if(data[j].e)temp='|';break;
				case 6 : if(data[j].f)temp='|';break;
				case 7 : if(data[j].g)temp='|';break;
				case 8 : if(data[j].h)temp='|';break;
			}
			printf("%c",temp);
		}
	}
	printf("\n");putc(13);
}
void clear_array(struct int2bit *data){
	int j;
	for(j=0;j<63;j++)
		data[j]=0;
}



void search_signal(){
	long time=0;
	while(time<200){
		delay_us(10);
		time++;
		if(input(PIN_A4))time=0;
	}
	time=0;
	while(!input(PIN_A4)){
		delay_us(10);
		if(time<1000)time++;
		//else printf("hikari-");
		else printf("%c%c%c",0x00,0x0,13);	//error code same all x00
	}
}
/*
void ex_rcv(struct int2bit *data,struct int2bit *result){
	int i,j,count0=0;
	int1 temp;
	search_signal();
	rcv_data(data);
	search_signal();
	rcv_data(result);
	search_signal();
	for(j=0;j<63;j++){
		for(i=1;i<=8;i++){
			switch(i){
				case 1 : result[j].a=((input(PIN_A4)+result[j].a+data[j].a)>1)?1:0;break;
				case 2 : result[j].b=((input(PIN_A4)+result[j].b+data[j].b)>1)?1:0;break;
				case 3 : result[j].c=((input(PIN_A4)+result[j].c+data[j].c)>1)?1:0;break;
				case 4 : result[j].d=((input(PIN_A4)+result[j].d+data[j].d)>1)?1:0;break;
				case 5 : result[j].e=((input(PIN_A4)+result[j].e+data[j].e)>1)?1:0;break;
				case 6 : result[j].f=((input(PIN_A4)+result[j].f+data[j].f)>1)?1:0;break;
				case 7 : result[j].g=((input(PIN_A4)+result[j].g+data[j].g)>1)?1:0;break;
				case 8 : result[j].h=((input(PIN_A4)+result[j].h+data[j].h)>1)?1:0;break;
			}
			delay_us(25);
		}
	}	
}
*/
int make_data(char *rcv_cmd,struct int2bit *data1,struct int2bit *data2,int pulse_cnt){
	int i,j,bit_cnt=0,cnt1=0;
	int1 temp=0,flg=0;
	rcv_cmd+=60;
	(*pulse_cnt)=0;
	for(i=0;i<3;i++){
		*(rcv_cmd+i)=0;	
	}
	for(j=0;j<63;j++){
		for(i=1;i<=8;i++){
			temp=0;
			switch(i){
				case 1 : if(data1[j].a)temp=1;break;
				case 2 : if(data1[j].b)temp=1;break;
				case 3 : if(data1[j].c)temp=1;break;
				case 4 : if(data1[j].d)temp=1;break;
				case 5 : if(data1[j].e)temp=1;break;
				case 6 : if(data1[j].f)temp=1;break;
				case 7 : if(data1[j].g)temp=1;break;
				case 8 : if(data1[j].h)temp=1;break;
			}
			if(temp){
				cnt1++;
				flg=1;
			}
			else if(flg){
				(*pulse_cnt)++;
				*rcv_cmd<<=1;
				if(cnt1>=THRESHOLD) *rcv_cmd|=1;
		//		printf("%d ",cnt1);
				cnt1=0;
				if(bit_cnt<7)bit_cnt++;
				else{
					rcv_cmd++;
					bit_cnt=0;
				}
				flg=0;
			}
		}
	}
	
	//printf("\n %d \n",cnt1);
	data1[0]=0;								//data1[1] use 0count

	for(j=0;j<63;j++){
		for(i=1;i<=8;i++){
			temp=0;
			switch(i){
				case 1 : if(data2[j].a)temp=1;break;
				case 2 : if(data2[j].b)temp=1;break;
				case 3 : if(data2[j].c)temp=1;break;
				case 4 : if(data2[j].d)temp=1;break;
				case 5 : if(data2[j].e)temp=1;break;
				case 6 : if(data2[j].f)temp=1;break;
				case 7 : if(data2[j].g)temp=1;break;
				case 8 : if(data2[j].h)temp=1;break;
			}
			if(temp){
				if(!flg) data1[0]=0;
				cnt1++;	
				flg=1;
			}
			else if(flg){
				(*pulse_cnt)++;
				*rcv_cmd<<=1;
				if(cnt1>=THRESHOLD) *rcv_cmd|=1;
		//		printf("%d ",cnt1);
				cnt1=0;
				if(bit_cnt<7)bit_cnt++;
				else{
					rcv_cmd++;
					bit_cnt=0;
				}
				flg=0;
			}
			else (int)data1[0]++;
			
			if((int)data1[0]>30) return;
		}
	}
}

void main(){
	struct int2bit sample[63]={0},result[63];
	char old_data[2];
	int *pulse_cnt,i;
	set_tris_a(0x10);
	set_tris_b(0x81);

	//enable_interrupts(INT_EXT);
	//ext_int_edge(L_TO_H);
	//enable_interrupts(GLOBAL);
	port_a=0;
		for(i=0;i<3;i++){							//LED_flasher
		output_low(PIN_A4);
		delay_ms(100);
		output_high(PIN_A4);
		delay_ms(100);
	}
	printf("%c%c%c",0x00,0x00,13);
	while(1){	
		search_signal();
		rcv_data(sample);
		rcv_data(result);
	//test//////////////////
		display_data(sample);
		display_data(result);
	//////////////////////
		make_data(result,sample,result,pulse_cnt);
		if(((int)result[60]&0xf0) == DEVICE_CODE)
			if(*pulse_cnt==24){
			//	if(((int)old_data[0]==(int)result[61])&&((int)old_data[1]==(int)result[62])){
			//	printf("%c%c%c",(int)result[61],(int)result[62],13);
				printf("%x%x%x\n",(int)result[60],(int)result[61],(int)result[62]);
			}
		//else printf("('A`)");
		if((*pulse_cnt)!=24) printf("%c%c%c",0x00,0x00,13);	//error code same all 0x00
		//rcv_cmd[0]=0;
		//rcv_cmd[1]=0;
		//rcv_cmd[2]=0;
			
	//	ex_rcv(sample,result);
	//	display_data(result);
		old_data[0]=(int)result[61];
		old_data[1]=(int)result[62];
		clear_array(result);
		clear_array(sample);
	}
}
最終更新:2007年06月09日 02:56