amilo_pa napisał(a):
Czyli polega to na tym, że w momencie porównania if(!chimney.LED_timer) nie może wystąpić przerwanie od Timera2
Dokładnie o to chodzi, jednak nie tylko w momencie porównania, ale także w trakcie przypisania wartości
chimney.LED_timer=chimney.timer_set;.
Oczywiście ta zasada nie dotyczy tylko tego konkretnego przypadku. Zawsze kiedy zmienna składająca się z więcej niż jednego bajtu (w mikrokontrolerach 8-bitowych) jest używana zarówno w przerwaniu, jak i w głównej pętli programu należy zapewnić do niej atomowy dostęp. Nie trzeba tego robić wewnątrz procedury obsługi przerwania, ponieważ wtedy globalna flaga zezwalająca na przerwania jest wyłączona, chyba że programista ją sam świadomie włączy, ale to już inna historia

Niestety nie mam czasu na szczegółową analizę całego kodu. Zakładam, że skoro działa poprawnie to znaczy, że jest OK. Wydaje mi się, że czasami może niepotrzebnie komplikujesz pewne sprawy, ale to się na pewno zmieni, jak zdobędziesz praktykę

Podam jeden przykład. Nie chodzi o to, że to błąd, chodzi tylko o poprawę czytelności (i być może szybkości wykonania).
Mógłbyś w strukturze TLED_RGB zamiast indeksu funkcji użyć wskaźnika do niej. Wprawdzie spowodowałoby to zwiększenie rozmiaru struktury o 1 bajt (nie masz przecież tych zmiennych dużo), jednak wywołanie odpowiedniej funkcji:
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
W tej chwili masz tylko dwie funkcje do wyboru, ale jak wyglądałoby Twoje wywołanie, gdyby ich było np. 10?
No ale tak jak napisałem, z czasem na pewno do tego dojdziesz
