На главную страницу сайта
· Наш магазин · Объявления · Рейтинг · Статьи · Частоты · Копилка · Аэродромы · Live!
· Файлы · Диапазоны · Сигналы · Музей · Mods · LPD-форум · Клуб · Радиостанции
На сайте: гостей - 51,
участников - 0
 · Начало · Опросы · События · Статистика · Поиск · Регистрация · Правила · FAQ · Галерея ·
 Форум —› Разработка, ремонт, схемы, модификации —› Приемопередатчик AT86RF211 400-950 MHz 
Портативные Си-Би радиостанции в нашем магазине


Беркут Hunter
руб.

Егерь 3
руб.

President Randy II P
руб.

Турист 3
руб.

Штурман 80
руб.
Автор Сообщение
USER
Участник
Offline1.1
с мар 2007
Казань
Сообщений: 23

Дата: 22 Янв 2008 08:09:32 #  

Привет ВСЕМ!!!
Начал собирать радиомодем на AT86RF211 фирмы Atmel управление будет осуществляться м/проц Atmega 16 , но столкнулся с такой проблеммой как отсутсвие софта на эту м/с для расчета частот (F0,F1,F2,F3) (TRX_EXE.EXE). Может кто занимался.. Подскажите. Заранее спс..
USER
Участник
Offline1.1
с мар 2007
Казань
Сообщений: 23

Дата: 15 Мар 2009 12:50:28 #  

Программы для At86RF211s нашел, если кому надо, могу в копилку скинуть.
Теперь с приемом (манчестерский код).
Организовал так: ловим преамбулу 0х55 затем остальной пакет(0x12 0x86 0x53 0x00 0x03 0x01 (0x3B 0xE1)-CRC
) коррелируя с лог 1 Постоянно сдвигая влево ,

