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

[at8][bascom] Odświeżanie LCD gdy zmienna <> zmienna

tomson5 02 Lut 2010 21:38 3455 27
REKLAMA
  • #1 7634233
    tomson5
    Poziom 16  
    Witam
    Nie mam pomysłu jak wykonać warunek gdzie:
    "Jeżeli zmienna Temperatura ulegnie zmianie to przejdź do podprogramu Wyswietlanie"
    Chciałbym aby LCD był odświeżany tylko wtedy, gdy się zmieni temperatura.

    Zamieszczam kod jak to wygląda teraz
    $regfile = "m8def.dat"
    $crystal = 8000000
    $hwstack = 32                 ' default use 32 for the hardware stack
    $swstack = 32                 ' default use 32 for the SW stack
    $framesize = 40               ' default use 40 for the frame space
    
    
    Config Lcd = 16 * 2
    Config Lcdpin = Pin , Db4 = Portc.3 , Db5 = Portc.2 , Db6 = Portc.1 , Db7 = Portd.0 , E = Portc.4 , Rs = Portc.5
    Config 1wire = Portb.0
    Dim Odczyt(2) As Byte , T As Integer , Temperatura As Single
    Deflcdchar 1 , 14 , 10 , 14 , 32 , 32 , 32 , 32 , 32       ' replace ? with number (0-7)
    Deflcdchar 2 , 12 , 4 , 6 , 4 , 12 , 4 , 14 , 32       ' replace ? with number (0-7)
    '------------------------------------------------------------------------------------------------
    
      Do
         Gosub Pomiar
         Gosub Wyswietlanie
    
    
        Loop
      End
    
    '----------------------------------------------------
      Pomiar:
      1wreset                     'reset
       1wwrite &HCC               'jedna kostka, więc wykorzystujemy rozkaz SKIP ROM
        1wwrite &H44              'dokonaj
         Waitms 750               'przeczekaj czas konwersji
          1wreset                 'reset
           1wwrite &HCC           'rozkaz adresowy SKIP ROM
            1wwrite &HBE          'rozkaz funkcyjny - polecenie odczytu DS18x20
      Odczyt(1) = 1wread(2)       'odczytaj dwa pierwsze bajty
      T = Odczyt(2)               'przepisz starszy bajt do zmiennej typu Integer
      Shift T , Left , 8          'przesuń ten bajt w lewo na wyższe pozycje
      T = T + Odczyt(1)           'przepisz - dodaj młodszy bajt
      Temperatura = T / 2         'wyraź w stopniach Celsjusza, wynik wpisz do zmiennej Single
       Return
    
    
    '---------------------------------------------------
    
      Wyswietlanie:
        Cls : Lcd "Temp=" ; Temperatura ; Chr(1) ; "C"       'wyświetl wynik ze zmiennej temperatura
    
      Return
  • REKLAMA
  • Pomocny post
    #2 7634363
    leon1313
    Poziom 15  
    wprowadzasz zmienną temperatura2 as single
    
    wyswietlanie:
    if temparatura<>temperatura2 then
      temperatura2=temperatura
    LCD ....
    end if
    return
    
  • #3 7634400
    alien_audio
    Poziom 21  
    Witam.
    Zamiast instrukcji CLS użyj Home
    Wtedy wyświetlacz nie będzie migał.
    Krzysztof
  • REKLAMA
  • #4 7634487
    leon1313
    Poziom 15  
    CLS czyści i ustawia kursor w pozycji 1,1
    HOME ustawia kursor w pozycji 1
    Drobna różnica acz znacząca.
    Jeśli chce użyć HOME, musi pokombinować z formatowaniem wyświetlanej zmiennej ( chodzi o długość i ew wypełnienie pustymi znakami)
  • Pomocny post
    #7 7635849
    nsvinc
    Poziom 35  
    pojaw sie "bba". Bo niby co innego?

    Najpierw wyswietlasz "aaa", wiec masz "a" na pozycjach 0,1,2
    Nastepnie wyswietlasz "bb", wiec to wpisuje się na pozycjach 0,1 - ale pozycji 2 juz nie modyfikujesz, wiec tam zostaje to co wpisales POPRZEDNIO [W PRZYRODZIE NIC NIE GINIE].

    Ja stosuje praktyke wypelniania znakiem 0x20 miejsc na wyswietlaczu, gdzie chce mieć pusto. Bardziej sie oplaca zrobic te kilkanascie zapisow znakow 0x20 niz uzyc cls lub home - to zajmuje przecietnemu kontrolerowi LCD spoooooro czasu...
  • #8 7638168
    tomson5
    Poziom 16  
    Witam

    Dzięki @leon1313 twój sposób działa, to jest to czego chciałem :) genialny w swojej prostocie.

    Wyswietlanie:
     If Temperatura <> Temperatura2 Then
      Temperatura2 = Temperatura
        Cls
         Locate 1 , 1 : Lcd "Temp="
         Locate 1 , 6 : Lcd Temperatura ; Chr(1) ; "C"    'wyświetl wynik ze zmiennej Single
               Cursor Off
       End If
      Return
    
    




    dzięki @nsvinc twój sposób działa, przynajmniej tak jak zrobiłem w poniższym kodzie
    Chyba nawet przy odświerzaniu nie mryga napis "Temp=" super :)
    
    Locate 1 , 1 : Lcd "Temp="
         Locate 1 , 6 : Lcd Temperatura ; Chr(1) ; "C"    'wyświetl wynik ze zmiennej Single
         Locate 1 , 12 : Lcd "     "   ' TUTAJ DAŁEM 5 SPACJI ABY ZAPEŁNIĆ LINIE
         Locate 2 , 1 : Lcd "                " TUTAJ 16 SPACJI BO NIC TAM NIE MA 
          Cursor Off
    
  • REKLAMA
  • #9 7639384
    leon1313
    Poziom 15  
    nsvinc napisał:
    pojaw sie "bba". Bo niby co innego?

    Najpierw wyswietlasz "aaa", wiec masz "a" na pozycjach 0,1,2
    Nastepnie wyswietlasz "bb", wiec to wpisuje się na pozycjach 0,1 - ale pozycji 2 juz nie modyfikujesz, wiec tam zostaje to co wpisales POPRZEDNIO [W PRZYRODZIE NIC NIE GINIE].

    Ja stosuje praktyke wypelniania znakiem 0x20 miejsc na wyswietlaczu, gdzie chce mieć pusto. Bardziej sie oplaca zrobic te kilkanascie zapisow znakow 0x20 niz uzyc cls lub home - to zajmuje przecietnemu kontrolerowi LCD spoooooro czasu...

    Dlatego napisałem, że tekst trzeba sformatować. Samo Locate X,Y nie wystarczy.

    Zaś co do zajmowania czasu: martwa pętla waitms750 chyba zajmuje więcej czasu :-)
  • #10 7640652
    tomson5
    Poziom 16  
    Skoro już wspomniałeś o tym waitms750, czy można się tego ustrzec w tym programie ??
  • #11 7640894
    asembler
    Poziom 32  
    Oczywiscie ze jak najbradziej da sie ją wyrzucic i to przynajmniej na kilka sposobów.
  • #12 7641120
    Logan
    Poziom 30  
    Cytat:
    If the DS18S20 is powered by an external supply, the master can issue read-time slots after the Convert T command and the DS18S20 will respond by transmitting 0 while the temperature conversion is in progress and 1 when the conversion is done. In parasite power mode this notification technique cannot be used since the bus is pulled high by the strong pullup during the conversion.


    Jeśli dobrze zrozumiałem to w trakcie trwania konwersji na wyjściu jest 0, a po zakończeniu 1, tak ?
  • #14 7645556
    leon1313
    Poziom 15  
    tomson5 napisał:
    Skoro już wspomniałeś o tym waitms750, czy można się tego ustrzec w tym programie ??

    Można, tylko czy akurat tu jest sens?
  • REKLAMA
  • #15 7645576
    asembler
    Poziom 32  
    Logan napisał:
    Cytat:
    If the DS18S20 is powered by an external supply, the master can issue read-time slots after the Convert T command and the DS18S20 will respond by transmitting 0 while the temperature conversion is in progress and 1 when the conversion is done. In parasite power mode this notification technique cannot be used since the bus is pulled high by the strong pullup during the conversion.


    Jeśli dobrze zrozumiałem to w trakcie trwania konwersji na wyjściu jest 0, a po zakończeniu 1, tak ?


    Dobrze zrozumiałeś ale tylko w trybie "powered" 3 przewodowym.
    W trybie "parasite" czyli 2-przewodowym nie ma mozliwosci "podglądania" czy juz konwersja sie skonczyła i trzeba odczekac swoje i dodatkowo cały tan czas trzymac 1-wire w napięciu. ('1' - logiczne)
  • #17 7649521
    leon1313
    Poziom 15  
    A co budujesz, ze jest ci potrzebne jak najszybsze uzyskanie temperatury z DS-a ? 1 sek nie wystarczy?
    To nie jest czas, w jakim uC odczytuje wartość z czujnika, to jest czas potrzebny na konwersję wewnętrzną DS-a.
  • #18 7649573
    Logan
    Poziom 30  
    Ja doskonale wiem co to za czas, ale nie chce blokować całego procesora na tak długo. Policz sobie ile to cykli...
  • #19 7649591
    leon1313
    Poziom 15  
    A kto/co ci nakazuje blokować procesor na tak długo?
  • #20 7649718
    Logan
    Poziom 30  
    Polecenie wait nie blokuje procesora Kolegi zdaniem? Ciekawe...
  • #21 7650229
    leon1313
    Poziom 15  
    Hmmm, powtarzam pytanie, formułując je w inny sposób: kto ci każe używać polecenia wait ?
  • #22 7650750
    Logan
    Poziom 30  
    To ja też powtórzę swoje :) Jaki jest inny (lepszy od Timera) sposób na sprawdzenie, czy konwersja danych jest skończona?
  • #23 7653484
    leon1313
    Poziom 15  
    Logan- myślę, że użycie Timer-a i flag jest najlepszym w tym przypadku rozwiązaniem. Polecenia takie jak wait i debounce blokują program i należy je używać z największa rozwagąi to w prostycg programach. Ja to zwykle robię za pomocą przerwania z jedno z Timer-ów zwiększającego licznik odliczający odpowiedni czas ( takie pseudo wait, nie blokujące procka)
  • #24 7653555
    Logan
    Poziom 30  
    Tyle to ja sam wymyśliłem, miałem nadzieję, że jest jakiś lepszy sposób.
  • #25 7653571
    leon1313
    Poziom 15  
    Hmmm, z jednej strony piszesz o poleceniu wait, z drugiej o wykorzystaniu Timerów.
    Wybacz, ale teraz to ja nie wiem, co masz na myśli. To dwa oddzielne rozwiązania.
  • #26 7655772
    asembler
    Poziom 32  
    Logan napisał:
    Czyli po poleceniu najlepiej chyba za pomocą przerwania z Timera (powiedzmy co 25ms) sprawdzać stan magistrali? Czy jest jakieś lepsze rozwiązanie?

    Sprawdzanie stanu magistrali nic nie daje, gdyz w trybie parasite musi byc cały czas '1'.
    Jak chcesz miec szybsze odczyty to zmniejsz rozdzielczosc DS-a i wtedy bedziesz czekał odpowiednio krócej.
  • #27 7655943
    Logan
    Poziom 30  
    Miałem na myśli podłączenie 3-przewodowe, mój błąd bo nie sprecyzowałem. W wersji 'S20 z tego co pamiętam nie ma możliwości zapisu do Configa.
  • #28 7655966
    asembler
    Poziom 32  
    Z tego co pamietam w wersji 3 przewodowej mozesz przed odczytem temperatury sprawdzic czy konwersja zostala ukonczona jaezli nie pomijasz odczt i zajmujesz procesora czym innym (pozbywasz sie wait) i nie musisz tego robic w przerwaniu tylko zawsze przed odczytem temperatuty.
    Robiło sie to chyba tak ze wystarczyło wysłac "reset DS" a potem badac stan odbieranego bitu dawal informacje o stanie konwesji (trzebaby doczytac w PDF)
    Strona 16 PDF DS18B20
    Kto jeszcze uzywa 18S20 one mialy wady odudowy do której sie producent nawet sam przyznał jakies 15 lat temu. i faktyczn S20 nie ma mozliwosci zmiany rozdzielczosci czy CONFIGA
    Co do sprawdzania konca konwersji to identycznie jak w DS18B20
REKLAMA