Wirtam.
Po przejrzeniu kodu kilka rzeczy rzuciło mi się w oczy.
W przerwaniu timera zmienne number i SumADCH to zmienne lokalne, które na początku każdego przerwania będą miały wartość zero.
Warunek
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
się spełni bo number==0. Program przypisze wartość ADCH do SumADCH i zwiększy wartość number o jeden. Ale w następnym przerwaniu zmienne number i SumADCH znów będą miały wartość zero. Kod po else nigdy się nie wykona. A tym samym zmienna flag nigdy nie przyjmie wartości równej jeden i cały kod w pętli while w warunku if(flag) się nie wykona. Dlatego diody się nie świecą.
Zmienne number i SumADCH powinny być statyczne. Wtedy będą widoczne tylko w przerwaniu ale zachowają swoje wartości po wyjściu z przerwania. Tak jak zmienne globalne.
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
Jeśli chcesz mierzyć napięcie na kilku kanałach to lepiej na początek zrezygnuj z trybu Free Running i zastosuj najzwyklejszy tryb z ręcznym wyzwalaniem pomiaru. W trybie Free Running przełączanie kanałów jest troszkę bardziej skomplikowane.
Wybór kanałów też masz błędny.
Jeśli zmienna input będzie miała wartość np. 2 to tą linią kodu
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
wybierzesz kanał ADC4 a nie ADC2.
Kanał ADC2 to takie ustawienie rejestru ADMUX 0b00000010. A ta linia ustawi trzeci bit w ADMUX czyli 0b00000100. A to jest kanał ADC4.
Jeśli zmienna input przyjmuje wartości 1, 2 i 3 to zamiast kanałów ADC1 (0b00000001), ADC2 (0b00000010) i ADC3 (0b00000011) wybierasz ADC2 (0b00000010), ADC4 (0b00000100) i pomiar różnicowy na ADC0 i ADC0 (0b00001000).
Wybór kanału powinie wyglądać tak, bez przesunięcia bitowego
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
Teraz jeśli input będzie równe 2 to rejestr ADMUX zostanie ustawiony tak 0b00000010. Oczywiście w tym przykładzie pominąłem ustawienie trzech starszych bitów.