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 w 2025? 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 30 kwi 2025, o 03:36


    Strefa czasowa: UTC + 1





    Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 15 ] 
    Autor Wiadomość
    PostNapisane: 12 mar 2015, o 14:59 
    Offline
    Nowy

    Dołączył(a): 07 cze 2013
    Posty: 14
    Pomógł: 0

    Witam,

    Nie mogę sobie poradzić z komunikacją I2C z czujnikiem HTU21D. Poradziłem sobie z BMP180, ale z tym za cholerę nie mogę się skomunikować. Bardzo proszę o naprowadzenie na właściwe tory... :)

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


    Następnie w pętli głównej co sekundę próbuję, wyświetlić trzy bajty...

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



    Prędkość magistrali I2C to 100kHz.



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 12 mar 2015, o 15:26 
    Offline
    Użytkownik

    Dołączył(a): 18 kwi 2013
    Posty: 181
    Lokalizacja: Kraków
    Pomógł: 30

    No dosyć to skromnie opisałeś, ale tak na pierwszy rzut oka to widzę , że podajesz jako adres układu wartość 0x40 a według noty aplikacyjnej adresem do zapisu jest wartość 0x80 a do odczytu 0x81. Po drugie czy ustawiasz stan wysoki na linii SCK przez conajmniej 15 ms po włączeniu układu?



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 12 mar 2015, o 16:17 
    Offline
    Nowy

    Dołączył(a): 07 cze 2013
    Posty: 14
    Pomógł: 0

    Nie ustawiam stanu wysokiego przez 15ms bo przyznam się nie wiem nawet jak. Jeżeli chodzi o adres to 0x40 to nie to samo co zapis 0b10000000, a 0x40 +1 = 0b10000001 ?
    Korzystam z biblioteki Pana Mirka i poza inicjalizacją i ustawieniem prędkości magistrali I2C w programie nie ma nic ciekawego.



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 12 mar 2015, o 16:30 
    Offline
    Użytkownik
    Avatar użytkownika

    Dołączył(a): 30 gru 2012
    Posty: 188
    Lokalizacja: Świnice Warckie woj. łódzkie
    Pomógł: 12

    archivi napisał(a):
    Jeżeli chodzi o adres to 0x40 to nie to samo co zapis 0b10000000, a 0x40 +1 = 0b10000001 ?


    Jeśli chodzi o 0x40 to jest 0b1000000 (7bit) i w takim przypadku powinieneś adres podać tak
    dla zapisu
    (0x40<<1) | 0x00

    a dla odczytu
    (0x40<<1) | 0x01

    co da w efekcie dla zapisu adres 0b10000000 a dla odczytu 0b10000001

    _________________
    ATMEL-ICE+ATXmega256A3BU oraz dużo samozaparcia



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 12 mar 2015, o 17:57 
    Offline
    Użytkownik

    Dołączył(a): 01 paź 2013
    Posty: 305
    Lokalizacja: Olsztyn
    Zbananowany użytkownik

    Pomógł: 20

    WItam
    nie wiem z jakiej biblioteki Mirka korzystasz ale powinieneś wpisać adres bez bitu zapisu lub odczytu normalnie z datasheeta



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 12 mar 2015, o 18:10 
    Offline
    Nowy

    Dołączył(a): 07 cze 2013
    Posty: 14
    Pomógł: 0

    lemurek napisał(a):
    archivi napisał(a):
    Jeżeli chodzi o adres to 0x40 to nie to samo co zapis 0b10000000, a 0x40 +1 = 0b10000001 ?


    Jeśli chodzi o 0x40 to jest 0b1000000 (7bit) i w takim przypadku powinieneś adres podać tak
    dla zapisu
    (0x40<<1) | 0x00

    a dla odczytu
    (0x40<<1) | 0x01

    co da w efekcie dla zapisu adres 0b10000000 a dla odczytu 0b10000001


    Hmm, faktycznie :)

    Zgodnie z Waszymi podpowiedziami ustawiam adresy na sztywno i sekwencja pomiaru i odczytu temperatury według datasheet'u wygląda według mnie tak:

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


    Z tym, że jeszcze nie doszedłem do tego jak wystawić stan wysoki na linie SCK...



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 12 mar 2015, o 20:07 
    Offline
    Użytkownik

    Dołączył(a): 18 kwi 2013
    Posty: 181
    Lokalizacja: Kraków
    Pomógł: 30

    Stan wysoki na SCK masz w zasadzie ustawiony zaraz po włączeniu, bo po resecie wszystkie porty mikrokontrolera są ustawione jako wejścia. Masz też zapewne włączone rezystory podciągające do +Ucc dla linii magistrali I2C - czyli dla linii SCK i SDA. Zatem jest zapewniony stan wysoki na SCK. Tylko zanim zainicjujesz porty czy magistralę I2C to powinieneś po prostu umieścić jednego delay'a - _delay_ms(15);
    Popatrz jeszcze do noty pdf tego układu, ale wydaje mi się to konieczne żeby wyszedł ze stanu "sleep mode".



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 12 mar 2015, o 21:24 
    Offline
    Nowy

    Dołączył(a): 07 cze 2013
    Posty: 14
    Pomógł: 0

    W nocie pdf piszą, że zaraz po włączeniu zasilania czujnik potrzebuje najwyżej 15ms, kiedy to na linii SCK jest stan wysoki aby przejść do stanu spoczynku ( czyli tzw. sleep mode ). Ponadto piszą, że zalecany jest "Soft restart" po uruchomieniu. Przynajmniej ja to tak rozumiem.

    Zabrałem się za kod od nowa. Tym razem wklejam całość.

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


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



    Tak jak zasugerowałeś, czekam 15ms na samym początku. W dodatku dopisałem funkcję realizującą "soft restart".
    Sprawdziłem połączenie. Czujnik przepiąłem w inne miejsce stykówki, skróciłem przewody, sprawdziłem napięcie, dokładnie 3.3V.
    Dalej nic :(



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 12 mar 2015, o 21:43 
    Offline
    Użytkownik
    Avatar użytkownika

    Dołączył(a): 30 gru 2012
    Posty: 188
    Lokalizacja: Świnice Warckie woj. łódzkie
    Pomógł: 12

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


    co prawda ja to używam na xmega ale myślę iż tu też zadziała :)

    _________________
    ATMEL-ICE+ATXmega256A3BU oraz dużo samozaparcia



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 12 mar 2015, o 22:22 
    Offline
    Nowy

    Dołączył(a): 07 cze 2013
    Posty: 14
    Pomógł: 0

    Hmm spróbowałem Twój kod i nie działa. Pętla główna zawiesza się gdzieś przy komunikacji I2C i tak sobie wisi. Wygląda na to, że brak komunikacji z czujnikiem. Rezystorów nie podpinałem bo są wlutowane ( moduł HTU21D ). Jakieś pomysły ?



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 12 mar 2015, o 22:41 
    Offline
    Użytkownik
    Avatar użytkownika

    Dołączył(a): 30 gru 2012
    Posty: 188
    Lokalizacja: Świnice Warckie woj. łódzkie
    Pomógł: 12

    Może pokaż schemat jak to łączysz bo może tu jest problem...jaki procek...i jaki moduł z czujnikiem masz...
    Ja mam to odpalone na xmega z ty modułem Weather Shield i zarówno HTU21D jak i MPL3115A2 działają prawidłowo

    _________________
    ATMEL-ICE+ATXmega256A3BU oraz dużo samozaparcia



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 12 mar 2015, o 23:34 
    Offline
    Nowy

    Dołączył(a): 07 cze 2013
    Posty: 14
    Pomógł: 0

    Kurczę, wiesz co ? Okazało się, że te rezystory na PCB nie są podciągnięte do VCC. Mam możliwość aktywacji tych rezystorów poprzez zlutowanie zworki. Podciągnąłem obydwie linie do VCC 3.3V i komunikacja działa ale... :) Dostaję trzy, dokładnie trzy pomiary ( widzę jak się wartości w postaci binarnej zmieniają ) i wszystko ustaje.
    Na tak późną godzinę przychodzi mi tylko zbyt długi odcinek linii SDA i SCL ( około 6-7cm ). Chociaż z drugiej strony w przypadku BMP180 to nie miało znaczenia :)



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

    Dołączył(a): 30 gru 2012
    Posty: 188
    Lokalizacja: Świnice Warckie woj. łódzkie
    Pomógł: 12

    Jeśli chodzi o długość przewodów to jeśli są za długie to możesz spróbować zmniejszyć prędkość komunikacji aczkolwiek u mnie na przewodach 10cm działa 200kHz i odczyt co 1s ... a powiedz mi której wersji do odczytu używasz...twojej czy tej co Ci podesłałem bo one się różnią ... u ciebie jest TWI_write(0xE3); a u mnie jest TWI_write(0xF3); //(No Hold master) i dodatkowo u mnie występuje TWI_Stop dodatkowo. Poza tym po odebraniu 3 bajtów(msb, lsb i crc) musisz je przeliczyć na realną temperaturę... Ja osobiście wzorowałem się na bibliotece z arduino i działa u mnie to bezproblemowo...

    _________________
    ATMEL-ICE+ATXmega256A3BU oraz dużo samozaparcia



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 13 mar 2015, o 15:12 
    Offline
    Nowy

    Dołączył(a): 07 cze 2013
    Posty: 14
    Pomógł: 0

    Zawieszanie komunikacji I2C powodowało przerwanie od UART'a. Po prostu skopiowałem całą bibliotekę z innego projektu i nie popatrzyłem, że miałem włączone przerwanie i odbiornik UART a do pinu RX nie było nic wpięte :D

    Pięknie działa u mnie poniższy kod napisany na szybko. Temperaturę obliczam tylko w celach testów. Do obliczeń zaprzęgnę raspberry pi ponieważ całość będę wysyłał po wifi a atmega ma tylko wykonywać pomiary i je wysyłać bez marnowania czasu na obliczanie liczb zmiennoprzecinkowych.

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


    Pozostało tylko napisać sensowną bibliotekę i dopisać pomiar wilgotności :)

    Dzięki bardzo za pomoc :)



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 1 cze 2015, o 16:55 
    Offline
    Użytkownik

    Dołączył(a): 04 lut 2013
    Posty: 31
    Pomógł: 0

    Hej,
    mam szybkie pytanko, dlaczego zrobiłeś to wymnożenie i przesunięcie (zakładam że szybciej liczy)?
    ja to podzieliłem tylko przez 65536 i wyszło to samo, choć pytam głównie dlatego, że chciałem wiedzieć dokładnie co się dzieje w pamięci przy tym zapisie.

    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  
    Wyświetl posty nie starsze niż:  Sortuj wg  
    Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 15 ] 

    Strefa czasowa: UTC + 1


    Kto przegląda forum

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