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

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

Вт апр 22, 2014 19:22:37

Вообщем, мне что-то сложно вам подсказать на расстоянии в таком режиме как мы общаемся. Эту библиотечку я прикручивал к ATmega16, ATXmega256A3 и ATTiny44. Во всех случаях после поисков проблем (обычно не очень долгих) все работало. Почему у вас не запускается - это вопрос, там скорей всего какая-то мелочь, но мне сложно подсказать что-то дельное сейчас. Проверьте все еще раз внимательно, может отложите на пару дней, а потом свежим взглядом еще раз взглянуть...

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

Ср апр 23, 2014 10:11:39

Я уже отдохнул на выходных, и вчера ещё раз стал выяснять почему не работает.
Первое что проверил, действительны ли мои предположения что первые 2 посылки как в модуле 1 так и 2 являются загрузкой конфигурации (параметров работы) модулей. Как оказалось так оно и есть, например в модуле 1 при вызове процедуры установки номера канала setChannel(28)
число cnum = 28 (в шестнадцатеричном виде 0х1C) отправляется
Код:
void setChannel(uint8_t cnum)
{
  writeRegVal( RFM70_CMD_WRITE_REG | RFM70_REG_RF_CH, cnum);
}

где
RFM70_CMD_WRITE_REG = 0x20// Define write command to register
RFM70_REG_RF_CH = 0x05 // 'RF channel' register address
операция или (|) даёт 0x25
при просмотре логическим анализатором видно, что такая последовательность 0x25 следующий байт 0х1С - передается, чтобы проверить не случайно ли я вижу такую последовательность, изменил номер канала на 27 (0х1В) и заново запустил лог. анализатор, он зафиксировал 0x25 0х1B - я не ошибся :)) до окончания пакета передачи идут несколько байтов (это как думаю) отправка команды setMode(0);//transmit
Для того чтобы проверить работает процедура отправки сообщения и точно видеть что передаю в процедуру, поставил число 24(0x18) - допустим у нас такая температура sendPayload(0x18,1, 0);
Так вот такая комбинация 0x18 отсутствует не только в том пакете который передаёт конфигурацию, но и в коротком о котором я писал ранее (Atmega 8a 2755 ms подтверждение.jpg) в своих сообщениях.
Получается явно что процедуры инициализации и установки канала работают а сама sendPayload - нет.
Продолжу общение с модулем сегодня вечером.
P.S. может дело в Atmega 8а адреса регистров где-то отличаются?

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

Чт апр 24, 2014 10:09:44

Продолжил общение с модулем, вернее с функцией передачи данных sendPayload, вместо 0х18 число 24 - sendPayload(24,1, 0); всё таки правильно передавать десятичное число так как входящий параметр определен как int
Код:
uint8_t sendPayload(int8_t * payload, uint8_t len, int8_t toAck)   // choose 0=nAck, 1=AckRequest
{
   
     // check TX_FIFO
     uint8_t status;
     status = readRegVal(RFM70_REG_FIFO_STATUS);
     if (status & RFM70_FIFO_STATUS_TX_FULL)
   {
       debug(RFM70_DEBUG_FIFO_FULL);
       return 0;
     }

     // send payload
   PORT_SPI &=~ (1<<CSN);
     _delay_ms(RFM70_CS_DELAY);
     if(toAck == -1)
       transmitSPI(RFM70_CMD_W_ACK_PAYLOAD);
     else if (toAck == 0)
       transmitSPI(RFM70_CMD_W_TX_PAYLOAD_NOACK);
     else
       transmitSPI(RFM70_CMD_WR_TX_PLOAD);
     while(len--)
   {
       transmitSPI(*(payload++));
      //uart_putc(*payload);
      //uart_puts(", ");
     }
   PORT_SPI |= (1<<CSN);
     _delay_ms(RFM70_CS_DELAY);
   //uart_puts("\n");
   //PORTA ^= (1<<PA4);
     return 1;
}

запускаю логический анализатор и вижу что 24 не передаётся (см. рисунок "до переделки.png"), а передаётся 0x2E, ставил третий параметр 1 и -1 как советовал уважаемый "eess9", изменений никаких.
Попробовал изменять второй параметр это len (длина сообщения), поставил 2 оказалось после последнего байта 0x2E появился 0x00, значит установка длины пакета работает.
Остался первый параметр int8_t * payload, и тут я подумал, а что если убрать * в объявлении параметра по ссылке, убираю * в объявлении функции и в transmitSPI(*(payload++)); - запускаю логический анализатор - 24 передаётся!!!!
Может здесь дело в IDE, у меня проект на Atmel Studio 6.1?
Теперь осталось изменить код во втором модуле и пробовать передачу пакетов между 2 этими модулями чем сегодня вечером и займусь.
Вложения
24 передаётся.jpg
(224.63 KiB) Скачиваний: 468
До переделки.png
(136.49 KiB) Скачиваний: 379

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

