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

DS18B20. Odczyt temperatury. Jak rozwiązać pojawiający się brak pomiaru?

HIOB 07 Mar 2006 00:10 2919 12
REKLAMA
  • #1 2383928
    HIOB
    Poziom 17  
    Posty: 222
    Pomógł: 23
    Ocena: 1
    WITAM!

    MAM SZYBKIE PYTANIA:

    CZY PRZY ODCZYCIE TEMP. Z DS18B20 TEZ CO KTORYS POMIAR MACIE 85 ST. (CZYLI BRAK POMIARU)?? DA SIE TO JAKOS WYELIMINOWAC (WYDLUZANIE CZASU KONWERSJI NIE POMAGA) - NIE CHODZI MI O ROZWIAZANIE TYPU "IF(TEMP!=85)......"??

    Z GORY DZIEKUJE I POZDRAWIAM!
  • REKLAMA
  • #2 2384040
    Karollo_82
    Poziom 15  
    Posty: 181
    Pomógł: 4
    Ocena: 7
    U mnie jest taki pomiar jak włączam zasilanie - pierwszy pomiar, potem jest już ok, ale nie wiem dlaczego tak sie dzieje.
  • REKLAMA
  • #3 2384153
    mikrorem
    Poziom 12  
    Posty: 30
    Pomógł: 2
    Ocena: 1
    Przydał by sie jakiś kod bo z czego mozna wrozyc? z fusow?

    Najprawdopodobniej masz błąd w kodzie.
    DS ma czas konwersji temperatury i w tym czasie musisz czekac.
    Czekam na wiecej danych.
    pozdrawiam.
  • #4 2384173
    maxiu25
    Poziom 16  
    Posty: 190
    Pomógł: 16
    Ocena: 3
    sprobuj zmniejszyc czas 1us przy odczycie moze pomoze
  • #5 2384436
    GienekS
    Poziom 32  
    Posty: 1971
    Pomógł: 139
    Ocena: 15
    W czym programujesz ?
    Jaki masz sposób zasilania DS18b20 ?
  • Pomocny post
    #6 2384525
    marekos
    Poziom 16  
    Posty: 140
    Pomógł: 14
    Ocena: 4
    85 ST jest wartością domyślną wpisaną do rejestru w którym przy kolejnych konwersjach DS wpisuje już zmierzoną temp i przy pierwszym pomiarze zawsze taka liczbę odczyta. Może gdzieś nie łączą przewody i czujnik traci na chwile zasilanie i wpisuje to wartość domyślną.
  • REKLAMA
  • #7 2385973
    kamil1807
    Poziom 12  
    Posty: 11
    Jak dla mnie to sprawdz czasy przy komunikacji (rozumiem że to 1-Wire).
  • #8 2386632
    HIOB
    Poziom 17  
    Posty: 222
    Pomógł: 23
    Ocena: 1
    WITAM!

    MOZE ODPOWIEM W KOLEJNOSCI:
    "Mikrorem": JESTEM PEWNY ZE BLEDU NIE MA... ODCZYTUJE CALA PAMIEC SCRATCHPAD ORAZ EEPROM - WYSWIETLAM JE NA LCD I WSZYSTKO JEST OK! RACJA, ZE CZAS KONWERSJI MOZE NIE BYC DOKLADNY... JEDNAK DOBRALEM GO (METODA PROB I BLEDOW) TAK, ZE NAJRZADZIEJ WYSTEPUJE BRAK POMIARU - 85ST.

    PROCEDURY OPOZNIEN:
    static void Opoznienie(unsigned int opoznienie)
    {
    do
    {
    asm("nop");
    }

    while(--opoznienie != 0);
    }

    static void Opoznienie_ms(unsigned int opoznienie)
    {
    unsigned int i;

    for(; opoznienie>0; --opoznienie)
    {
    for(i=0; i<40000; i++)
    {
    }
    }
    }


    OPOZNIENIE PO POLECENIU KONWERSJI: Opoznienie_ms(300);


    "Maxiu25": TU JEST MALY PROBLEM :) JAKO ZE WYKORZYSTUJE WEW. UKLAD RC MAX CZEST. MOJEGO UKLADU TO 1MHZ.... OPOZNIENIE ROWNE 1us GENERUJE TAK:

    ONE_WIRE_WY_L; //JEDEN ROZKAZ = JEDEN TAKT = 1us DLA 1MHZ
    ONE_WIRE_WE;



    "GienekS": PROGRAMUJE W C, ZASILANIE - PODCIAGANIE REZYSTOREM 4,7k. W NOCIE JEST NAPISANE ZEBY WYKORZYSTAC DODATKOWY TRANZYSTOR PODCIAGAJACY ZALACZANY NA 10us PO POCECENIU KONWERSJI... ALE SKORO TO MA BYC 1-WIRE TO ONE-WIRE!!


    "Marekos": UKLAD WSADZILEM W PIN ZENSKI (1X3PIN) JAK TYLKO SKONCZE PISAC POSTA SPRAWDZE CZY BEZPOSREDNIE PRZYLUTOWANIE COS ZMIENILO...


    "Kamil1807": TAK 1-WIRE... SA 2 CZASY CO DO KTORYCH NIE MAM PEWNOSCI: PIERWSZY TUZ PO POLECENIU KONWERSJI Opoznienie_ms(300); DRUGI: ONE_WIRE_WY_L; ONE_WIRE_WE; O OBU WSPOMNIALEM WCZESNIEJ.


    GDYBY COS SIE ZMIENILO DAM ZNAC!

    DZIEKUJE WSZYSTKIM ZA ODPOWIEDZI I PROSZE O DALSZE WSKAZOWKI!
    POZDRAWIAM!

    Dodano po 31 [minuty]:

    BEZPOSREDNIE PRZYLUTOWANIE NOZEK NIEMAL CALKOWICIE WYELIMINOWALO PROBLEM! :) PRZEZ 5 MINUT MOZE ZE 2 RAZY WYSKOCZYL POMIAR 85ST., A TO MNIE W ZUPELNOSCI ZADOWALA!

    CHOC GDYBY I TO BYLO WASZYM ZDANIEM ZA CZESTO PROSZE O DALSZE SUGESTIE!

    BARDZO DIEKUJE WSZYSTKIM ZA POMOC!
    POZDRAWIAM!
    Moderowany przez Light-I:

    Nie pisz z użyciem Caps Lock - kolejny raz to samo, dostajesz ostrzeżenie nr 4 za to samo, jeszcze jedno i konto bedzie zablokowane.

  • #9 2387615
    M. S.
    Poziom 34  
    Posty: 2107
    Pomógł: 259
    Ocena: 680
    Mam przed sobą termometr i program napisany w Bascomie oraz podobny w C. U mnie nie wystąpił odczyt 85'C. Wynika to pewnie z doprowadzenia do czujnika zasilania osobnym przewodem. Co dwa druty to nie jeden.

    A i jeszcze dla porzadku. Strasznie głośno piszesz (tzn. dużymi literami).
  • #10 2532254
    maly35
    Poziom 14  
    Posty: 91
    Pomógł: 6
    Ocena: 2
    Właśnie zacząłem się bawić DS18B20 i u mnie też występuje 85, z tym że cały czas - czy szukać błędu w programie czy raczej w podłączeniu?

    Kod:

    void Read_Temperature(void)
    {
    	char tmp[10];
    	char temp_lsbyte,temp_msbyte;
    	char buffer[4]="    ";
    	int k,i;
    
    	
    	
    	//LCD_clr();
    /*	write_byte(0x4E);
    		write_byte(0x05);
    		write_byte(0x50);
    		write_byte(0x1F);*/
    	if(ow_reset()) {LCD_xy(0,0); write_text("cisza");}
    	else
    	{
    		write_byte(0xCC); //Skip ROM
    		write_byte(0x44); // Start Conversion
    		_delay_loop_1(255);
    		_delay_loop_1(50);	//wyjdzie ok 950us
    		ow_reset();
    		write_byte(0xCC); // Skip ROM
    		write_byte(0xBE); // Read Scratch Pad
    		
    		ds.nds[0]=read_byte();
       		ds.nds[1]=read_byte();
       		itoa(ds.tds/16,buf,10);//temper. całkowita
       		write_text(buf);
    	}	
  • #11 2532546
    M. S.
    Poziom 34  
    Posty: 2107
    Pomógł: 259
    Ocena: 680
    Z opisu w programie wynika, że opóźnienie w programie pomiędzy konwersją a odczytem wynosi 950us. Nie wiem czy to błąd czy powód. Gdyby było to 950ms to byłobu dobrze.
  • REKLAMA
  • #12 2532917
    polik80
    Poziom 14  
    Posty: 85
    Pomógł: 6
    Ocena: 1
    Wartość temperatury 85st.C znajduje się w rejestrach po włączeniu zasilania układu więc albo ginie ci napięcie na zasilaniu jeśli podłączyłeś układ 3 przewodowo lub jeśli układ podłączyłeś 2 przewodowo masz zbyt krótki czas zwłoki między pomiarami 950us to stanowczo zbyt krótko żeby 950ms powinno wystarczyć.
    jeśli układ zasilasz z lini czyli 2 przewodowo to Vdd musisz obowiązkowo podłączyć do GND natomiast wyjście DATA układu przez opornik 4k7 do Vcc. gdy zasilasz zewnętrznie to (3 przewodowo) to Vdd podłączasz do Vcc a DATA do pinu procka i Przez opornik 4k7 do Vcc.
    to powinno wystarczyć.
  • #13 2533401
    maly35
    Poziom 14  
    Posty: 91
    Pomógł: 6
    Ocena: 2
    Oczywiscie czas byl zły. Nie wiem czemu ubsdurałem sobie ze to ma być w us. Zmienilem czas na ms i teraz działa dobrze:) Dzieki za pomoc

