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

[BASCOM] DS18B20 zwraca 0

marrog 15 Mar 2011 00:47 1344 4
  • #1 9278110
    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: text
    Zaloguj się, aby zobaczyć kod
  • Pomocny post
    #2 9278256
    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 )
  • #3 9278401
    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: text
    Zaloguj się, aby zobaczyć kod

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

    to program wykonując drugi warunek już działa poprawnie, gdyż wywołanie
    Kod: text
    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.
  • #4 9278473
    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.
  • #5 9278788
    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: text
    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: text
    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.
REKLAMA