Skocz do zawartości

Funkcja warunkowa if, przerwania


miccaldo

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 do komentarza
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 do komentarza
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 do komentarza
Share on other sites

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »
×
×
  • 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.