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



Teraz jest 28 mar 2024, o 23:16


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 13 ] 
Autor Wiadomość
PostNapisane: 5 sty 2017, o 08:20 
Offline
Użytkownik

Dołączył(a): 08 wrz 2012
Posty: 505
Pomógł: 6

Usiłuję dogadać się z czujnikiem MPL3115A2. Niestety problem mam chyba już na etapie samej komunikacji I2C. W swoich bojach wykorzystuję (a przynamniej próbuję) bibliotekę z BB do komunikacji I2C, ale może po kolei.
Sprzętowo mam wszystko ok. sprawdziłem programem z Arduino. Czujnik ładnie dogaduje się z procesorem wysyłając na terminal ciśnienie, wysokość oraz temperaturę.
Chciałem, wzorem Mirka poradników oprzeć się na bibliotece z wspomnianego wyżej Arduino, ale w pewnym momencie odniosłem wrażenie, że czytam Dziennik Ustaw. W pliku z funkcjami do obsługi MPL3115A2 jest załączony plik obsługi I2C. Z kolei w pliku I2C dołączony jest kolejny z kolejnymi funkcjami a następnie kolejny itd. Z Arduino jestem kompletnie zielony, i po wyrwaniu połowy włosów odpuściłem ten kierunek.
Ponownie zacząłem studiować dokumentację do samego czujnika MPL31115A2. Po kilkunastu godzinach przyzwyczajania się do treści wydawało mi się, że coś zaczynam rozumieć. Więc zbudowałem prosty main wzorem grafu z dokumentacji, no i klapa.
Stosując „debag” diodą led doszedłem do wniosku, że problem leży już na etapie wysyłania komunikatów na szynę I2C.
Proszę o podpowiedź, o co chodzi w poniższej funkcji?
Co to jest „IICC_MST = 1;” i to „IICS_BUSY” i po co jest „error |= 0x01;”
Rozumiem, że „IICC_MST = 1;” to przypisanie zmiennej IICC_MST wartości 1, ale po co? Chyba mi czegoś brakuje, w/w zmienne są chyba globalnymi zmiennymi.

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


Powyższy kod jest z pdf-a AN4481, obsługa czujnika MPL3115A2 jest z AN4519 obydwa pdf-y w załączniku.
Chyba się zapętliłem w swoich rozważaniach, proszę o podpowiedź. Od trzech dni siedzę nad tematem i nie drgnąłem z miejsca.


Załączniki:

Aby zobaczyć załączniki musisz się zalogować. Tylko zalogowani użytkownicy mogą oglądać i pobierać załączniki.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 5 sty 2017, o 09:25 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 14 lut 2014
Posty: 279
Lokalizacja: Kraków
Pomógł: 4

Witaj!
Najpierw na spokojnie przestudiuj sobie pdf'a (Zwłaszcza "fig. 7" i "fig. 8" ). Tam masz krok po kroku objaśnione jak wygląda komunikacja z czujnikiem.
Zapoznaj się również z (bo warto!) z obsługą błędów - w skrócie pewne flagi są zgłaszane w odpowiednim rejestrze uC-ka. Tutaj niestety trzeba bardziej w internecie poszperać bo w nocie AVRów nie wszystko opisano, a szkoda (przynajmniej w tych co sprawdzałem :P)
Biblioteki z BB są bardzo OK. Co prawda można, a nawet polecam je troszkę podrasować pod obsługę konkretnego SLAVE'a ;)
W wyżej opisany sposób napisałem kiedyś własną procedurę do obsługi HTU21D - chciałem napisać kod który rozumiem i przy okazji się wiele nauczyłem. Zajęło mi to niewiele czasu, a diabeł okazał się nie taki straszny jak na początku się zdawało ;)

_________________
http://forum.atnel.pl/topic15633.html



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 5 sty 2017, o 09:59 
Offline
Użytkownik

Dołączył(a): 02 gru 2015
Posty: 544
Pomógł: 27

W pdf an4481 masz pokazane na stronie 5 jak powinna być zbudowana ramka danych do odzczytu .
Ja bym spróbował tak zbudować funkcję z wykorzystaniem biblioteki z BB.
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

gdzie SLA - adres czujnika
adr - adres rejestru
len - ile rejestwów do odczytu
*buf wskaźnik na bufor gdzie mają się zapisać dane musisz zrobić sobie bufor na dane 32bitowy ponieważ dane z czujników są 20 bitowe.
czyli do odczytu ciśnienia będziesz musiał odczytać 3 bajty i je poskładać i masz odczyt ciśnienia.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 5 sty 2017, o 12:08 
Offline
Użytkownik

Dołączył(a): 08 wrz 2012
Posty: 505
Pomógł: 6