void rfin(void)
{unsigned char inbit;
unsigned char ccor;
inbit=((PINC&0x20)>>5);

switch (rec_state)
{
case REC_PREAMBLE:

// Принимаем отсчет бита преамбулы
smpls[15] = (smpls[15] << 1) | (smpls[14] >> 7);
smpls[14] = (smpls[14] << 1) | (smpls[13] >> 7);
smpls[13] = (smpls[13] << 1) | (smpls[12] >> 7);
smpls[12] = (smpls[12] << 1) | (smpls[11] >> 7);
smpls[11] = (smpls[11] << 1) | (smpls[10] >> 7);
smpls[10] = (smpls[10] << 1) | (smpls[9] >> 7);
smpls[9] = (smpls[9] << 1) | (smpls[8] >> 7);
smpls[8] = (smpls[8] << 1) | (smpls[7] >> 7);
smpls[7] = (smpls[7] << 1) | (smpls[6] >> 7);
smpls[6] = (smpls[6] << 1) | (smpls[5] >> 7);
smpls[5] = (smpls[5] << 1) | (smpls[4] >> 7);
smpls[4] = (smpls[4] << 1) | (smpls[3] >> 7);
smpls[3] = (smpls[3] << 1) | (smpls[2] >> 7);
smpls[2] = (smpls[2] << 1) | (smpls[1] >> 7);
smpls[1] = (smpls[1] << 1) | (smpls[0] >> 7);
smpls[0] = (smpls[0] << 1) | inbit;
// Вычисляем корреляцию с эталонной преамбулой
ccor = corrtbl[(smpls[15] ^ preamb15)];
ccor += corrtbl[(smpls[14] ^ preamb14)];
ccor += corrtbl[(smpls[13] ^ preamb13)];
ccor += corrtbl[(smpls[12] ^ preamb12)];
ccor += corrtbl[(smpls[11] ^ preamb11)];
ccor += corrtbl[(smpls[10] ^ preamb10)];
ccor += corrtbl[(smpls[9] ^ preamb9 )];
ccor += corrtbl[(smpls[8] ^ preamb8 )];
ccor += corrtbl[(smpls[7] ^ preamb7 )];
ccor += corrtbl[(smpls[6] ^ preamb6 )];
ccor += corrtbl[(smpls[5] ^ preamb5 )];
ccor += corrtbl[(smpls[4] ^ preamb4 )];
ccor += corrtbl[(smpls[3] ^ preamb3 )];
ccor += corrtbl[(smpls[2] ^ preamb2 )];
ccor += corrtbl[(smpls[1] ^ preamb1 )];
ccor += corrtbl[(smpls[0] ^ preamb0 )];

if (ccor >= 124)
{
bitcnt = 1;
gapcnt = 4;
cnt = 400;
smplcnt = 0;
smpls[0] = 0;
rec_state = REC_PACK;

ccor=0;
temp=0;
i=0;
b1=0;
b0=0;
}

break;
case REC_PACK:
// Принимаем отсчет бита пакета
// Коррелируем с шаблоном единицы

temp = (temp << 1) | inbit;
ccor = corrtbl[(temp ^ 0xFF)];
i++;

if (!gapcnt)
{

if (!b1)
{
if (ccor>3) b1=1;//receive bit 1
else b1=3;
}
}else gapcnt--;

if ((b1==1)&&(ccor>6)) temp=0xFF,b1=2,b0=1;
if ((b0==1)&&(ccor<2)) i=0,bitcnt++,recbuf[cnt]<<=1,temp=0,b0=0,gapcnt=6,b1=0;

if ((b1==3)&&(ccor<2)) temp=0x00,b1=2,b0=2;
if ((b0==2)&&(ccor>6)) i=0,bitcnt++,recbuf[cnt]<<=1,temp=0,recbuf[cnt]|=1,b0=0,gapcnt=6,b1=0;
if (bitcnt==8)
{
bitcnt=0,cnt++;
inbytecnt=recbuf[403];

if (cnt>(404+(inbytecnt<<8)+(recbuf[404]))) rec_state = PUT_PACK;
}
if (i>40)
{
smpls[15] = 0;
smpls[14] = 0;
smpls[13] = 0;
smpls[12] = 0;
smpls[11] = 0;
smpls[10] = 0;
smpls[9] = 0;
smpls[8] = 0;
smpls[7] = 0;
smpls[6] = 0;
smpls[5] = 0;
smpls[4] = 0;
smpls[3] = 0;
smpls[2] = 0;
smpls[1] = 0;
smpls[0] = 0;
hitcnt = 0;
rec_state=REC_PREAMBLE;
}
break;

case PUT_PACK: // отправить в ком порт принятый пакет
TCCR0 = 0x00;


for (cnt=400;cnt<(405+(inbytecnt<<8)+(recbuf[404]));cnt++)
{
putchar(recbuf[cnt]);

}
rec_state = REC_PREAMBLE;

TCNT0=0x01;
TCCR0 = 0x00;

break;

}
При этом качество приема не очень хорошее, заводская прошивка работает на много лучше в плане избирательности
Вот.
Созванивался с конструктором он в вкратце объяснил что прием организован след образом
Используется 2 счетчика 16 выборок на бит если счетчик с лог 1 больше счетчика лог 0 то бит равен лог 1 иначе бит равен лог 0.- Объяснил что это позваляет работать приенику в режиме сильной зашумленности
Вопрос как организовать прием манчестерского кода для приемников типа At86rf211
Что бы двигаться в правильном направлении. Заранее благодарю.
Реклама
Google
XOR
Участник
Offline4.0
с янв 2007
...
Сообщений: 1317

Дата: 15 Мар 2009 13:42:11 · Поправил: XOR (15 Мар 2009 13:48:58) #  

мне сравнивать несчем но оч похожий алгоритм работает совсем неплохо, поищите
"Сеть сбора данных и управления на базе многофункциональных криптозащищенных радио-сенсоров." приемник можно оставить как есть, а в передатчик нужно добавить
0х55 в начале посылки. отлавливать 55 ненужно, это пилот для стабилизации приемника
за ним идет синхрослово которое и надо ловить.

pilot = 0x55555555;
preamble = 0x55550000 | wp.preamble;

ну и дальше в исходнике передать пилот перед синхрословом
USER
Участник
Offline1.1
с мар 2007
Казань
Сообщений: 23

Дата: 15 Мар 2009 15:16:21 · Поправил: USER (15 Мар 2009 22:10:17) #  

Спасибо XOR
часть кода и сам принцип работы от проектов радио-сенсоров.
В принципе работает все и неплохо (из 1500 только 2 пакета не прошло), но при очень слабом сигнале пакет не распознаётся
А заводской р.м распознаёт и принимает там программная реализация совсем другая.
Что то вроде усреднения если больше единичек при выборке значит бит=1 иначе бит=0
Только не понятно как синхронизация устроена
Пробывал (с 2 сетчиками 2 таймера )
примено:
первый таймер
по прерыванию время примерно в 20 раз меньше времени 1 бита пакета т.е макс число в одном из счетчиков не более 20
опрашивает вход
if (PINC&0x20) cnt_bit1++ ;else cnt_bit0++;
//т.е тупо считает количество единичек и нулей

по прерыванию второго таймера

сравнивается количество 1 и 0 подсчитанных в первом таймере
прерывание примерно каждый бит пакета
int temp=0x0000; взял 16 битное чтобы манчестерский код влез (0=0b1010101010101010)
/********/
temp<<=1;//сдвигаем на 1 бит влево
if (cnt_bit1>cnt_bit0) temp|=1;//если единичек больше чем нулей то в конец temp-а добавляем единичку
и одновременно
ловим заголовок
if (temp==0x6666) поймали;// 0х6666- эт 0х55 в санчестерском представлении

первые 4-5 байт принимает нормально
Вот хотелось бы узнать какие по этому поводу бывают решения.
USER
Участник
Offline1.1
с мар 2007
Казань
Сообщений: 23

Дата: 17 Мар 2009 19:15:10 #  

В общем по тихому получается
Двумя таймерами
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;


}


}
UTU1589
Участник
Offline2.7
с авг 2008
Місто-герой Ірпінь
Сообщений: 256

