Не могу послать по выходу из состояния сна
- Войдите на сайт для отправки комментариев
Втр, 12/04/2016 - 10:03
#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 кнопка на землю, нажали - послать. Надо, чтобы всё время кроме самой передачи, всё спало, аккумулятор маленький. Помогите пожалуйста, у меня варианты закончились.
а где ты в основном цикле проверяешь, что флаг есть - проснуться, а флаг пропал - уснуть?
точнее у тебя есть условие выхода из цикла, но нет условия входа
я имею ввиду каким образом взводится флаг?
Вы его только сбрасываете
В прерывания ставится, а в спящей функции сбрасывается.
ткни лицом в строку пжл
В функции waking первым оператором sleep_disable();
Должно заработать. И все-таки эксперименты - хорошо, но работающие примеры идут другим путем:
засыпать не в setup, а в loop. То есть когда контроллер прошел все шаги и полностью инициализирован, возможно это суеверие.
Здесь на форуме есть рабочий пример: вот ссылка:http://arduino.ru/forum/obshchii/spyashchii-rezhim
как по мне слишком много "снотворного", а "будишь" слабо, вот он и спит у тебя