atmega i flaga int1

Apr 18, 2008 4 Replies

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³



pawel pisze:

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 :)...

...

Niestety,tak ma być.

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ł

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³

Pawel pisze:

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

Join the Discussion

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

Didn't find your answer?

Ask the community — no account required