Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

Atmega8 - Działanie rezystora podciągającego na przykładzie 1-wire, DS18B20

docencior 20 Wrz 2012 01:17 3186 6
  • #1 20 Wrz 2012 01:17
    docencior
    Poziom 10  

    Witam,

    Zacznę od tego, że jestem początkujący jeśli chodzi o mikrokontrolery i elektronikę dlatego proszę was o łopatologiczne wytłumaczenie działania rezystorów podciągających na podanym przeze mnie przykładzie bo to co do tej pory przeczytałem w internecie jakoś do mnie nie dociera.

    Układ jest prosty mikrokontroler -> termometr DS18B20 połączony linią podciągniętą do napięcia 5V poprzez rezystor 5kohm.

    Cytat z obsługi termometru poprzez 1-wire

    Cytat:
    Każda transmisja rozpoczyna się sekwencją inicjalizacyjną zawierającą impuls resetu RESET
    PULSE wysyłany z Mastera, po którym następuje impuls „przedstawienia się” PRESENCE
    PULSE wysyłany przez układ DS18B20. W momencie kiedy DS18B20 wysyła PRESENCE PULSE
    w odpowiedzi na reset, sygnalizuje to układowi Master, że DS jest gotowy do obsługi.
    Podczaj sekwencji inicjalizacji, Master wysyła reset przez ustawienie linii danych w stan niski
    przez minimum 480µs. Po tym zabiegu Master zwalnia magistralę i przechodzi w tryb
    odbiornika. Kiedy magistrala jest zwolniona, rezystor 5kΩ podciąga linie 1-Wire do stanu
    wysokiego. Kiedy DS18B20 wykryje narastające zbocze, odczeka 15 - 60µs a następnie wyśle
    impuls PRESENCE PULSE, poprzez ustawienie magistrali w stanie niskim przez 60 - 240µs.


    oraz sam kod w C do tego cytatu

    Code:
    #define WE 0
    
    #define PORT_1Wire PIND
    #define SET_WIRE DDRD&=~_BV(WE)
    #define CLEAR_1Wire DDR|=_BV(WE)

    unsigned char RESET_PULSE(void)
    {
    unsigned char presence;
    CLEAR_1Wire;
    delayus(500);
    SET_1WIRE
    delayus(30);
    if (bit_is_clear(PORT_1Wire, WE)) {presence=1;} else {presence=0;}
    delayus(470);
    if (bit_is_set(PORT_1Wire, WE)) {presence=1;} else {presence=0;}
    return presence;
    }


    A więc według opisu początek programu to ustawienie przez mikrokontroler linii w stan niski, za pomocą DDR|=_BV(WE). To chyba rozumiem, pin w mikrokontrolerze jest wyjściem o napięciu na wyjściu o wartości 0V.
    Po 500us mikrokontroler zmienia stan pinu z wyjścia 0V na wejście i wtedy rezystor 1-wire podciąga linię do stanu wysokiego. Jak on to robi? Ja to rozumiem tak, że mamy zasilanie 5V, które jest połączone rezystorem 5kohm z ziemią (pinem mikrokontrolera), według mnie na pinie napięcie będzie niskie bo te 5V odłoży się na rezystorze...
    Następnie odczekujemy 30us i mikrokontroler 'odsłuchuje' czy linia nie jest w stanie niskim dzięki DS18B20.
    Później po 470u sprawdzamy czy znów linia nie jest w stanie wysokim 'dzięki' rezystorowi podciągającemu...

    Byłbym bardzo wdzięczny za pomoc i korekty w moim rozumowaniu.

    0 6
  • #2 20 Wrz 2012 01:31
    stanleysts
    Poziom 27  

    Cytat:
    Po 500us mikrokontroler zmienia stan pinu z wyjścia 0V na wejście i wtedy rezystor 1-wire podciąga linię do stanu wysokiego.
    Jak zmieniasz stan z wyjścia na wejscie to wejście nie jest już masą, tylko jest w stanie wysokiej impedancji i ten rezystor wymusza na nim stan wysoki.

    0
  • #3 20 Wrz 2012 10:31
    docencior
    Poziom 10  

    stanleysts napisał:
    Jak zmieniasz stan z wyjścia na wejscie to wejście nie jest już masą, tylko jest w stanie wysokiej impedancji i ten rezystor wymusza na nim stan wysoki.


    W takim razie ja to widzę tak. Jest linia średniego napięcia DC 5kV, na środku przewodu między słupami wisi długi rezystor o wartości 5Mohm jedną końcówką zaczepiony o linię a drugą o linię 1-wire, podłączoną do pinu mikrokontrolera. Jeśli pin jest w stanie wysokiej impedancji (czyli w sumie tak jakby go nie było) to na linie 1-wire nie podłączonej do niczego pojawia się napięcie 5kVDC? W jaki sposób?

    0
  • #4 20 Wrz 2012 10:35
    stanleysts
    Poziom 27  

    Jak (1 wire) nie podłączonej do niczego, jak podłączonej przez rezystor do linii napięcia.

    0
  • #5 20 Wrz 2012 10:42
    gaskoin
    Poziom 38  

    Przecież jest połączenie master - slave i pośrodku tego połączenia jest pullup. Jak odetniesz mastera, to zostaje slave z rezystorem...

    0
  • #6 20 Wrz 2012 10:56
    pawel_mr
    Poziom 14  

    stanleysts napisał:
    W takim razie ja to widzę tak. Jest linia średniego napięcia DC 5kV, na środku przewodu między słupami wisi długi rezystor o wartości 5Mohm jedną końcówką zaczepiony o linię a drugą o linię 1-wire, podłączoną do pinu mikrokontrolera. Jeśli pin jest w stanie wysokiej impedancji (czyli w sumie tak jakby go nie było) to na linie 1-wire nie podłączonej do niczego pojawia się napięcie 5kVDC? W jaki sposób?

    Po co mieszasz w to napięcia rzędu kV? Zaraz będzie dyskusja, że trzeba uwzględnić rezystancję izolacji, powietrza i Twoich wkładek do butów.:-)
    Jeśli pin jest w stanie wysokiej impedancji to znaczy, że ma impedancję rządu mega, giga omów. W tym wypadku rezystor podciągający podłączony jest do +5V, następnie szeregowo z tą impedancją do masy układu. Mierząc napięcie między masą a pinem pojawi się całe 5V bo przy szeregowym połączeniu 5kohm i np. 100Mohm napięcie odłoży się proporcjonalnie do rezystancji czyli praktycznie całe na pinie mikrokontrolera.
    Pamiętaj, że napięcie to różnica potencjałów więc mierzysz je między np. masą a pinem procka.
    Rezystory podciągające nie powinny mieć rezystancji porównywalnej z "wysoką impedancją" pinu procka bo będą cyrki, dlatego zazwyczaj stosuje się kilka, kilkadziesiąt kiloomów a nie megaomów.

    0
  • #7 20 Wrz 2012 11:08
    docencior
    Poziom 10  

    pawel_mr napisał:

    Jeśli pin jest w stanie wysokiej impedancji to znaczy, że ma impedancję rządu mega, giga omów. W tym wypadku rezystor podciągający podłączony jest do +5V, następnie szeregowo z tą impedancją do masy układu. Mierząc napięcie między masą a pinem pojawi się całe 5V bo przy szeregowym połączeniu 5kohm i np. 100Mohm napięcie odłoży się proporcjonalnie do rezystancji czyli praktycznie całe na pinie mikrokontrolera.


    Wszystko jasne, dzięki :)

    0