Дисплеи, датчики и прочие функциональные узлы, управляемые МК.
Ответить

Re: HOPERF RFM70, особенности работы

Пт май 09, 2014 16:21:01

делал на базе этих модулей проект по дистанционной передаче уровня освещенности.
на передатчике фоторезистор подключен к ADC. и значение (0 - 1023), чтобы уместилось на одном порту приемника, делилось на 4. в таком виде не замечал проблем. сейчас, когда попробовал передавать значения больше байта (убрав деление на четыре) вижу, что не получается. значения больше байта отображаются как 255. странно. надо тыкнуться логическим анализатором в передатчик и посмотреть что же он такое передает и где проблема: в передатчике или в приемнике

Re: HOPERF RFM70, особенности работы

Пт май 09, 2014 16:31:49

asylumist писал(а):... сейчас, когда попробовал передавать значения больше байта (убрав деление на четыре) вижу, что не получается. значения больше байта отображаются как 255. странно. надо тыкнуться логическим анализатором в передатчик и посмотреть что же он такое передает и где проблема: в передатчике или в приемнике

Дело в передатчике, я лог анализатором смотрел, а в передатчике сделал так
Код:
...
while(len--)
   {
    transmitSPI(payload++);
   //payload = payload >> 8;
   
      if (payload >= 256)
       {
       //transmitSPI(payload++);
       payload = payload >> 8;
      }
      else
      {
      //transmitSPI(payload++);
      payload = payload << 8;         
      }
   //transmitSPI(payload++);
      //uart_putc(*payload);
      //uart_puts(", ");
     }
   PORT_SPI |= (1<<CSN);
...

закомментированные строки можно убрать :))
И естественно функцию вызывать sendPayload( payload, sizeof(payload), 0) где второй параметр будет равен 2 (передаем два байта), как ранее и писал. Я у себя просто вторым параметром поставил 2, т.к. у меня данные передаются по 2 байта.

Re: HOPERF RFM70, особенности работы

Пт май 09, 2014 17:28:16

ну если передавать так, то все сделано до нас. надо только передавать два байта вот так, например:

int main()
{
...
uint8_t temp [2] = {127, 68};
...

while (1)
{
...
sendPayload((uint8_t *)temp, 2, 0);
...
}
}
но в вашем случае перед отправкой пакета нужно заполнить массив старшим и младшим байтом как элементами.

я представляю себе отправку нескольких байтов (например, двух) примерно вот так:
{
...
uint8_t temp = 257;
uint8_t *pointer = &temp;
...

while (1)
{
...
sendPayload(pointer, 2, 0);
...
}
}
но пока не получается. единица отправляется правильно как младший байт, а вместо старшего - всегда "95".
Вложения
257.png
(26.84 KiB) Скачиваний: 356

Re: HOPERF RFM70, особенности работы

Пт май 09, 2014 18:36:08

докумекал.
int main()
{
...
int value = 610;
uint8_t *pointer = &value;
...
while (1)
{
sendPayload(pointer,2,0);
_delay_ms(500);
}
...
}
Вложения
610.png
(27.88 KiB) Скачиваний: 359

Re: HOPERF RFM70, особенности работы

Пт май 09, 2014 18:39:14

...компилятор правильно предупреждает, что указатель pointer ожидает uint8_t (1 байт), а получает int (2 байта)
но это в передатчике. теперь надо додумать как принять эти самые два байта. потому как у меня пока все еще принимается только младший байт.

Re: HOPERF RFM70, особенности работы

Пт май 09, 2014 19:25:08

в приемнике указатель объявляется так:
int buffer [] = {};
тогда все принимается правильно. два байта!

Re: HOPERF RFM70, особенности работы

Пт май 09, 2014 21:34:25

Ну можно и так, а у меня просто функция в передатчике обьявлена так
uint8_t sendPayload(int16_t payload, uint8_t len, int8_t
toAck) т.е. первый параметр uint16_t

Re: HOPERF RFM70, особенности работы

Пт май 09, 2014 22:03:39

...тогда однобайтные значения у вас, скорее всего, будут передаваться неправильно. если это не страшно, то можно так и оставить, конечно.
попробуйте, не трогая библиотеку, следующий код:
Код:
...
int main()
{
   uint16_t value = 0;
   uint8_t *pointer = &value;

   sei();
   _delay_ms(500);
   begin();

   setModeTX();
   setChannel(8);

   while (1)
   {
      sendPayload(pointer,2,0);
      value++;
      _delay_ms(10);
   }
}

так за одиннадцать минут передастся весь двухбайтовый ряд чисел.
но этот код не очень корректен в плане того, что значение value двухбайтовое, а указатель pointer - однобайтовый. на что компилятор и ругается.

Re: HOPERF RFM70, особенности работы

Пт май 09, 2014 22:42:59

Мне пока не критично, у меня 2 датчика температуры и датчик давления. У датчика давления всегда два байта, а с датчиков температуры первый байт номер датчика второй байт температура. Ну я учту ваш вариант т.к. он более универсальный. :))

Re: HOPERF RFM70, особенности работы

