pawel
Guest
Fri Apr 18, 2008 5:48 pm
Witam.
Mam problem z flagą i przerwaniem zewnętrznym int1 w atmega32.
Mianowicie podłączyłem przycisk do wejścia PD3 i aktywowałem przerwanie int1
na zbocze opadające.
//--------------------------
BUTTON_DDR &= ~(1 << BUTTON_PIN); //wejście
BUTTON_OUT |= (1 << BUTTON_PIN); //pullup
MCUCR |= (1 << ISC11); //zbocze opadające
GICR |= (1 << INT1); //aktywowanie przerwania
sei();
//-------------------------
Kiedy blokuję i maskuję przerwanie:
//--------------------------------------------------
GICR &= ~(1 << INT1); //zablokowanie przerwań
GIFR |= (1 << INTF1); //zerowanie flagi przerwania
//---------------------------------------------------
to potem wciśnięcie klawisza powoduje że flaga znów jest ustawiana.
Czy to tylko u mnie tak czy tak ma być?
Co zrobić żeby nie była ustawiana?
Dzięki za pomoc.
Paweł
Konop
Guest
Fri Apr 18, 2008 11:15 pm
pawel pisze:
Quote:
Witam.
Mam problem z flagą i przerwaniem zewnętrznym int1 w atmega32.
Mianowicie podłączyłem przycisk do wejścia PD3 i aktywowałem przerwanie int1
na zbocze opadające.
//--------------------------
BUTTON_DDR &= ~(1 << BUTTON_PIN); //wejście
BUTTON_OUT |= (1 << BUTTON_PIN); //pullup
MCUCR |= (1 << ISC11); //zbocze opadające
GICR |= (1 << INT1); //aktywowanie przerwania
sei();
//-------------------------
Kiedy blokuję i maskuję przerwanie:
//--------------------------------------------------
GICR &= ~(1 << INT1); //zablokowanie przerwań
GIFR |= (1 << INTF1); //zerowanie flagi przerwania
//---------------------------------------------------
to potem wciśnięcie klawisza powoduje że flaga znów jest ustawiana.
Czy to tylko u mnie tak czy tak ma być?
Co zrobić żeby nie była ustawiana?
Nie wiem, czy dobrze zrozumiałem... chodzi Ci o to, że w czasie, gdy
przerwania są zablokowane, to naciśnięcie przycisku i tak ustawia flagę,
tak?? Jeśli o to Ci chodzi - to niestety, nie da się tego obejść... to
działa tak - rejestr MCUCR ustawia, kiedy przerwanie ma być zgłoszone,
jak się pojawi odpowiednie kryterium (opadające zbocze) to jest
ustawiana flaga w GIFR, a procek albo to "widzi" albo tego "nie widzi"
(tzn. obsługuje albo nie) w zależności od flagi w GICR oraz flagi I w
SREG... ale niestety, flaga jest ustawiona tak czy inaczej... i nie da
się tego obejść...
Jedyne rozwiązanie jest takie, że w miejscach, w których włączasz
obsługę tego przerwania musisz wcześniej kasować flagę.. będzie to
wyglądać chyba tak (chyba, bo praktycznie nie znam C, takich dziś szkolą
inżynierów, studia zaczęte w 2004 roku, a z programowania miałem tylko
Pascala i dla proców ASM, C-przez pół semestru :/... następne roczniki
mają głównie C):
GIFR |= (1 << INTF1);
GICR |= (1 << INT1);
No ale ta metoda działać będzie tylko jeśli używasz flagi przerwania "po
bożemu", czyli do przerwania

... jeśli chcesz ją sprawdzać programowo,
to niestety przy okazji musisz też sprawdzić stan flagi INT1 :/...
Pozdrawiam
Konop
PS Tak jest ze wszystkimi przerwaniami

...
Paweł Pawłowicz
Guest
Sat Apr 19, 2008 11:13 am
On Fri, 18 Apr 2008 18:48:39 +0200, "pawel" <paw1976@poczta.onet.pl>
wrote:
Quote:
Witam.
Mam problem z flagą i przerwaniem zewnętrznym int1 w atmega32.
Mianowicie podłączyłem przycisk do wejścia PD3 i aktywowałem przerwanie int1
na zbocze opadające.
....
to potem wciśnięcie klawisza powoduje że flaga znów jest ustawiana.
Czy to tylko u mnie tak czy tak ma być?
Niestety,tak ma być.
Quote:
Co zrobić żeby nie była ustawiana?
Kasować. Zwróć też uwage na drgania styków przycisku. Jeśli
uruchomiona zostanie obsługa przerwania to drgania ustawią ponownie
flagę i przerwanie może być wykonane wiele razy.
Pozdrawiam,
Paweł
Pawel
Guest
Sat Apr 19, 2008 1:39 pm
Quote:
Nie wiem, czy dobrze zrozumiałem... chodzi Ci o to, że w czasie, gdy
przerwania są zablokowane, to naciśnięcie przycisku i tak ustawia flagę,
tak?? Jeśli o to Ci chodzi - to niestety, nie da się tego obejść... to
Witam.
Jednak się dało trzeba było dodatkowo wyczyścić ISC11.
MCUCR &= ~(1 << ISC11); //zbocze opadające
Jednak nie wiem dlaczego tak jest.
Wtedy przyciśnięcie guzika nie powoduje ustawienia flagi.
Pozdrawiam
Paweł
Konop
Guest
Sat Apr 19, 2008 2:51 pm
Pawel pisze:
Quote:
Nie wiem, czy dobrze zrozumiałem... chodzi Ci o to, że w czasie, gdy
przerwania są zablokowane, to naciśnięcie przycisku i tak ustawia flagę,
tak?? Jeśli o to Ci chodzi - to niestety, nie da się tego obejść... to
Witam.
Jednak się dało trzeba było dodatkowo wyczyścić ISC11.
MCUCR &= ~(1 << ISC11); //zbocze opadające
Jednak nie wiem dlaczego tak jest.
Wtedy przyciśnięcie guzika nie powoduje ustawienia flagi.
Pozdrawiam
Paweł
Już spieszę z wyjaśnieniem:
Opis flagi INTF1, ostatnie zdanie:
"This flag is always cleared when INT1 is configured as a level interrupt."
Czyli jak wyzerujesz ISC11 przełączasz to przerwanie w tyb "low-LEVEL",
a w tym trybie flaga INTF1 jest zawsze skasowana...
Pozdrawiam
Konop