Не могу послать по выходу из состояния сна

std
Offline
Зарегистрирован: 05.01.2012
#include <avr/sleep.h>
#include <avr/power.h>
#include <SPI.h>
#include <nRF24L01.h>
#include <RF24.h>

const uint64_t pipes[2] = { 0xFFFFFFFF00LL, 0xFFFFFFFF01LL };

RF24 radio(9,10);

byte data[4];
int ich=0;
byte bch=0;
volatile boolean onflag=0;

void waking(void){
  onflag=1;
}

void sleeping(void){
  onflag=0;
  delay(100);
  radio.powerDown();
  pinMode(13,0);
  pinMode(12,0);
  pinMode(11,0);
  pinMode(10,0);
  pinMode(9,0);
  delay(50);
  set_sleep_mode(SLEEP_MODE_PWR_DOWN);
  sleep_enable();
  sleep_mode();
  sleep_disable();
  radio.powerUp();
}

void msgCentral(byte name,byte content){
  data[0]=255;
  data[1]=9;
  data[2]=name;
  data[3]=content;
  for(byte i=0;i<5;i++) radio.write(&data, 4);
}

void setup(){
  radiosetup();
  pinMode(2,INPUT_PULLUP);
  attachInterrupt(0,waking,LOW);
  sleeping();
}

void radiosetup(){
  radio.begin();
  radio.setDataRate(RF24_250KBPS);
  radio.setPALevel(RF24_PA_MAX);
  radio.setChannel(1);
  radio.setAutoAck(1);
  radio.setRetries(15,15);
  radio.setPayloadSize(4);
  radio.openWritingPipe(pipes[1]);
  radio.stopListening();
}

void loop(){
  if(onflag){
    ADMUX=_BV(REFS0)|_BV(MUX3)|_BV(MUX2)|_BV(MUX1);
    ADCSRA|=_BV(ADSC);
    while(bit_is_set(ADCSRA, ADSC));
    uint8_t low=ADCL;
    uint8_t high=ADCH;
    float result=(high<<8)|low;
    result=(1.21546*1023.0*1000)/result;
    ich=(int)result;
    ich-=3400;
    if(ich>600) bch=100;
    else bch=(byte)ich/6;
    msgCentral(1,bch);
    delay(5000);
    if(digitalRead(2)) sleeping();
  }
}

Если убрать все упоминания спящих режимов (у МК, у RF24) и просто слать байт с процентом заряда в цикле, то всё приходит. Если вернуть сон МК, в приёмнике ничего.

На D2 кнопка на землю, нажали - послать. Надо, чтобы всё время кроме самой передачи, всё спало, аккумулятор маленький. Помогите пожалуйста, у меня варианты закончились.

James
Offline
Зарегистрирован: 26.02.2016

а где ты в основном цикле проверяешь, что флаг есть - проснуться, а флаг пропал - уснуть?

James
Offline
Зарегистрирован: 26.02.2016

точнее у тебя есть условие выхода из цикла, но нет условия входа

я имею ввиду каким образом взводится флаг?
Вы его только сбрасываете

std
Offline
Зарегистрирован: 05.01.2012

В прерывания ставится, а в спящей функции сбрасывается.

James
Offline
Зарегистрирован: 26.02.2016

ткни лицом в строку пжл

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

В функции waking первым оператором sleep_disable();

Должно заработать. И все-таки эксперименты - хорошо, но работающие примеры идут другим путем:

засыпать не в setup, а в loop. То есть когда контроллер прошел все шаги и полностью инициализирован, возможно это суеверие.

Здесь на форуме есть рабочий пример: вот ссылка:http://arduino.ru/forum/obshchii/spyashchii-rezhim

James
Offline
Зарегистрирован: 26.02.2016

как по мне слишком много "снотворного", а "будишь" слабо, вот он и спит у тебя