NRF не передает редкие пакеты

Condensator
Offline
Зарегистрирован: 02.06.2017

Как только ставлю delay(1000) , NRF перестает работать -  статус виден по светодиодам. Это же подтверждается со  стороны RX.  

IDE версии 1.0.5 r2

01#include "nRF24L01.h"
02#include <SPI.h>
03#include "RF24.h"
04 
05const uint64_t pipe = 'ABCDEFG';
06uint8_t  B_32bytes[32];
07 
08// для Mega2560:
09RF24 ModuleToTest(49,53); // CE_PIN,SS_PIN
10 
11//для Uno другие CE_PIN,SS_PIN:
12// RF24 ModuleToTest(8,10);
13 
14 
15// для Mega2560:
16#define GR_LED 14     // Tx Ok
17#define RED_LED 16    // Tx fail
18 
19 
20// для UNO другие номера выводов LED:
21//#define GR_LED  2
22//#define RED_LED 4
23 
24void setup(void)
25
26  ModuleToTest.begin();
27                          //ModuleToTest.setAutoAck(true);
28  ModuleToTest.setAutoAck(false);
29  ModuleToTest.setDataRate(RF24_1MBPS);
30  ModuleToTest.setCRCLength(RF24_CRC_16);
31  ModuleToTest.setChannel(66);
32  ModuleToTest.openWritingPipe(pipe);
33  //ModuleToTest.printDetails();
34  pinMode(RED_LED, OUTPUT); 
35  pinMode(GR_LED, OUTPUT);  
36}
37 
38void loop(void)
39{
40  switch(ModuleToTest.write(B_32bytes,32))
41     { case false: digitalWrite(GR_LED,HIGH); digitalWrite(RED_LED,LOW); break;
42       case true:  digitalWrite(RED_LED,HIGH); digitalWrite(GR_LED,LOW); break;
43     }
44delay(1000); /////////////////////////////////////////////////////////////////////////////////////////////////////////////////
45}

 

Condensator
Offline
Зарегистрирован: 02.06.2017

Может быть delay() задействует те же прерывания и таймеры, что и библиотека для этого устройства?  При delay() < 5 мсек проблема не проявляется.

Short Circuit
Short Circuit аватар
Offline
Зарегистрирован: 17.05.2015

??  делей - программавообще останавливается в микрконтроллере, а  нрф шлет инфу.. и куда он шлет, на деревню дедушке?

Condensator
Offline
Зарегистрирован: 02.06.2017

Short Circuit пишет:
??  делей - программа вообще останавливается в микроконтроллере
  Не похоже. По-вашему, в какой точке программы она останавливается?

Short Circuit пишет:
а  нрф шлет инфу.. и куда он шлет, на деревню дедушке?
нрф шлет информацию без пордтверждения получения , специально поставил в примере код

1//         ModuleToTest.setAutoAck(true);
2           ModuleToTest.setAutoAck(false);

Поэтому для демонстрации ошибки не важно наличие-отсутствия приемника. В случае AutoAckn(false) считается, что  доставлено в любом случае (tx_ok). Но если внести задержку между посылками больше чем delay(15), передача прекращается и включается красный LED "tx_fail".

 

 

Tarantino
Offline
Зарегистрирован: 04.06.2017

Condensator пишет:
Как только ставлю delay(1000) , NRF перестает работать -  статус виден по светодиодам. Это же подтверждается со  стороны RX.  

IDE версии 1.0.5 r2

Может нечаянно сотворили импульный блок питания?  Прочтите это:  http://arduino.ru/forum/obshchii/lozhnoe-srabatyvanie-pir-datchika-pri-p...

ЕвгенийП пишет:
Монтажную схему Вы не привели, но думаю, что у Вас проблемы с общей землёй. При включении относительно мощной нагрузки происходит скачок. Почитайте вот эту статью, сравните рисунки 2 и 3 и посмотрите на свой монтаж. Думаю, всё решится.

Condensator
Offline
Зарегистрирован: 02.06.2017

Tarantino пишет:
Может нечаянно сотворили импульный блок питания?  Прочтите это:  http://arduino.ru/forum/obshchii/lozhnoe-srabatyvanie-pir-datchika-pri-podklyuchenii-sim900#comment-287278

Нет осциллографа, чтобы проверить напряжение питания

Condensator
Offline
Зарегистрирован: 02.06.2017

Помогите пожалуйста понять в каком направлении искать причину

Nosferatu
Offline
Зарегистрирован: 04.11.2012

Short Circuit вам указал направлении.

У вашей программы получается "окно" для приёма всего несколько микросекунд, во время проверки в switch. После этого секунду нечего не принимает, пока работает delay.

Копайте в сторону "Мигаем светодиодом без delay()".

Condensator
Offline
Зарегистрирован: 02.06.2017

Nosferatu, я не понимаю, можете объяснить мою ошибку попроще?

Приема (подтверждения ?) в программе не должно быть, так как отключено подтверждение передачи:

1//ModuleToTest.setAutoAck(true);
2 ModuleToTest.setAutoAck(false); //  отключил прием  подтверждения

А если не отключено, то прием подтверждения происходит во время выполнения 

1ModuleToTest.write(B_32bytes,32);

и время выполнения write при включенном приеме подтверждения  немного больше, чем без подтверждения.

 

 

Lims
Offline
Зарегистрирован: 07.06.2017

