как победить сон LGT8P328

Elon Max

✩✩✩✩✩✩✩
11 Ноя 2022
4
0
Задача модуля - измерять давление отправлять его по NRF уходить в сон просыпаться через какое-то время и все по кругу.
Данные отправляются но в сон не уходит, сидит в loop`e и постоянно шлет данные даже на delay не смотрит что та м1 секунда.
Код сна взят из примеров ЛГБТ платы, удалось даже получить 17мкА но это при 32МГц, на 1МГц будет еще меньше, но суть в другом при попытке уйти в сон возможно контролер и уходит но после выхода и после переконфигурации портов модуль NRF уже не работает, и по потреблению не сказал бы что МК во сне, бывает даже что при явной команде в сон потребление увеличиваеться с 2мА до 10.
Все что сейчас получаеться это 2.5мА потребление.
Как отправить в сон правильно МК, и как потом заставить работать модуль, хоть модуль и клон нанки но работает так же по китайски
Отключал питание от радиомодуля, потребление не менялось особо
C++:
// SWC --> D13
// SWD --> D12
// RST --> D10


#include <SPI.h>
#include "nRF24L01.h"
#include "RF24.h"
#include "lgt_LowPower.h"
#include <Adafruit_BMP280.h>



RF24 radio(10,9);
Adafruit_BMP280 bmp;

int tx_data[16];
float r2 = 56000;
float r1 = 47000;

void setup() {
  initRadio();
  //initBaro();
  //analogReference(INTERNAL2V56);
  //pinMode(A0,INPUT);
}



void initRadio(){
  DDRB = 46;                                // установка пинов как было до сна
  radio.begin();                            // активировать модуль
  radio.setAutoAck(true);                   // режим подтверждения приёма, 1 вкл 0 выкл
  radio.openWritingPipe(0xC2C2C2C222);      // network adress
  radio.setChannel(10);                     // выбираем канал (в котором нет шумов!) такой же как на передатчике
  radio.setPALevel(RF24_PA_MIN);            // На выбор RF24_PA_MIN, RF24_PA_LOW, RF24_PA_HIGH, RF24_PA_MAX
  radio.setDataRate(RF24_2MBPS);            // скорость передачи данных должна быть такая же как на передатчике
  radio.powerUp();                          // начать работу
  radio.stopListening();
}

void initBaro(){
  bmp.begin();
  bmp.setSampling(Adafruit_BMP280::MODE_FORCED,     /* Operating Mode. */
                  Adafruit_BMP280::SAMPLING_X2,     /* Temp. oversampling */
                  Adafruit_BMP280::SAMPLING_X16,    /* Pressure oversampling */
                  Adafruit_BMP280::FILTER_X16,      /* Filtering. */
                  Adafruit_BMP280::STANDBY_MS_500);
}

void checkBattery(){
  float voltage = ((float)analogRead(A0) * 2.56 * ((r1 + r2) / r2)) / 1024;
  if(voltage <= 3.3){}
}

void toSleep(){
  radio.powerDown();
  DDRB  = 0x00;                 // Set all pins to input
  DDRC  = 0x00;
  DDRD  = 0x00;
  DDRE  = 0x00;
  PORTB = 0xFF;                 // Set all input with internal pull up resistors
  PORTC = 0xFF;
  PORTD = 0xFF;
  PORTE = 0xFF;
  LowPower.powerDown(SLEEP_8S, ADC_OFF, BOD_OFF);
  //LowPower.powerExtStandby(SLEEP_8S, ADC_OFF, BOD_OFF, TIMER2_OFF );
}

void loop() {
  initRadio();
  tx_data[0] = analogRead(A0);
  radio.write(&tx_data, sizeof(tx_data));
  delay(1000);
  toSleep();
}
 

Elon Max

✩✩✩✩✩✩✩
11 Ноя 2022
4
0
проблему победил
возможно библтотеки даного камня и ядра, в часности "lgt_LowPower.h" не дружат на какомто уровне с библиотеками NRF.
написал код заполняя регистры вручную, и все заработало. Сейчас потребление составляет 190мкА, но буду дальше эксперементировать, так как нужно еще отключать порты ввода вывода для полного снижения потребления.
C++:
void setup() {
  pinMode(4, OUTPUT);
  //initBaro();
  analogReference(INTERNAL2V56);
  pinMode(A0, INPUT);
  radio.begin();                            // активировать модуль
  radio.setAutoAck(true);                   // режим подтверждения приёма, 1 вкл 0 выкл
  radio.openWritingPipe(0xC2C2C2C222);      // network adress
  radio.setChannel(10);                     // выбираем канал (в котором нет шумов!) такой же как на передатчике
  radio.setPALevel(RF24_PA_MIN);            // На выбор RF24_PA_MIN, RF24_PA_LOW, RF24_PA_HIGH, RF24_PA_MAX
  radio.setDataRate(RF24_2MBPS);            // скорость передачи данных должна быть такая же как на передатчике
  radio.powerUp();                          // начать работу
  radio.stopListening();
  wdt_enable(WTO_8S);
}

void loop() {
  ADCSRA |= (1 << ADEN);                //включение ADC
  tx_data[0] = analogRead(A0);       //измерение
  ADCSRA &= ~(1 << ADEN);          //отключение ADC
  ADCSRA |=  (1 << ADIF);               //зброс флага прерывания ADC, возможно не обязательно
  //DDRB = 46;
  //SPCR = 80;


  radio.powerUp();
  radio.write(&tx_data, sizeof(tx_data));
  radio.powerDown();

  byte mask = 0b11111101;            //маска настройки регистра сна. сон dps0
  SMCR = ~SMCR & mask;               //установка регистра сна
  PRR |= 0b11101111;                      // отключение всей переферии
  asm("sleep");
  /*
    SPCR = 0;
    DDRB  = 0x00;                 // Set all pins to input
    DDRC  = 0x00;
    DDRD  = 0x00;
    DDRE  = 0x00;
    PORTB = 0xFF;                 // Set all input with internal pull up resistors
    PORTC = 0xFF;
    PORTD = 0xFF;
    PORTE = 0xFF;*/

}