Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

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

topstar 10 Wrz 2012 17:03 1983 10
  • #1 10 Wrz 2012 17:03
    topstar
    Poziom 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.

    Kod: bascom
    Zaloguj się, aby zobaczyć kod

    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?

    0 10
  • #2 10 Wrz 2012 17:19
    MArSTER_1
    Poziom 18  

    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.

    0
  • #3 10 Wrz 2012 17:31
    topstar
    Poziom 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?

    0
  • #4 10 Wrz 2012 17:39
    MArSTER_1
    Poziom 18  

    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ć.

    0
  • #5 10 Wrz 2012 21:08
    topstar
    Poziom 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ę ?

    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod

    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]

    0
  • #6 11 Wrz 2012 19:37
    zumek
    Poziom 39  

    topstar napisał:
    ..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".

    0
  • #7 11 Wrz 2012 19:55
    topstar
    Poziom 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ąć ?

    0
  • #8 11 Wrz 2012 20:37
    zumek
    Poziom 39  

    topstar napisał:
    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.

    0
  • #9 11 Wrz 2012 21:07
    topstar
    Poziom 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 .

    0
  • #10 11 Wrz 2012 22:09
    zumek
    Poziom 39  

    topstar napisał:
    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

    0
  • #11 12 Wrz 2012 21:39
    topstar
    Poziom 18  

    Temat do zamknięcia , nie potrafię sobie poradzić z obliczeniami wyników temperatury i ciśnienia.

    0