Skocz do zawartości

Funkcja warunkowa if, przerwania


Pomocna odpowiedź

Napisano

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.

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.

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.

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