- posted
16 years ago
atmega i flaga int1
- Vote on answer
- posted
16 years ago
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 :)...
- Vote on answer
- posted
16 years ago
...
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ł
- Vote on answer
- posted
16 years ago
- Vote on answer
- posted
16 years ago
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