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

Nieprawidłowe odczyty temperatury z DS1820 na AT89C2051 - co drugi odczyt błędny

sigreg 18 Kwi 2004 12:04 3660 24
  • #1 600146
    sigreg
    Poziom 10  
    Posty: 47
    Witam,

    Gdyby patrzec na ilosc postow to okaze sie ze 1820 jest obecnie najpopularniejszym ukladem ;)
    Zbudowalem sobie termometr oparty na AT89C2051 i powyzszym ukladzie. Uklad dziala, ale sa spore problemy z prawidlowym odczytem temperatury, mianowicie srednio co drugi odczyt jest bledny. Kiedy mam w pokoju temperature 21 stopni, to raz otrzymuje prawidlowa wartosc, a raz zupelne bzdury w rodzaju 0, sporo powyzej 100 stopni (co powoduje wykrzaczenie dwoch wyswietlaczy led ktore moga pokazac max 99 stopni), albo sporo ponizej zera. do odczytu temp stosuje taki procedurki :

    Inicjuj_czujnik:
    1wreset
    1wwrite &HCC
    1wwrite &H44
    Wait 1
    Return

    i od razu

    Czytaj_temp:
    1wreset
    1wwrite &HCC
    1wwrite &HBE
    T(1) = 1wread()
    T(2) = 1wread()
    1wreset
    If T(2) = 0 Then
    Temperatura = T(1) / 2
    Minus = 0
    Else
    T(1) = 256 - T(1)
    Temperatura = T(1) / 2
    Minus = 1
    End If
    If Temperatura = 0 Then
    Minus = 0
    End If
    Return

    Odczytuje tylko dwa bajty bo pomiar robie z dokladnoscia jedynie do 1 stopnia, wiec dwa bajty wystarcza. Tak mysle, moze w pamieci czujnika zostaja jakies smieci i lepiej odczytac wszystkie 9 bajtow ?
    wymyslilem kilka mozliwych przyczyn, ale czy sa prawdopodobne nie wiem, musialby mi pomoc ktos bardziej doswiadczony :)

    - blad w oprogramowaniu. Ale co jest zle ? nie mam pojecia. Jedyne co mi wpadlo do glowy to sprawdzac CRC (z tym ze nie znalalzem przykladu jak to robic) albo sczytywac 9 bajtow zamiast dwoch "bo moze pomoze"
    - za dlugi kabel. Ma cale 2 metry (kabel telefoniczny), ale kto wie. Z drugiej strony czytalem gdzies o magistrali 1wire na 300 metrowym kablu ktora dzialala.
    - uwalony czujnik. Czujnik na kablu zaizolowalem koszulka termokurczliwa, moze go przegrzalem ? Staralem sie zeby za bardzo sie nierozgrzal, byl co prawda goracy ale dotkniecie go nie powodowalo trwalych oparzen wiec mysle ze mial mniej niz 100 stopni.
    - zaklocenia w ukladzie. Linia danych 1wire na mojej plytce prowadzona jest miedzy nozkami oscylatora kwarcowego, milimetr od stabilizatora napiecia 7805 (uklad zasilany jest z zasilacza 12 V) i pod gniazdem zasilania. Plytka jest dosyc upakowana i tylko tak mozna bylo to zrobic. Czy mozliwe aby ktorys z tych elementow "sial" tak bardzo zeby znieksztalcac transmitowane dane ?

    WIecej pomyslow nie mam, moze ktos wymysli jeszcze inne mozliwe przyczyny. Help me please ! :)

    Grzesiek
  • #2 600171
    xbaj
    Poziom 20  
    Posty: 415
    Pomógł: 17
    Ocena: 16
    Ja bym dopisał między linijkami:

    1wwrite &HCC
    1wwrite &HBE


    w 'Czytaj_temp' opoźnienie:

    Waitms 250
    Waitms 250


    Napisałem 2x to samo, bo waitms na maxa przyjmuje tylko 255 a tu należałoby by zrobic opożnienie ok 500ms.
    Spróbuj, może zadziała...
  • #3 600207
    japacer
    Poziom 12  
    Posty: 43
    Ja miałem podobny problem z wiarygodnością odczytanych danych ale podłączyłem trzecią nogę do zasilania i problem się skończył. Jeżeli tego zrobć nie możesz to podłącz ją do masy i zmniejsz rezystor podciągający.

    W poscie "problem Z DS1820" zamieściłem procedurę która co prawda mierzy z dokładnością do 0,1 ale może się przydać. Waitms 250 pomiędzy 1wwrite &HCC 1wwrite &H44 okazało się niepodtrzebne. U mnie działa bez problemu.
    Pozdrawiam!
  • #4 600212
    sigreg
    Poziom 10  
    Posty: 47
    Witam,

    Podlaczone mam wszystkie trzy nozki, czytajac o problemach z 1wire nie zdecydowalem sie na czujnik na tylko dwoch przewodach zeby uniknac klopotow, a tu masz. Rezystor podciagajacy mam taki jak w datasheecie - 4.7 kom.

    Grzesiek
  • #5 600232
    ggrunge
    Poziom 17  
    Posty: 307
    Pomógł: 9
    Ocena: 25
    Wg mnie jest potrzebne opoznienie miedzy odczytami temperatury z DS1820, a ja w Twoim programie takiego nie widze. Nie wiem jak szybki ma ten czujnik przetwornik AC, ale odczyt powinien odbywac sie przynajmniej co 1 s. A te rezystory mozesz sprobowac dac na 2,2k. ALe to chyba nie tu tkwi problem, bo kiedys zczytywalem z pastylki dallasa numer seryjny przy uzyciu tez ok 3m kabla i z dwoma liniami (data, gnd) i rezystory tez 4,7k i dzialalo dosc dobrze.
    Wiec w odczycie temp przed return sproboj wsadzic 4 razy po waitms 250.

    Pozdrawiam
  • #6 600462
    japacer
    Poziom 12  
    Posty: 43
    Przetestowałem twoją procedurę do odczytu z DSa w króciutkim programiku który przesyła wartość temperatury do terminala przez RS232 i jest OK, więc opóźnienia są w pożądku. zreszta 1s spokojnie wystarczy i jest zaraz po 1wwrite &H44. Jeżeli używasz przerwań to sprawdź czy nie przerywają procedury obsługi DSa.

    oto treść:
    $baud = 57600
    Config 1wire = P1.0
    Dim T(2) As Byte
    Dim Temperatura As Byte
    Dim Minus As Byte
    Declare Sub Inicjuj_czujnik
    Declare Sub Czytaj_temp
    1wreset
    Do
    Inicjuj_czujnik
    Czytaj_temp
    Print Temperatura
    Loop
    Sub Inicjuj_czujnik
    1wreset
    1wwrite &HCC
    1wwrite &H44
    Wait 1
    End Sub

    Sub Czytaj_temp
    1wreset
    1wwrite &HCC
    1wwrite &HBE
    T(1) = 1wread()
    T(2) = 1wread()
    1wreset
    If T(2) = 0 Then
    Temperatura = T(1) / 2
    Minus = 0
    Else
    T(1) = 256 - T(1)
    Temperatura = T(1) / 2
    Minus = 1
    End If
    If Temperatura = 0 Then
    Minus = 0
    End If
    End Sub

    próbuj po kolei eliminować błędy. jezeli ten programik Ci nie zadziała to jest błąd w połączeniach, albo rezystor podciągający za duży. Spróbuj zmniejszyć o połowę.
    good luck!
  • #7 600467
    japacer
    Poziom 12  
    Posty: 43
    Aha, musisz dostosować odpowiednią szybkość transmisji na terminalu. Bo jeżeli używasz kwarcu 11,0592 to procek sobie poradzi.
    a propos 4 x waitms 250, wystarczy 1 x wait 1 i efekt ten sam.
    a wait 1 jest umieszczone zaraz po poleceniu konwersji 1wwrite $H44.
  • #8 600593
    sigreg
    Poziom 10  
    Posty: 47
    WItam,

    Czyli procedurka jest ok ? Coraz bardziej sklaniam sie do teorii ze czujnik jest walniety. Albo jakies zaklocenia nie wiem skad.
    Zrobilem kilka testow.

    1) Czujnik lezal sobie spokojnie na stole, w pomieszczeniu panowala temperatura 23 stopnie i tyle pokazywal. Obserwowalem wskazania ukladu przez 50 cykli pomiarowych, nie wystapil ani jeden blad.
    2) Poddalem czujnik "zmianom temperatury" sciskajac go na przemian w rece (36 stopni) i odkladajac na stol. Roznica temperatur otoczenia i mojej dloni to 13 stopni. Obserwujac 50 cykli naliczylem 13 blednych wskazan.
    3) I jeszcze inne zmiany temperatury. Szklanka z wody o temperaturze 46 stopni, czyli roznica temeratur 23 stopnie. W 50 cykli naliczylem 5 bledow.
    4) Do teraz ochlodzilo sie do 21 stopni w pokoju. Patrze na wyswietlacze a tam krzaki prawie co drugi pomiar (czujnik i uklad lezaly w spokoju). Na 50 cykli naliczylem 18 bledow.

    Nie wiem czy jest w tym jakas zaleznosc. Zrujnuje sie jutro na nowy czujnik i zobacze co z tego wyjdzie ;)

    Grzesiek
  • #9 1322644
    plp
    Poziom 15  
    Posty: 216
    Pomógł: 3
    Ocena: 12
    Witam !

    Chciałbym odnowić temat, trochę stary, ale jakby bez rozwiązania.

    Buduję sterownik do pieca CO. Zastosowałem DS18B20 i miałem podobne problemy z odczytem.
    Wczoraj wypróbowałem program, który wysyła polecenie konwersji temperatury, potem czeka niecałą sekundę i odczytuje dwa pierwsze bajty pamięci zawierające temperaturę, dwa razy. Od czasu do czasu te odczyty się różnią. Dzieje się to głównie wtedy gdy temperatura się zmienia. Jest to problem z transmisją.

    Nowy program odczytuje te dwa bajty pięć razy po konwersji tremperatury i porównuje. Jeśłi nie są identyczne, ignoruje pomiar.

    Jest to metoda, ale nie rozwiązanie. Może ktoś rozwiązał już taki problem.

    Pozdrawiam !

    PL

    Dodano po 1 [minuty]:

    Witam !

    Chciałbym odnowić temat, trochę stary, ale jakby bez rozwiązania.

    Buduję sterownik do pieca CO. Zastosowałem DS18B20 i miałem podobne problemy z odczytem.
    Wczoraj wypróbowałem program, który wysyła polecenie konwersji temperatury, potem czeka niecałą sekundę i odczytuje dwa pierwsze bajty pamięci zawierające temperaturę, dwa razy. Od czasu do czasu te odczyty się różnią. Dzieje się to głównie wtedy gdy temperatura się zmienia. Jest to problem z transmisją.

    Nowy program odczytuje te dwa bajty pięć razy po konwersji tremperatury i porównuje. Jeśłi nie są identyczne, ignoruje pomiar.

    Jest to metoda, ale nie rozwiązanie. Może ktoś rozwiązał już taki problem.

    Pozdrawiam !

    PL
  • #10 1322709
    zatiro
    Poziom 17  
    Posty: 172
    Pomógł: 12
    Ocena: 1
    Witam.
    Miałem podobny problem.
    W moim przypadku pomogło obniżenie napięcia zasilającego kontroler i czujnik DS z 5V do 4,3V. Co do czasu potrzebnego na dokonanie pomiaru temperatury to wystarczy 600ms u mnie tak działa.
  • #11 1322874
    plp
    Poziom 15  
    Posty: 216
    Pomógł: 3
    Ocena: 12
    W help'ie do Bacoma wyczytałem, że ds powinien być zasilany z innego źródła niż procesor.

    Jak to rozumieć ? Wydaje się niedorzeczne.

    Czy wystarczy obniżeć napięcie na ds do 4,3 V ?

    PL
  • #12 1323061
    olekewaagata
    Poziom 25  
    Posty: 638
    Pomógł: 64
    Ocena: 28
    Każda transmisja jest obarczona prawdopodobieństwem pojawienia się błedów i dlatego producent stosuje do kontroli sumę CRC. Jesli ktoś narzeka że ma krzaki zamiast poprawnych danych jest sam sobie winny bo nie stosuje tego co sugeruje producent. Po każdym pełnym odczycie powinno się samemu policzyć CRC i sprawdzić z odebraną z układu. Jeśli są identyczne, transmisja jest poprawna, w przeciwnym wypadku odzytuje się ponownie. Ja rozumiem że policzenie CRC to trochę porąbany algorytm, ale jest w dokumentacji producenta i nie tylko.
    Inna sprawa to to , że jest bardzo dużo błędów odczytu, to wg. mnie jest nienormalne. Ja na dwóch ds18b20 na jednej lini, z odległości 10 m odczytuję procesorem 51 i nie mam żadnych przekłamań.
  • #13 1324120
    zumek
    Poziom 39  
    Posty: 3352
    Pomógł: 695
    Ocena: 52
    A jakich kwarców używacie :?:
    Wewnętrzne procedury 1wire w Bascomie 8051 , napisano dla kwarcu 11059200 i przy innych częstotliwościach taktowania proca występują problemy.

    Piotrek
  • #14 1350516
    higlos
    Poziom 13  
    Posty: 146
    Pomógł: 7
    Ocena: 9
    Czy np podczas procedury wykonywania konwersji temperatury termometru w uC nastapi przerwanie programu glownego i skok do innego popprogramu moga wystapic jakies bledy czy nawet uszkodzenie ?
  • #15 1351073
    elektryk
    Poziom 42  
    Posty: 11029
    Pomógł: 439
    Ocena: 240
    higlos napisał:
    Czy np podczas procedury wykonywania konwersji temperatury termometru w uC nastapi przerwanie programu glownego i skok do innego popprogramu moga wystapic jakies bledy czy nawet uszkodzenie ?
    Nie, ale jeśli przerwanie wystąpi w czasie komunikacji po 1wire to komunkacja może być błędna.
  • #16 1351767
    lechoo
    Poziom 39  
    Posty: 5161
    Pomógł: 377
    Ocena: 545
    Podaję przykładowy algorytm sprawdzania CRC po odczycie z DS1820. Kod zapisany jest w C ale myślę, że nie powinno być problemu z konwersją na bascoma.
    // kody rozkazów dla DS1820
    #define SKIP_ROM        0xCC
    #define READ_SCRATCHPAD 0xBE
    
    unsigned char ds_bufor[9];     // bufor odczytu danych z układu DS1820
    
    // tablica pomocnicza do sprawdzania sumy kontrolnej CRC danych z układu DS1820
    code unsigned char ds_crc_tab[] =
    {
        0, 94,188,226, 97, 63,221,131,194,156,126, 32,163,253, 31, 65,
      157,195, 33,127,252,162, 64, 30, 95,  1,227,189, 62, 96,130,220,
       35,125,159,193, 66, 28,254,160,225,191, 93,  3,128,222, 60, 98,
      190,224,  2, 92,223,129, 99, 61,124, 34,192,158, 29, 67,161,255,
       70, 24,250,164, 39,121,155,197,132,218, 56,102,229,187, 89,  7,
      219,133,103, 57,186,228,  6, 88, 25, 71,165,251,120, 38,196,154,
      101, 59,217,135,  4, 90,184,230,167,249, 27, 69,198,152,122, 36,
      248,166, 68, 26,153,199, 37,123, 58,100,134,216, 91,  5,231,185,
      140,210, 48,110,237,179, 81, 15, 78, 16,242,172, 47,113,147,205,
       17, 79,173,243,112, 46,204,146,211,141,111, 49,178,236, 14, 80,
      175,241, 19, 77,206,144,114, 44,109, 51,209,143, 12, 82,176,238,
       50,108,142,208, 83, 13,239,177,240,174, 76, 18,145,207, 45,115,
      202,148,118, 40,171,245, 23, 73,  8, 86,180,234,105, 55,213,139,
       87,  9,235,181, 54,104,138,212,149,203, 41,119,244,170, 72, 22,
      233,183, 85, 11,136,214, 52,106, 43,117,151,201, 74, 20,246,168,
      116, 42,200,150, 21, 75,169,247,182,232, 10, 84,215,137,107, 53
    };
    
    // --------------------------------------------------------------------
    
      // przyjmujemy, że pomiar został już wcześniej zainicjowany!
    
      unsigned char i, crc;
    
      ds_reset();                 // reset DS1820
    
      ds_write(SKIP_ROM);         // pomiń odczyt ROM
      ds_write(READ_SCRATCHPAD);  // inicjuj odczyt danych z DS1820
    
      for (i=0; i<9; i++)         // powtarzanie (9 bajtów)
      {
        ds_bufor[i] = ds_read();  // odczytaj 9 bajtów z DS1820 do tablicy
      }
    
      ds_reset();                 // reset DS1820
    
      crc=0;                      // sprawdzenie poprawności sumy kontrolnej CRC
      for (i=0; i<9; i++) crc = ds_crc_tab[crc ^ ds_bufor[i]]; 
    
      // jeśli crc==0 to odczyt przebiegł poprawnie.
  • #17 1355920
    higlos
    Poziom 13  
    Posty: 146
    Pomógł: 7
    Ocena: 9
    A czy ktos moglby podac ta wersje programu w jezycu bascom ?
    Pozdraiwam :)
  • #18 1356094
    lechoo
    Poziom 39  
    Posty: 5161
    Pomógł: 377
    Ocena: 545
    Nie znam i nie uzywam bascoma, ale program jest bardzo prosty - są tam 2 pętle wykonywane 9 razy każda i proste operacje na tablicach. Znaczek ^ w języku C to operacja XOR.
  • #19 1359968
    jacur
    Poziom 32  
    Posty: 1748
    Pomógł: 166
    Ocena: 295
    W bascomie to leci mniej wiecej tak :

    If Bd(9) = Crc8(bd(1) , 8) Then ' jezeli 9 bajt odczytany z ds-a (czyli suma kontrolan wysyłana z ds-a) jest równa sumie kontrolnej obliczonej z 8 bajtoów to
    transmisja ok i wyslij dane dalej do obliczenia ' przykład ;)
    else
    pomin odczyt lub inne co komu sie podoba lub pasuje w zaistniałej sytuacji ;)

    a dokładnie to opisuje help do bascoma funkcja CRC8
  • #20 1400169
    chillli
    Poziom 2  
    Posty: 2
    lechoo napisał:
    Podaję przykładowy algorytm sprawdzania CRC po odczycie z DS1820. Kod zapisany jest w C ale myślę, że nie powinno być problemu z konwersją na bascoma.


    a mozesz zamiescic kod w c? ale w calosci?
  • #21 1400316
    jacur
    Poziom 32  
    Posty: 1748
    Pomógł: 166
    Ocena: 295
    Ponizej podaje kod do liczenia CRC w ukladach DS
    pisany w MS Visual C tak dal sprawdzenia czy to hula.
    Dane przykłądowe sa odczytane z układu DS18B20.
    Procedura jest przepisana z książki Mikrokontrolery AVR w praktyce.


    #include <stdio.h>


    unsigned char wynik, *temp;
    unsigned char bufor1w[9];

    unsigned char i, zp,zp1,zp2,j,bajt,*CRC;

    void main(void)
    {
    {

    bufor1w[0]=86;
    bufor1w[1]=1;
    bufor1w[2]=75;
    bufor1w[3]=70;
    bufor1w[4]=127;
    bufor1w[5]=255;
    bufor1w[6]=10;
    bufor1w[7]=16;
    bufor1w[8]=209;

    zp=0;
    for(i=0;i<8;i++)
    {
    bajt = bufor1w[i];
    CRC = &zp;
    zp1=bajt;
    for(j=0;j<8;j++)
    {
    bajt^=*CRC;
    zp2=bajt&0x01;
    bajt=*CRC;
    if(zp2)
    {
    bajt^=0x18;
    }

    bajt=((unsigned char)(bajt)>>1)+0x80*zp2;

    *CRC=bajt;

    zp1=(bajt=zp1>>1);
    }
    }
    zp = *CRC;

    if (zp==bufor1w[8])
    printf("CRC OK %d\n",zp);
    else
    printf("CRC bledne %d\n",zp);

    }
    }
  • #22 1401814
    gotan
    Poziom 12  
    Posty: 19
    Dim Bd(9) As Byte
    Dim Tmp As Integer
    Dim Temp As Byte
    Dim I As Byte
    Dim Crc As Byte
    Dim T As Integer
    Dim T1 As Integer
    Dim T2 As Integer



    Temp:
    1wwrite &HCC
    1wwrite &H44
    Waitms 600
    1wreset
    1wwrite &HCC
    1wwrite &HBE
    Bd(1) = 1wread(9)
    1wreset
    Gosub Suma
    If Crc = 0 Then
    Tmp = Bd(1) And 1
    If Tmp = 1 Then Decr Bd(1)
    T = Makeint(bd(1) , Bd(2))
    T = T * 50 : T = T - 25 : T1 = Bd(8) - Bd(7) : T1 = T1 * 100
    T1 = T1 / Bd(8) : T = T + T1 : T = T / 100
    End If
    Return


    Suma:


    Crc = 0
    For I = 1 To 9
    Temp = Crc Xor Bd(i)
    Crc = Lookup(temp , Crc8)
    Next
    Return


    Crc8:
    Data 0 , 94 , 188 , 226 , 97 , 63 , 221 , 131 , 194 , 156
    Data 126 , 32 , 163 , 253 , 31 , 65 , 157 , 195 , 33 , 127
    Data 252 , 162 , 64 , 30 , 95 , 1 , 227 , 189 , 62 , 96
    Data 130 , 220 , 35 , 125 , 159 , 193 , 66 , 28 , 254 , 160
    Data 225 , 191 , 93 , 3 , 128 , 222 , 60 , 98 , 190 , 224
    Data 2 , 92 , 223 , 129 , 99 , 61 , 124 , 34 , 192 , 158
    Data 29 , 67 , 161 , 255 , 70 , 24 , 250 , 164 , 39 , 121
    Data 155 , 197 , 132 , 218 , 56 , 102 , 229 , 187 , 89 , 7
    Data 219 , 133 , 103 , 57 , 186 , 228 , 6 , 88 , 25 , 71
    Data 165 , 251 , 120 , 38 , 196 , 154 , 101 , 59 , 217 , 135
    Data 4 , 90 , 184 , 230 , 167 , 249 , 27 , 69 , 198 , 152
    Data 122 , 36 , 248 , 166 , 68 , 26 , 153 , 199 , 37 , 123
    Data 58 , 100 , 134 , 216 , 91 , 5 , 231 , 185 , 140 , 210
    Data 48 , 110 , 237 , 179 , 81 , 15 , 78 , 16 , 242 , 172
    Data 47 , 113 , 147 , 205 , 17 , 79 , 173 , 243 , 112 , 46
    Data 204 , 146 , 211 , 141 , 111 , 49 , 178 , 236 , 14 , 80
    Data 175 , 241 , 19 , 77 , 206 , 144 , 114 , 44 , 109 , 51
    Data 209 , 143 , 12 , 82 , 176 , 238 , 50 , 108 , 142 , 208
    Data 83 , 13 , 239 , 177 , 240 , 174 , 76 , 18 , 145 , 207
    Data 45 , 115 , 202 , 148 , 118 , 40 , 171 , 245 , 23 , 73
    Data 8 , 86 , 180 , 234 , 105 , 55 , 213 , 139 , 87 , 9
    Data 235 , 181 , 54 , 104 , 138 , 212 , 149 , 203 , 41 , 119
    Data 244 , 170 , 72 , 22 , 233 , 183 , 85 , 11 , 136 , 214
    Data 52 , 106 , 43 , 117 , 151 , 201 , 74 , 20 , 246 , 168
    Data 116 , 42 , 200 , 150 , 21 , 75 , 169 , 247 , 182 , 232
    Data 10 , 84 , 215 , 137 , 107 , 53


    To jest kod na AVR z obliczaniem sumy kontrolnej.
    Kod jest przetestowany i działa poprawnie, mierzy temperaturę z dokładnością do 1 stopnia.
    W przypadku wykrycia błędu CRC w zmiennej T zachowany zostaje ostatni poprawny pomiar.
  • #23 5073586
    uvesik
    Poziom 10  
    Posty: 35
    Ocena: 1
    Aktualizuje temat, czy komuś działa to crc ?

    Zaimplementowałem ten kod w c++, ale wynik nie daje 0 dla przykładowych danych z pastylki :/
  • #24 5074061
    Zajc3w
    Poziom 14  
    Posty: 104
    Pomógł: 1
    xbaj napisał:
    Ja bym dopisał między linijkami:

    1wwrite &HCC
    1wwrite &HBE


    w 'Czytaj_temp' opoźnienie:

    Waitms 250
    Waitms 250


    Napisałem 2x to samo, bo waitms na maxa przyjmuje tylko 255 a tu należałoby by zrobic opożnienie ok 500ms.
    Spróbuj, może zadziała...


    Maksymalny czas konwersji temperatury trwa 750ms!!!Czytajcie Datasheety LUUDZIE.....
  • #25 5074377
    crazy_phisic
    VIP Zasłużony dla elektroda
    Posty: 2244
    Pomógł: 278
    Ocena: 130
    Wykopaliska. Zamykam.

