• Уважаемые посетители сайта esp8266.ru!
    Мы отказались от размещения рекламы на страницах форума для большего комфорта пользователей.
    Вы можете оказать посильную поддержку администрации форума. Данные средства пойдут на оплату услуг облачных провайдеров для сайта esp8266.ru
  • Система автоматизации с открытым исходным кодом на базе esp8266/esp32 микроконтроллеров и приложения IoT Manager. Наша группа в Telegram

Вопрос NodeMCU v3 и модуль nRF24L01+

Gamak15km

New member
Добрый день! Уважаемые фррумчане подскажите пожалуйста куда копать. Столкнулся с проблемой сканирования частоты 2,4 ГГц по 127 каналам. Использую стандартный скетч из примера библиотеки rf24. Скетч модифицирован:

-закоментирована библиотека "printf.h" и все что с ней связано.
- изменена строка
Код:
printf("%x", min(0xf, values[i]));
на
Код:
printf("%x", min<int>(0xf, values[i]));
при сканировании всех 127 частот, контроллер перегружается.
Копия порта:
Код:
RF24/examples/scanner/
STATUS         = 0x0e RX_DR=0 TX_DS=0 MAX_RT=0 RX_P_NO=7 TX_FULL=0
RX_ADDR_P0-1     = 0xe7e7e7e7e7 0xc2c2c2c2c2
RX_ADDR_P2-5     = 0xc3 0xc4 0xc5 0xc6
TX_ADDR         = 0xe7e7e7e7e7
RX_PW_P0-6     = 0x00 0x00 0x00 0x00 0x00 0x00
EN_AA         = 0x00
EN_RXADDR     = 0x03
RF_CH         = 0x4c
RF_SETUP     = 0x07
CONFIG         = 0x0e
DYNPD/FEATURE     = 0x00 0x00
Data Rate     = 1MBPS
Model         = nRF24L01+
CRC Length     = 16 bits
PA Power     = PA_MAX
000000000000000011111111111111112222222222222222333333333333333344444444444444445555555555555555666666666666666677777777777777
0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcd

Soft WDT reset

>>>stack>>>

ctx: cont
sp: 3ffffdc0 end: 3fffffc0 offset: 01b0
3fffff70:  4010019c 0000005b 3ffee4f8 40202f2c 
3fffff80:  3ffe8579 0000007e 0000005b 4020253b 
3fffff90:  feefeffe feefeffe feefeffe 3ffee590 
3fffffa0:  3fffdad0 00000000 3ffee560 40203960 
3fffffb0:  feefeffe feefeffe 3ffe84f4 40100a05 
<<<stack<<<
Если указать не верную скорость порта, то циклично выдается данное сообщение:
Код:
 ets Jan  8 2013,rst cause:2, boot mode:(3,6)

load 0x4010f000, len 1384, room 16
tail 8
chksum 0x2d
csum 0x2d
v951aeffa
~ld
Если начать сканировать менее 40 портов, то сканирование работает.

Загружаемый скетч:
Код:
#define D5 14  // SCK
#define D6 12  // MISO
#define D7 13  // MOSI
#include <SPI.h>
#include "nRF24L01.h"
#include "RF24.h"
//#include "printf.h"

//
// Hardware configuration
//

// Set up nRF24L01 radio on SPI bus plus pins 7 & 8

RF24 radio(D4, D8);

//
// Channel info
//

const uint8_t num_channels = 126;
uint8_t values[num_channels];

//
// Setup
//

void setup(void)
{
  //
  // Print preamble
  //

  Serial.begin(9600);
  //printf_begin();
  Serial.println(F("\n\rRF24/examples/scanner/"));

  //
  // Setup and configure rf radio
  //

  radio.begin();
  radio.setAutoAck(false);

  // Get into standby mode
  radio.startListening();
  radio.stopListening();

  radio.printDetails();

  // Print out header, high then low digit
  int i = 0;
  while ( i < num_channels )
  {
    printf("%x", i >> 4);
    ++i;
  }
  Serial.println();
  i = 0;
  while ( i < num_channels )
  {
    printf("%x", i & 0xf);
    ++i;
  }
  Serial.println();
}

//
// Loop
//

const int num_reps = 100;

void loop(void)
{
  // Clear measurement values
  memset(values, 0, sizeof(values));

  // Scan all channels num_reps times
  int rep_counter = num_reps;
  while (rep_counter--)
  {
    int i = num_channels;
    while (i--)
    {
      // Select this channel
      radio.setChannel(i);

      // Listen for a little
      radio.startListening();
      delayMicroseconds(128);
      radio.stopListening();

      // Did we get a carrier?
      if ( radio.testCarrier() ) {
        ++values[i];
      }
    }
  }

  // Print out channel measurements, clamped to a single hex digit
  int i = 0;
  while ( i < num_channels )
  {
    printf("%x", min<int>(0xf, values[i]));
    ++i;
  }
  Serial.println();
}

// vim:ai:cin:sts=2 sw=2 ft=cppagjvjubnt
Мое предположение, что происходит переполнение памяти и контроллер уходит в рст, а что с этим делать и куда копать, в силу своей не компетенции,"самообучаемости" и новизны для меня, я незнаю. Помогите пожалуйста разобраться.
Заранее спасибо!
 

CodeNameHawk

Moderator
Команда форума
В loop долго не сидите. Один проход loop один канал.

Ну или попробуйте в цикле while (i--) добавить задержку delay(1) или yield() это нужно для того, что бы есп обработала WiFi.
 

Gamak15km

New member
В loop долго не сидите. Один проход loop один канал.

Ну или попробуйте в цикле while (i--) добавить задержку delay(1) или yield() это нужно для того, что бы есп обработала WiFi.
Спасибо! Скетч завелся! и с delay(1), и с yield() работает.
Подскажите пожалуйста где почитать информацию, связанную с данной ошибкой? хочется более глубже вникнуть в физику процесса. Литературы полно, но какая более подойдет для новичка не понятно!
 

nikolz

Well-known member
читайте документацию по SDK
--------------
есть два способа решить вашу проблему
1) самый простой - поставьте в цикл сканирования сброс WDT и проблемы не будет
2) сделайте сканирование по таймеру
 
Сверху Снизу