Napisałem, że trudno precyzyjnie ocenić nie widząc całego kodu, ponieważ w przypadku przedstawienia tylko fragmentów:
- nie wiadomo, z jakiego miejsca programu dany fragment pochodzi, a to może mieć kluczowe znaczenie
- nie wiadomo, czy w pozostałej części kodu nie ma czegoś, co może spowodować nieprawidłowe działanie pokazanego fragmentu
- jaka jest ogólna struktura/organizacja programu, ponieważ to też może mieć wpływ na prawidłowość działania przedstawionych fragmentów.
Nadal nie wszystko jest jasne. Przykładowo masz taką linijkę
PCINT8_flag=1;, a nigdzie nie widzę deklaracji, co to jest
PCINT8_flag i do czego tej zmiennej używasz...
...ale już to zostawmy, bo nie o to chodzi, żeby tutaj przedstawiać wszystkie moduły programu

Teraz już lepiej widać, jak to wszystko jest zorganizowane.
Niestety nie dysponuję wystarczającą ilością czasu, aby szczegółowo przeanalizować cały kod, więc odniosę się tylko do usypiania, które jest tematem tego wątku.
Nadal zerowanie flagi przerwania PCINT8 (PCIF1) masz w nieodpowiednim miejscu. Tak jak wcześniej napisałem, powinno być przed
włączeniem zezwolenia na przerwanie, czyli przed
PCICR |= (1<<PCIE1); , a nie przed wyłączeniem. Właściwie wygląda na to, że w Twoim przypadku nie trzeba tego robić, więc możesz spróbować to zerowanie flagi w ogóle pominąć. W każdym razie zerowanie w tym miejscu, w jakim jest w tej chwili, i tak nie spełni swojej roli.
Ustawienie bitu SE we funkcji
sm_power_down() jest zbędne, a nawet niewskazane (ustawienie bitu SE jest realizowane przez makro
sleep_mode() ). W pliku <avr/sleep.h> masz gotowe makro wygodniejsze w użyciu, które robi to, co Twoja funkcja, więc w miejscu wywołania funkcji
sm_power_down() zrobiłbym tak:
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
To, o czym napisałem, to nie jakieś błędy, które mogą powodować nieprawidłowe działanie. To tylko takie moje uwagi. Ogólnie myślę, że w tej formie usypianie i wybudzanie powinno działać prawidłowo. Reszty szczegółowo nie analizowałem, więc się nie wypowiadam, choć być może też znalazłoby się kilka uwag. Myślę, że powinieneś po prostu solidnie przetestować i w razie problemów zawsze można spróbować poprawić lub pytać na forum.