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.

[BASCOM] DS18B20 zwraca 0

marrog 15 Mar 2011 00:47 1068 4
  • #1 15 Mar 2011 00:47
    marrog
    Poziom 22  

    Witam serdecznie

    Napisałem program w którym wykorzystuję czujnik DS18B20 do pomiaru temp. Funkcja zwraca poprawną wartość temp. z tym, że po restarcie procka, na LCD zwracana jest wart. 0. Ponadto mając taki oto kod jak poniżej program skacząc do "jakas_etykieta" ( malo wazna nazwa ;-) ) zapętla się gdyż wskazania sa ciągle 0st. natomiast gdy zaladuje sama funkcje pomiaru temp. z wyświetlaniem na LCD temp. to program poprawnie mierzy temp. próbowałem zmieniać czas dla DS-a ale to nic nie daje...
    Procek to Atmega16, kwarc 8MHz zewn. ustawiony jest ok.

    Kod: vb
    Zaloguj się, aby zobaczyć kod

    0 4
  • Pomocny post
    #2 15 Mar 2011 06:26
    piotr5000
    Poziom 21  

    Z tego fragmentu nie wiadomo czy używasz przerwań.
    Może wywołujesz jakieś przerwanie i jego obsługa zajmuje tyle
    czasu , że przychodzi następne przerwanie i program się pętli
    ( jedyne co robi to obsługuje przerwanie )

    0
  • #3 15 Mar 2011 08:14
    marrog
    Poziom 22  

    witam serdecznie

    Tak używam przerwań (z TIMER0), ale są uruchamiane tylko gdy są potrzebne tzn. wykorzystuję do tego instrukcję Start/Stop Timer0.
    Co ciekawe ten fragment co wyżej to fragment większej części programu i jak zamienię pętle "do loop " na np.

    Kod: vb
    Zaloguj się, aby zobaczyć kod

    oraz dodam drugi warunek
    Kod: vb
    Zaloguj się, aby zobaczyć kod

    to program wykonując drugi warunek już działa poprawnie, gdyż wywołanie
    Kod: vb
    Zaloguj się, aby zobaczyć kod
    jest znacznie dalej w programie, czyli jest wykonywane później i całość działa normalnie.
    Natomiast w przypadku pierszego warunku tak jakby się zawieszał, z tym, że przecież wchodząc do podprogramu i wykonując warunek wywołuję odczyt temp. a jednak ciągle tam jest 0 i dlatego już nie powraca z tej pętli...

    DS-a mam podpiętego na 3 przewodach i między Vcc a DQ 4,7kΩ, wykorzystuję PB.0 jako 1Wire. W nocie wyczytałem, że czas czas potrzebny dla DS przy pracy na 12-bit to 750ms, ja mam normalnie 200us i to wszystko działa tak jak powinno (bynajmniej mi się tak wydaje) no poza tym fragmentem w którym otrzymuje 0°C. Zmieniałem ten czas na 750ms na 1s i nic, bez zmian....
    Już sam nie wiem co jest nie tak, bo tak jak pisałem normalnie pastylka działa....nawet przy zapętleniu dla sprawdzenia odczytu temp. funkcja po resecie wypluwa zaraz wart. temp zmierzonej a nie ), a tutaj jest 0.

    0
  • #4 15 Mar 2011 08:54
    Marczeli_P
    Poziom 20  

    Zgadza się że nie będzie to działało, dlatego że pętla while do poprawnej pracy potrzebuje by wartość wyrażenia lub sprawdzanego warunku dawała w wyniku wartość różną od zera. Ty przypisujesz dla wartość 0 dlatego pętla wykrywa 0 i nie dopuszcza do wykonywania instrukcji zawartych w jej ciele. Natomiast w drugim przypadku a posiada 1 więc się wykonuje.

    0
  • #5 15 Mar 2011 11:58
    marrog
    Poziom 22  

    Ale ona daje 1 lub 0 logiczne gdy warunek jest spełniony lub nie, czyli gdy jest spełniony to wykonuje ciąg instrukcji zawarty między:

    Kod: vb
    Zaloguj się, aby zobaczyć kod

    Jeżeli warunek będzie nie spełniony, to nie wejdzie w pętle.
    Ja u siebie mam dokładnie w ten sposób:
    Kod: vb
    Zaloguj się, aby zobaczyć kod

    teraz problem, dlaczego w pętli nie odczytuje poprawnej wartości temp z DS-a?

    Dodano po 1 [godziny] 2 [minuty]:

    Witam ponownie
    Problem rozwiązany. Wina leżała po stronie przerwań tak jak nadmienił piotr5000. Dodałem przed pętlą główną programu Stop Timer0 i program pracuje poprawnie.

    Wielkie dzięki za wszelkie porady.

    0
  Szukaj w 5mln produktów