Микроконтролери и електроника
http://mcu-bg.com/mcu_site/

Atmega168 Събуждане с външно прекъсване
http://mcu-bg.com/mcu_site/viewtopic.php?f=3&t=10217
Страница 1 от 1

Автор:  klez [ Нед Юни 10, 2012 8:38 pm ]
Заглавие:  Atmega168 Събуждане с външно прекъсване

Здравейте правя си в момента Power On/Off бутона на джаджата но имам проблеми със събуждането му.

За спиране/пускане ползвам хардуерен бутон който е закачен на един от External Interrupt пиновете.

кода за неговия Interrupt vector е следният:

Код:

ISR(INT1_vect) {
_delay_ms(100);

if (shutdown_timer >= 50) {
   DDRB = 0x00; //stop outputs
   DDRC = 0x00; //stop outputs
   DDRD = 0x00; //stop outputs
   sleep_enable(); //Enable sleep mode
   sleep_mode(); //put in sleep mode
   _delay_ms(500);
   DDRB = 0b11111111; //PORTB Outputs/inputs
   DDRD = 0b11110111;
   shutdown_timer=0;
   }
   shutdown_timer++;
}


В общи линии като натиснеш Power бутона и го задържиш известно време shutdown_timer стига до 50 (ако пуснеш бутона, тази променлива се нулира извън interrupt vector-а). И изпълнява кода който е в IF-а.

Sleep режима е: POWER-DOWN

След като заспи не мога да го събудя.

Въпросите ми са...
1. когато натисна Power бутона ако контролера е в Sleep режим, от къде се изпълнява INT вектора, от там до където е стигнал (sleep_mode() функцията) или се извиква отначало интеръпт вектора.

2. трябва ли да реинициализирам TWI, SPI и т.н. интерфейсите при събуждане или мога просто да продължа от където съм стигнал (т.е. регистрите нулират ли се... би трябвало да се запазват доколкото успях да прочета)

Автор:  Cino [ Нед Юни 10, 2012 11:20 pm ]
Заглавие:  Re: Atmega168 Събуждане с външно прекъсване

http://www.avrfreaks.net/index.php?name ... c&p=929272
http://www.avrfreaks.net/index.php?name ... 95&start=0

от тези линкове се вижда че има и други ентусиати които го правят.
Но не се прави така, заспиване/събуждане в самото прекъсване за заспиване/събуждане.
В линковете се казва че поради хардуерното сваляне на глобалното разрешение на прекъсванията
когато се влезе в прекъсване при AVR, събждане в последствие е невъзможно, ако се заспи там.
Трябва да е от друго прекъсване за събуждане , само при условие че са разрешени вградени интеръпти,
и текущото е спряно преди заспиване ( иначе се препълва стека и се събуждаш с ресет ).


Другото , какво прави този delay_ms(100) в прекъсването,
то докато е натиснат бутона преди заспиване не се прави нищо друго 5 секунди ,
по тази логика по-добре веднага с натискането да го приспиш :)).

Автор:  klez [ Пон Юни 11, 2012 8:24 am ]
Заглавие:  Re: Atmega168 Събуждане с външно прекъсване

Благодаря за отговора ще разгледам темите :)
Това ми е първия опит да приспивам MCU и бях убеден че съм допуснал хиляди грешки

Автор:  klez [ Пон Юни 11, 2012 1:33 pm ]
Заглавие:  Re: Atmega168 Събуждане с външно прекъсване

П.С. Прегледах го, доста неща ми се изясниха сега покрай приспиването/събуждането на контролерчетата.
Благодаря ти още веднъж, Cino, аз доста търсих из Avrfreaks но точно на тези теми не съм попаднал явно.

Автор:  marcuka68 [ Вто Юни 26, 2012 10:34 am ]
Заглавие:  Re: Atmega168 Събуждане с външно прекъсване

Е то темата май е приключена вече, ама да ти споделя аз как го правя за един проект, с който си играя вкъщи. За сега работи само на симулация, което ще рече, че е повече концептуално, отколкото изпробвано :)

- използвам тайни13А и прекъсването PCINTX - Pin Change, което е налично на доста крачета.

- засичам натискане и отпускане на бутона, с една функция, със съответните закъснения. Тогава разрешавам прекъсването и заспивам. В самото прекъсване няма код, използвам го само за събуждане. Гледам, че май и ти на WIN AVR пишеш, там има и EMPTI_INTERRUPT(), което спестява код и е удобно за случая.

- след събуждане на контролера от Pin Change, забранявам това прекъсване, чакам със същата функция за обработване на натискане и пускане на бутона, за да не заспи пак контролерът.

Автор:  a_stankov [ Вто Юни 26, 2012 12:54 pm ]
Заглавие:  Re: Atmega168 Събуждане с външно прекъсване

Все се чудя, имали нещо да става по нормалния начин при ATMEL. Това да го приспиш и да не можеш да го събудиш после. При пикльовците е къде по-лесно, събужда се точно след sleep инструкцията, независимо какво е предизвикало събуждането. Изпълнява една празна инструкция и после газ на музиката т.е. на кода :)

Страница 1 от 1 Часовете са според зоната UTC + 2 часа [ DST ]
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
http://www.phpbb.com/