Пт апр 25, 2014 13:54:35

Подключил вчера вечером логический анализатор к модулю 2 (приёмник) для того чтобы посмотреть хоть что-то принимается, но как оказалось чуда пока не произошло. Модуль 1 с передатчиком передаёт пакет (как я писал ранее с числом 24), а в пакете приёмника пока такого не наблюдается, как видно из приложенного рисунка Мк передаёт радиомодулю 2 байта 0x07 0x00 и получает 0x0E 0x0E. Стал смотреть функцию приёма пакета receivePayload вот её код
Код:
unsigned int receivePayload(unsigned int *payload)
{
     unsigned int len;
     // check RX_FIFO
     unsigned int status;
     status = readRegVal(RFM70_REG_STATUS);
     if (status & RFM70_IRQ_STATUS_RX_DR) { // RX_DR
      //PORTA ^= (1<<PA4);
       //while(1) {
         unsigned int fifo_sta;
         len = readRegVal(RFM70_CMD_RX_PL_WID); // Payload width
         readRegBuf(RFM70_CMD_RD_RX_PLOAD, payload, len);
         fifo_sta = readRegVal(RFM70_REG_FIFO_STATUS);
         //if (fifo_sta & RFM70_FIFO_STATUS_RX_EMPTY) break; // read until RX_FIFO empty
       //}
      
        if (fifo_sta & RFM70_FIFO_STATUS_RX_EMPTY) {
           status|= 0x40 & 0xCF; // clear status bit rx_dr
          writeRegVal(RFM70_CMD_WRITE_REG | RFM70_REG_STATUS, status);
        }
       //showstr("что-то приняли",0,120,0,0,255);   //это строка для проверки
      return len;
     }
     else
   {
      //showstr("Ничего не приняли",0,130,0,0,255);   //это строка для проверки
       return 0;
   }
}

где RFM70_REG_STATUS = 0x07 // 'Status' register address
RFM70_IRQ_STATUS_RX_DR = 0x40 // Status bit RX_DR IRQ
если посмотреть функцию проверки статуса readRegVal(RFM70_REG_STATUS);
Код:
unsigned int readRegVal(unsigned int cmd)
{
     unsigned int res;
   PORT_SPI &=~ (1<<CSN);
     _delay_ms(RFM70_CS_DELAY);

     transmitSPI(cmd); //отправка 0х07 команды

     res=transmitSPI(0); //отправка 0 и получение результата
     PORT_SPI |= (1<<CSN);
     _delay_ms(RFM70_CS_DELAY);
     return res;
}

видно что она отправляет 0x07 0x00
и в приложенном здесь рисунке res - результат статуса 14 (0x0E), естественно далее
в функции receivePayload ничего не выполняется.
У меня вопрос, как должен работать приём?
P.S. Посмотрел ещё раз на скрин, и вижу что CE высокий уровень, может он должен быть низкий?
Вложения
приём.png
(185.52 KiB) Скачиваний: 324

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

Пт апр 25, 2014 19:02:14

Читаем datasheet:
The RX mode is an active mode where the RFM73 radio is configured to be a receiver. To enter this mode from standby-I mode, the PRX device must have the PWR_UP bit set high, PRIM_RX bit set high and the CE pin set high.
Все правильно CE в 1.

Значит передатчик таки ничего не передает. По опыту: я всегда при передаче ставлю toAСK = 0 (3-й параметр), при других параметрах бывает веселье с RFM70(3). Похоже, что приемопередатчики боятся статики: когда я запускал их с ATXmega256A3 умудрился парочку угрохать: общение с контроллером идет, а по воздуху тишина. Хорошо помогла замена для проверки в чем причина, а то пару дней мозги сушил в чем дело.

К слову силапсовские SI100x имеют туже проблему: приемопередатчик вылетает от статики на раз (это для тех, кто будет использовать RFM50).

В последнем проекте устройство было очень критично к потреблению. 22мА в режиме приемника немало. Опуская СЕ в 0, а потом опять поднимая в 1 удалось сократить потребление до 10мА практически без потери пакетов, но передатчик должен передавать с частотой, которая бы попадала в эти интервалы.

Больше не знаю чем помочь

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

Пт апр 25, 2014 21:44:58

