Elektroda.pl
Elektroda.pl
X
CControls
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

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

tomson5 02 Lut 2010 21:38 3200 27
  • #1 02 Lut 2010 21:38
    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

    Code:
    $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

    0 27
  • CControls
  • Pomocny post
    #2 02 Lut 2010 21:54
    leon1313
    Poziom 14  

    wprowadzasz zmienną temperatura2 as single

    Code:

    wyswietlanie:
    if temparatura<>temperatura2 then
      temperatura2=temperatura
    LCD ....
    end if
    return

    0
  • #3 02 Lut 2010 21:59
    alien_audio
    Poziom 21  

    Witam.
    Zamiast instrukcji CLS użyj Home
    Wtedy wyświetlacz nie będzie migał.
    Krzysztof

    0
  • #4 02 Lut 2010 22:13
    leon1313
    Poziom 14  

    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)

    0
  • #5 02 Lut 2010 22:37
    M. S.
    Poziom 34  

    Zastosuj zatem Locate y,x.

    0
  • #6 02 Lut 2010 23:36
    leon1313
    Poziom 14  

    Code:

    Locate1,1
    LCD "aaa"
    Locate 1,1
    LCD "bb"

    co się pojawi na LCD?
    tekst trzeba sformatować.

    0
  • Pomocny post
    #7 03 Lut 2010 10:49
    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...

    0
  • CControls
  • #8 03 Lut 2010 18:45
    tomson5
    Poziom 16  

    Witam

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

    Code:
    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 :)
    Code:

    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

    0
  • #9 03 Lut 2010 21:35
    leon1313
    Poziom 14  

    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 :-)

    0
  • #10 04 Lut 2010 06:27
    tomson5
    Poziom 16  

    Skoro już wspomniałeś o tym waitms750, czy można się tego ustrzec w tym programie ??

    0
  • #11 04 Lut 2010 09:17
    asembler
    Poziom 32  

    Oczywiscie ze jak najbradziej da sie ją wyrzucic i to przynajmniej na kilka sposobów.

    0
  • #12 04 Lut 2010 10:26
    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 ?

    0
  • #13 04 Lut 2010 12:39
    M. S.
    Poziom 34  

    Cytat:
    Locate1,1
    LCD "aaa"
    Locate 1,1
    LCD "bb"


    Code:
    Locate1,1
    
    LCD "aaa"
    Locate 1,1
    LCD "bb "

    I po sprawie.

    0
  • #14 05 Lut 2010 05:22
    leon1313
    Poziom 14  

    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?

    0
  • #15 05 Lut 2010 06:46
    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)

    0
  • #16 05 Lut 2010 07:48
    Logan
    Poziom 30  

    Czyli po poleceniu

    Code:
    1wwrite &H44
    najlepiej chyba za pomocą przerwania z Timera (powiedzmy co 25ms) sprawdzać stan magistrali? Czy jest jakieś lepsze rozwiązanie?

    0
  • #17 05 Lut 2010 21:55
    leon1313
    Poziom 14  

    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.

    0
  • #18 05 Lut 2010 22:01
    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...

    0
  • #19 05 Lut 2010 22:05
    leon1313
    Poziom 14  

    A kto/co ci nakazuje blokować procesor na tak długo?

    0
  • #20 05 Lut 2010 22:23
    Logan
    Poziom 30  

    Polecenie wait nie blokuje procesora Kolegi zdaniem? Ciekawe...

    0
  • #21 05 Lut 2010 23:58
    leon1313
    Poziom 14  

    Hmmm, powtarzam pytanie, formułując je w inny sposób: kto ci każe używać polecenia wait ?

    0
  • #22 06 Lut 2010 09:34
    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?

    0
  • #23 06 Lut 2010 18:37
    leon1313
    Poziom 14  

    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)

    0
  • #24 06 Lut 2010 18:51
    Logan
    Poziom 30  

    Tyle to ja sam wymyśliłem, miałem nadzieję, że jest jakiś lepszy sposób.

    0
  • #25 06 Lut 2010 18:54
    leon1313
    Poziom 14  

    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.

    0
  • #26 07 Lut 2010 09:19
    asembler
    Poziom 32  

    Logan napisał:
    Czyli po poleceniu
    Code:
    1wwrite &H44
    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.

    0
  • #27 07 Lut 2010 10:14
    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.

    0
  • #28 07 Lut 2010 10:20
    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

    0