Jeśli masz książkę Mirka to polecam przebrnąć przez cały rozdział 4 i np projekt 5.4(Multipleksowanie LED - przerwania) - tam zrozumiesz przerwania
a następnie możesz się pokusić o dział 5.7(Pomiar napięcia za pomocą ADC) żeby zrozumieć ADC (tego działu nie czytałem jeszcze)
Ja mam kontakt z programowaniem AVR-ów od mniej wiecej 3 lat ale mimo to przerabiam książkę wg. mnie bez sensu jest żebym ja Ci podał rozwiązania bo tutaj chodzi o podstawy zrozumienia całego języka
jak już migałeś diodą to ja jeszcze bym zrobił miganie diodą na przycisk (w procesorze odczytujesz stan przycisku i ze względu na to włączasz diodę albo jedna dioda się świeci jak masz wciśnięty przycisk a druga kiedy nie masz wciśnięte) chodzi o to żebyś zrozumiał funkcję if
odnosząc się do tego co mi napisałeś
1. zgadza się jest to zezwolenie na przerwania, kluczem mojego pytania było kiedy się to wykona - wg. mnie nigdy bo program zaczyna pracę od funkcji main i robi tylko to co zostanie mu przeznaczone w tej funkcji
2. linijka 15 pozwól że zacytuję specyfikację dotyczącą rejestru TIFR
Cytuj:
TOV0: Timer/Counter0 Overflow Flag
The bit TOV0 is set (one) when an overflow occurs in Timer/Counter0. TOV0 is cleared by hardware
when executing the corresponding interrupt Handling Vector. Alternatively, TOV0 is
cleared by writing a logic one to the flag. When the SREG I-bit, TOIE0 (Timer/Counter0 Overflow
Interrupt Enable), and TOV0 are set (one), the Timer/Counter0 Overflow interrupt is executed.
czyli ustawiając TOV0 na 1 tak na prawdę powiedziałeś procesorowi że otrzymał przerwanie, jednorazowo - to jest flaga informująca o przepełnieniu
zezwolenie na przerwanie masz w rejestrze TIMSK polecam spojrzeć do specyfikacji
3. nie rozumiem w ogóle co odpisałeś, w każdym razie funkcja timer_init w ogóle się nie kończy bo nie ma nawiasu klamrowego (to powinno Ci wyrzucać masę błędów podczas kompilacji stąd nie rozumiem czemu tego wcześniej nie poprawiłeś)
4. co to jest przerwanie? książka Mirka strona podrozdział 3.6.2 (Przerwania), jeśli ustawiasz przerwanie to znaczy, że umożliwiasz żeby to przerwanie się wykonywało. Funkcją timer_stop w Twoim przypadku robisz to co powinieneś robić w timer_init... Wydaje mi się przerwania można zatrzymywać poprzez przestawienie preskalera czyli właśnie za pomocą bitów CSxx (ale nigdy z tego nie korzystałem i nie wiem jak jest zgodnie ze sztuką)
5. main jest traktowane jako główna część programu - ale trzeba rozumieć jak jest wykonywany kod
najpierw jest odczytywana i wykonywana pierwsza instrukcja z funkcji main, a potem następna i następna - wyjątek pojawia się tylko kiedy pojawia się wywołanie funkcji albo funkcje warunkowe lub pętle wtedy program jest przenoszony do jakiejś instrukcji
jak działa pętla?
- sprawdź warunek pętli
- wykonaj kod z wnętrza pętli
- skocz na początek pętli
jeśli nie ma nieskończonej pętli to program pogalopuje dalej i napotka instrukcje które nie mają sensu (bo tam nic nie zostało zdefiniowane)
prawdopodobnie są na to zrobione zabezpieczenia żeby mikrokontroler nie "wylazł" poza dozwolony obszar ale na pewno nie jest to "zgodne ze sztuką"...
W Twoim własnym kodzie nigdy nie może być nawet linijki która nie wiesz jak działa! chyba że musisz to tylko mieć a nie chcesz zrozumieć ani się rozwijać
W programowaniu jest bardzo fajna metoda testu własnego oprogramowania, ja znam tą metodą pod nazwą "metoda gumowej kaczuszki" czyli stawiasz na biurku gumową kaczuszkę lub jakikolwiek inny obiekt do którego będziesz się odnosił i linijka po linijce tłumaczysz jak działa Twój program - bardzo skuteczna metoda szczególnie jak projekt ma mniej niż powiedzmy 200 linii kodu

Wg. mnie najpierw zrób diodę sterowaną przyciskami np. dobrze zrozumieć rozdział 5.3 następnie zrób coś z przerwaniami czasowymi (podłącz sobie kilka diodek do procesora i przerób rozdział 5.4 używając tych diodek zamiast wyświetlaczy)
a następnie wrzuć swoje kody (szczególnie ten drugi) i pochwal się jak Ci wyszło
dopóki czegoś takiego nie zrobisz to nie ma co się porywać dalej
Taka ciekawostka nie masz nigdzie obsługi przerwania nawet w Twoim programie - także do dzieła masz minimum 100 stron do przeczytania i zrozumienia
Najbardziej kluczowe strony dla Ciebie to jest od początku rozdziału 4 do podrozdziału z makrodefinicjami włącznie. Resztę doczytaj jak najszybciej się da, ale będziesz w stanie na tej podstawie zrobić większość rzeczy
Wszystkie te rozdziały które poruszyłem są ze starego bluebooka nie wiem jak to jest w nowym ale myślę, że będziesz w stanie się połapać jeśli masz nowego
W razie pytań pisz