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

KURS HOME ASSISTANT

Chcesz zautomatyzować swój dom bez skomplikowanego kodowania?
Zastanawiasz się nad wyborem sprzętu, oprogramowania i aplikacji?
Od czego zacząć przygodę z HA? Co będzie najlepsze na start?

Nasz kurs Home Assistant nauczy Cię krok po kroku, jak łatwo zautomatyzować swój dom i oszczędzić na rachunkach za prąd i ogrzewanie. Bez chmur, bez zbędnych abonamentów. Twoja przygoda z Home Assistant zaczyna się tutaj!

↓↓↓

    Szanujemy Twoją prywatność. Możesz wypisać się w dowolnym momencie.




    Teraz jest 4 cze 2025, o 03:02


    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: 27406
    Lokalizacja: Szczecin
    Pomógł: 1043

    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: 27406
    Lokalizacja: Szczecin
    Pomógł: 1043

    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 26 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:  
    cron
    Sitemap
    Technologię dostarcza phpBB® Forum Software © phpBB Group phpBB3.PL
    phpBB SEO