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



Teraz jest 2 gru 2024, o 16:50


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 16 ] 
Autor Wiadomość
PostNapisane: 5 lut 2016, o 09:23 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 02 kwi 2015
Posty: 449
Pomógł: 3

Witam!
Mam gotową bibliotekę do obsługi czujnika wilgotności DHT22 (znaleziona w internecie), ale mam problem z jej uruchomieniem. Proszę o pomoc. Jak powinno wyglądać wywołanie funkcji dht22_init(...) oraz dht_read_tem(...) i dht_read_hum(...). Oto biblioteka:

dht22.h
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


dht22.c
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


Dziękuję i pozdrawiam



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 5 lut 2016, o 10:19 
Offline
Użytkownik

Dołączył(a): 29 mar 2012
Posty: 595
Lokalizacja: Jaworzno
Pomógł: 39

Zapytam może w taki sposób. Jak wygląda obecnie Twój plik main.c w tym projekcie?

_________________
Pozdrawiam
PP



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 5 lut 2016, o 10:23 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 02 kwi 2015
Posty: 449
Pomógł: 3

Bardzo dziękuję.
Chodzi mi jednak o sposób przekazania danych do funkcji w tej konkretnej bibliotece. Chcę zrozumieć. W strukturze dht22 zdefiniowane są dwa pola data i pin. W jaki sposób przekazać do funkcji dht22_init() informację, że czujnik podłączony jest do PD5 (jak powinien wyglądać zapis; dht_init(&dht22, 5) nie działa).
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


------------------------ [ Dodano po: 3 minutach ]

Cytuj:
Zapytam może w taki sposób. Jak wygląda obecnie Twój plik main.c w tym projekcie?

Pliku main na razie brak. Utknąłem na semantyce. Spodziewałem się definicji typu strukturalnego: typedef struct {} THUMTEMP, utworzenia zmiennej: extern THUMTEM humtem i odwołania do niej: dht_init(&humtem, 5).



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 5 lut 2016, o 10:32 
Offline
Użytkownik

Dołączył(a): 24 sty 2012
Posty: 1469
Pomógł: 56

avrfun napisał(a):
Pliku main na razie brak. Utknąłem na semantyce. Spodziewałem się definicji typu strukturalnego: typedef struct {} THUMTEMP, utworzenia zmiennej: extern THUMTEM humtem i odwołania do niej: dht_init(&humtem, 5).

W pliku .h masz deklarację typu dht22. Linijki 26-28
teraz musisz sobie zdefiniować zmienną takiego typu i powinno zadziałać.
A Ty jak zrobiłeś?

_________________
Jestem początkujący i moje porady mogą być błędne



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 5 lut 2016, o 10:45 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 02 kwi 2015
Posty: 449
Pomógł: 3

MirkoT napisał(a):
W pliku .h masz deklarację typu dht22. Linijki 26-28
teraz musisz sobie zdefiniować zmienną takiego typu i powinno zadziałać.
A Ty jak zrobiłeś?

Zrobiłem tak, ale musiałem typ strukturalny zdefiniować po swojemu. Nie wiem czy dobrze, ale kompilator to przyjmuje:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


main.c
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


Jak to zapisać nie ruszając biblioteki?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 5 lut 2016, o 10:56 
Offline
Użytkownik

Dołączył(a): 24 sty 2012
Posty: 1469
Pomógł: 56

A tak się nie da

Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

_________________
Jestem początkujący i moje porady mogą być błędne



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 5 lut 2016, o 11:09 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 02 kwi 2015
Posty: 449
Pomógł: 3

avrfun napisał(a):
Zrobiłem tak, ale musiałem typ strukturalny zdefiniować po swojemu. Nie wiem czy dobrze, ale kompilator to przyjmuje:
Składnia: [ Pobierz ] [ Ukryj ]
język c
typedef struct dht22 {
uint8_t data[6];    /* data from sensor store here */
uint8_t pin;        /* DDR & PORT pin */
}TDHT22;
 
extern TDHT22 dht22;
GeSHi


main.c
Składnia: [ Pobierz ] [ Ukryj ]
język c
dht_init(&dht22,5);
GeSHi


Jak to zapisać nie ruszając biblioteki?


Poradziłem sobie w ten sposób i działa :D
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 5 lut 2016, o 12:18 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 02 kwi 2015
Posty: 449
Pomógł: 3

Mam pytanie. Z jakich przerwań korzysta biblioteka do obsługi DHT22? W pliku dht22.c (linia 89) jest tajemnicza linijka zgody na przerwania, ale nigdzie nie widać ciała tych przerwań.

W niezrozumiały sposób odczyt z czujnika interferuje z przerwaniem od TIMER2, w którym multipleksuję wyświetlacz LED. Wygląda to tak, że występuje mrugnięcie wyświetlacza LED za każdym wywołaniem funkcji odczytującej dane z czujnika DHT22. Na podglądzie z analizatora stanów logicznych widać to "mrugnięcie":

Obrazek

Obrazek



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 5 lut 2016, o 12:42 
Offline
Użytkownik

Dołączył(a): 24 sty 2012
Posty: 1469
Pomógł: 56

