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

[ATmega8][C] Czujnik temperatury DS18B20

koper29 04 Gru 2011 16:01 4552 13
REKLAMA
  • #1 10217452
    koper29
    Poziom 9  
    Witam wszystkich,
    Nieśmiertelny problem czujnika ds18b20 powraca.
    W mojej sytuacji chodzi o problem samego nawiązania połączenia z czujnikiem.
    Przeszukałem już całe forum i dokumentacje, ale nie znalazłem rozwiązania swojego problemu.



    Rezystor podciągający to 4,76 Ohm'a(szeregowo 3x 1,5k i 260), te nadmiarowe 60 Ohmow względem dokumentacji to chyba nie problem? Wszystko jest podłączone do baterii 4,5 V.
    Wklejam istotny fragment kodu kod:

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


    główna petla programu ma tylko za zadanie sprawdzić czy jest połączenie z czujnikiem.

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


    Fuse bitów nie zmieniałem, F_CPU w programie wynosi 1000000, na wyswietlaczu wciaz pojawia sie "problem".
    Gdy linia zasilania czujnika jest odłączona, na wyświetlaczu pojawia się "jest polaczenie", więc rezystor spełnia swoje zadanie.
  • REKLAMA
  • #2 10217669
    tmf
    VIP Zasłużony dla elektroda
    Jeśli nie zmieniałeś fusebitów to twój procesor z pewnością nie jest taktowany zegarem 10MHz, więc to nie ma prawa działać ze względu na timingi.
  • REKLAMA
  • #3 10217691
    koper29
    Poziom 9  
    Oczywiscie chodziło mi o F_CPU=1000000, po prostu zle napisałem i uC jest taktowany zegarem 1 Mhz, mimo wszystko dzięki za zainteresowanie. Kwestię timingów sprawdzałem wielokrotnie, bo u wielu innych osób na tym forum to było problemem nie działania całego układu.

    Jakieś inne pomysły?
  • #4 10221020
    koper29
    Poziom 9  
    Mam nadzieję, że podbijanie swojego tematu nie jest mocno karalne, ale naszło mnie kilka pytań, na które odpowiedzi mogą mi pomóc.

    1. Jak łatwo uszkodzić taki układ(przez przegrzanie) podczas lutowania? Jest szansa, że jedną nóżkę przygrzałem mocniej od innych.
    2. Jak sprawdzić, czy taki układ jest sprawny? Wykluczając opcję podmiany czujnika u kolegi, który ma taki sam układ. Bo błędów w programie nie znajduję i żadne zmiany nic nie dają.
  • #5 10224825
    Sławek-K
    Poziom 15  
    Tak 4,7 k to nie jest jakaś tak super precyzja. Robiłem na 3x DS18B20 i dwa miały R=4,7k a jeden 3,3k i wszystko śmigało. Jeśli masz na długich kablach (choć deklarują do 200m) to podłącz na krótko (np po 10cm).
    Jak masz podłączony na dwóch czy na trzech przewodach?
    Nie wiem czy przypadkiem ta bateria 4,5V to nie TUTAJ problem. Jeśli możesz to podłącz na pewnym +5V ( z zasilacza).
  • #6 10225008
    snnaap
    Poziom 25  
    DS18B20 może być zasilany napięciem od 3 do 5V. Ja osobiście zasilam 3.3 i nie stanowi to najmniejszego problemu.
    Czy aby na pewno jest to DS18b20 a nie np DS18b20p z zasilaniem pasożytniczym?, chociaż prawdę mówiąc nawet przy zasilaniu pasożytniczym układ powinien odpowiadać na reset pulse.
    Co do czasów osobiście w swojej procedurze reset pulse stosuje następujące czasy: 490us stan niski, po kolejnych 70 us odczyt stanu linii i odczekanie 410 us do końca cyklu.

    Pokaż jeszcze co masz w "bit_is_clear".
  • #7 10225061
    koper29
    Poziom 9  
    @Sławek-K
    Mam połączone na 3 przewodach długości około 50 cm każdy, rezystory pomiedzy DQ i VCC, nie jest to jeszcze żaden projekt, tylko "zestaw edukacyjny" więc wszystko i tak leży na biurku.

    @snnaap
    funkcja bit_is_clear jest funkcją z biblioteki avr/io.h, probowałem także instrukcji (SENSOR_PORT & 0x01)==1, ale nie zadziała,
    zmieniałem czasy opóźnień, tak aby sprawdzać reset pulse nawet po 150 us od zwolnienia magistrali.
    Zainstalowałem nawet AVR studio 4, aby w ustawieniach projektu ustawić FCPU, wciąż nic. Zaczynam sam siebie przekonywać do opcji, że czujnik jest zepsuty.
  • #8 10225103
    snnaap
    Poziom 25  
    Jak już to nie (SENSOR_PORT & 0x01) tylko (PINC & 0x01) a dokładniej (PINC & (1<<WE)), i skróć na chwile te przewody jak kolega wyżej pisał do ok 10 cm, tak na próbę.

    PS. nie powinieneś używać już _BV(WE) tylko np (1<<WE).
  • REKLAMA
  • #9 10225222
    koper29
    Poziom 9  
    Skróciłem przewody do około 10 cm, zmieniłem funkcję bit_is_clear na (PINC & 0x01), pomanipulowałem trochę opóźnieniami, ale czujnik wciąż nie odpowiada. Chociaż zauważyłem, że podłączony do zasilania zagrzewa się o kilka stopni w porównaniu do tego gdy nie jest podłączony.
  • #11 10225258
    koper29
    Poziom 9  
    Myślałem o tym na samym początku, ale to byłoby zbyt proste:)
  • REKLAMA
  • #12 10227410
    PietrekDer
    Poziom 13  
    Pozwolę sobie zapodać link do posta, w którym jako złącznik wrzuciłem kompletny przykład do komunikacji po 1Wire. Przykład obejmuje zarówno odczyt z DS1990 lub z DS18B20, w zależności co się wykomentuje w "mainie". Przykład chodzi na zegarze 4MHz, więc będziesz musiał sobie jedynie przerobić funkcje opóźniające (waitus), aby jej wywołanie waitus(60); oznaczało odczekanie 60us.

    https://www.elektroda.pl/rtvforum/topic1075400.html
  • #13 10228030
    Logan
    Poziom 30  
    koper29 napisał:
    Chociaż zauważyłem, że podłączony do zasilania zagrzewa się o kilka stopni w porównaniu do tego gdy nie jest podłączony.


    Taki objaw występuje przy zamienionych końcówkach zasilających. To jest termometr, jak niby miałby mierzyć poprawnie temperaturę, skoro sam byłby źródłem ciepła ?!
  • #14 10228390
    Sławek-K
    Poziom 15  
    Skoro się sam podgrzewa to albo jest uszkodzony , albo zamieniłeś końcówki 1 i 3. Masa ludzi źle interpretuje rysunki z numeracją nóżek DSa
REKLAMA