Podsumowanie tematu

✨ Dyskusja dotyczy problemów z nieprawidłowymi odczytami temperatury z czujnika DS1820 podłączonego do mikrokontrolera AT89C2051, gdzie co drugi pomiar jest błędny, pokazując wartości nierealne (np. 0, powyżej 100°C lub poniżej 0°C). Proponowane rozwiązania obejmują wprowadzenie opóźnień (np. 250-600 ms) po wysłaniu polecenia konwersji temperatury (1wwrite &H44), co jest zgodne z maksymalnym czasem konwersji 750 ms według datasheetu. Zwrócono uwagę na konieczność stosowania rezystora podciągającego (4,7 kΩ lub 2,2 kΩ) oraz podłączenie wszystkich trzech nóżek czujnika do zasilania i masy, aby uniknąć zakłóceń. Wskazano, że przerwania podczas komunikacji 1-wire mogą powodować błędy transmisji. Zalecane jest także sprawdzanie sumy kontrolnej CRC po odczycie danych, co pozwala wykryć i odrzucić błędne pomiary. W dyskusji pojawiły się przykładowe implementacje algorytmu CRC w językach C i Bascom oraz sugestie dotyczące obniżenia napięcia zasilania czujnika i mikrokontrolera (np. z 5 V do 4,3 V) w celu poprawy stabilności odczytów. Podkreślono, że problemy z transmisją pojawiają się głównie przy zmianach temperatury i mogą wynikać z zakłóceń lub wadliwego czujnika. Ostatecznie rekomenduje się stosowanie opóźnień, poprawne okablowanie, kontrolę CRC oraz eliminację przerwań podczas komunikacji 1-wire.
Wygenerowane przez model językowy.
REKLAMA