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.

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

meehowk3 15 Lip 2012 00:50 1159 1
  • #1 15 Lip 2012 00:50
    meehowk3
    Poziom 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

    Kod: c
    Zaloguj się, aby zobaczyć kod

    0 1
  • #2 15 Lip 2012 01:33
    gaskoin
    Poziom 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.

    0