Не могу послать по выходу из состояния сна
- Войдите на сайт для отправки комментариев
Втр, 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
как по мне слишком много "снотворного", а "будишь" слабо, вот он и спит у тебя