реклама на сайте
подробности

 
 
 
Closed TopicStart new topic
> проблема с выходом из режима Power Down, Attyny2313
bgc
сообщение Dec 4 2006, 12:51
Сообщение #1


Местный
***

Группа: Свой
Сообщений: 313
Регистрация: 30-07-06
Из: Москва
Пользователь №: 19 188



Вот и я решил задать вопрос обществу, может кто знает в чем проблема:

На 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);


--------------------
Окружающий мир - не иссякающий источник сюрпризов!
Go to the top of the page
 
+Quote Post
MichaelU
сообщение Dec 4 2006, 15:18
Сообщение #2


Участник
*

Группа: Участник
Сообщений: 40
Регистрация: 1-02-06
Пользователь №: 13 867



Тут что-то с логикой. Не к месту последняя строчка: while(1) - МК переходит в спящий режим, пробуждается, а затем попадает в цикл и может реагировать только на прерывания. Вместо нее бы переход куда-нибудь перед MyAddr = EEPROM_read(0) например.
Go to the top of the page
 
+Quote Post
bgc
сообщение Dec 4 2006, 18:18
Сообщение #3


Местный
***

Группа: Свой
Сообщений: 313
Регистрация: 30-07-06
Из: Москва
Пользователь №: 19 188



while(1) - это чтобы перезагрузился по WATCHDOG


--------------------
Окружающий мир - не иссякающий источник сюрпризов!
Go to the top of the page
 
+Quote Post
MichaelU
сообщение Dec 5 2006, 10:45
Сообщение #4


Участник
*

Группа: Участник
Сообщений: 40
Регистрация: 1-02-06
Пользователь №: 13 867



Все-равно странно:



__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);
Go to the top of the page
 
+Quote Post
bgc
сообщение Dec 5 2006, 18:34
Сообщение #5


Местный
***

Группа: Свой
Сообщений: 313
Регистрация: 30-07-06
Из: Москва
Пользователь №: 19 188



в том то и дело, что не опечатка и как оказалось именно в этом дело. Но эта программа работала на 90s2313. Поставил 1 в бит WDE и все заработало!!!
Хоть и удалось найти самому, спасибо за коментарии. Тему закрываем.


--------------------
Окружающий мир - не иссякающий источник сюрпризов!
Go to the top of the page
 
+Quote Post

Closed TopicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 29th July 2025 - 04:20
Рейтинг@Mail.ru


Страница сгенерированна за 0.014 секунд с 7
ELECTRONIX ©2004-2016