Как правильно понял по CE = 1 режим приёмника, CE = 0 передатчика. Посмотрел в модуле 1 (передатчика) при передаче коротких пакетов (рисунок 24 передаётся.jpg) CE там тоже равен 1, при передаче пакета наверное надо удерживать низкий уровень.
А модули я менял, у меня 3 модуля RFM73 и два RFM70 паял я их паяльником периодически отключая его от сети чтобы исключить повреждения (может конечно какой и повредил, но я их местами менял в разных вариантах). Попробую ещё один подпаять и посмотрю, хотя чую что дело в чём то другом, читая статью на EasyElectronics.ru ссылку - которую приводил ранее, не вижу в приведённых вами примерах где задаётся адрес (может адрес надо задать в передающем и приёмном модуле)?
Вложения
Всё вместе.jpg
(191.12 KiB) Скачиваний: 427
Последний раз редактировалось BigallS Сб апр 26, 2014 18:14:30, всего редактировалось 1 раз.

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

Сб апр 26, 2014 10:08:58

CE = 0 - это режим Standby-I. В этом режиме минимизируется потребление, и поэтому RF часть модуля отключена. То есть НИЧЕГО ПЕРЕДАВАТЬ И ПРИНИМАТЬ ОН НЕ БУДЕТ!!!
Библиотеку я брал вот от сюда http://projects.weber-itam.de/rfm70-funkmodul/. Статья на немецком, но это не беда при современных средствах перевода. Можете у него еще спросить. Я с ним переписывался в комментариях к статье на английском (немецкого не знаю вообще) в январе 13-го года. Ничего, отвечал тоже на английском.

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

Сб апр 26, 2014 17:48:36

Спасибо за подсказку, буду ещё копать. Если не получится, попробую на NRF24L01+ сделать, есть ещё другие радио модули RFM23B-S, RFM12B, не подскажите с ними как работать, не в этой теме конечно, а в личку.
P.S. Был у немца по вашей ссылке, скачал его пример он там под Atmega 8а, буду смотреть.

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

Вс апр 27, 2014 16:57:56

И всё таки передача заработала, посмотрел я код немца, он в принципе почти ничем не отличается от приведённого, и решил проверять все модули поочерёдно чтобы как писал "eess9" найти рабочие. В первую очередь к модулю RFM73 (который я ещё не пробовал) очень осторожно подпаял шлейф и подключил его на модуль 1 (передатчик) по очереди стал ставить в модуль 2 (приёмник) радио модули сначала RFM73 (2 шт.), потом RFM70 (2 шт.), результата никакого. Поставил в передатчик первый попавшийся RFM70 и стал проверять RFM73 (3 штуки) и последний RFM70 и о... с последним заработало!!!
Т.е. пара RFM70 работает, не знаю может быть параметры для RFM73 отличаются и они не работают с RFM70, а возможно и какие то из них и вправду от статики померли, важно что хоть пара работает за что большая благодарность "eess9". Естественно я по отдельности попробую всё таки запустить оставшиеся эти три штуки RFM73.
В приложенном "скрине" видно что приходит "24" (это 4-й байт в пакете) которое я передаю.

P.S. Попробовал логическим анализатором подольше лог записать, да периодически идут короткие посылки 15 шт. как я писал в предыдущем посте, а потом пакет как на этом рисунке, заново 15 коротких и после пакет с данными.
Вложения
Приём пакета Работает.png
(212.55 KiB) Скачиваний: 451

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

Пн апр 28, 2014 11:07:03

Ну что вам сказать? ПОЗДРАВЛЯЮ!!!
По поводу не работы RFM73: прикрепляю свой последний проект ATTiny24(44) + RFM73. Это диммер с пультом. Может действительно есть какая-то разница с вашим кодом. Чтобы переделать под другой контроллер надо просто правильно настроить SPI, т.е. поменять функции
Код:
void initSPI(uint8_t clk_div)
Код:
uint8_t transmitSPI(uint8_t val)
в rfm70.c Также в rfm70.h дефайнами задать правильно нужные ноги и будет работать. По крайней мере у меня работает.
Удачи!
Вложения
RFM73.rar
(116.66 KiB) Скачиваний: 218

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

Пн апр 28, 2014 13:02:22

Ещё раз благодарю, посмотрю ваш код обязательно притом что за RFM73 деньги "уплочены" и без дела их оставлять резона нет. По другим радио модулям, о которых я спрашивал в предыдущих сообщениях, есть ли у вас опыт работы (как запускали) и примеры работы если это не секрет можете дать, естественно в личной переписке.

P.S. Да забыл спросить в ваших примерах в main при инициализации радиомодуля
Код:
setMode(1);
setChannel(28);
setMode(1); // resive

два раза идёт вызов функции SetMode (как в коде приёмника так и передатчика), это просто ошибка?
У немца такого нет.
Последний раз редактировалось BigallS Пн апр 28, 2014 13:49:38, всего редактировалось 1 раз.

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

Пн апр 28, 2014 13:30:36

