Adam Wysocki
Guest
Fri Feb 13, 2009 2:45 am
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.
--
http://www.extreme-photo.pl/
Adam Dybkowski
Guest
Fri Feb 13, 2009 2:45 am
Adam Wysocki pisze:
Quote:
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?
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."
--
Adam Dybkowski
http://dybkowski.net/
Uwaga: przed wysłaniem do mnie maila usuń cyfry z adresu.
Adam Wysocki
Guest
Fri Feb 13, 2009 8:45 am
Adam Dybkowski <adybkows12@45wp.pl> wrote:
Quote:
W dokumentacji jest wg mnie jasno napisane, że najpierw zostanie
wykonana funkcja obsługi przerwania, a potem kolejne instrukcje po SLEEP:
Jasne - jakoś mi umknęło. Dzięki!
--
http://www.extreme-photo.pl/
mw158979
Guest
Fri Feb 13, 2009 11:12 am
"Adam Wysocki" <gophi.at.chmurka.net@nospam.invalid> schrieb
Quote:
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.
....
a nie przeszkadza Ci, ze przerwanie np wystapi
po sprawdzeniu while(!flaga) ale przed sleep_mode();?
hej
Adam Dybkowski
Guest
Fri Feb 13, 2009 9:31 pm
mw158979 pisze:
Quote:
volatile uint8_t flaga = 0;
[...]
while (!flaga)
sleep_mode();
i flaga będzie ustawiana w przerwaniu.
....
a nie przeszkadza Ci, ze przerwanie np wystapi
po sprawdzeniu while(!flaga) ale przed sleep_mode();?
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.
--
Adam Dybkowski
http://dybkowski.net/
Uwaga: przed wysłaniem do mnie maila usuń cyfry z adresu.
Adam Wysocki
Guest
Mon Feb 16, 2009 6:45 am
mw158979 <e@tam.pl> wrote:
Quote:
while (!flaga)
sleep_mode();
i flaga będzie ustawiana w przerwaniu.
...
a nie przeszkadza Ci, ze przerwanie np wystapi
po sprawdzeniu while(!flaga) ale przed sleep_mode();?
Słusznie - nie pomyślałem o tym. Dzięki.
--
http://www.extreme-photo.pl/