AVR - sleep mode, przerwania - co robi po wybudzeniu?

Feb 13, 2009 5 Replies

Cześć,



AVR zostaje wybudzony z idle sleep przez przerwanie - np. przerwanie TWI. Czy jest szansa, że wykona chociaż kilka instrukcji w normalnym przebiegu, czy na pewno zawsze pierwsze co wykona to przerwanie, a dopiero potem wróci do normalnego przebiegu?



Pytam bo chcę zrobić:



volatile uint8_t flaga = 0; [...] while (!flaga) sleep_mode();



i flaga będzie ustawiana w przerwaniu.


Adam Wysocki pisze:

W dokumentacji jest wg mnie jasno napisane, że najpierw zostanie wykonana funkcja obsługi przerwania, a potem kolejne instrukcje po SLEEP:

"If an enabled interrupt occurs while the MCU is in a sleep mode, the MCU wakes up. The MCU is then halted for four cycles in addition to the start-up time, executes the interrupt routine, and resumes execution from the instruction following SLEEP."

Jasne - jakoś mi umknęło. Dzięki!

"Adam Wysocki" snipped-for-privacy@nospam.invalid schrieb

... a nie przeszkadza Ci, ze przerwanie np wystapi po sprawdzeniu while(!flaga) ale przed sleep_mode();?

hej

mw158979 pisze:

Przerwanie może wystąpić tuż przed wykonaniem instrukcji SLEEP - wg mnie sensowne wtedy byłoby (w przerwaniu) wykrycie takiej sytuacji i wyłączenie możliwości zaśnięcia tak aby SLEEP nie zadziałał. Można makro sleep_mode() rozbić na sleep_enable(); sleep_cpu(); sleep_disable() i w przerwaniu właśnie dodać sleep_disable(). Wtedy procek nie zaśnie w tym obiegu pętli while.

Słusznie - nie pomyślałem o tym. Dzięki.

Join the Discussion

Have something to add? Share your thoughts — no account required.

Didn't find your answer?

Ask the community — no account required