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

[ATmega8] + [DS18B20] - Błędne działanie programu, jeśli funkcja zwraca (-1)

zweinstein 01 Lis 2013 22:11 1455 9
REKLAMA
  • #1 12904801
    zweinstein
    Poziom 17  
    Witam,
    Mam na linii kontrolera słynny DS18B20. Jeżeli czujnik jest podłączony to wszystko jest ok. Problem pojawia się wtedy jeżeli odepnę na chwilę czujnik. Funkcja zwraca mi wartość -1, a ponowne podłączenie czujnika nie powoduje ponowienia prawidłowych odczytów. Trzeba wtedy po podłączeniu zresetować cały układ.

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Jeżeli przed komendą return wstawię formułę:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    wszystko jest prawidłowo (czujnik wznawia normalnie pracę po podłączeniu). Dodam jeszcze że użycie tutaj zamiast 0 dowolnej ujemnej liczby powoduje ponowienie problemów.

    Wydaje mi się, że niezależnie od odebranych danych czujnik po ponownym podłączeniu powinien normalnie wznowić pracę. Wartość zwracana przez funkcję przekazana jest bezpośrednio do wyświetlenia. Funkcja wyświetlania działa prawidłowo i nie robi problemów z żadną wielkością.

    Co może być tego przyczyną?
  • REKLAMA
  • #2 12904834
    BlueDraco
    Specjalista - Mikrokontrolery
    Przyczyną jest ta część kodu, której nie pokazałeś.
  • REKLAMA
  • #3 12904866
    zweinstein
    Poziom 17  
    Funkcja odczytu jest wywoływana tylko tutaj w nieskończonej pętli głównej:

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
    [/code]

    Sama obsługa wyświetlacza raczej nie będzie tu przyczyną...
  • #4 12904892
    BlueDraco
    Specjalista - Mikrokontrolery
    Rozumiem, że mamy Ci powiedzieć, jaki błąd popełniłeś w deklaracji zmiennej temperatura oraz w funkcji LCDdec() i READ_BYTE()?
  • #5 12904910
    excray
    Poziom 41  
    Poza tym dziwie mnie to -1. Ta funkcja:
    zweinstein napisał:
    temp=temp>>4;

    nie powinna nigdy zwrócić -1.
  • #6 12904939
    zweinstein
    Poziom 17  
    Jeśli chodzi o samą deklarację funkcji to wszędzie są INT-y:

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    [/code]

    Funkcja LCDdec działa prawidłowo ze wszystkimi wartościami INT-ów (w LCDdec jest wywołana funkcja itoa). Problem jest tylko wtedy jak funkcja odczyt_DS zwraca -1
  • REKLAMA
  • #7 12904940
    BlueDraco
    Specjalista - Mikrokontrolery
    excray:
    Powinna i zapewne zwraca, jeśli 12 górnych bitów temp jest wcześniej jedynkami.


    zweinstein:
    Pierwszy błąd masz w odczyt_DS() - temp1 i temp2 powinny być typu uint8_t. Kolejne błędy masz w funkcjach, których nie chcesz pokazać.
  • REKLAMA
  • #8 12905029
    zweinstein
    Poziom 17  
    Nie to że nie chcę pokazać tylko ten kod dopiero powstaje i jest tam straszny bajzel. Może żeby nie było wątpliwości zamieszczam cały pakiet plików

    Być może Ci co zobaczą kod zbluzgają mnie za obsługę dwóch DS-ów na osobnych liniach więc już teraz usprawiedliwiam się że w razie awarii tego elementu chciałbym go po prostu wymienić i nie bawić się w wyciąganie indywidualnego adresu.

    ..........
    Zmieniłem typ temp1 i temp2 na unsigned char (to samo co uint8_t) i nie naprawiło to sytuacji.
  • #10 12910080
    zweinstein
    Poziom 17  
    Zrobiłem tak jak Grzesiek proponował. Efekt jest taki, że funkcja zwraca wyłącznie wartości dodatnie, więc nie ma problemu z błędnym działaniem. Jednak dalej nie wiem czemu wartości ujemne zaburzają pracę programu. Podejrzewam, że to raczej optymalizacja robi taki cyrk...
REKLAMA