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

[ATMega16][C] - Dziwne odczyty z DS1820

Quider 24 Maj 2013 01:20 1575 6
  • #1 24 Maj 2013 01:20
    Quider
    Poziom 2  

    Witam serdecznie kolegów forumowiczów.
    Siedziałem trochę nad moim problemem, próbowałem rozwiązać go samodzielnie, a gdy się nie udawało zacząłem szukać informacji na temat odczytu temperatury z czujnika DS1820 (NIE DS18b20).

    Mój problem polega na tym, że na wyświetlaczach 7-mio segmentowych zamiast temperatury świecą nie te diody, które powinny. Co ciekawe, gdy każę uP wyświetlić na nich kolejne liczby to jest wszystko ok, tzn wyświetlają się poprawni. W związku z czym wnioskuję, że obsługę LED napisałem dobrze.

    Obsługę one wire napisałem opierając się (a w zasadzie kładąc się) na w 100% działającej (tej w załączniku). Poza tym są wszelkie przesłanki ku temu, że jednak połączenie po one wire jest poprawne.

    Zamieszczam moją pętlę z funkcji main:

    Kod: c
    Zaloguj się, aby zobaczyć kod

    Nie mogę dojść do porozumienia z moim DS1820.

    W takim razie czy mógłby ktoś z szanownych forumowiczów wskazać mi drogę? Będę zobowiązany. W razie gdyby brakowało jakiś danych proszę mnie nie linczować - niezwłocznie dołożę to, co trzeba.

    Edit:
    1. tmp1 jest typu unsigned char.
    2. gdy ustawię maskę na 0b00111111 to wyświetlacz pokazuje 63 (czyli te wszystkie jedynki)
    3. Gdy maska jest w całości: 0b01111111 pojawiają się jakieś krzaki. Mogę wywnioskować, które bity są włączone wówczas będę wiedział co przekazuje DS do uC ale to i niewiele zmienia w tym przypadku.
    Prowizję dla pliku wyłączono, gdyż jest on elementem przedstawionego problemu.
    LordBlick


    ++Edit:
    Zmieniłem czujnik na DS18b20 i nadal jest to samo - lecą same jedynki. Czy mógłby ktoś zerknąć czy kod programu jest ok?

    ++Edit:
    Serio nikt nic?

    0 6
  • CControls
  • #2 29 Maj 2013 23:54
    atom1477
    Poziom 43  

    Co ma robić ta linia:

    Kod: c
    Zaloguj się, aby zobaczyć kod

    ?
    Bo chyba nie uzyskiwać temperaturę w stopniach Celsiusza? Bo ona tego nie robi.
    Całkowite stopnie masz na 4 bitach tmp1 i 8 bitach tmp2 (pozostałe 4 bity tmp1 to część ułamkowa).
    Powinieneś więc przesuwać o 4, i to jednocześnie tmp1 i tmp2. A więc najlepiej je złączyć z uint16_t i dopiero przesuwać.

    0
  • CControls
  • #3 30 Maj 2013 21:41
    Quider
    Poziom 2  

    Tak, marsz rację ale kod jest dla czujnika ds1820 (nie ds18b20) gdzie temperatura jest 9 bitowa

    0
  • #4 10 Cze 2014 18:53
    ZbygneF
    Poziom 2  

    Witam serdecznie. Próbowałem zrobić własną malutką bibliotekę do obsługi termometru DS1820 na atmedze16a. Chciałem żeby była jak najprostsza. Niestety coś nie działa. Czy może ktoś bardziej doświadczony w programowaniu w C oraz w obsłudze połączenia 1wire mógłby rzucić okiem na kod? Urządzenie jest podpięte do PA5 przez opornik 4,2k. Nie wiem czy ma jakiekolwiek znaczenie, że do kontrolera jest także podpięta sonda pod adc (inny pinA). Oto kod:

    Kod: c
    Zaloguj się, aby zobaczyć kod

    0
  • #5 10 Cze 2014 20:29
    Szumlus
    Poziom 17  

    Witam,

    Po pobieżnym zerknięciu to coś mi czasy nie grają ;], kiedyś pisałem program do obsługi OW.

    Procedura reset powinna sprawdzić czy urządzenie jest fizycznie podpięte i odpowiada aby nie czytać potem z głupot.

    Moje biblioteki nie działają z adresowaniem podaje kolega tylko port i pin ale w zamian nie ma obsługi więcej niż jednego ds'a na jednym pinie uP.

    Kod: c
    Zaloguj się, aby zobaczyć kod


    Będę koledze dawkował informacje żeby nie było na gotowca ;]
    Nauka przede wszystkim ;p

    PS. a kompiluje się to koledze?? Co to jest DDA5 w kodzie ?? Pierwsze widzę aby taki rejestr był w ATmega, chyba że to jakiś define mi nie znany albo dodany przez kolegę.

    0
  • #6 10 Cze 2014 21:16
    ZbygneF
    Poziom 2  

    Kompiluje się, DDAx to odpowiedni bit rejestru DDRA odpowiadającego za kierunek portu x. Czy dla jednego termometru dołączonego do pinu mikrokontrolera funkcja reset powinna robić coś jeszcze oprócz podania 1 przez 480us a potem ustawienia linii jako wejścia? Następnie po 60us DS1820 zgłasza "presence pulse" (trwający do 240us) ale czy ma to tutaj znaczenie (czy służy tylko do odnalezienia wielu urządzeń)?

    EDIT: Zauważyłem u siebie w kodzie literówkę, w procedurze odczytywania temperatury należy na konwersję czekać 500ms a nie 500us (mea culpa). Niestety po poprawieniu temperatura nadal nie jest odczytywana prawidłowo.

    0
  • #7 12 Cze 2014 18:20
    Szumlus
    Poziom 17  

    Reset to nie tylko wysłanie paru stanów logicznych podstawą jest dostać info zwrotne czy zresetowaliśmy DS'a czy wszystko poszło w "powietrze".
    Sprawdzamy flagę poprawności resetu i wiemy czy czujnik "żyje" czy nie.
    Dotyczy to zarówno kilku układów na szynie jak i jednego

    0