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

Bascom Mega32 Zmiana wyświetlanej wartości

maximus22_kr 11 Sty 2011 01:40 2004 11
REKLAMA
  • #1 8989242
    maximus22_kr
    Poziom 18  
    Witam
    Chciałbym przy użyciu dwóch przycisków ( nawet jednego, bo pewnie tak się da ) zmieniać czujnik DS18B20, a właściwie wskazania które pokazuje. Mam dwa układy DS18B20 i przy założeniu ( teoretycznym ), że mam mało miejsca na wyświetlanie, więc dobrze by było mieć możliwość zmiany ( na przemian jednym przyciskiem lub dwoma - pierwszy-drugi ).
    Samo połączenie z DS'ami działa OK, więc tę część kodu pominę, a właściwie część jednego z wariantów kodu. Problem w tym, że po wybraniu danego DS'a wskazania się zmieniają tylko w momencie zmiany stanu przycisku, co nie do końca jest celem.



     T1 = T1 * 10
       T1 = T1 / 16
                                            'korekta przesuniecia znaku st C przy przejściu z temp ujemnej na dodatnią
       Ss1 = Str(t1)
       Ss1 = Format(ss1 , " 0.0")
                                                        'formatuj według wzorca - jedno miejsce po przecinku
    
    
    
    
    
    '**************** drugie wejście - DS18B20 obliczenia + wyświetlanie **********
    
    T2 = T2 * 10
       T2 = T2 / 16
                                           'korekta przesuniecia znaku st C przy przejściu z temp ujemnej na dodatnią
       Ss2 = Str(t2)
       Ss2 = Format(ss2 , " 0.0")                               'formatuj według wzorca - jedno miejsce po przecinku
    
    Debounce W1 , 0 , Temp1 , Sub
    
    Debounce W2 , 0 , Temp2 , Sub
    
    
    Loop
    End
    
    Temp1:
    Cls
    Locate 1 , 2                                                'wyświetl w pozycji
    Lcd Ss1 ; Chr(0) ; "C "
    
    Return
    Temp2:
    
    Cls
    Locate 1 , 2                                                'wyświetl w pozycji
    Lcd Ss2 ; Chr(0) ; "C "
    
    Return
  • REKLAMA
  • #2 8989269
    Duch__
    Poziom 31  
    Dodaj zmienną pomocniczą np.

    
    Dim Ktory_temp as bit 
    


    Zmienna ta może przyjmować tylko stany 0 i 1.

    Dodaj se procedurę która w momencie naciśniecia przycisku będzie zmieniać wyświetlany czujnik.

    np.

    
    Do
    
    Debounce W1 , 0 , Przycisk , Sub
     
    Tutaj procedura odczytu DSów
    
    If Ktory_temp = 1 Then
    Pokaż T1
    Else
    Pokaz T2
    End if
    
    Przycisk:
    Toggle Ktory_temp
    Return
    
    


    Oczywiście nie zapomnij na początku programu wstawić procedury:

    
    Config Debounce = 10           'Czekaj 10ms
    
  • REKLAMA
  • #3 8992084
    Konto nie istnieje
    Poziom 1  
  • #4 8998320
    maximus22_kr
    Poziom 18  
    Pomysł z czasowym przełączaniem też ciekawy, zrobiłem to przez użycie Wait ( na początek ustawiłem na 8 sekund ), ale efekt jest podobny jak opisywałem to na początku, czyli wskazanie Temp1 jest uzyskane w momencie przełączenia i na zmianę tego wskazania trzeba trzeba czekać aż do następnego przełączenia z Temp2 na Temp1.
    Zastanawiałem się, czy użycie timera0 coś zmieni, oczywiście pomijając sens jego zastosowania w takim celu.
  • REKLAMA
  • #5 8998500
    Konto nie istnieje
    Poziom 1  
  • #7 9016575
    maximus22_kr
    Poziom 18  
    Witam ponownie
    Zrobiłem to przez Timer0. Jednak problem z aktualizacją wyświetlania dalej występuje. Jeszcze drugi problem to start, przez okres zdefiniowany zmienną Licznik ( teraz równą 300 ) nic się nie wyświetla - dopiero po czasie = 300.
    Próbowałem również z Enable/Disable Interrupts na czas pomiaru, ale nie było żadnego efektu.

    Mam takie pytanie ( tylko mnie nie zmieszajcie z ... ), czy do jednego Timer'a można przypisać kilka zmiennych Licznik i każda będzie się zwiększać

    
    $regfile = "m32def.dat"
    $crystal = 16000000
    
    Config Lcdbus = 4
    Config Lcd = 16 * 2
    Config Lcdpin = Pin , Db4 = Pb.4 , Db5 = Pb.5 , Db6 = Pb.6 , Db7 = Pb.7 , E = Pb.3 , Rs = Pb.2
    
    Config Timer0 = Timer , Prescale = 1024
    Enable Timer0
    
    On Timer0 Czas
    Enable Interrupts
    Config 1wire = Porta.0
    
    '********** deklaracje zmiennych
    
    Dim Ds1(8) As Byte                                          'zmienna określająca numer układu czujnika
    Dim Ds2(8) As Byte                                          'zmienna określająca numer układu czujnika
    Dim Ss1 As String * 6                                       'zmienna zawierająca przeliczoną i sformatowaną wartość wskazania układu
    Dim Ss2 As String * 6                                       'zmienna zawierająca przeliczoną i sformatowaną wartość wskazania układu
    Dim T1 As Integer                                           'zmienna zawierająca odczytaną wartość z układu
    Dim T2 As Integer                                           'zmienna zawierająca odczytaną wartość z układu
    Dim Licznik As Integer
    Dim Ot As Bit
    Dim W As Byte
    Dim T As Integer                                            'zmienna licznikowa określająca czas wyświetlania wskazań aktywnego układu
    
    '********** deklaracje podprogramów
    
    Declare Sub Temp1
    Declare Sub Temp2
    Declare Sub Wybor
    
    '********** deklaracje wartości początkowych zmiennych
    
    Ot = 0
    T = 300
    
    '********** definicja znaku specjalnego wyświetlacza LCD
    
    Deflcdchar 0 , 6 , 9 , 6 , 32 , 32 , 32 , 32 , 32           ' znak stopnia celcjusza
    
    Cursor Off                                                  'wyłącz kursor
    Cls                                                         'wyczyść ekran
    
    W = 1wirecount()                                            'rozkaz liczenia układów podłączonych do magistrali 1-Wire
    Ds1(1) = 1wsearchfirst()                                    'rozkaz szukania pierwszego układu
    Ds2(1) = 1wsearchnext()                                     'rozkaz szukania nastepnego układu
    
    
    '*************************** pomiar temp. na termometrze ds18b20
    
    Do
    '********** magistrala 1-wire wejście 1 czujnik 1
    
    1wreset                                                     'reset magistrali 1-wire
    1wwrite &H55                                                'rozkaz adresowy MATCH ROM
    1wverify Ds1(1)                                             'sprawdź adres
    1wwrite &HBE                                                'rozkaz funkcyjny polecenie odczytu DS18B20
    T1 = 1wread(2)                                              'odczytaj dwa pierwsze bajty
    
    '********** magistrala 1-wire wejście 1 czujnik 2
    
    1wreset                                                     'reset magistrali 1-wire
    1wwrite &H55                                                'rozkaz adresowy MATCH ROM
    1wverify Ds2(1)                                             'sprawdź adres
    1wwrite &HBE                                                'rozkaz funkcyjny polecenie odczytu DS18B20
    T2 = 1wread(2)                                              'odczytaj dwa pierwsze bajty
    
    '********** konwersja temperatury dla DS18B20
    
    1wreset                                                     'reset magistrali 1-Wire
        1wwrite &HCC                                            'rozkaz funkcyjny SKIP ROM
       1wwrite &H44                                             'rozkaz dokonaj konwersji
    Waitms 750                                                  'czekaj 750 ms
    
    
    '**************** drugie wejście - DS18B20 obliczenia + wyświetlanie **********
    
    T2 = T2 * 10
       T2 = T2 / 16
                                                                'korekta przesuniecia znaku st C przy przejściu z temp ujemnej na dodatnią
       Ss2 = Str(t2)
       Ss2 = Format(ss2 , " 0.0")                               'formatuj według wzorca - jedno miejsce po przecinku
    
    
    
    '**************** pierwsze wejście - DS18B20 obliczenia + wyświetlanie **********
    
     T1 = T1 * 10
       T1 = T1 / 16
                                                                'korekta przesuniecia znaku st C przy przejściu z temp ujemnej na dodatnią
       Ss1 = Str(t1)                                            'formatuj według wzorca - jedno miejsce po przecinku
       Ss1 = Format(ss1 , " 0.0")
    
    Loop
    End
    
    
    '**************** Podprogramy **********
    
    '**************** Podprogram wyświetlania wskazań pierwszego układu DS18B20 **********
    Temp1:
    
    
    
    
    Cls                                                         'wyczyść ekran z poprzednich wskazań
    
     Locate 1 , 1                                               'wyświetl w pozycji
     Lcd "Temp1=" ; Ss1 ; Chr(0) ; "C "                         'wyświetl wynik obliczeń + znak stopnia + litera C
    
    
    Return
    
    
    '**************** Podprogram wyświetlania wskazań drugiego układu DS18B20 **********
    Temp2:
    
    
    
    Cls                                                          'wyczyść ekran z poprzednich wskazań
    
    Locate 1 , 1                                                'wyświetl w pozycji
    Lcd "Temp2=" ; Ss2 ; Chr(0) ; "C "                          'wyświetl wynik obliczeń + znak stopnia + litera C
    
    
    Return
    
    '**************** Podprogram wyboru układu DS18B20 **********
    
    Wybor:                                                      'podprogram wyboru czujnika DS18B20
    If Ot = 0 Then                                              'jesli pomocnicz zmienna bitowa = 0
    Gosub Temp1                                                 'wtedy idź do podprogramu pierwszego DS18B20
    Ot = 1                                                      'zmień stan zmiennej bitowej na 1
    Else                                                        'jeśli nie
    Gosub Temp2                                                 'to idź do podprogramu drugiego DS18B20
    Ot = 0                                                      'zmień stan zmiennej bitowej na 0
    End If
    
    Return
    
    '**************** Podprogram Timer0 **********
    
    Czas:
    Counter0 = Counter0 + 6
    Incr Licznik                                                'zwiększaj stan licznika
    
    
    If Licznik = T Then                                         'jeśli Licznik = T
    Gosub Wybor                                                 'idź do podprogramu Wybor
    Licznik = 0                                                 'zeruj licznik
    
    End If
    
    Return
    
  • REKLAMA
  • #9 9020626
    maximus22_kr
    Poziom 18  
    Witam
    Dzięki za odzew - dopiero zaczynam i "męczę" różne zaległe tematy - do tej pory raczej montowałem układy, teraz coś samemu podziałać

    Układ ma służyć do odczytu kilku temperatur ( 4 lub 5 ) na dużym wyświetlaczu 16x1 ( wersja BIG ) - bo to dla rodziców, a u nich już wzrok nie ten.

    Nie chcę, żeby coś przy tym majstrowali, więc zmienianie układu czujnika po zadanym czasie ( np 10- 15 sekund ) to chyba najlepsze rozwiązanie.

    Chciałbym, żeby:
    - wyświetlacz nie przestał aktualizować temperatury wybranego układu ( teraz pokazuje temperaturę pobraną w momencie przełączenia, zmienia się dopiero po ponownym przełączeniu na ten układ DS18B20 )
    - po włączeniu układu, aby od razu, jak pojawią się jakieś dane następowało wyświetlenie ( teraz czekam na pojawienie się pierwszych wskazań tyle czasu, ile trwa wyświetlanie danych - tyle ile ustaliłem zmienną T )
    - obsługę 4-5 układów DS18B20

    Pozdrawiam
    Piotr
  • #11 9028370
    maximus22_kr
    Poziom 18  
    Witam
    Dziękuję za odpowiedź, jak znajdziesz chwilę czasu to zapodaj kod, jakieś punkciki polecą dla Ciebie.

    Mam też drugi problem z Timer'ami - sterowanie jednym przyciskiem dwoma funkcjami ( w zależności od czasu przytrzymania przycisku ).
    Temat poruszałem tutaj
    Link
REKLAMA