Operujesz w pętli głównej, czy wykorzystywanej tam bibliotece, na zasobie PORTD (L_RGB_PORT). Odbywa się to w cytowanym ostatnio case (tego którego zahashowanie naprawia wyświetlanie segmentu G). Robisz tam dwukrotnie odczytanie wartości portu, dokonanie manipulacji na tej wartości i ponowny zapis.
A w przerwaniu timera TIMER0_OVF robisz podobne operacje na porcie D - dokujesz zmian stanu pinów.
Co się według Ciebie stanie jak we wspominanym case nastąpiło już odczytanie PORTD i w tym momencie wystąpiło przerwanie TIMER0_OVF? Przerwanie ustawi sobie nowy stan dla pinów w PORTD (oczywiście zmieni tylko pin dla segmentu G). Ale po zakończeniu przerwania wrócisz do swojego case i tam masz dalsze operacje na odczytanej przed przerwaniem wartości PORTD. Więc po tej operacji nastąpi zapis do portu i .... bity które zostały zmienione w czasie przerwaniu zostaną odtworzone ze stanu przed przerwaniem.
Dlatego w takich wypadkach używa się sekcji ATOMIC_BLOCK, która uniemożliwia przerwanie wykonywania danego bloku.
Zrób w problematycznym case takie coś:
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
}
Tylko musisz jeszcze dodać jednego include do tego pliku:
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
--
Pozdrawiam,
Robert