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

[atmega][winavr]DS18b20 nie działa przy 2 przewodach

pawelvod 09 Lut 2011 20:05 2427 15
REKLAMA
  • #1 9128006
    pawelvod
    Poziom 18  
    Jak w temacie.
    Temperatura prawidłowo się czyta przy 3 przewodach (+3v3 na stałe), natomiast nie chce się czytać przy podłączeniu dwoma. Nie bardzo widzę w dokumentacji żeby był jakiś inny algorytm do 2 przewodów? Wyświetla się natomiast 85C więc odczyt jest prawidłowy tylko nie oznacza temperatury....
    Sprawdziłem i numer seryjny wysyła dobrze (co za tym idzie zapis komend też rozumie). Nie bardzo wiem w jakim stanie zostawić magistralę go podczas odczytywania temperatury? +3v3 z mikrokontrolera czy może wysoki opór(mikrokontrolera) i tylko ten opornik z dokumentacji 4k7... a może masa:)?
  • REKLAMA
  • #2 9128062
    asembler
    Poziom 32  
    Czyli znowu ciemne okulary.
    Trzeba odczekac ąz łony czujnik skończy przetwarzanie.
  • REKLAMA
  • #4 9128126
    asembler
    Poziom 32  
    kozak_sc napisał:
    Ja przy 3,3V też miałem problem. Pomaga tylko podłączenie na 3 przewodach albo wstawienie ekstremalnie małego opornika podciągającego który po czasie powoduje zjaranie DS-a.

    To musiałes bardzo zle trafic faktycznie DS przestają działać przy 2 przewodach coś koło 2.4 do 2.7 a przy zasilanieu 3 przewodami to sie znacznie obniża cos koło 2.1 2.2V.
  • #5 9128215
    pawelvod
    Poziom 18  
    dałem 4x 4k7 w szeregu i żadnej zmiany... Tak jak napisałem wyżej (edytowałem post w trakcie). Czyta numer seryjny na 2 kablach bez problemu a temp nie chce.
    Co do czekania czekam w ten sposób:
    uint8_t therm_read_bit(void){
    	uint8_t bit=0;
    	//Pull line low for 1uS
    	THERM_LOW();
    	THERM_OUTPUT_MODE();
    	therm_delay(us(1));
    	//Release line and wait for 14uS
    	THERM_INPUT_MODE();
    	therm_delay(us(14));
    	//Read line value
    	if(THERM_PIN&(1<<THERM_DQ)) bit=1;
    	//Wait for 45uS to end and return read value
    	therm_delay(us(45));
    	return bit;
    }

    i while do kompletu
  • REKLAMA
  • #6 9128260
    asembler
    Poziom 32  
    Czyli program zły skoro czyta cokolwiek to mamy do wyeliminowania napiecia natęzenia opornosci .. Trzeba poprowic program.
  • #7 9128393
    pawelvod
    Poziom 18  
    ok znalazłem... teraz jeszcze zaimplementować:
    Cytat:
    If the DS18B20 is powered by an external supply, the master can issue “read time slots” (see the
    1-Wire Bus System section) after the Convert T command and the DS18B20 will respond by transmitting
    0 while the temperature conversion is in progress and 1 when the conversion is done. If the DS18B20 is
    powered with parasite power, this notification technique cannot be used since the bus must be pulled high
    by a strong pullup during the entire temperature conversion. The bus requirements for parasite power are
    explained in detail in the Powering the DS18B20 section.
    [/tex]
  • #8 9128418
    asembler
    Poziom 32  
    Ok teraz wystarczy w zalezności od wybranej rozdzielczosci odpowiednio odczekac i juz.
  • #9 9128677
    pawelvod
    Poziom 18  
    No i dalej nie dziła:(
    Kod który powinien już chodzić:
    therm_reset();
    //therm_write_byte(THERM_CMD_READROM);
    therm_write_byte(THERM_CMD_SKIPROM);
    therm_write_byte(THERM_CMD_CONVERTTEMP);
    //Wait until conversion is complete
    //while(!therm_read_bit());
    THERM_HIGH();
    THERM_OUTPUT_MODE();
    therm_delay(us(850));
    //Reset, skip ROM and send command to read Scratchpad
    therm_reset();
    therm_write_byte(THERM_CMD_SKIPROM);
    therm_write_byte(THERM_CMD_RSCRATCHPAD);
    //Read Scratchpad (only 2 first bytes)
    temperature = therm_read_byte();
    temperature += (therm_read_byte()<<8);
    therm_reset();
  • REKLAMA
  • #11 9128711
    pawelvod
    Poziom 18  
    No właśnie nie chodzi. Tzn chodzi na 3 kablach:). W dokumentacji oni podciągają napięcie tranzystorem sterowanym osobną nogą mikrokontrolera.
    Może tak spróbuję zaraz... Puki co wystawiam poprostu stan wysoki na czas czytania.
  • #12 9129901
    flapo213
    Poziom 21  
    Witaj,

    Na początku powiem że to wykonalen i to na AVR.

    Niestety podczas konfiguracji również napotkałem kilka problemów. Opiszę po krótce co i jak.

    W dokumentacji technicznej masz opisane co i jak powinno być zrobione w trybie parasite power tzn.

    1. Podłączyć pin zasilania do masy (o ile dobrze pamiętam)

    2. Teraz najważniejsze najbardziej prądożerną komendą dla układu czujnika temperatury jest konwersja temperatury czyli po wydaniu komendy convert chyba 0x44 musisz w bardzo szybkim czasie przełączyć pin DO na Pushpull czyli poprostu zasilić układ.

    3. Następnie w zależności od wybranej rozdzielczości należy odczekać wymaganą liczbę ms aż układ skończy kowertować temperaturę. Wszystkie czasy jak również parametry elektryczne znajdziesz w dokumentacji technicznej układu.

    4. Przestroga - podpwiem Ci że w przypadku AVR ma znaczenie procedura przekonfigurowywania portu tzn kolejność wywoływania instrukcji DDRx PORTx, która powinna być pierwsza to już nie pamiętam ale miało to duże znaczenie taka drobna rzecz która ujawniła się przy większych temperaturach.

    Jak już kompletnie nie dasz rady to mogę Ci podesłać procedury co i jak.

    Pozdrawiam
  • #13 9130263
    pawelvod
    Poziom 18  
    Nie działą dalej:(. Wyraźnie brakuje prądu podczas konwersji temperatury i wstawia wartość domyślną. Znalazłem jeszcze w dokumentacji coś takiego:
    However, when the DS18B20 is performing
    temperature conversions or copying data from the scratchpad memory to EEPROM, the operating current
    can be as high as 1.5mA. This current can cause an unacceptable voltage drop across the weak 1-Wire
    pullup resistor and is more current than can be supplied by CPP. To assure that the DS18B20 has sufficient
    supply current, it is necessary to provide a strong pullup on the 1-Wire bus whenever temperature
    conversions are taking place or data is being copied from the scratchpad to EEPROM. This can be
    accomplished by using a MOSFET to pull the bus directly to the rail as shown in Figure 4. The 1-Wire
    bus must be switched to the strong pullup within 10μs (max) after a Convert T [44h] or Copy Scratchpad
    [48h] command is issued, and the bus must be held high by the pullup for the duration of the conversion
    (tCONV) or data transfer (tWR = 10ms). No other activity can take place on the 1-Wire bus while the pullup
    is enabled.

    Ja to rozumiem tak:
    po komendzie 44 ustawić magistralę 10us najpuźniej na +5V i trzymać tak 750us..
    Mój kod dokładnie to robi i nic. Ale jakby ktoś spojrzał bo po dłuższym czasie wpatrywania się w to samo ślepy człowiek się robi. Co do kolejności to wydaje się logiczna najpierw ustawić Hi, a potem podciągnąć napięcie, bo jakby odwrotnie zrobić to dallas mógłby dostawać ujemny ping. Kod:

    therm_reset();
    //therm_write_byte(THERM_CMD_READROM);
    therm_write_byte(THERM_CMD_SKIPROM);
    therm_write_byte(THERM_CMD_CONVERTTEMP);
    //Wait until conversion is complete
    //while(!therm_read_bit());
    THERM_HIGH();
    THERM_OUTPUT_MODE();
    therm_delay(us(750));
    //Reset, skip ROM and send command to read Scratchpad
    therm_reset();
    therm_write_byte(THERM_CMD_SKIPROM);
    therm_write_byte(THERM_CMD_RSCRATCHPAD);
    //Read Scratchpad (only 2 first bytes)
    temperature = therm_read_byte();
    temperature += (therm_read_byte()<<8);
    therm_reset();

    jeszcze to dorzuce, ale tutaj raczej się nie pomyliłem:
    /* Thermometer Connections */
    #define THERM_PORT PORTB
    #define THERM_DDR DDRB
    #define THERM_PIN PINB
    #define THERM_DQ PB0
    
    /* Utils */
    #define THERM_INPUT_MODE() THERM_DDR&=~(1<<THERM_DQ)
    #define THERM_OUTPUT_MODE() THERM_DDR|=(1<<THERM_DQ)
    #define THERM_LOW() THERM_PORT&=~(1<<THERM_DQ)
    #define THERM_HIGH() THERM_PORT|=(1<<THERM_DQ)
  • Pomocny post
    #14 9132625
    hose2
    Poziom 17  
    Witam,

    pawelvod napisał:
    Nie działą dalej:(
    The 1-Wire
    bus must be switched to the strong pullup within 10μs (max) after a Convert T [44h] or Copy Scratchpad
    [48h] command is issued, and the bus must be held high by the pullup for the duration of the conversion
    (tCONV) or data transfer (tWR = 10ms). No other activity can take place on the 1-Wire bus while the pullup
    is enabled.

    Ja to rozumiem tak:
    po komendzie 44 ustawić magistralę 10us najpuźniej na +5V i trzymać tak 750us..
    Mój kod dokładnie to robi i nic.

    Niedokładnie to robi, bo masz czekać tCONV czyli ok. 750ms (MILISEKUND)

    Pozdrawiam
  • #15 9134783
    pawelvod
    Poziom 18  
    Heh. Dokładnie tak jak pisałem. Jak się za długo kawałek kodu rzeźbi to się ślepnie:).
    Nawet jak przeczytałem twój post hose2 to myślę sobie "o co mu chodzi? przecież jest 750". Zamieniłem:
    therm_delay(us(750));


    for (i=0 ;i<1000; i++){
    	therm_delay(us(750));
    }

    i wszystko śmiga jak trzeba. Dzięki.
    Ale sam błąd wredny bo czytasz notę katalogową, odtwarzasz wszystkie czasy w mikrosekundach (kilkadziesiąt razy w różnych miejscach), a tylko jeden czas jest 3 rzędy wielkości dłuższy. Aż prosi się żeby tam się pomylić.
  • #16 9162255
    Radkoo
    Poziom 12  
    Witam

    flapo213 napisał:
    Witaj,

    4. Przestroga - podpwiem Ci że w przypadku AVR ma znaczenie procedura przekonfigurowywania portu tzn kolejność wywoływania instrukcji DDRx PORTx, która powinna być pierwsza to już nie pamiętam ale miało to duże znaczenie taka drobna rzecz która ujawniła się przy większych temperaturach.



    Czy możesz przybliżyć jakie były tego objawy - być może mam to samo i muszę to zdiagnozować. Chodzi mi np. o poziomy wskazywanej temperatury, powtarzalność etc.

    Pozdrawiam
REKLAMA