Funkcje z BB są dla mnie zrozumiałe, z powodzeniem wykorzystuje je (delikatnie przerobione)do komunikacji z PCF8563. Niestety nie mogę z ich pomocą nawiązać komunikacji z MPL3115A2. Dlatego zacząłem kombinować z funkcjami z pdf-a (te które wkleiłem w pierwszym poście). W pdf-ie faktycznie mam ładnie rozpisane co i jak powinno być w komunikacji z czujnikiem, ale na razie mam chyba problem z samą funkcją wysyłającą pojedynczy bajt do czujnika. Tego nie mogę zrozumieć co tu jest nie tak. Sprawdzałem stosując debug z diodą led ale już po wysłaniu pierwszych komend
Kod:
TWI_start ();

do czujnika program mi się zawiesza.
Chyba tu jest coś nie tak, nie rozumiem tego co jest?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 5 sty 2017, o 17:25 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 31 gru 2014
Posty: 88
Pomógł: 2

Jestem początkującym i moje sugestie mogą Cię wprowadzić w maliny, jeżeli to pomoże zrobiłbym tak. Spróbował bym nawiązać podstawową komunikację :
- sekwencja (sygnatura) startu TWI_start();
- następnie komunikacja z układem slave czyli funkcja TWI_write(adr) adres + bit kierunku transmisji 0 write , w tym miejscu przebuduj program w taki sposób by sprawdzić czy slave nadaje 9 bit ACK, (np dioda) jeżeli 9 bit jest ACK to znaczy, że podstawowa komunikacja jest OK slave odpowiada na adres, następnie zmień adres układu slave w funkcji write na inny (nieprawidłowy) dioda nie powinna się palić (zły adres slave) zrób to po to by uzyskać większą pewność.
- na koniec sekwencja (sygnatura) stop.

Jeżeli Cię to interesuje mogę (możemy ?) to rozwijać dalej ale nie mam pewności czy to właściwa droga i jeszcze jedno wydaje mi się, że łatwiej powyższe zrobić wykorzystując programową implementację I2C, pisałem w uproszczeniu posługując się terminologią ze sprzętowej obsługi.
Inne sugestie to jakie rezystory podciągające zastosowałeś w I2C, jaką częstotliwość ustawiłeś na ICL



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 5 sty 2017, o 18:40 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 14 lut 2014
Posty: 279
Lokalizacja: Kraków
Pomógł: 4

Ja polecam zrobić sobie prostą komunikację uart z terminalem na pc i po każdym kroku komunikowania się z czujnikiem (TWI_start.... TWI_write...) wysyłać do terminala zawartość rejestru TWSR.
TO SPRAWDZONY PRZEZE MNIE SPOSÓB i skuteczny ;) w tym przypadku powie nam dużo więcej niż dioda.
A i jeszcze taki cukierasek od lisełka
Lista statusów komunikacji

_________________
http://forum.atnel.pl/topic15633.html



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 5 sty 2017, o 18:54 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 31 gru 2014
Posty: 88
Pomógł: 2

No "panie kolego" pięknie i wisienka całkiem całkiem dzięki jak dla mnie pomógł.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 6 sty 2017, o 13:19 
Offline
Użytkownik

Dołączył(a): 08 wrz 2012
Posty: 505
Pomógł: 6

Dziękuję za zainteresowanie. Na razie nie udało mi się jeszcze nic osiągnąć w temacie, jak ruszę z miejsca dam znać. Dzięki jeszcze raz.
Pozdrawiam



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 6 sty 2017, o 17:53 
Offline
Użytkownik

Dołączył(a): 08 wrz 2012
Posty: 505
Pomógł: 6

To teraz mam głupie pytanie, wychodzi brak systematycznego układania wiedzy w głowie :oops:
Skoro mam temperaturę podaną z rozdzielczością 12 bitową to co to znaczy? Jak z tego wyłuskać wartość dziesiętna temperatury. Wartość temperatury zmierzona przez czujnik zapisana jest do dwóch rejestrów: Temperature Data Out MSB starcza część oraz Temperature Data Out LSB młodsza część. Są to dwa ośmio bitowe rejestry gdzie młodszy zapełniony jest tylko czterema starszymi bitami. W sumie tworzą wartość 12 bitową.
W przypadku "zwykłego" ADC w mikrokontrolerze gdy mam rozdzielczość np 10 bitową to znaczy, że napięcie referencyjne dzielę przez 1024 i mam prostą informację ile jeden bit to jest V-tów. Jak to jest w omawianym czujniku MPL3115A2? Nie wiem jak to wyłuskać. W AN4519 są funkcje konwersji tyle, że znowu jest coś (nic nie jest jasne)niejasne w tych funkcjach.
Poniżej funkcja konwertująca, pochodzi z AN4519 (umieściłem w pierwszym poście) str.15

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: 7 sty 2017, o 01:07 
Offline
Użytkownik

Dołączył(a): 20 kwi 2014
Posty: 51
Zbananowany użytkownik

Pomógł: 3