Дата: 17 Мар 2009 19:37:03 #  

Давно интересно, а есть ли аналогичный девайс, но с аналоговым входом/выходом?
USER
Участник
Offline1.1
с мар 2007
Казань
Сообщений: 23

Дата: 17 Мар 2009 19:44:52 #  

В принципе у At86RF211s аналоговый выход есть, но аналогового входа нет к сожалению.
(Цифры)
USER
Участник
Offline1.1
с мар 2007
Казань
Сообщений: 23

Дата: 18 Мар 2009 14:07:32 · Поправил: USER (18 Мар 2009 14:09:44) #  

Сегодня попробывал организовать полностью приемо передачу (т.е. в качестве ретраслятора)
Отправлял и принимал тоже самое 1000 пакетов по 400 байт на скорости 2400 бит в сек по манчестеру
или так 1200 бит в сек все пакеты прошли свой путь нормально.
Для передачи использовал тот же второй таймер которы на прием.
И код не большой всего пару строк


//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

switch(rx_tx)// переключатель выбора прием передача
{
case rx: //прием
if (cnt_bit1>cnt_bit0)
{
cnt_bit1=cnt_bit0=0;
rfin(1);
}else
{
cnt_bit1=cnt_bit0=0;
rfin(0);
}

break;

case tx://передача
RF_TX();break;
}
}

/* перед передачей
buff[197]=0x55;// для синхронизации
buff[198]=0x12;//заголовок первый байт
buff[199]=0x86;//заголовок второй байт

cnt=197; // от 197 байта
rx_tx=tx;// режим таймера передача
b1=0;// просто перем
bit_cnt=0;// счет. бит

pause(10000);
TCCR2 = 0x03;// запустить таймер 2
*/

void RF_TX(void) ( попадаем сюда каждые 420 микросек по прерыванию таймера 2)
{char outbit;

if (!b1)
{
if ((buff[cnt])&0x80) DMSG_0,b1=1;else DMSG_1,b1=2; //DMSG_0 установить лог 0 на ножке, DMSG_1 лог 1
}
if (b1==3) DMSG_1,b1=0,bit_cnt++,buff[cnt]<<=1;
if (b1==1) b1=3;
if (b1==4) DMSG_0,b1=0,bit_cnt++,buff[cnt]<<=1;
if (b1==2) b1=4;
if (bit_cnt==8) bit_cnt=0,cnt++,b1=0;//досчитали до 8 бит(здесь 1 байте 8 бит) обнул счет бит след байт буф
if (cnt==byte_cnt) // количество перед байт равно принятым
{pause(2000);
rx_tx=rx;// режим прием
RX();// перкличить приемо передатчик в реж приема
stat=pream;// ловить заголовок
TCCR0 = 0x02;//запустить 0 таймер для новых выборок
}
}
USER
Участник
Offline1.1
с мар 2007
Казань
Сообщений: 23

