logo elektroda
logo elektroda
X
logo elektroda
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

Atmega32 biblioteka I2C czujnik wilgotności i temperatury

ravmar 17 Mar 2011 23:18 8236 40
  • #1 9289922
    ravmar
    Poziom 22  
    Witam
    Zmagam się z uruchomieniem czujnika pracującego na interfejsie I2C. Dokonałem modyfikacji :
    SDA na PORTC5
    CLS na PORTC4

    -I2C_HAL.H zmieniłem deklaracje portów i trochę zmodyfikowałem mechanizm wpisywania 1 i 0 na poszczególne bity

    -I2C_HAL.C zastosowanie wyżej wymienionych zmian

    -STH2x.c zmiany przy opcji hold master

    -STH2x.h nie wiem czemu wywala błąd przy
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    Dlatego za komentowałem tą linie, a zamiast używać POLYNOMIAL stosuję bezpośrednio 0x131

    -System.h zrezygnowałem z watchdogów itp., Init_HW() nie istnieje

    -System.c
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
    - nie wiem co to jest, kompilator ma z tym jakieś warningi,domyślnie kod był dostosowany do 4MHz, ja pracuje na 16MHz (dodałem kilka nop'ów). Z szybkością wykonywania programu mi się nie pali, dlatego kod nie musi być w pełni zoptymalizowany (u mnie dł. kabli 20cm czujnik->uC, w maualu piszą o max. 10cm - 400pF) dlatego nie obrażę się jeśli SCL będzie pracować nieco wolniej

    -typedefs.h
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
    Kompilator ma jakiś problem z tym, niestety nie wiem jaki.

    -z głównego pliku zabrałem kilka funkcji, niestety nie wyświetla niczego sensownego

    Zwracam się do was drodzy programiści o pomoc. Najbardziej zależało by mi na sprawdzeniu mojej modyfikacji I2C_HAL.C i I2C_HAL.H. Wykonywałem program pokrokowo i wydawało się być wszystko dobrze.
  • #2 9290199
    hotdog
    Poziom 26  
    Uruchomiłeś w ogóle ten czujnik? Piszesz dużo o modyfikacjach, ale nie napisałeś nic czy działał przed modyfikacjami, czy nie.

    Jak chcesz to mogę Tobie wrzucić tutaj mój kod do obsługi SHT na M8. I2C z tego co pamiętam jest sprzętowe wykorzystane. Wynik są wyświetlane na 2 cyfrach wyś. LED. Do tego jest tylko jeden przycisk do przełączania temperautra/wilgotność/automat. Bibliotekę, z tego co pamiętam, miałem od producenta układu.
  • #3 9290377
    ravmar
    Poziom 22  
    Cytat:
    Bibliotekę, z tego co pamiętam, miałem od producenta układu.
    Wysłali Ci ?

    Czujnika nie uruchomiłem, modyfikacje wprowadzam ponieważ pierwotny kod (zapomniałem dodać) jest ze strony producenta, pod inny uC i inny wyświetlacz.

    hotdog
    Cytat:

    Jak chcesz to mogę Tobie wrzucić tutaj mój kod do obsługi SHT na M8

    Jeżeli możesz to wrzuć, i wiem o czym mówisz, trzeba sprawdzić czy wogóle ten układ działa :)
  • #4 9290675
    hotdog
    Poziom 26  
    Sorry trochę namotałem. Mam kod do SHT11, nie wiem czy są zgodne, być może podobne. Wydaje mi się że na stronie mieli umieszczony kod.

    Kod jest ciulowy, bo pisany 2 lata temu. Teraz bym go zrobił już inaczej... Generalnie projekt poszedł na zaliczenie mojego kolegi z jakiegoś tam przedmiotu za skrzynkę bro...

    Tak czy inaczej, mam nadzieje że się przyda.
    Załączniki:
  • #5 9291469
    wdogli
    Poziom 18  
    Witam.

    ravmar=> jakiego czujnika używasz??
    Z tego co widzę jeśli używasz któryś z czujników typu SHT.... to w bibliotece I2C_HAL.C masz błąd na samym początku przy wysyłaniu komendy Start. Ty stosujesz standardową procedurę startową dla I2C

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Atmega32 biblioteka I2C czujnik wilgotności i temperatury


    a te czujniki działają trochę inaczej.

    Atmega32 biblioteka I2C czujnik wilgotności i temperatury

    Pozdrawiam
  • #6 9302421
    ravmar
    Poziom 22  
    używam SHT21 dokumentacja którą przyszła razem z czujnikiem Link zobacz stronę 7
  • #7 9303802
    hotdog
    Poziom 26  
    Przeglądałeś protokoły? Zgodne są te czujniki?
  • #8 9304820
    ravmar
    Poziom 22  
    NO raczej są zgodne. W linku który przesłałem:
    Cytat:
    This sample code is made to communicate with SHT2x
    humidity and temperature sensors. The purpose of the
    code is to ease the own software programming
    addressing SHT21 sensors. This sample code has been
    completed and besides the pure measurement it provides


    Ja tak samo mam SHT21. Tylko nie mogę go uruchomić pod Atmegą.

    Tak myślę czy dla sprawdzenia samego czujnika nie napisać na piechotę jednego ciągu znaków, które by odczytały np. temperaturę. Może podczas lutowania układu przegrzałem go, albo gdzieś ścieżki się nie spasowały. Różnie bywa. Człowiek się namęczy nad kodem, a później okazuje się ze to wina układu.
  • #9 9305196
    tmf
    VIP Zasłużony dla elektroda
    SHT to nie jest I2C i może tu leży problem. Protokoły są tylko podobne ale nie identyczne. Ja proponuję ci samemu od początku napisać procedurę odczytu, to żaden problem. Przy okazji robiąc to krok po kroku będzie to łatwiej uruchomić niż analizując gotowy kod.
  • #10 9305514
    ravmar
    Poziom 22  
    tmf
    Cytat:
    SHT to nie jest I2C


    link który podałem do pdf'a parę postów wyżej - Datasheet SHT21
    Cytat:
    Digital output, I2C interface


    WIKIPEDIA
    Cytat:
    Alternatywne nazwy

    Ponieważ I²C jest nazwą zastrzeżoną przez firmę Philips, inne firmy implementują kompatybilne standardy pod innymi nazwami:

    * TWI (Two Wire Interface), stosowane w mikrokontrolerach firmy Atmel
    * IIC (Inter-Intergrated Circuit)
    * SCCB (Serial Camera Control) w produktach firmy OmniVision
  • #11 9306002
    tmf
    VIP Zasłużony dla elektroda
    Ok, to mówimy o SHT21, 11 czy innym, bo się gubię :) SHT11 i 75 nie mają I2C, 21 ma. Ty masz który? Do jakego etapu doszedłeś? Dostajesz ACKa po wybraniu adresu?
  • #12 9306846
    ravmar
    Poziom 22  
    Na początku nie zostało to bezpośrednio powiedziane tylko nazwą pliku można było się domyślić. Oczywiście chodzi tylko i wyłącznie o SHT 21 :!: Kolega hotdog przesłał kod od SHT11. Ciężko mi stwierdzić czy dostaje ACK ponieważ nie mam możliwości prześledzenia krokowo programu zaimplementowanego na µC.
  • #14 9310008
    ravmar
    Poziom 22  
    Instrukcja soft restaru, teraz piszę odczytu temperatury za dwie godzinki podrzucę. Jedna rzecz mi nie pasuje. LED na porcie 6 ma sygnalizować ACK nadawane przed SHT w stanie wysokim, czyli błąd. W poniższym kodzie dioda się nie zapala co świadczy o "niby" poprawności wykonania soft restartu. Niestety jeżeli zmienię tylko adres urządzenia dioda się zapala (zaraz po adresacji). To znaczy że SHT emituje w tym czasie '1' :?: Jeżeli tak to w jaki sposób mógłbym podłączyć do szyny I2C dwa urządzenia (o różnych adresach). Przecież tak nie może być. Kiedy będę chciał się dogadać z drugim urządzeniem czekając od niego na ACK w postaci '0' wtedy SHT się udzieli i powie '1', co ja zinterpretuje za błąd drugiego urządzenia :?:

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    Sygnał zegara SCL nie musi być stały w żaden sposób, może raz trwać 100ms a raz 50us :?: (nie przekraczając oczywiście maksymalnej szybkości zmian podanej w nocie katalogowej)
    Zastosowałem długie czasy oczekiwania ze względu na długie kable ~20cm
    ============================================================
    Pisząc instrukcje odczytu już natrafiam na problem. Jest wywoływana po pełnej instrukcji soft restarcie, po "niby" poprawnym zaadresowaniu wysyłam komendę 11100011 - 227 odpowiadającą za pomiar temperatury w trybie hold master (różnica w kodach jest tylko w wysyłanym bajcie). Niestety odpowiedzią czujnika jest ACK w stanie wysokim ;/
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
  • #15 9310578
    wdogli
    Poziom 18  
    Witam.

    Niestety nie ma możliwości podłączenia drugiego urządzenia do szyny I2S do której jest podłączony czujnik SHT21, . Sprawa jest prosta nie ma możliwości ustalenia adresu określonego urządzenia poprzez podanie VCC lub GND na wejścia najczęściej oznaczane jako A1, A2, A3 jak to ma miejsce na przykład w PCF8583.

    Druga sprawa to zgodnie z dokumentacją do tego urządzenia ACK to ściągnięcie linii SDA do stanu niskiego. A stan wysoki na linii SDA masz od rezystora podciągającego.
  • #16 9310654
    hotdog
    Poziom 26  
    wdogli napisał:
    Witam.

    Niestety nie ma możliwości podłączenia drugiego urządzenia do szyny I2S do której jest podłączony czujnik SHT21, . Sprawa jest prosta nie ma możliwości ustalenia adresu określonego urządzenia poprzez podanie VCC lub GND na wejścia najczęściej oznaczane jako A1, A2, A3 jak to ma miejsce na przykład w PCF8583.


    No ale drugim urządzeniem na szynie I2C nie musi być przecież ten czujnik. Swoją drogą to było by trochę bez sensu stosować 2 czujniki na szynie która ma max kilkadziesiąt cm. Chyba że dla średniej :)
  • #17 9310706
    wdogli
    Poziom 18  
    Zgadzam się
    adres SHT na linii to 10000000
    adres innego urządzenia na przykład PCF8583 to 10100000
    Czyli da się :)
  • #18 9310853
    ravmar
    Poziom 22  
    Cytat:
    Zgadzam się
    adres SHT na linii to 10000000
    adres innego urządzenia na przykład PCF8583 to 10100000
    Czyli da się Smile

    Wiadomo że nie da się do jednej szyny podłączyć dwóch SHT21 ponieważ mają te same adresy. To już chyba było wiadome :)

    Cytat:
    Druga sprawa to zgodnie z dokumentacją do tego urządzenia ACK to ściągnięcie linii SDA do stanu niskiego. A stan wysoki na linii SDA masz od rezystora podciągającego.

    Czyli to co SHT podaje w dokumentacji za '0' przez rezystory staje się '1', a to co podają za '1' staje się '0'
    Już mi się wszystko myli, czyli można by rzec, że jeżeli w mojej instrukcji soft resetu ACK '1' wysztko jest dobrze. Więc gdzie dalej mam błąd :?:
  • #19 9310922
    wdogli
    Poziom 18  
    No dobra ale gdzie masz procedurę odczytu danych z SHT i przeliczenia wyniku ??
  • #20 9310958
    ravmar
    Poziom 22  
    Pisałem wcześniej że nie mam ponieważ zatrzymałem się na błędzie który dostaje. Posługując się notą katalogową (str 18) po wykonaniu soft restart i odczekaniu 15ms, zaczynam wysyłać instrukcje odczytu temperatury w trybie hold master. W tym celu kopiuje początek instrukcji soft reset. Bit START- adresuje 7bit + write(0) = 100000000=128, spodziewam się ACK w stanie wysokim i takie dostaje. Następnie przystępuje do wysłania komendy "daj mnie temperatuje" - 11100011. Ponownie spodziewam się ACK w stanie wysokim, a tu niespodzianka stan niski, zapala się dioda to sygnalizująca. Dlatego wstrzymałem się z pisaniem dalej kodu - przecież powinienem dostać ACK w stanie wysokim jak poprzednio, prawda ?

    Ale skupił bym się na samej instrukcji soft reset, bo jeżeli to mi wystartuje to dalej powinno być łatwo. Ona raczej nie działa, wysyłając dwa razy te instrukcje z odstępem ~20ms przy czym pierwsza jest zaadresowana np. do urządzenia fikcyjnego 158, dostaje zapaloną diode dla ACK. Druga instrukcja jest zaadresowana juz do naszego SHT czyli 128 i tu też dostaje zapaloną diodę czyli układ nie odpowiada.
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
  • #21 9311454
    wdogli
    Poziom 18  
    Nie prawda.
    ACK jak już Ci pisałem jest stanem niskim na linii SDA.
  • #22 9311829
    ravmar
    Poziom 22  
    Czyli ta część kodu programu jest prawidłowa.

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
  • #23 9312069
    wdogli
    Poziom 18  
    Teoretycznie jest ok.
    Choć ja bym przetestował jego zachowanie w AVRStudio.
    W momencie gdy czujka nie wystawi ci sygnału ACK zapali się dioda sygnalizując błąd.
    Takie było zamierzenie ??

    Ja w tej chwili tworzę układ z czujnikiem SHT_75 i napisałem coś takiego do sprawdzania czy został wystawiony sygnał ACK.
    Jednak nie wiem czy działa bo nie mam jeszcze zbudowanego urządzenia (projektuję płytkę)
    u08 test_SDA_75 (void)
    {
    u08 stan;
    if(bit_is_set(PINC,PC1))                               //jeżeli slawe nie wystawił 0 na magistrali
    {
    stan=0;                                                //zwróć 0 nie wystawił ACK 
    }
    else                                                   //jeżeli slawe wystawił zero na magistrali
    {         
    stan=1;                                                //zwróć 1 wystawił ACK 
    }
    return stan;
    }
  • #24 9312628
    ravmar
    Poziom 22  
    Cytat:
    W momencie gdy czujka nie wystawi ci sygnału ACK zapali się dioda sygnalizując błąd.
    Takie było zamierzenie ??

    Tak, takie było zamierzenie

    wdogli piszesz na Atmela ?
  • #25 9312650
    wdogli
    Poziom 18  
    Tak na Atmela a konkretnie na Atmega32 z tym ze na SHT75.

    :arrow: ravmar I co uruchomiłeś tę czujkę ??

    SHT 11 działa

    Atmega32 biblioteka I2C czujnik wilgotności i temperatury
  • #26 9756495
    ravmar
    Poziom 22  
    Odgrzewam temat i dalej kopie w tej kupie g**** :)

    Czytam manuala i stwierdzam, że po softrestarcie nie muszę dokonywać konfiguracji user register. W ogóle nie muszę się tego czepiać, żeby odczytać "Trigger T measurement hold master 1110’0011" poprawcie mnie jeśli się mylę.

    Kolejna kwestia jest taka ze głowie się jak "źle" zagadać do tego czujnika, żeby nie wysłał mi sygnału ACK, a w konsekwencji powinna zapalić mi się dioda. Jeżeli tak by się stało oznaczało by to że na pewno mam dobrze podlutowany czujnik. Domniemam, że powinienem poprawnie zaadresować urządzenie i potem podać nieistniejącą komendę.
  • #27 9781368
    ravmar
    Poziom 22  
    Ostatnio co udało mi się wypocić czujnik stara się rozmawiać na chuchanie i dmuchanie reaguje coś niby się logicznie zmienia.. ale dla pokojowych warunków dla temperature zwraca mi 56130 co odpowiada temp. ok 100 stopni !! a wilgotność 60412 to odpowiada coś ponad 100% :| Sprawdziłem jeszcze jeden czujnik mam te same wskazania. Gdzie szukać przyczyny, dałem im czas na re-hydro po lutowaniu
  • #28 9782842
    wdogli
    Poziom 18  
    Wklej jakieś kody to postaram się pomóc. U mnie działa wyśmienicie pod atmegą32
    Pozdrawiam
  • #29 9782845
    krru
    Poziom 33  
    Może masz zamienione bajty (zły endian).
  • #30 9784396
    ravmar
    Poziom 22  
    wdogli ty pisałeś ze pod atmegą32 działa Ci SHT75. Ja pracuje na SHT21. Z tego co pamiętam u ciebie występowała nietypowa sekwencja START/STOP.

    Cyrki, cyrki i jeszcze raz cyrki. Chciałbym mieć chociaż jednego pewniaka, albo dobry kod albo poprawnie zlutowany i sprawny czujnik. Obecnie wyświetla o dziwo poprawnie temperaturę ... ale wpada czasem w jakieś martwe stany o wartości 128.**, z wilgotnością jest podobnie, pracuje dobrze podczas ogrzewania suszarką spada 50,45,43,40,30 ... ale pomiędzy niektórymi wartościami, których nie jestem wstanie precyzyjnie wyznaczyć wyświetla maxa czyli coś koło 118,**%.

    Pomiarów dokonywałem raz co 8sec, a innym razem co 1sec bez różnicy działa tak samo.

    Co więcej w sekwencji służącej do odczytu np. temp zmieniając adres urządzenia, manipulując bitami W/R (zapalają się diody sygnalizacyjne błąd) ale czujnik dalej mierzy i reaguje na zmiany temperatury bądź wilgotności (nie licząc wyżej wspomnianych przypadkowych maxymalnych odchyleń).

    Jak by tego było mało to po każdym restarcie atmegi TYLKO przy pierwszym pomiarze (poprawnie zaadresowanego czujnika i odpowiednim ustawieniu bitów W/R) zapalają się diody sygnalizujące błąd, w kolejnych krokach pętli WHILE problem ten nie występuje, żeby było śmieszniej pierwszy pomiar jest poprawny :)

    Jeżeli jesteście w stanie jakoś pomóc będę wdzięczny. I wielki podziw jeżeli komuś zechce się czytać mój kod. Wiem jak to jest czytać czyjeś "brudy"

    Kod: text
    Zaloguj się, aby zobaczyć kod
REKLAMA