W książce w rozdziale związanym z multipleksowaniem wyświetlaczy LED dokładnie opisuję i to praktycznie dokładnie takie samo maskowanie
![Puszcza oko ;)](https://forum.atnel.pl/images/smilies/icon_e_wink.gif)
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
nie będę więc teraz tutaj tego tak dokładnie opisywał ale spróbuj popatrzeć na to tak:
1. musisz do rejestru wpisać kolejny numer kanału, ty robisz to co chwilę za pomocą linii typu:
Kod:
ADMUX = 0b11100010;
nadpisując bity REFS1, REFS2 i ADLAR - a po co ??? gdyby nagle przyszło ci zmodyfikować działanie ADC to musiałbyś poprawiać TYLE linii, a można tych bitów przecież w ogóle nie "DOTYKAĆ", dlatego najpierw popatrz na to
Kod:
(ADMUX & 0xF8)
co tu robimy - maskujemy wszystkie bity poza 3 najmłodszymi które zerujemy (to w nich ustala się numer kanału tak?)
![Puszcza oko ;)](https://forum.atnel.pl/images/smilies/icon_e_wink.gif)
, potem druga część:
Kod:
(mux & 0x07)
tu z kolei robimy odwrotną maskę, zerujemy wszystkie bity poza trzema pierwszymi z numerem kanału
i teraz robimy operację OR pomiędzy tymi wyrażeniami, dzięki czemu
1. NIE ZMIENIAMY ustawień REFS1, REFS0 i ADLAR
2. wpisujemy TYLKO nowy kanał
i całość do ADMUX
![Puszcza oko ;)](https://forum.atnel.pl/images/smilies/icon_e_wink.gif)
------------------
ADEN panie kochany nie służy do wyzwalania TYLKO załącza cały ADC, robi się to RAZ w inicjalizacji więc nie wiem o czym mówisz, chyba że masz na myśli bit:
oczywiście jeśli nie ustawiłeś w inicjalizacji bitu
Bit 5 – ADATE: ADC Auto Trigger Enableto naturalnie musiałbyś na koniec każdego przerwania inicjalizować pomiar bitem ADSC. Ale jeśli ten bit ustawisz w inicjalizacji to ustawiasz ADC w tryb Free Running Mode, dzięki czemu pomiary odbywają się automatycznie raz za razem a wystarczy TYLKO raz zainicjalizować przy starcie bitem ADSC
możesz więc albo w ostatniej linii przerwania dodać
Kod:
ADCSRA |= (1<<ADSC);
ale po co ? lepiej w inicjalizacji ustaw ten bit
Kod:
ADCSRA |= (1<<ADATE);
------------------------ [ Dodano po: 4 minutach ]Ale jeśli jeszcze nawet po doczytaniu w książce o tym maskowaniu nie zaskoczysz to śmiało pytaj dalej - ZDECYDOWANIE WARTO to zrozumieć - bo będzie CIĄGLE przydatne w milionach sytuacji podczas pisania programów.
z tym, że ja widzę, że nie do końca nauczyłeś się działania operatorów bitowych a szczególnie przesunięć. Wnioskuję to po twoim usilnym deklarowaniu kocich makr rodem ze starszych wersji GCC, które zostały wycofane gdyż wygląda kod jakby ktoś pisał w asemblerze. Zamiast więc pisać
Kod:
sbi(ADCSRA,ADIE);
ZDECYDOWANIE polecam ci zapomnieć o tych kocich makrach i przyzwyczaić się do
Kod:
ADCSRA |= (1<<ADIE);
poczytaj na forum, każdy na początku miał z tym może trudności ale spróbuj po czasie zobaczyć i dopytać - większość przechodzi na jasną stronę mocy czyli poprawny zapis w czystym C