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

[ATmega8][C]Inicjalizacja DS18B20 - brak PRESENCE

rozumek 25 Paź 2008 18:06 1907 7
  • #1 5666974
    rozumek
    Poziom 10  
    Witam

    Mam problem z inicjalizacja czujnika DS18B20. Chciałem sam napisac inicjalizacje czujnika DS18B20 na podstawie noty jego katalogowej. Mam problem z czujnikiem bo nie zgłasza mi on swojej dostępnosci i albo mam problem z kodem albo z czujnikiem.
    Prosiłbym aby ktos mi powiedzial czy kod jest prawidłowy:

    
    uchar init_DS18B20(void)
    {
     uchar presence = 0;
     
     _1_WIRE_DIR |= _BV(_1_WIRE);            //---ustawienie magistrali w trybie send
     _1_WIRE_OUT &= ~_BV(_1_WIRE);           //--- wysłanie sygnalu reset
     _delay_us(480);
     
     _1_WIRE_DIR &= ~_BV(_1_WIRE);          //--- ustawienie magistrali w trybie receive   
     
     _delay_us(60);                           //--- DS18B20 czeka do 60 us i ustawia 1_wire na 0 
     
     
     if(!(_1_WIRE_IN & _BV(_1_WIRE)))         //--- jesli wykryto ze 1_wire jest 0 zapala diode i ustawia sygnał "obecnosci"
     {
      PORTC &= ~_BV(PRESENCE);
      presence = 1;  //--- sprawdzenie czy wystapił sygnał dopstepnosci DS18B20
     }
     _delay_us(240);
     return presence;
    }
    


    Funkcja działa w ten sposób ze kiedy wykryje na 1_WIRE 0 zapala diode która sygnalizuje o dostępnosci. Czy cos zle rozumiem jesli chodzi o inicjalizacje?

    By wszystko bylo jasne:
    
    #define _1_WIRE_IN PINC
    #define _1_WIRE_OUT PORTC
    #define _1_WIRE_DIR DDRC
    #define _1_WIRE 0
    #define PRESENCE 5
    


    Bardzo uprzejmie prosze o rade

    Poprawiłem tytuł - regulamin p.11.1
    [zumek]
  • #2 5671368
    rozumek
    Poziom 10  
    dodam jeszcze ze przeprowadziłem symulacje w AVRStudio i wg tego kod powinien działac, wiec osobicie podejrzewam ze cos moze byc nie tak z czujnikiem.

    Czy mozecie mi cos doradzic?
  • #3 5671441
    dawid512
    Poziom 32  
    PCB sprawdzone?
    4k7 jest na lini danych?
    100nF przy uc?

    Spróbuj pokombinować z czasami tych impulsów, DS bardzo nie lubi gdy one sa za krotnie lub za długie. Po za tym tutaj:
    _1_WIRE_DIR &= ~_BV(_1_WIRE);          //--- ustawienie magistrali w trybie receive 

    Owszem zmieniasz DDRC ale nie zapomniałeś czasem o czymś? Podpowiem ci:
    _1_WIRE_OUT |= _BV(_1_WIRE);
    Mam nadzieje że wiesz o co chodzi.
  • #4 5671591
    zumek
    Poziom 39  
    dawid512 napisał:
    ..Owszem zmieniasz DDRC ale nie zapomniałeś czasem o czymś? Podpowiem ci:
    _1_WIRE_OUT |= _BV(_1_WIRE);
    Mam nadzieje że wiesz o co chodzi.

    A po co włączać wewnętrzny pull-up , skoro jest zewnętrzny :?:
    Ponieważ magistrala 1wire jest typu "open-drain" , to do komunikacji , wystarczy "manipulacja" kierunkiem portu , bez włączania wewnętrznego R.

    rozumek
    Spróbuj w tym miejscu poczekać 120uS ,
    
    _delay_us(60);                           //--- DS18B20 czeka do 60 us i ustawia 1_wire na 0 

    albo próbkować magistrale kilkakrotnie , co np. 20uS.

    Piotrek
  • #5 5672577
    rozumek
    Poziom 10  
    Czy problem moze stac po stronie czasów opóźnien?

    A co da próbkowanie magistrali kilkukrotnie?

    Normalnie loteria:|, myslalem ze idąc zgodnie z nota katalogowa bedzie ok, ale widac trzeba kombinowac, (normalnie jak z siecią neuronowa;p).

    A poza tym kod jest ok? Dodam ze robiłe to wg noty katalogowej i porównywałem z kodem który znalazłem na forum.

    Sprawdziłem działanie z innymi czasami, ale nie ma odzewu:( wychodzi na to ze DS18B20 dalej nie wysyła sygnału obecnosci, na dniach kupie nowy czujnik, moze ten był felerny.

    Dodano po 1 [godziny] 2 [minuty]:

    Przyszło mi cos do głowy, czy czestotliwosc taktowania zegara ma tutaj znacznie? bo ja mam ATmega8 taktowany zegarem 1MHz, czy to moze miec wpływ na zachowanie czujnika?
  • #6 5673059
    dawid512
    Poziom 32  
    Może jeśli nie podałeś że jest to 1MHz w avrstudio lub w make-u. Wtedy opóźnienia z util/delay.h będą niepoprawne.
  • #7 5673240
    rozumek
    Poziom 10  
    Ja używam AvrSide w połaczeniu z AvrStudio, nie wiem o co chodzi z plikami "make", ale wiem ze sa w WinAvr. W ustawieniach AvrSide ustawiłem 1 MHz, ale wyglada na to ze nic to nie zmieniło w moim zyciu.

    A ten 1 MHz mam jeszcze fabrycznie ustawiony bo nie chciałem sie na razie bawic fuse-bitami.

    Ale z tego co widziałem z normalnego działania innych moim programów to wykorzystując funckje _delay_ms(1000) działanie było prawidłowe, wiec sądze ze jej odpowiednik z mikrosekundami tez raczej działa.

    Zastanawiam sie jeszcze czy czujnik nie jest walnięty, czy jest jakis sposób by go sprawdzic?

    Juz ogólnie nie wiem co robic:cry:

    Z działania programu wiem jedno, albo cos jest nie tak z czujnikie ze sie nie zgłasza, albo nie łapie sygnału reset z "mastera", w ostatnich probach co sie takze skonczyly niepowodzeniem próbowalem 500 a nawet 1000 us.

    Dodano po 3 [godziny] 53 [minuty]:

    Z ostatniej chwili :D
    Przetestowałem kilka (konkretnie 2) funkcji resetujących, co znalazłem na forum (wg autorów powinnybyły działac...) Coraz bardziej skłaniam sie do wniosku ze problem jest jednak z czujnikiem, na dniach skocze sobie kupic nowy, chyba ze ktos miał taki problem... jestem pewny ze rezystor podciaga magistrale na stan wysoki, bo sprawdzilem.

    Co robic dalej?

    Dodano po 9 [minuty]:

    A powiedzcie mi jeszcze, czy zasilanie nie w trybie parasite, wymaga podłączenia do zewnetrznego zr zasilania do DS18B20, to chodzi tu o +5V co mam dostepne na plytce. Bo niby w nocie katalogowej pisze ze ze te zasilania nie sa sobie równe, i wpadłem w małe zakłopotanie.

    Prosze o pomoc takze w tej sprawie :D

    [ATmega8][C]Inicjalizacja DS18B20 - brak PRESENCE

    czy Vcc ==Vdd?
  • #8 5679378
    rozumek
    Poziom 10  
    Przy okazji, miałbym do kogos wielka prosbe by przetestował moją funkcje inicjalizacyjną, czy działa, bo chciałbym wiedziec po ktorej stronie tkwi problem.

    Bede wielce zobowiązny za opinie i jesli to cos da zrobie uzytek z tych punktów i je ofiaruje.

    BARDZO PROSZE O POMOC :!:
REKLAMA