Вот и я решил задать вопрос обществу, может кто знает в чем проблема:
На 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);