Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: проблема с выходом из режима Power Down
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > AVR
bgc
Вот и я решил задать вопрос обществу, может кто знает в чем проблема:

На At90s2313 все работало, и уже не один год в реально эксплуатации. новый проект на
AtTyny2313

После перенастройки таймеров и фуз-бит все работает кроме выхода из спящего режима.
причем сразу после усыпления выходит по обнулению pd3, а через несколько секунд (точно не определил, от 10 до 20сек) выходить перестает.
Первый раз после пересброса питания выходит всегда.
Что новое появилось в AtTyny2313 что я не заметил?

Собственно программа: вернее существенная для данного вопроса ее часть.

#define Set_SleepMode_Idle() ClrBitS(MCUCR,((1<<SM1)+(1<<SM0)))
#define Set_SleepMode_PwrDown() SetBit(MCUCR,SM0)
#define Set_SleepMode_Standby() {ClrBit(MCUCR,SM0); SetBit(MCUCR,SM1); }

начало программы после сброса
// Start timed equence
WDTCR |= (1<<WDCE) | (1<<WDE);
// Set new prescaler(time-out) value = 64K cycles (~0.5 s)
WDTCR = (1<<WDE) | (1<<WDP2) | (1<<WDP0);

Set_SleepMode_Idle();
SetBit(MCUCR,SE);

DDRB |= 0xFC;
DDRD &= ~0x38;
PORTD |= 0x38;


InitOutIOPD2();
SetIOPD2(); // âêëþ÷åíèå ïðèåìà

......

MyAddr = EEPROM_read(0);

if (MCUSR & (1<<BORF) ) {

нечто... не работающее с упрвляющими регистрами.
}
MCUSR = 0;

собественно код ухода в спячку и презагрузки после выхода.
while (!done) {
if (команда) done = 1;
}

Set_SleepMode_PwrDown();

__disable_interrupt();
WDTCR |= (1<<WDCE) | (1<<WDE);
WDTCR = 0x00;
__enable_interrupt();

ClrIOPD1(); // отключить дополнительного потребителя на плате.
SetBit(GIMSK,INT1);
SetBit(MCUCR,SE);
asm ("SLEEP");
WDTCR |= (1<<WDCE) | (1<<WDE);
WDTCR = (0<<WDE) | (0<<WDP2) | (0<<WDP0);
while(1);
MichaelU
Тут что-то с логикой. Не к месту последняя строчка: while(1) - МК переходит в спящий режим, пробуждается, а затем попадает в цикл и может реагировать только на прерывания. Вместо нее бы переход куда-нибудь перед MyAddr = EEPROM_read(0) например.
bgc
while(1) - это чтобы перезагрузился по WATCHDOG
MichaelU
Все-равно странно:



__disable_interrupt();
WDTCR |= (1<<WDCE) | (1<<WDE);
WDTCR = 0x00; //здесь отключаем WatchDog
__enable_interrupt();

ClrIOPD1();
SetBit(GIMSK,INT1);
SetBit(MCUCR,SE);
asm ("SLEEP");
WDTCR |= (1<<WDCE) | (1<<WDE);
WDTCR = (0<<WDE) | (0<<WDP2) | (0<<WDP0); //а здесь он все-равно отключен

//может опечатка - вместо нулей единицы: WDTCR = (1<<WDE) | (1<<WDP2) | (1<<WDP0);
while(1);
bgc
в том то и дело, что не опечатка и как оказалось именно в этом дело. Но эта программа работала на 90s2313. Поставил 1 в бит WDE и все заработало!!!
Хоть и удалось найти самому, спасибо за коментарии. Тему закрываем.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.