ランレングス法を使用した受信アルゴリズム
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