Сб май 10, 2014 01:04:20

вот еще нужная особенность...
если передатчик питается от батареи и желательно беречь ее емкость, то можно во время бездействия переводить передатчик в состояние "Standby I". в таком состоянии ток потребления составляет примерно 50 мкА вместо 330 мкА в состоянии "Standby II". в состояние "Standby II" передатчик переходит автоматически при опустошении буфера отправки. а вот для того, чтобы перевести его в "Standby I" нужно посадить вывод СЕ на землю, а перед отправкой - наоборот. в моем примере (а у меня данные отправляются с интервалом в одну секунду):
Код:
   while (1)
   {
      PORT_SPI |= 1<<CE; // просыпаемся
      value = 1023 - readADC();
      sendPayload(pointer,2,0);
      PORT_SPI &= ~(1<<CE); // засыпаем (перевод в Standby I)
      _delay_ms(1000);
   }

Re: HOPERF RFM70, особенности работы

Сб май 10, 2014 07:43:38

Ух ценное замечание, как ранее мне подсказали можно еще питать модуль пониженным напряжением и при передаче он меньше потребляет. Я эту информацию учту, у меня основной проблемой будет датчик давления, сколько он потребляет в даташите не нашел.

Re: HOPERF RFM70, особенности работы

Ср май 14, 2014 16:19:56

Уважаемые форумчане!
Уже пятый день бьюсь с RFM73 за дальность. Некоторые успешные из вас пишут о достигнутой фантастической дальности в 50 метров! Просто завидую белой завистью... 5 метров мой предел и то с перебоями. Проект горит, сроки подходят, сдвинуться с мертвой точки не могу ((
Окажите услугу, пжлста, ткните меня в ошибку, иначе скоро на одного программиста станет меньше :)
На текущий момент сделаны две одинаковые железяки для испытания модуля. На плате МК SiLabs c8051f350, модуль RFM73, кнопка и светодиод (для проверки работы канала), ну и батарейный отсек. Ничего лишнего )
В исходнике первой строкой идет объявление типа устройства (#define PTX_Device). Если закомментировано - приемник, иначе - передатчик.
Настройки модуля лежат во флэш и грузятся в IRAM функцией LoadVars
Далее основная инициализация модуля RFM73_Init (хочу потом в отдельную библиотеку эту функцию выкинуть)
Следом настройка модуля под конкретное программно-аппаратное решение - RFM73_Prepare (адреса Pipe0 и Pipe1 приемника выбраны 0x0000000001 и 0x0000000002)
В основном цикле программы к модулю относится только функция RFM73_Processor. Прерывание не используется по человечески из-за неверной разводки платы, но в данном случае это не существенно, т.к. сама плата отладочная. Просто смотрю уровень на IRQ "в ручную".
При нажатии на кнопку вызывается функция ShowCurrentMode, где и осуществляется отправка пакета ('TEST'). В случае приема ACK "светлый диод" должен подмигуть на 100мс при ARC_CNT=0 и два раза по 100мс при ARC_CNT>0. В случае неуспешной отправки - один раз на 500мс. Приемник в случае приема 'TEST' также должен подмигнуть на 100мс.
Передатчик после отправки уводит модуль в PowerDown, т.к. конечное устройство должно проработать от батареи не меньше года при условии отправки одного пакета раз в 1,5 минуты.
Написана прога на комп для контроля состояния регистров. Все честно, все отображается как положено. Но вот дальше 5 метров - ни-ни. За стенку зайти - вообще труп.
И не желает включаться волшебная фича ACTIVATE 0x73. Регистры DYNPD и FEATURE остаются недоступными.
С меня пиво :)
Вложения
HUM_RF.asm
(24.51 KiB) Скачиваний: 206

Re: HOPERF RFM70, особенности работы

Ср май 14, 2014 18:31:53

выкладываю свой код на основе библиотеки от немца.
передатчик между засыпаниями отправляет значение ADC (примерно раз в две секунды) 0 - 1023 (два! байта).
приемник питается от сети и поэтому пока не спит. принимает эти два байта, выводит на lcd дисплей и выплевывает в uart.
схему, если надо, выложу позже. как понял, вам больше нужна инициализация в файле rfm70.c.
а вообще, если надо просто проверить дальность или работоспособность, то я бы рекомендовал начать с проекта digitalr "радиосинхронизатор на avr" http://radiokot.ru/circuit/digital/automat/57/
Вложения
avr_rfm_photo_detector.rar
(102.23 KiB) Скачиваний: 197

Re: HOPERF RFM70, особенности работы

Ср май 14, 2014 18:40:50

И надо проверить на других таких модулях купленных в другом месте чтобы исключить неисправность самих модулей.

Re: HOPERF RFM70, особенности работы

Ср май 14, 2014 19:10:25

asylumist писал(а):если надо просто проверить дальность или работоспособность, то я бы рекомендовал начать с проекта digitalr "радиосинхронизатор на avr" http://radiokot.ru/circuit/digital/automat/57/


