Смотрю, в исходниках значения для инициализации регистров взяты из даташита. А как насчет документа "EM198810 Application Notes. AN 0003 (06.18.2007). Register optimize value for EM198810" ? Там некоторые регистры отличаются значениями и их больше.
Да регистров там больше. Но если присмотреться там использованы регистры в которые писать нельзя. Они зарезервированы. Зачем их указали в рекомендованных значениях..хз. Но в эти регистрах значение не меняется. А в основном эти настройки похожи. Но от тех отказался из-за того что они показались мне "странными".
Сегодня провел испытания. На прямой видимости выдало 60-65 м без какого либо позиционирования. Трансиверами крутил, вертел и это ничего не дало.
Какой коэфициент ошибочных пакетов ? Конфигурация регистров как в последних исходниках или иная ? подключил два модуля к at90usb162. Лежат на столе в метре друг от друга, отправка 1000 пакетов: 1->2: Код (Text): Ch: 6. Packets received: 992, CRC error: 1 Ch: 6. Packets received: 989, CRC error: 0 Ch: 6. Packets received: 994, CRC error: 0 Ch: 6. Packets received: 993, CRC error: 0 Ch: 6. Packets received: 989, CRC error: 0 Ch: 6. Packets received: 988, CRC error: 1 Ch: 6. Packets received: 991, CRC error: 0 2->1: Код (Text): Ch: 6. Packets received: 984, CRC error: 63 Ch: 6. Packets received: 977, CRC error: 56 Ch: 6. Packets received: 981, CRC error: 43 Ch: 6. Packets received: 974, CRC error: 45 Ch: 6. Packets received: 975, CRC error: 46 Ch: 6. Packets received: 982, CRC error: 44 Ch: 6. Packets received: 978, CRC error: 47 Ch: 6. Packets received: 975, CRC error: 53 Ch: 6. Packets received: 976, CRC error: 52 От длины пакета ничего не зависит...
Для инициализации использовал регичтры, что и в коде. Только FEC1/3 и программное CRC. Аппаратное CRC галимое. Процент потеряшек не знаю. Использовал протокол.
Сколько у кого ток потребелния в спящем режиме ? У меня получилось 8,5мка. Почти то что обещано (3,5мка). Отправка пакета сразу после сна без задержек проходит нормально.
Если хочешь достичь желанных 3,5мка, то читай назначение регистров. Перед входом в сон нужно сначала вырубить все, что только в нем выключается и усыпить. После вывести из сна и снова все повключать. В моем коде это не реализованно, но ничто не мешает это дописать.
Пробовал, что нашел. Только это либо не дает ничего, либо, наооборот, увеличивает ток, если например отключить RFIC. При чем потом придется сделать модулю ресет и заново инициализировать.
В общем, попробовал все что можно - 8мка - минимум. В принципе, сгодится. На длительное время для экономии стоит ключ на питании. Поигрался с кодировками и коррекцией ошибок. Осталось неясным, почему код 8/10 эффективнее манчестера. Все таки у манчестера избыточность в 1,6 раз больше. Так же не нашел что же не так с аппаратным CRC. Всегда при битом пакете бит CRC выставляется, а иногда и на корректном пакете .
Кодировку 8/10 я испытывал на растоянии 5м. Да этот трансивер вообще зачарованный. На сайте производителя(элан) битые ссылки на документацию. Также они не отвечают на какие либо вопросы.
Провел "полевые" испытания модулей. 100м - на прямой видимости - только при определенной направленности антенн. Нормально принимается 1/10 пакетов. В морозилке при -18 работает, но надо выдерживать таймаут T1 при инициализации из аппноута в 5мс. По питанию: при 3,6 работает нормально. Больше - не доходят пакеты. Меньше - вообще отлично. Провел тест: плата atmega48pa + емкостный датчик влажности. Цикл: измерение-отправка пакета-усыпление модуля и контроллера раз в минуту. Питание: инонистор 1F. При начальном напряжении питания в 3,6В продержалось 18 часов. Модуль стабильно отправлял пакеты в плоть до 1,8В. Также вполне нормально происходит запуск при 2,4-2,5В, но статистику не собирал.
Уважаемый a9d, Я только начал разбираться с девайсом. Скачал ваш протокол. Интересует пару моментов. 1) Как модули знают на каком канале находится абонент? 2) Есть ли возможность сделать хопинг между каналами(как в сети GSM)? 3) Если можно ссылку или черкнуть пару строк как должна выглядеть main() функция к этим хидерам (последовательность запуска процедур) Спасибо.
Я анализирую Ваш код (протокол) и не совсем понятен комментарий: //SPI::CSpi MySpi; //#include "tr24a.h" //TR24A::CTr24a MyTr; //SPEED::CSpeed MySpeed; Причем структура MySpi и MyTr часто используется, так же не совсем понятно что возвращает функция unsigned char GetPktFlag() { return !bit_is_clear(PIND,PIN_PKT); }//end GetPktFlag Спасибо
2) Есть ли возможность сделать хопинг между каналами(как в сети GSM)? Если сделаешь, то будет возможно. 1) Как модули знают на каком канале находится абонент? Задается в коде. http://forum.easyelectronics.ru/viewtopic.php?f=11&t=2584 Тут есть код проекта.
Ясно. Я портировал код вашего протокола на СVavr который к сожалению не знает что такое классы. Связь вроде бы есть. Пробовал устанавливать длину синхронизующего слова , трейлер и преамбулу, но лутший результат оказался без всего этого. я брал так d vtqy. Код (Text): main() { init_mega(); //инициализация чипа Init_tr24a(); //инициализация модуля modeTX(); //режим тх SetPreambleL(2); //не улутшает связь SetSyncWL(2); //не улутшает связь SetTrailer(2); //не улутшает связь while(1) { PkG_send(len, data); //отправили масив даных длиной лен. while (getstate()!=0 ); //ждем пока модуль выйдет в идл мод. } Может что не так или не в том порядке? Кстати не могу усыпить чип. Слип мод не включается код: Код (Text): void modesleep(unsigned char mode) { DATA buf; //убрал переменную дата и есть просто битовое поле и масив на два учара. if(mode==0) { SS=1; reg_read(48); //читаем регистр, данные идут в глоб. переменные high и low buf.byte[1]=high; buf.byte[0]=low; //buf.data=read(48); buf.bitt.b2=1; reg_write(48,buf.byte[1],buf.byte[0]); //пишем в регистр измененные данные } else //или пробуждаем if(mode==1) { SS=0; delay_ms(2); SS=1; } }//end ModeSleep Вроде бы от Вашего варианта не сильно отличается а вот гетстейтом не показывает что заснул.
Код (Text): main() { init_mega(); //инициализация чипа Init_tr24a(); //инициализация модуля modeTX(); //режим тх SetPreambleL(2); //не улутшает связь SetSyncWL(2); //не улутшает связь SetTrailer(2); //не улутшает связь while(1) { PkG_send(len, data); //отправили масив даных длиной лен. while (getstate()!=0 ); //ждем пока модуль выйдет в идл мод. } Незнаю, что ты хочешь добиться этим кодом. Почитай в интернете о преамбуле, синхрослове и трейлере. они предназначены для другого. Также почитай даташит, как я понял ты неправильно пакеты отправляешь. Код (Text): if(mode==0) { SS=1; reg_read(48); //читаем регистр, данные идут в глоб. переменные high и low buf.byte[1]=high; buf.byte[0]=low; //buf.data=read(48); buf.bitt.b2=1; reg_write(48,buf.byte[1],buf.byte[0]); //пишем в регистр измененные данные на выводе SS активный ноль. Также возможно перепутал старшую и младшую часть. После входа в сон нельзя проверять состояние. Проверкой состояния ты его будишь. Это нужно мультиметром проверять. Также смени компилятор. Ты юзаешь полное Г.
По первой части почитаю. Насчет неправильной отправки- если бы неправильно то ничего бы не принималось. А так прием идет. иногда проскакивают нули в пакете. Просто стоит ли игратся этими тремя параметрами или оно и по дефолту отлично идет. Компилятор конечно не супер. Просто в нем проще для не проф. програмиста -генератор кода, + доступ к любому пину через PORTХ.У а не какашку с битовыми операциями на пол строки. Хотя конечно дело вкуса и профессионализма. Я еще пробую на Винавр но там както сложнее выходит.