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