Страница 1 из 1

Выход из спящего режима

Добавлено: Сб июн 27, 2015 09:59:16
leksmaster
Есть Tiny24. Удачно перевожу в спящий режим в теле main().

Код: Выделить всё

		// переход в спячку
			if ( cntr1 >= 20) {
				cntr1 = 1;
				TMR1_Stop();  // останов таймкра 1
				set_sleep_mode(SLEEP_MODE_PWR_DOWN);
				sleep_enable();
				// сигнализируем о переходе в спячку
				PORTA = 0b00001111;
				_delay_ms(1000);
				PORTA = 0x00;
				_delay_ms(100);
				TCNT1 = 0;				
				ClearBit(PORTA,6);
				// разрешаем прерывание по низкому уровню INT0
				GoToSleep();		
				// Засыпаем
				sleep_enable();
				sleep_cpu();	
				// запрещаем прерывание по низкому уровню INT0
				GIMSK = 0x00;
				MCUCR = 0x00;	
				GIFR = 0x00;		
			} // mode READY	
По нажатию на кнопку на INT0 программа начинает работать заново. Причем все последующие нажатия на кнопку опять перезапускают программу. До ввода в спящий режим кнопка правильно выполняет заданные действия.

Код: Выделить всё

ISR (INT0_vect) {
	GIMSK = 0;
	GIFR = 0x00;
	TMR1_Start();	// запуск таймера 1
} // INT0
Подскажите как поправить.

Re: Выход из спящего режима

Добавлено: Сб июн 27, 2015 14:54:45
ARV
правильное засыпание делается так:

Код: Выделить всё

set_sleep_mode(SLEEP_MODE_PWR_DOWN);
		sleep_mode(); // спим
использовать макросы sleep_enable() и т.п. - не нужно.

Re: Выход из спящего режима

Добавлено: Ср июл 01, 2015 04:35:56
leksmaster
Проблему решил. Все работает.
Код засыпания и просыпания переписал заново глядя в ДШ.

Re: Выход из спящего режима

Добавлено: Вт июл 21, 2015 19:44:12
Marat16180
Господа!

Не объясните начинающему, почему если перед входом в спящий режим оставить включенным диод, он так и остается гореть?

В моем понимании МК переходит в экономный режим и отключает все что возможно.
режим
SLEEP_MODE_PWR_DOWN

Re: Выход из спящего режима

Добавлено: Вт июл 21, 2015 19:49:15
Ser60
МК при входе в определенные режимы сна сохраняет содержимое всех регистров, памяти, и состояние портов. Какой режим сна используете Вы? В ДШ на МК четко написано что именно сохраняется в каком режиме сна.

Re: Выход из спящего режима

Добавлено: Вт июл 21, 2015 19:50:02
просто КОТ
В твоём режиме он отключает "думалку". Но ведь регистры то были установлены уже. И ежели там записана единичка, то хоть ты тресни, а надо гореть диоду. В принципе, можешь в DDRX переписать все пины на входы, не трогая содержимого их перед сном. А потом обратно на выходы, проснувшись.

Re: Выход из спящего режима

Добавлено: Вт июл 21, 2015 20:36:05
Marat16180
Просто КОТ

спасибо за ответ :)) . Значит в правильном направлении двигаюсь, пошел копать дальше!

Ser60

Power-down Mode.
Стараюсь всегда перед вопросом читать ДШ, дабы людей просто так не дергать.
По таблице в данном режиме идет прерывание по INTам и по I2C.
Перечитаю еще раз, значит что то упустил.

Спасибо, Господа!

Re: Выход из спящего режима

Добавлено: Ср июл 22, 2015 10:31:17
Андрей СШ
Мало перевести пины в режим входа, нужно ещё подтяжку отключить, а то диод будет и дальше гореть, но тускло.

Кроме того способность микроконтроллера сохранять включенные пины во сне бывает полезна.

В даташите есть такое утверждение:
When entering a sleep mode, all port pins should be configured to use minimum power. The
most important thing is then to ensure that no pins drive resistive loads.

Re: Выход из спящего режима

Добавлено: Ср июл 22, 2015 10:58:06
просто КОТ
Но ведь чтоб отключить подтяжку, придётся "уничтожить" информацию в нём. Хотя. с целью экономии -- всегда можно.. Можно и сохранить его содержимое себе куда-то, если очень надо.

Re: Выход из спящего режима

Добавлено: Сб июл 25, 2015 16:13:12
Foton-4n
Дам совет. У меня есть процедура спящего, там всё прописано и перед сном всё ненужное снимается включаться внешние прерывания, после выхода происходит инициализация состояний, у меня все состояния хранятся и могут в любой момент быть восстановлены, это занимает может и занимает больше памяти но зато 100% гарантия что не когда не зависнет дольше чем до след такта (как правило 1 сек) или события, порту назначается состояние только при изменении состояния переменной но можно и принудительно. Сделай так же и проблемы минуют. А так же если состояния портов не хранить то как запросить их скажем по сети.
Зы если МК не сохранял состояние портов во сне то почти все девайсы были бы лишены это режима и МК работал бы всегда :))) .