Podsumowanie tematu

✨ Problem pojawiającego się odczytu temperatury 85°C z czujnika DS18B20 jest związany z wartością domyślną zapisaną w rejestrze po włączeniu zasilania, która oznacza brak aktualnego pomiaru. Najczęściej pierwszy odczyt po zasileniu zwraca 85°C, a kolejne pomiary są poprawne. Przyczyną może być chwilowa utrata zasilania lub zbyt krótki czas oczekiwania na zakończenie konwersji temperatury. W przypadku zasilania 2-przewodowego (parasite power) konieczne jest odpowiednie podłączenie linii Vdd do GND oraz rezystora podciągającego 4,7 kΩ na linii DATA do Vcc. Przy zasilaniu 3-przewodowym Vdd powinno być podłączone do Vcc, a linia DATA do mikrokontrolera z rezystorem 4,7 kΩ do Vcc. Czas oczekiwania na konwersję powinien wynosić około 750 ms lub więcej, a nie mikrosekundy (np. 950 µs jest zbyt krótkie). Wskazane jest stosowanie opóźnień rzędu setek milisekund między rozpoczęciem konwersji a odczytem danych. Problem nie wynika z błędów w kodzie, jeśli odczyt pamięci scratchpad i EEPROM jest poprawny. Zaleca się sprawdzenie stabilności zasilania i poprawności czasów komunikacji w protokole 1-Wire.
Wygenerowane przez model językowy.
REKLAMA