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

[Atmega8][AVR][C]Ustawić stan wysoki na magistrali 1-wire... To znaczy 1 czy 0?

dominik59 18 Maj 2012 17:36 1974 2
REKLAMA
  • #1 10910638
    dominik59
    Poziom 10  
    Witam. Mam pytanie odnośnie stanów na magistrali 1-wire. Wiem że ustawiając stan wysoki na pinie mikro kontrolera ustawiam tam 1, a ustawiając stan niski 0.
    Jednak ponieważ zająłem się teraz rozpracowywaniem magistrali 1 -wire nastąpił pewien zgrzyt mianowicie w wyrażeniu : clr_wire DDRB|=(1<<0); jak sama nazwa wskazuje magistrala powinna być wyczyszczona ... czyli 0 no a jednak ustawia się ją na wyjście(przy okazji trzeba wtedy ustawić 1 na porcie aby to działało? znaczy w tym przypadku PORTB|=(1<<0); czy nie?)... a analogiczna sprawa jest z set_wire DDRB&=~(1<<0); tu powinno się ustawić magistralę na 1 a zamiast tego ustawia się ją na wejście ... (a trzeba tu też zastosować wewnętrzny rezystor podciągający ? bo mam podłączony zewnętrzny rezystor podciągający 4.7kΩ ale gdy nie ustawię wewnętrznego to nigdy nie może przeczytać odpowiednio stanu magistrali).Mógłby mi tu ktoś objaśnić bo w książce Mikrokontrolery AVR Język C jest opisana gotowa biblioteka a ja chciałbym się dowiedzieć "od podszewki" jak to działa :)
    Mogę wam udostępnić cały kod mojego programu. Może ja tu coś knocę bo napisałem mini-bibliotekę do obsługi tego 1-wire jednak oprócz reset-pulse i bitu presense to nie chce odczytywać temperatury :(

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    2 plik programu(zawierający definicje)

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    3 plik programu (zawierający deklaracje)
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
  • REKLAMA
  • #2 10910826
    tmf
    VIP Zasłużony dla elektroda
    Zmiana kierunku portu na wejściowy (operacje na DDR) powodują, że pin przechodzi w stan wysokiej impedancji, można więc zewnętrznie (poprzez rezystory podciągające) wymusić na nim stan wysoki. Zmieniając port na wyjście napięcie na pinie IO będzie determinowane wartością rejestru PORT.
  • #3 10912555
    dominik59
    Poziom 10  
    OK, dzięki :) Jeszcze tylko dla zlikwidowania wszelkich wątpliwości prosiłbym o wytłumaczenie za pomocą jakich poleceń spowodować stan oznaczony na zdjęciu numerem 1 i 2 (w którym przypadku :DDRB|=(1<<0) czyli ustawienie pinu na wyjście; lub DDRB&=~(1<<0) czyli ustawienie pinu na wejście; i czy trzeba przy okazji jakoś porty ustawić( np. czy trzeba przy ustawieniu pinu na wejście podciągnąć do wewnętrznego rezystora podciągającego)?) Prosiłbym także o wyjaśnienie w jaki sposób odczytywać bit presense i kolejne bity przy odczycie temperatury - za pomocą polecenia (PINB&(1<<0))czyli oczekując "1" na magistrali czy (!(PINB&(1<<0)) czyli oczekując na 0 na magistrali)?
    [Atmega8][AVR][C]Ustawić stan wysoki na magistrali 1-wire... To znaczy 1 czy 0?
    Za odpowiedzi dzięki:)
REKLAMA