Да, спасибо, это я затупил. Функция конечно только одна, вторая лишняя. И у себя тоже подправлю :) . По поводу других модулей ничего сказать не могу, не работал.

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

Сб май 03, 2014 23:51:31

работаю с rfm73. проект взял, как и eess9, у немца с сайта http://projects.weber-itam.de/rfm70-funkmodul/
переделка с rfm70 на rfm73 заключалась в изменении седьмого регистра из нулевого банка на 0x0F (как вариант) вместо 0x3F. иначе модули не связывались.
моя проблема заключается в том, что приемник ВСЕГДА принимает (судя по выводу в uart) 14 байт (символов). вне зависимости от того, сколько я их передаю. кроме того, прием смещается на один байт и первым всегда идет символ '@'. подключив (для проверки) uart к выходу передатчика, вижу, что данные передаются правильно. кстати, для этого надо исправить ошибку в файле rfm70.c. в функции sendPayload цикл должен быть таким:
while (len--)
{
uart_putc(*payload);
uart_puts(", ");
transmitSPI(*(payload++));
}
прошу помощи. может, кто-то уже решил такую проблему, потому как я бьюсь уже второй день.

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

Пн май 05, 2014 10:59:11

asylumist писал(а):работаю с rfm73. проект взял, как и eess9, у немца с сайта http://projects.weber-itam.de/rfm70-funkmodul/
переделка с rfm70 на rfm73 заключалась в изменении седьмого регистра из нулевого банка на 0x0F (как вариант) вместо 0x3F. иначе модули не связывались...

Попробую с rfm73 заменить значение, у меня как раз они не работают.
По вопросу работы
Код:
while (len--)
{
uart_putc(*payload);
uart_puts(", ");
transmitSPI(*(payload++));
}

попробуйте уберите * у меня не работало, о чём я писал выше
я сделал так
Код:
uint8_t sendPayload(int16_t payload, uint8_t len, int8_t toAck)   // choose 0=nAck, 1=AckRequest
...
while (len--)
{
//uart_putc(payload); //uart я не использую
//uart_puts(", ");
transmitSPI(payload++);
}
...

на счёт 0x40 (@) так и должно быть посмотри моё сообщение выше "Приём пакета работает.png"

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

Ср май 07, 2014 15:19:24

разобрался с собакой. пришлось убрать весь uart. и все, судя по выходам на портах, работает хорошо. тестировал дальность. у меня два rfm73 связываются между собой на 50 метрах!

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

Ср май 07, 2014 17:54:22

asylumist писал(а):...тестировал дальность. у меня два rfm73 связываются между собой на 50 метрах!

Удивительно для rfm73 хотелось бы увидеть код чтобы понять почему у вас они так хорошо работают.

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

Чт май 08, 2014 18:54:28

в коде, кроме { (0x20|0x06), 0x0F } в инициализации шестого регистра нулевого банка, никаких изменений. ну и еще поубирал uart за ненадобностью. а так все, как у немца. модули покупал в http://www.rcscomponents.kiev.ua/produc ... v.1.0.html
еще есть в http://www.krokodil.kiev.ua/index.php?p ... t&Itemid=1
еще попробую согласно pdf-файла замены 70 на 73 изменить зачения инициализации четвертого и тринадцатого регистров. может, еще увеличит дальность.

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

Чт май 08, 2014 20:07:02

Видимо к нам в Россию какието другие завозят :shock: шучу конечно. Проверю позже, буду дома не раньше чем через неделю. Кстати там в функции передачи неправильно передается значение более 256. Даже если входной параметр определить как uint16_t, вставил проверку на 256 если больше сдвигаем влево на 8 и передаем старший байт, если меньше передаем без сдвига. Функцию вызываем sendPayload( payload, sizeof(payload), 0) где второй параметр будет равен 2 ( передаем два байта).
Последний раз редактировалось BigallS Пт май 09, 2014 07:16:53, всего редактировалось 1 раз.

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

Чт май 08, 2014 22:16:18

удалось выжать еще несколько метров изменением в приемнике в первом банке пятого регистра на { (0x20|0x05), 0x3C, 0x02, 0x7F, 0xA6 }. а то, что можно передавать несколько (до 32) байт настраивается, как я себе представляю, настройкой регистров. скорее всего, в функции "configRxPipe". тогда отпадет надобность вручную разбивать данные по байтам. но я пока не могу понять логику этой функции.

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

Чт май 08, 2014 22:59:18

Нет, буфер модуля уже определен размером 32 байта, но этаж ф-ция как раз и пихает туда байты, но делает это не правильно, в случае если чисто больше 256, попробуй как у тебя есть передай чисто 400. Я сделал и сильно удивился когда увидел что приходит 144 и 145 в десятичном виде.
Ответить