Kanał - ATNEL tech-forum
Wszystkie działy
Najnowsze wątki



Teraz jest 25 kwi 2024, o 17:08


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 5 ] 
Autor Wiadomość
PostNapisane: 9 lip 2012, o 02:59 
Offline
Nowy
Avatar użytkownika

Dołączył(a): 08 lip 2012
Posty: 13
Lokalizacja: Norwich
Pomógł: 0

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?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 9 lip 2012, o 08:41 
Offline
Moderator
Avatar użytkownika

Dołączył(a): 03 paź 2011
Posty: 27225
Lokalizacja: Szczecin
Pomógł: 1041

ADCW - jak działa ? to już wiele razy było poruszone na forum ;) .... odczytuje TYLKO i wyłącznie te dwa rejestry naraz. Jak ??? a zainstaluj sobie Eclipse - podjedź mychą na nazwę ADCW, wciśnij lewy klawisz CTRL i kliknij lewy klawisz mychy. Toż Eclipse cię od razu przeniesie do odpowiedniego pliku nagłówkowego gdzie zobaczysz definicję tego makra. To jedno

a drugie to źle robisz te własne przesunięcia (bo przesuwasz jeden rejestr a drugi jeszcze sumujesz) i co więcej po co ty je w ogóle robisz ? Przecież od tego jest bit ADALR w rejestrze ADMUX - zajrzyj do noty ;) zobacz że dzięki niemu te przesunięcie procek może robić dla ciebie sprzętowo jeśli chcesz odczytywać wynik tylko w postaci 8 bitowej

więc nie kombinuj z własnym przesuwaniem

_________________
zapraszam na blog: http://www.mirekk36.blogspot.com (mój nick Skype: mirekk36 ) [ obejrzyj Kurs EAGLE ] [ mój kanał YT TV www.youtube.com/mirekk36 ]



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 9 lip 2012, o 11:54 
Offline
Nowy
Avatar użytkownika

Dołączył(a): 08 lip 2012
Posty: 13
Lokalizacja: Norwich
Pomógł: 0

Ja za Twoja poradą z książki właśnie korzystam z Eclipse i jestem wdzięczny, bo to bardzo dobre narzędzie. Niestety po najechaniu na ADCW z CTRL i kliknięcie LKM nic nie otwiera.
Piszesz abym odczytał wynik w postaci 8-bitowej. ADLAR na 1 i odczytać ADCH. To działa, tu nie mam problemów. Mnie chodzi o odczyt w postaci 10-bitowej, ale nie wykorzystując ADCW, bo jak sam często piszesz, abyśmy zaglądali do not katalogowych, a tam nie ma ADCW. Dlatego ja chciałem odczytać ADCH i ADCL, na tym polega nauka. Nie ślepo przepisywać kod a próbować coś samemu, więc próbuję.
Jak już wspominałem po zastąpieniu
Kod:
wynik=ADCW;
kodem
Kod:
   wynik = ADCH;            
   wynik = (wynik << 8) | ADCL;
który powinien działać, gdyż jak ja to rozumiem. Odczytuję wartość 8-bitową ADCH i zapisuję ją do komórki 16-bitowej. Następnie przesuwam o 8 miejsc aby znalazła się w części starszych 8-miu bitów i dodaję kolejną wartość 8-bitową ADCL. W rezultacie powinienem uzyskać to samo co odczytując ADCW. Czy tak? Owszem i tak jest, ale po zapętleniu pomiaru napięcia używając ADCW wartość wyświetlana zmienia się wraz z wartością na Pr-ku a odczytując ADCH i ADCL wartość wyświetlana jest zawsze pierwsza po resecie (pierwsza odczytana) i nie zmienia się jak zmieniam położenie Pr-ka. Wygląda jakby wartości ADCH i ADCW były zatrzaśnięte w tych komórkach i trzeba ty je jakoś odblokować aby mogły się zmienić przy kolejnym pomiarze. A ADCW robi to automatycznie.

------------------------ [ Dodano po: 26 minutach ]

Już dobrze, olśniło mnie a raczej doczytałem kilka linijek. Najpierw należy odczytać ADCL a następnie ADCH, nie odwrotnie jak ja to robiłem.
"When ADCL is read, the ADC Data Register is not updated until ADCH is read. Conse-quently, if the result is left adjusted and no more than 8-bit precision is required, it is
sufficient to read ADCH. Otherwise, ADCL must be read first, then ADCH."

Należy czytać dane katalogowe, ale należy czytać ze zrozumieniem i/lub dokładnie.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 9 lip 2012, o 12:55 
Offline
Moderator
Avatar użytkownika

Dołączył(a): 03 paź 2011
Posty: 27225
Lokalizacja: Szczecin
Pomógł: 1041

Oczywiście rozumiem twoje podejście i że chciałeś się dowiedzieć - ale O! proszę już doszedłeś o co chodzi ;) Super ...

jak coś jeszcze będzie niejasne to jestem do dyspozycji

_________________
zapraszam na blog: http://www.mirekk36.blogspot.com (mój nick Skype: mirekk36 ) [ obejrzyj Kurs EAGLE ] [ mój kanał YT TV www.youtube.com/mirekk36 ]



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 9 lip 2012, o 13:59 
Offline
Nowy
Avatar użytkownika

Dołączył(a): 08 lip 2012
Posty: 13
Lokalizacja: Norwich
Pomógł: 0

Spójrz tylko do której wczoraj siedziałem i męczyłem się z "problemem". Akurat mam trochę wolnego więc mogę się w spokoju pouczyć, a tu prosta rzecz, która nie wiadomo dlaczego a nie chciała zatrybić. Rano też nic, dopiero na spokojnie, po śniadanku, kolejny wgląd do datasheet-u olśnił mój umysł.
Dobra, plan na dziś to różnicowy pomiar napięcia i spróbować podpiąć płytkę z akcelerometrem ADXL202. Książka w rękę i do dzieła.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
Wyświetl posty nie starsze niż:  Sortuj wg  
Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 5 ] 

Strefa czasowa: UTC + 1


Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zidentyfikowanych użytkowników i 6 gości


Nie możesz rozpoczynać nowych wątków
Nie możesz odpowiadać w wątkach
Nie możesz edytować swoich postów
Nie możesz usuwać swoich postów
Nie możesz dodawać załączników

Szukaj:
Skocz do:  
Sitemap
Technologię dostarcza phpBB® Forum Software © phpBB Group phpBB3.PL
phpBB SEO