Jest tam ponieważ w linii 52 przerwania są wyłączane.
A widocznie ważne są zależności czasowe i żeby przerwanie nie zakłócało
wykonania funkcji są najpierw wyłączane a potem z powrotem włączane.
Jeśli w swoim programie nie korzystasz z przerwań możesz je obie zakomentować.

_________________
Jestem początkujący i moje porady mogą być błędne



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 5 lut 2016, o 12:46 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 02 kwi 2015
Posty: 449
Pomógł: 3

MirkoT napisał(a):
Jest tam ponieważ w linii 52 przerwania są wyłączane.
A widocznie ważne są zależności czasowe i żeby przerwanie nie zakłócało
wykonania funkcji są najpierw wyłączane a potem z powrotem włączane.
Jeśli w swoim programie nie korzystasz z przerwań możesz je obie zakomentować.


Dzięki teraz to widzę. Uzupełniłem post powyżej. Korzystam z przerwań m.in. do multipleksowania LED (ISR(TIMER2_COMP_vect)). Czy można jakoś obejść to wyłączanie przerwań?
Może da się jakoś zakamuflować to mrugnięcie?
Stwierdziłem doświadczalnie, że bez wyłączania przerwań odczyt działa przy multipleksowaniu do 100Hz (to za mało na 6 lamp VFD). W jaki sposób można zmodyfikować ten krytyczny fragment biblioteki pomiędzy cli(), a sei()?

Przepraszam za lawinę pytań. Mam wybór: dobre multipleksowanie lub obsługa DHT22. Nie umiem tego pogodzić.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 5 lut 2016, o 15:26 
Offline
Użytkownik

Dołączył(a): 24 sty 2012
Posty: 1469
Pomógł: 56

Zobacz jak to jest robione w bibliotece do DS18x20

_________________
Jestem początkujący i moje porady mogą być błędne



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 5 lut 2016, o 16:55 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 02 kwi 2015
Posty: 449
Pomógł: 3

MirkoT napisał(a):
Zobacz jak to jest robione w bibliotece do DS18x20


Dziękuję. Sprawdzę ten trop :D



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 25 mar 2016, o 23:57 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 17 lut 2013
Posty: 158
Lokalizacja: KTT
Pomógł: 1

Witam kolegów.
Jeśli pozwolicie przyłączę się do tematu, bo ostatnio wszedłem w posiadanie tego czujnika i trafiłem na ten temat na forum. Udało mi się go uruchomić na tej bibliotece i fajnie działa. Nie zmieniałem nic w bibliotece (ustawiłem tylko port na C) Tak na szybko skleciłem taki kod w main.c:

DHT22 podłączony do pinu PC1 (Mega32)
Program wyświetla na LCD tylko całkowite części temperatury i wilgotności - w wolnej chwili pobawię się w ułamki

main.c
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


Może komuś się przyda.
Pozdrawiam

_________________
Gordon



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 26 mar 2016, o 09:09 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 02 kwi 2015
Posty: 449
Pomógł: 3

gordon10 napisał(a):
Jeśli pozwolicie przyłączę się do tematu, bo ostatnio wszedłem w posiadanie tego czujnika i trafiłem na ten temat na forum. Udało mi się go uruchomić na tej bibliotece i fajnie działa. Nie zmieniałem nic w bibliotece (ustawiłem tylko port na C)


Witam.
Odczyt temperatury i wilgotności działa prawidłowo, ale jest pewna niedogodność. W czasie obsługi czujnika w tej bibliotece, "na krótko" wyłączane są przerwania. Gdy do wyświetlania danych zastosujesz wyświetlacz multipleksowany (7-seg LED) to od pewnej częstotliwości (akceptowanej dla mojego oka tzn. 4 * >50Hz na cyfrę, czyli >200Hz ) zaobserwujesz jego "dławienie się" (krótki, ale wyraźny brak wyświetlania). Przy niższych częstotliwościach multipleksowania tego efektu nie ma, ale jest ona zbyt mała dla komfortowego patrzenia na wyświetlacz.
Pozdrawiam



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 26 mar 2016, o 10:45 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 17 lut 2013
Posty: 158
Lokalizacja: KTT
Pomógł: 1

avrfun napisał(a):
jest pewna niedogodność. W czasie obsługi czujnika w tej bibliotece, "na krótko" wyłączane są przerwania.
No racja. To chyba głównie te dalay-e po wyłączeniu przerwań dają takie efekty.

_________________
Gordon



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 26 mar 2016, o 10:52 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 02 kwi 2015
Posty: 449
Pomógł: 3

gordon10 napisał(a):
No racja. To chyba głównie te dalay-e po wyłączeniu przerwań dają takie efekty.


Multipleksowanie odbywa się w przerwaniu od timera. Wyłączasz przerwanie cli() (np. do obsługi DHT22) - multipleksowania brak, włączasz je ponownie sei () - multipleksowanie jest. To przełączenie widać jako przerwę (mrugnięcie) wyświetlanej wartości. Tu nie chodzi o delay ;) Ty nie używasz przerwań więc wszystko jest ok.

Pozdrawiam



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: 16 ] 

Strefa czasowa: UTC + 1


Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zidentyfikowanych użytkowników i 2 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