Mam pytanie odnośnie pomiaru napięcia w m32 i ADCW. Znalazłem na forum, że to specjale makro przygotowane właśnie przez AVR GCC na tą okazję (odczyt wyniku pomiaru napięcia).
Bo najpierw szukałem w PDF-ie i kicha, skąd to się wzięło i dlaczego to w ogóle działa? To była zagadka. Ale do tematu, mam w pętli pomiar napięcia i wyświetlenie na wyświetlaczu bezpośredniej wartości z rejestrów. Kod poniżej działa wyśmienicie
Kod:
ADMUX |= (ADMUX & 0xF8) | nr_we;
ADCSRA |= (1<<ADSC); //wywołanie żądania pomiaru napięcia
while (ADCSRA & (1<<ADSC)); //oczekiwanie na zakończenie pomiaru
wynik = ADCW; //odczyt wyniku pomiaru
Po przestawieniu PR-ka wyświetlana jest nowa zawartość "wynik". Ale ja z przekory chciałem sam odczytać rejesrty ADCH i ADCL i tu zaczęły się schody. Kod
Kod:
ADMUX |= (ADMUX & 0xF8) | nr_wej;
ADCSRA |= (1<<ADSC); //wywołanie żądania pomiaru napięcia
while (ADCSRA & (1<<ADSC)); //oczekiwanie na zakończenie pomiaru
wynik = ADCH; //zapis bajtu ADCH do wynik
wynik = (wynik<<8) | ADCL;
powoduje poprawny odczyt za pierwszym razem i ... tyle. Zmiana napięcia mierzonego nie powoduje zmiany wyświetlanej wartości. Nawet robiąc to "na piechotę"
Kod:
ADMUX |= (ADMUX & 0xF8) | nr_wej;
ADCSRA |= (1<<ADSC); //wywołanie żądania pomiaru napięcia
while (ADCSRA & (1<<ADSC)); //oczekiwanie na zakończenie pomiaru
d = ADCH; //zapis bajtu ADCH do wynik
wynik = (d << 8);
wynik = wynik|ADCL;
niczego nie zmienia.
Czy ADCW robi coś więcej niż tylko odczyt rejestrów ADCH i ADCL? Może należy ponownie coś wywołać, coś zresetować ręcznie, przestawić jakiś bit odczytując ADCH i ADCL, co makro ADCW robi automatycznie?