Ja jeszcze dodam, że wkradła ci się mała nieścisłość w tym kawałku kodu
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
Wpisujesz wartość porównania do OCR1A a potem używasz OCIE1B i TIMER1_COMPB_vect. Może to i działa ale lepiej zrobić to tak jak ma być czyli
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
Skoro jesteśmy już przy timerze to przy takim ustawieniu timera przerwanie będzie ci się wywoływać z częstotliwością 2kHz czyli co 0,5ms (8000000Hz / 256(preskaler) / 15(OCR1A) = 2kHz). Dużo jak na obsługę multipleksowania. Do czterech wyświetlaczy spokojnie wystarczy wywoływać przerwanie z częstotliwością 200Hz czyli co 5ms. Trzeba tylko troszkę zmienić ustawienia timera na takie
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
Mi osobiście byłoby szkoda tracić Timer1 na multipleksowanie i zamiast niego wybrał bym np. Timer2, który to również posiada wygodny tryb CTC.
I z takich kosmetycznych poprawek to zamiast w każdym case gasić jeden wyświetlacz można przed switch gasić wszystkie. Wtedy nie trzeba się zastanawiać, że w danym case trzeba zgasić wyświetlacz włączony w poprzednim case.
No i ten warunek
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
zmień na
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
Bo teraz to zmienna "i" przyjmuje wartości od 0 do 4 i dopiero gdy osiągnie wartość 5 to zostanie wyzerowana.