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

Atmega88 - odświeżanie wyświetlacza - konflikt z DS1820

p.kaczmarek2 28 Sty 2015 14:27 1317 11
REKLAMA
  • #1 14376825
    p.kaczmarek2
    Moderator Smart Home
    Witajcie moi drodzy.
    Mam dziwny problem.
    W moim kodzie co 10 ms odświeżam wyświetlacz dwucyfrowy, który multipleksuję. Wymaga to oczywiscie pętli, i każde większe opóźnienie niż te ułamki sekundy jest widoczne na wyświetlaczu.
    Jednocześnie chcę obsłużyć one-wire DS1820. Niestety biblioteka od DS1820 pobiera temperaturę przez jakąś sekundę, co skutkuje taki efektem:

    - wyświetla się temperatura
    - na sekundę gaśnie wyświetlacz, bo pracuje biblioteka DS1820
    - spowrotem wyświetla się temperatura ta nowa pobrana

    Co mogę na to zaradzić? Całość wykonuję w pętli while.
    Pseudokod:

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


    Proszę o pomoc i rady!
    Pomogłem? Kup mi kawę.
  • REKLAMA
  • #2 14376883
    otapi
    Poziom 25  
    DS1820 potrzebuje cos około 750ms na przetrawienie pomiaru dlatego taki efekt, może odświeżanie w przerwaniu pomoże?
  • REKLAMA
  • #3 14377023
    M. S.
    Poziom 34  
    Ja dzieliłem wymianę danych z DS'em na najmniejsze możliwe kawałeczki i mieszałem je z obsługą multipleksowanego siedmiosegmentowego wyświetlacza LED. Działało i nic nie migało.
    P. S. I to wszystko w Bascomie.
  • #4 14377106
    Konto nie istnieje
    Konto nie istnieje  
  • #5 14377152
    tmf
    VIP Zasłużony dla elektroda
    p.kaczmarek2 napisał:

    Co mogę na to zaradzić? Całość wykonuję w pętli while.


    Odpowiedź jest banalna - napisać ten kod porządnie. Przede wszystkim multipleksowanie zawsze robi się w oparciu o timer i przerwania. Nigdy nie robi się tego w pętli. Druga kwestia - obsługa DS18x20 przez bit-banging to nieporozumienie. Tak pisze się kod na szybko, w praktyce, o czym właśnie się przekonałeś, tak napisany kod trudno połączyć z jakimkolwiek sensownie wykonywanym programem. Normalnie obsługę 1-wire robi się w oparciu o USART (lub jak powie kol. BlueDraco w oparciu o timer, oczywiście najlepiej jeśli to timer z opcją single-shot). Czyli z maksymalnym wykorzystaniem zasobów sprzętowych MCU. Przykłady IMHO sensownie rozwiązanego multipleksowania i obsługi 1-wire znajdziesz w darmowych przykładach do ksiażek z mojej stopki.
  • #6 14388228
    JedenZero
    Poziom 10  
    akurat niedawno przerabiałem ten temat, odświeżanie w przerwaniu timera:

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
  • REKLAMA
  • #7 14388358
    BlueDraco
    Specjalista - Mikrokontrolery
    I mamy następny przykład jak nie należy robić wyświetlania multipleksowanego oraz kiedy nie należy używać zmiennego przecinka.
  • REKLAMA
  • #8 14388649
    JedenZero
    Poziom 10  
    to jeszcze może napisz jak należy, bo jest przerwanie timera, sprawdziłem w przykładzie tmf avrppr.zip\Przyklady\LED\7segLED\7segLED\LED7Seg.c - i też jest podobnie
    i co chodzi Tobie z tym przecinkiem?
  • #9 14388726
    BlueDraco
    Specjalista - Mikrokontrolery
    W przerwaniu timera wyświetla się pojedynczą cyfrę, a w następnym - następną itd.

    Jedna operacja zmiennopozycyjna na AVR zajmuje mniej-więcej tyle czasu, co 1000 operacji na liczbach całkowitych, a w przypadku DS18B20 wystarczy najpierw zamienić liczbę na postać znak+wartość bezwzględna, potem wyciąć najmniej znaczące cztery bity (to co zostanie - to temperatura w stopniach) i ew. te cztery bity pomnożyć przez 5 i podzielić przez 8 w celu uzyskania dziesiątych części stopnia. Przekształcenie temperatury na postać wyświetlaną należy zrobić jeden raz po każdym nowym odczycie z DS18B20, a nie przy każdym przebiegu wyświetlania.

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
  • #10 14390018
    JedenZero
    Poziom 10  
    Teraz widzę różnicę, ale nie wiem jeszcze dlaczego odświeżanie po jednej cyfrze jest lepsze od odświeżenia całości w 1 przerwaniu. Następne przerwanie przyjdzie zanim się wykona obsługa poprzedniego? Jakie ma to konsekwencje?

    Co do float to faktycznie zaszalałem zasobami. Ale też przy okazji też pytanie o konsekwencje? Większe zużycie prądu?
    Dobrze, że w dziale edukacyjnym takie błędy są od razu wytykane, bo najgorzej to nauczyć się źle. Ale jeśli nie sprawiłoby to kłopotu proszę o komentarz w sprawie tych konsekwencji.
  • #11 14390035
    BlueDraco
    Specjalista - Mikrokontrolery
    Dlatego, że działa, w przeciwieństwie do rozwiązania "w jednym przelocie", które gwarantuje nierówne lub zbyt słabe świecenie cyfr i grozi paroma innymi efektami - "duchy", przegrzewanie tranzystorów itp.. Z zasady przerwania planuje się w taki sposób, że obsługa na zdążyć przed kolejnym przerwaniem - i zdąży, o ile nie popełnisz grubego błędu.

    Użycie float na 8-bitowym uC - to spory przyrost wielkości kodu i znaczny spadek wydajności. Użycie float w przerwaniu - patrz wyżej - możesz nie nadążyć z obsługą przerwań. Oczywiście jeśli projektujesz system energooszczędny, to również przełoży się to na większe zużycie energii.

    Niewiele jest rzeczy, których nie da się zrobić bez zmienngo przecinka. Warto pamiętać o tym, że istnieje coś takiego, jak reprezentacja stałopozycyjna. Zamiast liczyć napięcia w woltach, można je liczyć w miliwoltach. Ogólnie wszystko można wyrazić w dowolnych jednostkach ułamkowych, tak, żeby wartość była całkowita.
  • #12 14472995
    p.kaczmarek2
    Moderator Smart Home
    BlueDraco napisał:
    W przerwaniu timera wyświetla się pojedynczą cyfrę, a w następnym - następną itd.[/syntax]


    Dziękuję za wszystkie odpowiedzi oraz rady, jak również za przykładowy kod.
    Temat zamykam.
    Pomogłem? Kup mi kawę.
REKLAMA