Elektroda.pl
Elektroda.pl
X

Search our partners

Find the latest content on electronic components. Datasheets.com
Elektroda.pl
Please add exception to AdBlock for elektroda.pl.
If you watch the ads, you support portal and users.

[ATTiny2313][C] - Protokół 1wire

meehowk3 15 Jul 2012 00:50 1300 1
  • #1
    meehowk3
    Level 10  
    Witam,
    uczę sie programować mikrokontrolery AVR i postanowiłem zrobić sam od podstaw jakiś projekt. Mianowicie, staram sie zbudować termometr na bazie czujnika DS18B20. Nie chcę zaglądać w gotowe projekty ani sugerować się czyimiś rozwiązaniami, chcę żeby był to mój projekt.

    Ale chciałbym żeby ktoś doświadczony zerknął na niego i wskazał błędy w składni. Obecnie jesttem na etapie tworzenia funkcji odbierania bitów danych a mianowicie próbkowanie przychodzących bitów. Nie jest ona skończona, więc nie zwracajcie na nia większej uwagi.

    Jednak główne powody dla których założyłem ten temat są nastepujące:
    1) Jak zwolnić linię w ATmedze?
    2) Jak wyłuskać pojedyńczy bit z bajtu?

    ad.1.
    W projekcie jest rezystor podciągający linię danych do '1' gdyż jest to stan domyślny linii w protokole 1wire. Sytuacja jest taka:

    Mam '1' i wpisuję '0' aby nadać je przez powiedzmy 5 us:
    PORTD = ~(1 << PD0);
    _delay_us(5);
    i teraz muszę zwolnić linię aby rezystor podciągający mógł podciagnąć ją do stanu wysokiego. Jak to zrobić? Bo chyba nie tak
    PORTD = (1 << PD0); <--- to powinnien wykonać rezystor. Jak ustawić NIC na pinie? Inaczej, jak usunąć to '0', które ustawiłem?

    ad.2.
    Mam zmienną:
    uint8_t search_rom = 0xf0
    Jak wyciągnąć z tego bajtu jeden bit? Albo inaczej, jak zrobić z tej zmiennej tablicę 8 elementową? (Pisząc to chyba wpadłem na pomysł. Może jakos maskować 7 bitów i sprawdzać ten jeden za pomocą np. &? Nie sprawdzę tego gdyż jest juz późno i idę spać)

    Jestem troche juz zmęczony i przepraszam za to ,że ten post jest może zbyt chaotyczny ale mam nadzieję, że mnie zrozumieliscie:).

    Pozdrawiam

    Code: c
    Log in, to see the code
  • #2
    gaskoin
    Level 38  
    Nie znając podstaw operacji bitowych radzę nie zabierać się za samodzielne tworzenie biblioteki onewire :)

    Nie czytałem kodu bo też już śpię, ale powiem Ci tylko tyle, że onewire jest transmisją typu otwarty kolektor(dren) więc nie robi się pullupa wymuszając go stanem wysokim na pinie procesora, tylko zwalnia się linie.

    Chodzi o to, że w PORTD na pinie 0 masz mieć cały czas 0, tego rejestru w ogóle nie ruszasz. Teraz tak: Jeśli ustawisz kierunek na wyjściowy (DDRD |= (1 << PD0)) to master (czyli Twój mikrokontroler) zrobi pulldown (bo na PORTD jest 0 na bicie 0), jeśli zaś ustawisz na kierunek wejściowy (DDRD &= ~(1 << PD0); jest to zwolnienie linii o które pytasz) to wówczas pin będzie w stanie HiZ i nastąpi pullup z rezystora, który masz na linii.