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.

DS18B20 - Dziwny pomiar przy 8MHz

@Kamil 26 Paź 2014 17:02 903 11
  • #1 26 Paź 2014 17:02
    @Kamil
    Poziom 23  

    Witam, mam problem z obsługą DS18B20.
    Plik main.c

    Kod: c
    Zaloguj się, aby zobaczyć kod

    Plik DS18B20.h
    Kod: c
    Zaloguj się, aby zobaczyć kod

    Plik DS18B20.c
    Kod: c
    Zaloguj się, aby zobaczyć kod


    Próbuję wysłać dane po USART, jednak temperaturę jaką udaje mi się odczytać w terminalu to -260, po podgrzaniu DS'a ta temperatura szybko rośnie do 0. Procek to ATMEGA8, taktowana wewnętrznym 8MHz, fusy na pewno ustawione dobrze, w ustawieniach projektu Eclipse ustawione 8MHz. Wcześniej gdy ćwiczyłem obsługę DS oraz multipleksowanie wyświetlaczy LED, stworzyłem sobie tą bibliotekę. Na 1MHz działało mi to poprawnie, teraz nie chce. Nie potrafię znaleźć błędu, czyżby błąd był w czasach? Bardzo proszę o pomoc.

    0 11
  • #2 26 Paź 2014 20:36
    michalko12
    Specjalista - Mikrokontrolery

    Dokumentację lepiej czytać

    Kod: c
    Zaloguj się, aby zobaczyć kod


    _delay_us(15); Zamiast 15 daj 3us

    0
  • #3 27 Paź 2014 11:50
    nsvinc
    Poziom 35  

    Ten twór

    Kod: C
    Zaloguj się, aby zobaczyć kod


    jest paskudnym sposobem na pisanie kodu ;]

    Lepszym jest
    Kod: C
    Zaloguj się, aby zobaczyć kod

    0
  • #4 27 Paź 2014 12:13
    vonar
    Poziom 28  

    Ale to:

    Kod: C
    Zaloguj się, aby zobaczyć kod
    zwraca 0 lub 1, a to:
    Kod: C
    Zaloguj się, aby zobaczyć kod
    0 lub (1<<PIN_1WIRE).

    Co prawda tutaj nie będzie różnicy w działaniu, ale kod nie ma komentarzy opisujących wartość zwracaną i w takim przypadku moim zdaniem bezpieczniej używać 0 lub 1, np tak:
    Kod: c
    Zaloguj się, aby zobaczyć kod

    0
  • #5 27 Paź 2014 13:20
    nsvinc
    Poziom 35  

    Jeśli juz, to

    Kod: C
    Zaloguj się, aby zobaczyć kod


    Operator !! jest na tyle dziwny, ze chyba nikt go nie stosuje :D

    Poza tym, wartosc logiczna ucBit rozpatrywana w warunkach typu
    Kod: C
    Zaloguj się, aby zobaczyć kod

    to zero/nie zero, wiec jesli zmienna jest niezerowa to nie wazne, jaką wartość trzyma.

    0
  • #6 27 Paź 2014 13:36
    michalko12
    Specjalista - Mikrokontrolery

    nsvinc napisał:
    Jeśli juz, to
    Kod: c
    Zaloguj się, aby zobaczyć kod


    Jeśli juz, to
    Kod: c
    Zaloguj się, aby zobaczyć kod

    a może jeszcze lepiej
    Kod: c
    Zaloguj się, aby zobaczyć kod


    Dodano po 2 [minuty]:

    nsvinc napisał:
    Poza tym, wartosc logiczna ucBit rozpatrywana w warunkach typu

    Kod C - [rozwiń]
    if(ucBit)

    to zero/nie zero, wiec jesli zmienna jest niezerowa to nie wazne, jaką wartość trzyma.



    Ale potem może nastąpić taka konstrukcja

    Kod: c
    Zaloguj się, aby zobaczyć kod

    0
  • #7 27 Paź 2014 14:00
    nsvinc
    Poziom 35  

    Kod: C
    Zaloguj się, aby zobaczyć kod

    No wlasnie się nie sprawdzi, jeśli funkcja zwraca zero lub arbitralną liczbę; wynik f()&1 zwroci zero jesli wynik np. f()==0x80

    Co do ostatniego, masz rację ;] dlatego wypadałoby uzyć jednak && aby zamienic 'losowe' nie-zero na wartość 1.

    Dodano po 5 [minuty]:

    w
    Kod: C
    Zaloguj się, aby zobaczyć kod

    można zamiast warunku również zastosować &&
    Kod: C
    Zaloguj się, aby zobaczyć kod

    0
  • #8 27 Paź 2014 14:04
    michalko12
    Specjalista - Mikrokontrolery

    nsvinc napisał:
    zwroci zero jesli wynik np. f()==0x80


    W sumie zgadza się, ale zwracanie z funkcji wartości !0 w C to proszenie się o problemy.

    nsvinc napisał:
    można zamiast warunku również zastosować &&

    ucBit = (PORT_1WIRE & PIN_1WIRE)&&1;


    Nadal zmienna przyjmuje wartości 0 i !0

    0
  • #9 27 Paź 2014 14:27
    vonar
    Poziom 28  

    nsvinc napisał:
    Poza tym, wartosc logiczna ucBit rozpatrywana w warunkach typu [...] zero/nie zero, wiec jesli zmienna jest niezerowa to nie wazne, jaką wartość trzyma.

    Jasne (wspomniałem, że „tutaj nie będzie różnicy”). Jednak przypisanie i sprawdzenie przekracza granicę funkcji, do tego nazwa uc1Wire_ReadBit sugeruje „bit”. Zwracanie nieokreślonej niezerowej wartości nie jest złe, ale moim zdaniem w takim wypadku potrzebny jest komentarz („funkcja zwraca zero lub nie-zero”), żeby np. w uv1Wire_ReadByte zamiast tak jak jest teraz:
    Kod: c
    Zaloguj się, aby zobaczyć kod
    nie napisać tak:
    Kod: c
    Zaloguj się, aby zobaczyć kod

    0
  • #10 27 Paź 2014 14:49
    nsvinc
    Poziom 35  

    Ależ można, tylko nadal - po co warunek? Pisząc ifa tego typu, oddajesz się w ręce kompilatora.

    Kod: C
    Zaloguj się, aby zobaczyć kod

    Na ARMie nie ma problemu, na AVR jest, i to duzy. Z tego co pamiętam, to 8bitowe AVRy nie mają jednocyklowego shiftera, więc 0x1u<<8 zajmie 8 taktów. Dlatego też jedynym sensownym wyjsciem jest ten nieszczęsny, wcześniej wspomniany if...

    Kod: C
    Zaloguj się, aby zobaczyć kod

    0
  • #11 27 Paź 2014 15:06
    vonar
    Poziom 28  

    To swoją drogą.
    Użyłem jak najmniej zmodyfikowanego kodu z pierwszego postu w ramach przykładu, gdzie pojawiłby się bug, gdyby pierwsza funkcja nie zwracała 0 lub 1, a druga nie używała if().

    //edit
    Widzę, że michalko12 ju z o tym wspomniał:

    michalko12 napisał:
    Ale potem może nastąpić taka konstrukcja

    Kod: c
    Zaloguj się, aby zobaczyć kod

    0
  • #12 27 Paź 2014 19:06
    @Kamil
    Poziom 23  

    michalko12 napisał:
    Dokumentację lepiej czytać

    Kod: c
    Zaloguj się, aby zobaczyć kod


    _delay_us(15); Zamiast 15 daj 3us


    Dziękuję za wszystkie odpowiedzi. Dodam tylko, że jestem początkujący więc nie wszystko jeszcze dobrze rozumiem. Zastosowałem się do powyższego i zmieniłem delay na 3us. Teraz dostaje jeszcze niższą temperaturę bo -375. Czujnik i sposób podłączenia jest na pewno dobry, na innej bibliotece mi to zadziałało. Myślę teraz że przy 1MHz też mi nie działało, bo na wyświetlaczach led wyświetlałem dwie pierwsze cyfry więc akurat było to 25 - co sprawiało złudzenie że pomiar jest poprawny.

    Jeśli chodzi o powyższą bibliotekę to starałem sie wzorować na Link tym, jednak w sumie większość przepisałem.

    0
  Szukaj w 5mln produktów