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

Termometer Atmega 8 na 7-segmentowym - -miganie wyniku

roolead 16 Lip 2020 13:29 723 8
REKLAMA
  • #1 18820309
    roolead
    Poziom 2  
    Czesc wszystkim,

    Mam problem z poprawnym działaniem termometru na 7-segmentowym wyświetlaczu.
    Załączam film - no nie chce się bardzo rozpisywać. Generalnie to nic złego w bibliotekach multipleks.
    Coś z kodem jest nie tak prawdopodobnie w dsb1820. Poniżej załączam kod. Proszę o pomoc. Pozdrawiam.
    Dodam tylko, że temperatura jest wyświetlana poprawnie - tzn. są poprawne wartości.

    Film:



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


    "ds18b20.h"

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


    "ds18b20.c"

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
  • REKLAMA
  • REKLAMA
  • #3 18820334
    roolead
    Poziom 2  
    To są biblioteki gdzieś z neta, ale zedytowane pod mój projekt. Ten test to tylko - wyświetlenie jakiejś liczby zmienno-przecinkowej - to potwierdza ze wina leży w kodzie w bibliotece ds18b20
  • REKLAMA
  • #4 18820575
    dasej
    Poziom 32  
    Witam.


    Błąd masz w założeniach tu :

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



    Ta linia powinna być w przerwaniu
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
  • #5 18820824
    kaczodp
    Poziom 14  
    dasej napisał:

    Ta linia powinna być w przerwaniu
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    Wtedy będzie miał błędy odczytu termometru gdy DS18B20_STOPINTERRUPTONREAD != 1 a gdy DS18B20_STOPINTERRUPTONREAD == 1 to multipleksowanie będzie działać źle.
    Ten kod jest słaby. Z najważniejszych błędów to, nie sprawdza crc, zawiesza na długo przerwania a wystarczy na czas transmisji bitu gdy wystawiane jest 0 na magistralę. Używa niepotrzebnie liczb zmiennoprzecinkowych i wiele, wiele innych niedociągnięć.
  • REKLAMA
  • #6 18823323
    kamyczek
    Poziom 38  
    Jednym słowem chcesz coś zrobić dobrze to rób to sam, albo używaj komercyjnych (czytaj płatnych) bibliotek, które i tak do końca nie wycisną tego co można zrobić pisząc kod samodzielnie. Jeśli wiesz że chcesz używać DS18B20 i wyświetlacza LED z multiplexem, aż się prosi napisać tę obsługę samodzielnie, tym bardziej że całą obsługę 1 wire można załatwić przy pomocy uarta i przerwań, a czas w którym uart wysyła i czeka na odebranie danych poświęcić na obsługę wyświetlacza i kalkulację danych z poprzedniego odczytu. Jeśli używasz biblioteki, to po prostu czekasz aż wykona się polecenie (podprogram) który wywołałeś, a jak tam jest czekaj w pętli na wynik czy nawet przerwanie to po protu czekasz, i czekasz, i czekasz...
  • #7 18823506
    roolead
    Poziom 2  
    Dzięki z tym uart to dobry pomysł, postaram się to napisać sam. Tak to jest właśnie bazować na czyimś kodzie bo chce się coś zrobić na szybko. Dodatkowo, to że kod jest słaby to wiem. Ogólnie mam blue booka wiec mam nadzieję, że dużo mi powie. Dzięki za odpowiedzi
  • Pomocny post
    #8 18824588
    tmf
    VIP Zasłużony dla elektroda
    Skoro chcesz zrobićna szybko, bez wgłębiania się jak to działa, to ściągnij sobie darmowe kody do moich książek z ftp Helionu (linki w stopce), masz tam przykład i multipleksowania i obsługi DS'a na UART.
  • #9 18824637
    kaczodp
    Poziom 14  
    roolead napisał:
    Ogólnie mam blue booka wiec mam nadzieję, że dużo mi powie.

    W BB nie ma obsługi przez uart. Zwykłe delay tyle że zawieszane są przerwania na czas transmisji bitu a nie jak gdzie indziej bajtu czy nawet całej transmisji łącznie z reset. Jeśli zawieszanie przerwań na kilkadziesiąt us nie jest problemem użyj płatnych, niedoskonałych jak napisał @kamyczek funkcji z BB. Jak chcesz dobrze, napisz sam. Powolną transmisję możesz zrealizować całkowicie na przerwaniach.
REKLAMA