Мое сугубо дилетантсткое предположение, может быть дело в неправильной работе SPI и его сигналов  CE и SS ?

По аналогиии с этим сообщением http://arduino.ru/forum/programmirovanie/s-kakim-obemom-rabotaet-bibliot...

Для Mega2560 стандартный SS=53, CE=не знаю какой. Для UNO см в таблице

 

 

b707
Offline
Зарегистрирован: 26.05.2017

Condensator, вы во внутрь либы RF24 загляните - при каких условия функция RF24.write() возвращает False? может станет понятнее

Condensator
Offline
Зарегистрирован: 02.06.2017

b707 пишет:
Condensator, вы во внутрь либы RF24 загляните - при каких условия функция RF24.write() возвращает False? может станет понятнее

Заглянул, но ясности не прибавилось. https://github.com/maniacbug/RF24/issues . Проблема проявляется не только в том, что функция write возвращает false, но и приемник на второй ардуино перестает принимать пакеты.

RF24:write(const void *buf, uint8_t  len) , на что влияет модификатор const для  void *buf?

код функции RF24:write:

 

b707
Offline
Зарегистрирован: 26.05.2017

Condensator пишет:

Заглянул, но ясности не прибавилось.

тоже заглянул. Во-первых, может IF_SERIAL_DEBUG включить, чтобы увидеть какую-то диагностику? И во-вторых, что-то мне кажется. что то что вы отключили ask-пакеты - либа не отслеживает и все равно ждет ответа. Хотя могу ошибаться, смотрел мельком.

 

sansei4
Offline
Зарегистрирован: 09.01.2015

Ради эксперимента можете добавить ModuleToTest.stopListening(); перед switch() (пишу с телефона, так что лучше могу ошибиться в написании), а если не поможет, то и startListening(...); после

Condensator
Offline
Зарегистрирован: 02.06.2017

sansei4 пишет:
Ради эксперимента можете добавить ModuleToTest.stopListening(); перед switch() (пишу с телефона, так что лучше могу ошибиться в написании), а если не поможет, то и startListening(...); после
 

Но цитата из описания классов библиотеки http://maniacbug.github.io/RF24/classRF24.html противоречит этому совету тк  в тексте программы внутри switch используется write():

Pipe 0 is also used by the writing pipe. So if you open pipe 0 for reading, and then
startListening(), it will overwrite the writing pipe. Ergo, do an openWritingPipe() again before
write().

Перевод: Pipe 0 также используется как pipe для записи. Таким образом, если открываете pipe 0 для чтения, и затем startListening(), это перепишет pipe трубу для write. Следовательно, сделайте openWritingPipe() опять до write().

1void loop(void)
2{
3  switch(ModuleToTest.write(B_32bytes,32))
4     { case false: digitalWrite(GR_LED,HIGH); digitalWrite(RED_LED,LOW); break;
5       case true:  digitalWrite(RED_LED,HIGH); digitalWrite(GR_LED,LOW); break;
6     }
7delay(1000); //

 

Condensator
Offline
Зарегистрирован: 02.06.2017

b707 пишет:
тоже заглянул. Во-первых, может IF_SERIAL_DEBUG включить, чтобы увидеть какую-то диагностику? И во-вторых, что-то мне кажется. что то что вы отключили ask-пакеты - либа не отслеживает и все равно ждет ответа. Хотя могу ошибаться, смотрел мельком.

Я отключил подтверждение setAutoAck(false) (стр. 27,28 программы в сообщении 1) только в версии опубликованной на форуме, чтобы можно было тестировать программу одной картой NRF. 

Если включить подтверждение при помощи setAutoAck(true), то понадобится вторая NRF в качестве приемника, но при этом возникает такая же ошибка и ее синхронно видно как со стороны TX,  так и со стороны  RX.

SERIAL_DEBUG попробую включить.

sansei4
Offline
Зарегистрирован: 09.01.2015

Не было возможности еще раз просмотреть даташит. И все равно, я бы посоветовал включить прослушку со всеми необходимыми настройками. У меня работает так и с delay и с millis.

Вы пробовали уменьшать/увеличивать значение delay? 

Condensator
Offline
Зарегистрирован: 02.06.2017

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

sansei4 пишет:
У меня работает так и с delay и с millis.
У Вас работает программа из поста 1 с задержками более 15-20 мсек?

sansei4 пишет:
Вы пробовали уменьшать/увеличивать значение delay?
Да, уменьшение до нуляили удаление вызова delay().

При увеличении задержки в delay() от 15 и выше наблюдаются проблемы из-за которых и создана тема. Вместо delay() ставил длинные циклы операций с float для задержки и появляется эта же проблема.  

sansei4
Offline
Зарегистрирован: 09.01.2015

Я не запаривался с чтением статусов вообще, только прием пакетов. Мой код отличается наличием listening и задержкой между пакетами в пару секунд. А еще ардуино спит 5 минут, в это время питание радио отключено. Соответсвенно после включения надо инициализировать заново. Может и Вам поможет.

Condensator
Offline
Зарегистрирован: 02.06.2017

sansei4 пишет:
Я не запаривался с чтением статусов вообще, только прием пакетов. Мой код отличается наличием listening и задержкой между пакетами в пару секунд. А еще ардуино спит 5 минут, в это время питание радио отключено. Соответсвенно после включения надо инициализировать заново. Может и Вам поможет.
Возможно проблема в сбросе инициализации NRF