Tom277 napisał(a):
Funkcje z BB są dla mnie zrozumiałe, z powodzeniem wykorzystuje je (delikatnie przerobione)do komunikacji z PCF8563. Niestety nie mogę z ich pomocą nawiązać komunikacji z MPL3115A2. Dlatego zacząłem kombinować z funkcjami z pdf-a (te które wkleiłem w pierwszym poście). W pdf-ie faktycznie mam ładnie rozpisane co i jak powinno być w komunikacji z czujnikiem, ale na razie mam chyba problem z samą funkcją wysyłającą pojedynczy bajt do czujnika. Tego nie mogę zrozumieć co tu jest nie tak. Sprawdzałem stosując debug z diodą led ale już po wysłaniu pierwszych komend
Kod:
TWI_start ();

do czujnika program mi się zawiesza.
Chyba tu jest coś nie tak, nie rozumiem tego co jest?


Z wątku tego nie wyczytałem, powiedz zatem jaki podajesz adres urządzenia dla MPL3115A2?

Spotykane biblioteki w internecie różnie interpretują co to jest "adres urządzenia".
Jest różnica pomiędzy adresem "7 bitowym" i "8 bitowym".

Mirek w BB stosuje adres 8 bitowy, a czytanie od zapisywania do urządzenia rozróżnia poprzez dodawanie 1 do adresu (najmniej znaczący bit ustawiany jest na 1).
PDF do urządzeń zwykle podają adres 7 bitowy, ale z wyraźnym zaznaczeniem:
"The device uses 7-bit addressing and does not acknowledge general call address 000 0000. Slave address has been set
to 60h or 110 0000. 8-bit read is C1h, 8-bit write is C0h
."
Powyżej to dokładny cytat z noty do MPL3115A2.

Można zatem wpaść w pułapkę i definiując w stałych podawać adres 7 bitowy: 0x60 z tym, że do biblioteki Mirka jest potrzebny adres 8 bitowy: 0xC0

Jeśli popatrzymy do adafruitowej biblioteki (arduino) to znajdzimy:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

Podanie tego adresu do mirkowej biblioteki spowoduje brak komunikacji z czujnikiem, bo poprawna definicja powinna wyglądać tak:

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


Ciekawe jak to u Ciebie wygląda.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 7 sty 2017, o 13:46 
Offline
Użytkownik

Dołączył(a): 08 wrz 2012
Posty: 505
Pomógł: 6

Podaję adres 8-bitowy, czyli 0xC0 jako adres urządzenia podczas zapisu. W funkcji odbioru do adresu dodawane jest 1 czyli "robi" się z tego adres odczytu.
Kod:
TWI_write(0xC0 + 1);

Wydaje mi się, że powoli zaczynam dogadywać się z czujnikiem. Na razie jeszcze nie wiem tylko czy poprawnie tzn. czy czujnik wysyła mi to co bym chciał. Otrzymuję dane z dwóch rejestrów OUT_T_MSB_Register i OUT_T_LSB_Register (na razie odczytuję tylko temperaturę dla uproszczenia). Wiem, że rejestr OUT_T_LSB to wartość "po kropce" temperatury natomiast rejestr OUT_T_MSB to całe stopnie z informacją czy temperatura jest dodatnia czy ujemna, gdy większa od 0x7F to ujemna. Tylko jak z tej wartości teraz uzyskać wartość dziesiętną temperatury, no bo chyba nie jest tak, że wartość rejestru OUT_T_MSB np 0x19 to zwyczajne 25 stopni?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 8 sty 2017, o 00:02 
Offline
Użytkownik

Dołączył(a): 08 wrz 2012
Posty: 505
Pomógł: 6

Tak więc po długich bojach, coś otrzymuję z czujnika. Proszę teraz o pomoc w przekonwertowaniu danych z czujnika.
Otrzymałem np takie dane z rejestrów:
OUT_T_MSB = 20
OUT_T_LSB = 16
w dokumentacji jest pokazana funkcja do konwersji części całkowitej.

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


Podstawiając powyższe dane z czujnika MSB wychodzi mi, że:
a = 240
b = 240
c = 2
r = 2

Znalazłem gdzieś w pdf-ach NXP ciało funkcji SCI_NibbOut(...) oraz jej opisu

"Located in the driver program, the code below performs this conversion. It also adds the additional output formatting step of replacing each leading zero digit with a space character, which is done by passing 0xF0 to SCI_NibbOut(). Looking more closely, you can see that this routine will add 0x30 to 0xF0, resulting in a value of 0x120, which gets truncated to 0x20 (the ASCII space character)"

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


Jak bym nie podstawiał to wychodzą bzdury.

a tu funkcja konwersji części po przecinku
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


Pomóżcie proszę, bo godziny / dni lecą a ja dalej w miejscu stoję.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 8 sty 2017, o 12:27 
Offline
Użytkownik

Dołączył(a): 08 wrz 2012
Posty: 505
Pomógł: 6

No nie bądźcie tacy, niech ktoś coś podpowie :) .



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

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