В общем по тихому получается
Двумя таймерами
XOR
был прав за это ему огромное СПАСИБО!
0x55 ловить не нужно для стабилизации приемника
Связь намного лучше чем которые предлагаются в инете с радио сенсорами
например
http://www.guarda.ru/guarda/data/control_panel/txt_34.php
Там всего 4 выборки на бит и код очень весомый
На атмеге 16 у меня он занял при 8 выборках на бит (сверху часть кода)около 8 % памяти
А с 2 таймерами всего 2 % ниже (около 30 выборок на бит);
Так что, кто только планирует или начал заниматься c AT86RF211s или подобными
(без встроенного манчестер декодера)лучше использовать с большим количеством выборок
на 3500 отправленных пакетов 3500 пришло т.е без потерь
//TIMER0 initialize - prescale:8
// WGM: Normal
// desired value: 12uSec
// actual value: 12,000uSec (0,0%)
void timer0_init(void)
{
TCCR0 = 0x00; //stop
TCNT0 = 0xE8; //set count
OCR0 = 0x18; //set compare
// TCCR0 = 0x02; //start timer
}
#pragma interrupt_handler timer0_ovf_isr:iv_TIM0_OVF
void timer0_ovf_isr(void)
{
TCNT0 = 0xE8; //reload counter value
if (PINC&0x20)
{
if (cnt_bit0>20)TCNT2 = 0xFE;
cnt_bit1++;
}
else
{if (cnt_bit1>20)TCNT2 = 0xFE;
cnt_bit0++;
}
}
//TIMER2 initialize - prescale:32
// WGM: Normal
// desired value: 420uSec
// actual value: 420,000uSec (0,0%)
void timer2_init(void)
{
TCCR2 = 0x00; //stop
ASSR = 0x00; //set async mode
TCNT2 = 0x2E; //setup
OCR2 = 0xD2;
// //start
}
#pragma interrupt_handler timer2_ovf_isr:iv_TIM2_OVF
void timer2_ovf_isr(void)
{TCNT0 = 0xE8;
TCNT2 = 0x2E; //reload counter value
if (cnt_bit1>cnt_bit0)
{
cnt_bit1=cnt_bit0=0;
rfin(1);
}else
{
cnt_bit1=cnt_bit0=0;
rfin(0);
}
}
void rfin(char inbit)//прием
{
switch(stat)
{
case pream: //ловим 2 байта зголовка
temp3 = (temp3 << 1) | (temp2 >> 7);
temp2 = (temp2 << 1) | (temp1 >> 7);
temp1 = (temp1 << 1) | (temp0 >> 7);
temp0 = (temp0 << 1) | inbit;
if ((temp3==0xA9)&&(temp2==0xA6)&&(temp1==0x6A)&&(temp0==0x96)) // если поймали
{
stat=packet;
signal=GET_SIGNAL();
cnt=200;
bit_cnt=0;
b1=0;
}
break;
case packet:
if (!b1)
{
if (inbit) b1=1;else b1=2;
}
if ((!inbit)&&(b1==1)) bit_cnt++,buff[cnt]<<=1,b1=0;
if (( inbit)&&(b1==2)) bit_cnt++,buff[cnt]<<=1,buff[cnt]|=1,b1=0;
if (bit_cnt==8) bit_cnt=0,cnt++;
if (cnt>213)
{
TCCR2 = 0x00;
TCCR0 = 0x00;
stat=pream;
putchar((signal/10)+0x30);
putchar((signal-((signal/10)*10))+0x30);
putchar(0x20);
for (cnt=200;cnt<213;cnt++)
{
putchar(buff[cnt]);
}
TCCR2 = 0x03;
TCCR0 = 0x02;
}
break;
}
}