Elektroda.pl
Elektroda.pl
X

Search our partners

Find the latest content on electronic components. Datasheets.com
Elektroda.pl
Please add exception to AdBlock for elektroda.pl.
If you watch the ads, you support portal and users.

Bascom - czujnik ciśnienia i temperatury MS5803 i2c jak odczytywać dane

topstar 10 Sep 2012 17:03 2325 10
  • #1
    topstar
    Level 18  
    Witam ,
    projektuje sobie stacje pogodową która mierzy temperaturę i ciśnienie z jednego czujnika (MS5803). Ma on dwie możliwości sterowania po i2c oraz SPI . Ja chcę odczytywać z niego dane po i2c i tu mam pytanie jak się zabrać za to ? Prosiłbym kogoś o zaglądniecie do DS i naprowadzenie mnie czy dobrze kombinuje z odczytem po i2c.
    Napisałem taki program wstępnie żeby sprawdzić jakie wartości kalibracyjne są zapisane fabrycznie ale w każdym adresie od C1 do C6 wyświetla mi na Lcd wynik 255.
    Code: bascom
    Log in, to see the code

    Czy odczyt danych kalibracyjnych musi być w pętli głównej programu , czy wystarczy że program zrobi to raz i wpisze je do zdefiniowanych zmiennych wykorzystywanych później do obliczeń? Oraz jak się odczytuje dane temperatury i ciśnienia z wbudowanego ADC który wysyła wynik w postaci 24 bitów?
    [28-30.06.2022, targi] PowerUP EXPO 2022 - zasilanie w elektronice. Zarejestruj się za darmo
  • #2
    MArSTER_1
    Level 19  
    Masz napisane:
    I2cwbyte &H76 Ack 'adres czujnika
    I2cwbyte &H1E Ack ' komenda reset czujnika

    Czy musi byc komenda ACK?
    Wydaje mi się, że zapis robi sie bez ACK.
  • #3
    topstar
    Level 18  
    Tak tu jest błąd bo ack wystawia slave czyli czujnik , ale przy odbiorze danych z czujnika master powinien potwierdzać ACK odebrane dane . TU akurat dane kalibracyjne są 16 bitowe i nie wiem jak sie zabrać za to . Czy trzeba gdzieś pierwsze 8 bitów i zapisać je w jakiejś zmiennej następnie potwierdzić odbiór i odebrać kolejne 8 bitów i połączyć je w liczbę 16 bitowa?
  • #4
    MArSTER_1
    Level 19  
    Jeśli dane sa 16 bitowe to odbierasz dwa bajty Pierwszy odebrany zapisujesz do zmiennej na przykład :
    I2crbyte C1 , Ack
    i drugi zapisujesz do zmiennej
    I2crbyte C2 , Nack
    Oczywiście tą zmienna C2 musisz wczesniej zadeklarować.
  • #5
    topstar
    Level 18  
    No wiec jak powinna wyglądać komenda która sczyta mi najpierw 2 bajty MSB potem 2 bajty LSB i później je połączy w zmienną long ? Jakoś nie mogę nic wymyślić jak się za to zabrać.

    EDIT:
    Może ktoś mnie naprowadzi jak należy odebrać dane 16 bitowe z czujnika ? Jeśli czujnik wysyła najpierw 8bit MSB , a później kolejne 8 bit LSB to gdzie je zapisać i jak je później połączyć w wynik, które bity trzeba przesunąć , o ile i w którą stronę ?
    Code: basic4gl
    Log in, to see the code

    Czy ten fragment kodu jest poprawny do odczytu danych ? Bo połączeniu dwóch zmiennych zawierających msb i lsb wychodzi mi wynik 65536 lub 255.
    Bascom - czujnik ciśnienia i temperatury MS5803 i2c jak odczytywać dane

    Posty scaliłem.
    [zumek]
  • #6
    zumek
    Level 39  
    topstar wrote:
    ..Może ktoś mnie naprowadzi jak należy odebrać dane 16 bitowe z czujnika ?


    Kolego :!:
    Aby cokolwiek odczytać z urządzenia za pomocą magistrali I2C, to najpierw należy to urządzenie prawidłowo zaadresować :idea:
    Nie wiem skąd Ty wziąłeś &H76, ale nie jest to na pewno adres Twojego "scalaka".
    Przypatrz się rysunkowi, który załączyłeś i sprawdź jaką liczbę dają bity(8szt.) umieszczone pomiędzy S(tart) i A(cknowledge). W/g moich "obliczeń" (zakładając ,że pin CSB jest podpięty do GND), adres do zapisu to &HEE, a do odczytu &HEF.
    A teraz, do dzieła :D

    PS
    Po zaadresowaniu układu warto sprawdzić, czy "wystawił" ACK.
    W Bascomie, robi się to przez sprawdzenie zmiennej systemowej "Err".
  • #7
    topstar
    Level 18  
    Ok , działa :) Teraz pytanie odnośnie odbioru danych jeśli odbieram pierwsze 8 Bitów MSB to zapisuje je do zmiennej np. A1 i przesuwam o 8 bitów w lewo czy w prawo ? a Bity LSB nie przesuwa się czy też trzeba przesunąć ?
  • #8
    zumek
    Level 39  
    topstar wrote:
    Ok , działa :) ... przesuwam o 8 bitów w lewo czy w prawo ? a Bity LSB nie przesuwa się czy też trzeba przesunąć ?


    W Bascom-ie, jest do tego specjalna instrukcja, a więc skorzystaj z niej i tyle.
  • #9
    topstar
    Level 18  
    Chodzi o instrukcję SHIFT ? Próbuję jej użyć ale nie wiem jak ja zastosować. Czy jeśli odczytuje MSB i zapisuje ja do np A1 to mam przesunąć w lewo a , LSB zapisane w np. A2 mam przesunąć w prawo i później dodać je do siebie czy przesunąć tylko MSB a LSB po prostu dodać bez przesunięcia ?
    -----------------------------------------------------------------
    Ok poradziłem sobie , należało zapisać MSB do tymczasowej zmiennej , następnie przesunąć w lewo o 8 , odebrac LSB zapisac do drugiej zmiennej tymczasowej i dodać je do siebie .
  • #10
    zumek
    Level 39  
    topstar wrote:
    Chodzi o instrukcję SHIFT ? ...


    Nie, chodziło mi o MAKEINT(LSB,MSB), bo co Ci po SHIFT, skoro nie wiesz w którą stronę przesuwać :D
  • #11
    topstar
    Level 18  
    Temat do zamknięcia , nie potrafię sobie poradzić z obliczeniami wyników temperatury i ciśnienia.