matiase napisał(a):
dioda w ogóle nie zmienia swojej jasności. I nie rozumiem dlaczego.
Jeśli ustawisz bit ADATE w rejestrze ADCSRA z wyzerowanymi bitami ADTS2:0, ADC pracuje w trybie Free Runnig.
W tej sytuacji konwersję startujesz tylko raz ustawiając bit ADSC w rejestrze ADCSRA (np. w Twoim przypadku przed pętlą
while(1)). Nie sprawdzasz później zakończenia konwersji poprzez sprawdzenie bitu ADSC:
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
ponieważ jest on cały czas w stanie wysokim i program Ci się w tym miejscu zapętli. Rejestr ADC jest aktualizowany na bieżąco automatycznie, wystarczy go po prostu odczytywać.
Jak już wspomniał kolega
kicajek nie kombinuj z konstrukcjami typu:
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
i nie chodzi tu tylko o estetykę kodu.
Rejestr ADC jest rejestrem dwubajtowym i jest bardzo istotne, aby jego bajty były odczytywane w odpowiedniej kolejności (poczytaj w datasheet o
Accessing 16-bit Registers). Taki odczyt, jak zrobiłeś, może spowodować, że kompilator odczyta najpierw rejestr ADCH, a powinien odczytać ADCL. W drugim przypadku nie będzie miał takich wątpliwości.
Zamiast trybu Free Running zalecałbym startowanie konwersji w równych odstępach czasowych za pomocą jakiegoś timera.
Nie zaszkodziło by też zastosowanie jakiegoś uśredniania wartości odczytywanych z ADC, bo na granicach zakresów możesz uzyskać "mrużenie" diod.