Tak na początek to mała uwaga na temat makra _delay_ms(), a mianowicie jest to makro a nie funkcja, tak więc nie powinno się wartości czasu podawać w postaci zmiennej, ponieważ kompilator to makro zamienia na blok zawierające "pustą instrukcję" (poprostu kompilator liczy ile tych pustych instrukcji musi wstawić aby opóźnienie było takie jakie chcemy). W twoim programie masz do tego makra wstawione zmienne, ale masz je od razu zainicjowane więc kompilator zna ich wartość w momencie kompilacji, ale jeśli w programie były by wykonywane jakieś operacje na tych zmiennych to program by Ci się nie skompilował a kompilator wypluł by błąd.
Jak chcesz mieć możliwość łatwej zmiany czasu bez przerabiania kodu zdefiniuj te wartości poleceniem #define
czyli zamiast
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
użyj czegoś takiego
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
Takie rozwiązanie zadziała zawsze i nie zajmie pamięci ram procesora.
Wracając do tematu to musisz uruchomić tejmer sprzętowy który atmega8 posiada w ilości 3 na swoim wyposażeniu, proponuję timer1 bo na nim najwygodniej dostosować czas, a i tak leży odłogiem.
Włączasz przerwanie od porównania timera i ustawiasz timer tak by generował przerwanie co powiedzmy 1s.
W programie tworzysz zmienną, to będzie licznik sekund zliczający do 300 (czyli twoje 5minut świecenia).
Zmienna powinna być opatrzona jako volatile oraz powinna być 16 bitowa:
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
W obsłudze przerwania wstawiasz coś w tym stylu:
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
a w pętli głównej dodajesz warunek:
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
Na koniec w warunkach zapalających ledy ładujesz licznik na zadany czas czyli nasze 300.
I teraz w momencie gdy czujka zainicjuje zapalenie ledów, załaduje również licznik. Tykające przerwanie ten licznik będzie co sekundę zmniejszało o 1. Gdy licznik dojdzie do 1 odliczanie się zatrzyma, równocześnie spełniony zostanie warunek w głównej pętli programu odpowiedzialny za natychmiastowe zgaszenie ledów, jednocześnie licznik zostanie wyzerowany i cały mechanizm zdezaktywowany)
Dla porządku możesz w warunku stopniowego gaszenia również wyzerować licznik by mechanizm bezwarunkowego gaszenie nie wywoływał się gdy ledy już wcześniej zostały wygaszone przez czujkę.
To chyba tyle. Mam nadzieję że coś zrozumiesz i sobie poradzisz. Ewentualnie dopytaj.