NodeMCU v3 и модуль nRF24L01+
- Войдите на сайт для отправки комментариев
Добрый день! Уважаемые фррумчане подскажите пожалуйста куда копать. Столкнулся с проблемой сканирования частоты 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
Мое предположение, что происходит переполнение памяти и контроллер уходит в рст, а что с этим делать и куда копать, в силу своей не компетенции,"самообучаемости" и новизны для меня, я незнаю. Помогите пожалуйста разобраться. Заранее спасибо!
Для решения данной проблемы надо добавить задержку delay(1) или yield(), это нужно для того, что бы есп обработала WiFi.