Skocz do zawartości

Funkcja warunkowa if, przerwania


Pomocna odpowiedź

Witam, tworzę obsługę czujnika HC-SR04, ale w trakcie naszła mnie pewna wątpliwość co do funkcji warunkowej. Czy w takim przypadku:

volatile uint8_t flag = 0;

ISR(INT0_vect){

if(flag == 0){  // flag = 0, przerwanie wykonuje funkcję warunkową
	cnt = 0;
	LCD_GoTo(0,0);
	LCD_Int(cnt);
	flag += 1;  
	MCUCR |= (1<<ISC01);  // przerwanie opadajace
}
if(flag == 1){    // w poprzedniej funkcji if zmienna flag została zwiększona o 1, czy przerwanie od razu przejdzie do następnej funkcji if? Czy zakończy się, a przy następnym wygenerowaniu przerwania zostanie wykonana funkcja if(flag == 1)?

	MCUCR |= (1<<ISC00)|(1<<ISC01);  // przerwanie rosnace
	cnt = 1;
	LCD_GoTo(0,0);
	LCD_Int(cnt);
}
}

Pozdrawiam.

Link to post
Share on other sites

Program idzie od góry do dołu, więc jak w pierwszym warunku zrobisz flag += 1 (a flag była 0) to w drugim warunku flaga będzie miała już wartość 1 (bo 0 + 1 = 1).

Taki warunek nie miałby sensu (wystarczy przecież wkleić kod z drugiego warunku do pierwszego warunku).

Jak rozumiem chodzi Tobie o to, żeby w pierwszym przerwaniu spełnił się pierwszy warunek, a w kolejnych drugi (o ile flaga nie zostanie wyzerowana). W takim wypadku najlepiej użyć konstrukcji:

if ( flag == 0 ) ...

else if ( flag == 1 ) ...

W tej sposób jak pierwszy warunek będzie spełniony to nie zostanie nawet sprawdzony drugi warunek.

Link to post
Share on other sites

Dodatkowo, ładowanie długich funkcji (np. do obsługi LCD) do funkcji przerwania nie jest dobrym pomysłem. Obsługa przerwania powinna być możliwie najkrótsza. Inaczej będzie to tylko generowało problemy.

Link to post
Share on other sites

Dołącz do dyskusji, napisz odpowiedź!

Jeśli masz już konto to zaloguj się teraz, aby opublikować wiadomość jako Ty. Możesz też napisać teraz i zarejestrować się później.
Uwaga: wgrywanie zdjęć i załączników dostępne jest po zalogowaniu!

Anonim
Dołącz do dyskusji! Kliknij i zacznij pisać...

×   Wklejony jako tekst z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Twój link będzie automatycznie osadzony.   Wyświetlać jako link

×   Twoja poprzednia zawartość została przywrócona.   Wyczyść edytor

×   Nie możesz wkleić zdjęć bezpośrednio. Prześlij lub wstaw obrazy z adresu URL.

×
×
  • Utwórz nowe...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.