Отговори на тема  [ 6 мнения ] 
Atmega168 Събуждане с външно прекъсване 
Автор Съобщение
Ранг: Професионалист
Ранг: Професионалист
Аватар

Регистриран на: Нед Ное 08, 2009 12:17 am
Мнения: 512
Мнение 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 и т.н. интерфейсите при събуждане или мога просто да продължа от където съм стигнал (т.е. регистрите нулират ли се... би трябвало да се запазват доколкото успях да прочета)


Нед Юни 10, 2012 8:38 pm
Профил
Ранг: Новодошъл
Ранг: Новодошъл

Регистриран на: Чет Окт 02, 2008 10:24 pm
Мнения: 105
Мнение 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 секунди ,
по тази логика по-добре веднага с натискането да го приспиш :)).


Нед Юни 10, 2012 11:20 pm
Профил ICQ
Ранг: Професионалист
Ранг: Професионалист
Аватар

Регистриран на: Нед Ное 08, 2009 12:17 am
Мнения: 512
Мнение Re: Atmega168 Събуждане с външно прекъсване
Благодаря за отговора ще разгледам темите :)
Това ми е първия опит да приспивам MCU и бях убеден че съм допуснал хиляди грешки


Пон Юни 11, 2012 8:24 am
Профил
Ранг: Професионалист
Ранг: Професионалист
Аватар

Регистриран на: Нед Ное 08, 2009 12:17 am
Мнения: 512
Мнение Re: Atmega168 Събуждане с външно прекъсване
П.С. Прегледах го, доста неща ми се изясниха сега покрай приспиването/събуждането на контролерчетата.
Благодаря ти още веднъж, Cino, аз доста търсих из Avrfreaks но точно на тези теми не съм попаднал явно.


Пон Юни 11, 2012 1:33 pm
Профил
Ранг: Ориентиран
Ранг: Ориентиран

Регистриран на: Пет Авг 07, 2009 4:58 pm
Мнения: 273
Мнение Re: Atmega168 Събуждане с външно прекъсване
Е то темата май е приключена вече, ама да ти споделя аз как го правя за един проект, с който си играя вкъщи. За сега работи само на симулация, което ще рече, че е повече концептуално, отколкото изпробвано :)

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

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

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


Вто Юни 26, 2012 10:34 am
Профил
Ранг: Новодошъл
Ранг: Новодошъл

Регистриран на: Съб Дек 06, 2008 9:22 am
Мнения: 119
Местоположение: Пловдив
Мнение Re: Atmega168 Събуждане с външно прекъсване
Все се чудя, имали нещо да става по нормалния начин при ATMEL. Това да го приспиш и да не можеш да го събудиш после. При пикльовците е къде по-лесно, събужда се точно след sleep инструкцията, независимо какво е предизвикало събуждането. Изпълнява една празна инструкция и после газ на музиката т.е. на кода :)


Вто Юни 26, 2012 12:54 pm
Профил
Покажи мненията от миналия:  Сортирай по  
Отговори на тема   [ 6 мнения ] 

Кой е на линия

Потребители разглеждащи този форум: 0 регистрирани и 6 госта


Вие не можете да пускате нови теми
Вие не можете да отговаряте на теми
Вие не можете да променяте собственото си мнение
Вие не можете да изтривате собствените си мнения
Вие не можете да прикачвате файл

Търсене:
Иди на:  
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group.
Designed by ST Software for PTF.
Хостинг и Домейни