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



Teraz jest 18 gru 2024, o 10:12


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 ]
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 ]
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 ]
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 0 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