так у меня rfm73. если я сильно круто не туплю где-то, то проблема на мой взгляд именно в банке 1. а у немца другие настройки.
попробовал настройки для 73 из вашего исходника - вообще приемник оглох. в трех см ничего не видит...
может проблема в ДНК? )))

Re: HOPERF RFM70, особенности работы

Ср май 14, 2014 23:53:49

вряд-ли) радиосинхронизатор работает с той-же прошивкой и с rfm73! только должен быть и передатчик и приемник на rfm73. по крайней мере, так говорит автор. вам бы сначала их хоть как-то завести, чтобы исключить аппаратный дефект, а потом уже дорабатывать.
что касается того, что ваш приемник ничего не принимает с моими настройками, то я думаю, что у вас получается так, что настройки передатчика и приемника не совпадают. попробуйте и в передатчик тоже занести мои настройки. и не забудьте еще про частоту модуляции. мало того, что у меня в коде она задается при инициализации, так еще и в main принимает другое значение. короче, шейте и передатчик и приемник и смотрите uart или светодиод на PB7. и обратите внимание также на распиновку в rfm70.h. и еще, забыл сказать, тактовая частота микропроцессора у меня 8МГц. правда, не проверял влияет ли она на дальность

Re: HOPERF RFM70, особенности работы

Чт май 15, 2014 11:14:21

asylumist писал(а):вряд-ли) радиосинхронизатор работает с той-же прошивкой и с rfm73! только должен быть и передатчик и приемник на rfm73. по крайней мере, так говорит автор. вам бы сначала их хоть как-то завести, чтобы исключить аппаратный дефект, а потом уже дорабатывать.
что касается того, что ваш приемник ничего не принимает с моими настройками, то я думаю, что у вас получается так, что настройки передатчика и приемника не совпадают. попробуйте и в передатчик тоже занести мои настройки. и не забудьте еще про частоту модуляции. мало того, что у меня в коде она задается при инициализации, так еще и в main принимает другое значение. короче, шейте и передатчик и приемник и смотрите uart или светодиод на PB7. и обратите внимание также на распиновку в rfm70.h. и еще, забыл сказать, тактовая частота микропроцессора у меня 8МГц. правда, не проверял влияет ли она на дальность


1. аппаратный по идее быть не должен, иначе совсем бы ничего не работало.
2. приемник и передатчик шьются одной и той же прогой, так что инициализация идентична.
3. распиновка на работу модуля влиять не может, как и тактовая МК.
4. а вот про частоту модуляции не понял. есть ширина модуляции, но я такой настройки не видел. есть несущая частота, которая у вас выбрана 2408 МГц. если имеется в виду номер канала, то он указан правильно, иначе п.1

в общем, поехал я за новыми модулями. может какой-то немного пошабашил... перепаяю - отпишусь )

Re: HOPERF RFM70, особенности работы

Чт май 15, 2014 12:48:30

модуляция? нет, конечно. это я к ночи уже перестал соображать. несущая. конечно, несущая. при инициализации 0 банка происходит запись { (0x20|0x05), 0x17 }, //channel = 0x17. потом в main она изменяется - setChannel(8);
п.2 вы ведь не имеете ввиду одну и ту же прошивку для приемника и передатчика?
п.3 на дальность, конечно, не влияет, а вот на работоспособность. я, например, когда примерял код немца на atmega8, то, конечно, изменял распиновку. вы, в зависимости от того, какой у вас микроконтроллер, тоже должны применить ту распиновку, которая соответствует вашему. тоже думаю, что тактовая частота не должна влиять на дальность, но ведь что-то на нее влияет!

Re: HOPERF RFM70, особенности работы

Чт май 15, 2014 14:13:20

вернулся с железяками. сейчас начну играться.
одна прошивка для приемника и передатчика - так и есть. первая строка проги определяет роль железяки. соответственно, процедура инициализации банка 1 одинакова.
у меня два темных пятна в этой теме:
1. что означает регистр 4 банка 1 (for single carrier mode)?
2. почему не работает ACTIVATE 0x73?

и еще вот странность одна. в даташите написано: Don't write reserved registers and no definition registers in register bank 1
а сами в примере туда нули лупят. удивляет меня эта Киталия периодически...

Re: HOPERF RFM70, особенности работы

Чт май 15, 2014 15:21:19

если одна строка в main отличается - то тогда и прошивка ведь изменяется. и нельзя шить одной и то же прошивкой и передатчик и приемник. от этой одной строчки зависит все поведение модуля. у меня, например, для передатчика это строка setModeTX();, а для приемника - setModeRX();.
а инициализация, да, может быть одинаковой и для передатчика и для приемника (но только, если потом в main сделать из передатчика ({ (0x20|0x00), 0x0F }) приемник (setModeRX())).
1. тоже не знаю. и не помню, изменял ли эти значения.
2. ACTIVATE 0x73 работает. иначе не было бы передачи без подтверждения. посмотреть на команды (работают-ли) можно подключив логический анализатор к SPI.
3. да. действительно пишут. могу предположить, что делают это только для того, чтобы сохранить порядок (00 - 0Е) в банке 1. и не усложнять код.
Ответить