Với đoạn code lệnh như sau đc viết trong ngắt ngoài của PIC/ AVR:
Mọi người đừng quan tâm code viết gì
_Mà chỉ quan tâm viết như thế nào thôi nhé( Ko bàn tính tối ưu ở đây nhé
)
Chú ý màu xanh đậm, nếu viết dạng biểu thức thì PIC887 ko giải mã đc, AVR vẫn ok. Nếu mình tính toán hộ Pic887 thì Pic887 giải mã đc.
Kết quả:
AVR( Mega8) giải mã tốt với code trên.
PIC 16F887 ko giải mã đc theo code trên.
Anh em cứ chém tẹt ga để mọi người thêm kinh nghiệm và lựa chọn.
Code:
if((13*T_T)>>2 <=RF_time_copy && RF_time_copy< (15*T_T)>>2 && RF_check_start_bit==0)// 3.5bit
{
RF_check_start_bit=1;//Bao da nhan dc bit start
RF_number_recive=0;//Dem so lan nhan data
RF_shift_data=0;//Bat dau tinh so lan dich bit
}
//_____________________Vi tri bat dau o cuoi(1.5bit)____________________________________________
else if((5*T_T)>>2 <=RF_time_copy && RF_time_copy < (7*T_T)>>2 && RF_check_start_bit==1 && RF_number_recive==0 && RF_end==0)
{
RF_end=1;//Xung canh len dau tien o vi tri end
RF_middle=0;
RF_number_recive=1;
}
//____________________Vi tri bat dau o giua(2bit)________________________________
else if((7*T_T)>>2 <=RF_time_copy && RF_time_copy< (9*T_T)>>2 && RF_check_start_bit==1 && RF_number_recive==0 && RF_middle==0)
{
RF_middle=1;//Xung canh len dau tien o vi tri middle
RF_end=0;
RF_number_recive=1;
}
//_______________________________________________________________________
else if((3*T_T)>>2 <=RF_time_copy && RF_time_copy< (5*T_T)>>2 && RF_end==1)//Neu do rong bit=1bit va bat dau la vi tri end
{
if(RF_shift_data<8)
{
RF_data_in=RF_data_in<<1;//Dich trai 1 bit
RF_data_in=RF_data_in|0x00;
RF_shift_data++;//Dem so lan dich bit
}
RF_end=1;//Xung canh len sau do o vi tri end
RF_middle=0;
}
else if((3*T_T)>>2 <=RF_time_copy && RF_time_copy< (5*T_T)>>2 && RF_middle==1)//Neu do rong bit=1bit va bat dau la vi tri middle
{
if(RF_shift_data<8)
{
RF_data_in=RF_data_in<<1;//Dich trai 1 bit
RF_data_in=RF_data_in|0x01;
RF_shift_data++;//Dem so lan dich bit
}
RF_middle=1;//Xung canh len sau do o vi tri middle
RF_end=0;
}
//_______________________________________________________________________
else if((5*T_T)>>2 <=RF_time_copy && RF_time_copy< (7*T_T)>>2 && RF_end==1)//Neu do rong bit=1.5bit va bat dau la vi tri end
{
if(RF_shift_data<8)
{
RF_data_in=RF_data_in<<1;//Dich trai 1 bit
RF_data_in=RF_data_in|0x00;
RF_shift_data++;//Dem so lan dich bit
}
RF_middle=1;//Xung canh len sau do o vi tri middle
RF_end=0;
}
else if((5*T_T)>>2 <=RF_time_copy && RF_time_copy< (7*T_T)>>2 && RF_middle==1)//Neu do rong bit=1.5bit va bat dau la vi tri middle
{
if(RF_shift_data<8)
{
RF_data_in=RF_data_in<<1;//Dich trai 1 bit
RF_data_in=RF_data_in|0x01;
RF_shift_data++;//Dem so lan dich bit
}
if(RF_shift_data<8)
{
RF_data_in=RF_data_in<<1;//Dich trai 1 bit
RF_data_in=RF_data_in|0x00;//Xac dinh duoc them gia tri giai ma ke tiep
RF_shift_data++;//Dem so lan dich bit
}
RF_end=1;//Xung canh len sau do o vi tri end
RF_middle=0;
}
//_______________________________________________________________________
else if((7*T_T)>>2 <=RF_time_copy && RF_time_copy< (9*T_T)>>2 && RF_middle==1)//Neu do rong bit=2bit va bat dau la vi tri middle
{
if(RF_shift_data<8)
{
RF_data_in=RF_data_in<<1;//Dich trai 1 bit
RF_data_in=RF_data_in|0x01;
RF_shift_data++;//Dem so lan dich bit
}
if(RF_shift_data<8)
{
RF_data_in=RF_data_in<<1;//Dich trai 1 bit
RF_data_in=RF_data_in|0x00;//Xac dinh duoc them gia tri giai ma ke tiep
RF_shift_data++;//Dem so lan dich bit
}
RF_middle=1;//Xung canh len sau do o vi tri middle
RF_end=0;
}
else if((9*T_T)>>2 <=RF_time_copy && RF_time_copy< (11*T_T)>>2)// Neu co Byte Stop// 2.5bit
{
if(RF_shift_data==8)//Neu du 8bit
{
//RF_data=RF_data_in;//Copy du lieu_Dam bao an toan du lieu da nhan duoc
RF_Buffer[RF_counter]=RF_data_in;
RF_data=RF_data_in;
RF_counter++;// Overlow Buffer
if(RF_counter==4)// Neu nhan du 4 gia tri
{
RF_Buffer_Overlow=1;// Overlow Buffer
RF_counter=0;
}
}
//RF_data_in=0;//Xoa du lieu nhan
RF_shift_data=0;
RF_middle=0;
RF_end=0;
RF_time=0;
RF_enable_time=1;
RF_number_recive=0;
RF_check_start_bit=0;
}
else//Neu du lieu nhan ko dung ma manchester
{
RF_data_in=0;//Xoa du lieu nhan
RF_shift_data=0;
RF_middle=0;
RF_end=0;
RF_time=0;
RF_enable_time=1;
RF_number_recive=0;
RF_check_start_bit=0;
RF_time_copy=0;
}
_Mà chỉ quan tâm viết như thế nào thôi nhé( Ko bàn tính tối ưu ở đây nhé
)Chú ý màu xanh đậm, nếu viết dạng biểu thức thì PIC887 ko giải mã đc, AVR vẫn ok. Nếu mình tính toán hộ Pic887 thì Pic887 giải mã đc.
Kết quả:
AVR( Mega8) giải mã tốt với code trên.
PIC 16F887 ko giải mã đc theo code trên.
Anh em cứ chém tẹt ga để mọi người thêm kinh nghiệm và lựa chọn.

Comment