Дата: 18 Мар 2009 18:37:13 · Поправил: USER (18 Мар 2009 19:29:58) #  

Вот прога для AT86rf211 лучше чем TRX_EXE
http://www.radioscanner.ru/files/download/file8107/at86rf211s.rar
После добавления s1 и s0 - от дребезга
#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>18)&&(s1>2))TCNT2 = 0xFE;//
cnt_bit1++;
s1++;
s0=0;
}
else
{if ((cnt_bit1>18)&&(s0>2))TCNT2 = 0xFE;//
cnt_bit0++;
s1=0;
s0++;
}
}

Вот на рисунке после добавления даже такой испорченный сигнал(желтый) можно распознать(синий обработанный МП )
USER
Участник
Offline1.1
с мар 2007
Казань
Сообщений: 23

Дата: 19 Мар 2009 17:32:26 #  

серху не рабочая ссылка (удалили)

рабочая ссылка на программы для AT86RF211s и не только
ftp://82.140.81.3/pub/atmel/SmartRF/

ftp://82.140.81.3/
USER
Участник
Offline1.1
с мар 2007
Казань
Сообщений: 23

Дата: 10 Апр 2009 21:49:20 · Поправил: USER (10 Апр 2009 21:52:47) #  

Проект с исходниками для управления AT86RF211s slave потребляет 9 mA в режиме ожидания(WUEN).
Мастер опрашивает слейв и получает информацию о уровне сигнала и батареи

http://www.radioscanner.ru/uploader/2009/for_at86rf211s.zip
Дата: 15 Апр 2009 09:51:07 #  

USER
А ты не мог бы принципиальную схему выложить для примера, а то занялся разработкой похожего девайся... заранее благодарен...
USER
Участник
Offline1.1
с мар 2007
Казань
Сообщений: 23

Дата: 26 Апр 2009 14:38:13 #  

bonanza

ВОТ
NextDoor
Участник
Offline3.5
с июн 2007
Киев
Сообщений: 2003

Дата: 03 Май 2009 00:03:06 · Поправил: NextDoor (03 Май 2009 00:04:40) #  

USER
Много мороки с этим чипом...
Попробуйте готовый модуль TR24 - цена вопроса 3$...
USER
Участник
Offline1.1
с мар 2007
Казань
Сообщений: 23

Дата: 03 Май 2009 19:34:33 #  

NextDoor
Да, мороки много.Но устройство уже работает. потребляя в ждущем режиме 6-7 mA.
Мне было легче, потому как "железная часть" была взята от готового р/м . а мне оставалось только написать под себя ,пере прошить и кое-что перепаять .
USER
Участник
Offline1.1
с мар 2007
Казань
Сообщений: 23

Дата: 12 Май 2009 21:12:32 #  

Во общем приемопередатчики работают, но сигналы, выходная мощность всего лишь 40 мВт

Одно устройство в железной трубе под землей будет(в торпеде). А вторым(ЖКИ дисплей для вывода уровней сигналов батарейки и тд) по поверхности буду пеленговать, где засор, там и остановится торпеда. Находим , откапываем ,устраняем засор.
Полезная вещь, если получится.

Вот еще бы усилитель 0,5-1 Вт на одном СВЧ транзисторе, 2.5 - 3.8 Вольт питание 433 МГц
Может у кого ссылки есть или опыт?
И второе, может это глупая задумка с 433МГц(другой диапазон выбрать) под землей в трубе(глубина около 1-3 м )?
Даже с глубины 1.5 м воды сигнал не проходит. Сегодня в пруд забрасывал.
Заранее СПС!
Sashman
Участник
Offline4.6
с фев 2007
р'Льех
Сообщений: 2029

Дата: 12 Май 2009 22:11:58 #  

1 ватт, 467 МГц (с 433 принципиальной разницы нет), антенна спиральная диапазонная, глубина около двух-пяти метров, расстояние голосовой связи с поверхностью -- квартал-два квартала. Труба ж/б, а не цельнометаллическая.
Реклама
Google
 

Создавать сообщения могут только зарегистрированные участники форума.
Войти в форум :: » Логин » Пароль
Начало
Средства связи, рации. Купить радиостанции Motorola, Yaesu, Vertex, приемники, антенны.
Время загрузки страницы (сек.): 0.045; miniBB ®