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] [atmega8] menu w programie do termostatu

ginger78 14 Wrz 2009 21:10 2419 4
REKLAMA
  • #1 7018007
    ginger78
    Poziom 21  
    Witam.
    Mam problem z napisaniem sterowania grzałką do wytrawiarki. Program ma za zadanie wyświetlać na LCD aktualną temp. i grzanie/niegrzanie płynu. Po naciśnięciu S1 wchodzę w opcje do ustawiania temperatury docelowej (S2 do góry, S3 w dół). Cały problem polega na tym, że przycisk S1 w ogóle nie reaguje (nie wchodzi do menu, wyświetla tylko sub praca). Zamieszczam okrojony kod źródłowy (bez konfigu lcd i dim-ów).

    
    Dim S As Bit                                                'flaga 
    
    Grzanie Alias Portd.6
    
    Declare Sub Menu                                       'menu do ustawiania temp. żądanej
    Declare Sub Praca                                       'główny program
    Cursor Off
    Cls
    
    
    Do
      If Pinc.0 = 0 Then
         S = 1                                                  'flaga
         Call Menu
      Else
          Call Praca
    
      Loop
     End
    
    
    
    
    
     Sub Praca
      1wreset                                                   'reset 1wire
      1wwrite &HCC                                              'rozkaz skip rom
      1wwrite &H44                                              'dokonaj konwersji temperatury
      Waitms 750                                                'przeczekaj konwersję
      1wreset
      1wwrite &HCC                                              'rozkaz skip rom
      1wwrite &HBE                                              'polecenie odczytu DS-a
      Odczyt(1) = 1wread(2)                                     'odczytaj dwa pierwsze bajty  do zmiennej
      T = Odczyt(2)                                             'przepisuje starszy bajt do zmiennej Integer
      Shift T , Left , 8                                        'przesuwa ten bajt w lewo na wyższe pozycje
      T = T + Odczyt(1)                                         'przepisz i dodaj młodszy bajt
      Waitms 25
      T1 = T * 10
      T1 = T / 16                                               'wyraź w st. celsjusza i wpisz do zmiennej single
    
      F = Str(t1)                                               'wpisz odczyt do string
      F = Fusing(t1 , "#.#")                                    'ustaw format wyświetlania
    
        Locate 1 , 1
        Lcd Chr(2) ; F ; Chr(0)
    
      Th1 = Tr + 1                                              'histereza
      Th2 = Tr - 1
    
      If T1 >= Th1 Then
         Grzanie = 0
      End If
    
       If T1 <= Th2 Then
         Grzanie = 1
         Locate 2 , 1
         Lcd "Grzanie"
       End If
     End Sub
    
    
    
    
    
     Sub Menu
        Locate 1 , 1
        Lcd " Temp docelowa: "
        Locate 2 , 6
        Lcd Tr ; Chr(0)
    
    
       If Pinc.1 = 0 Then
          Incr Tr
       End If
    
          If Pinc.2 = 0 Then
             Decr Tr
          End If
    
              If Pinc.0 = 0 Then
                  Waitms 250
                  If Pinc.0 = 0 Then
                     S = 0
                  End If
             End If
            End If
      End Sub
      Return
    
    
  • REKLAMA
  • REKLAMA
  • #3 7018124
    ginger78
    Poziom 21  
    Porty mam ustawione tak:
    
    Config Portd = &B1111111
            Portd = &B0000000
    Config Portc = &B000000
            Portc = &B111111
    


    Znalazłem błąd :D Brak end if w pętli głównej i jedno za dużo w sub menu. Program działa ale... trzeb trzymać przycisk menu by było one wyświetlane. Jak zrobić by po naciśnięciu było wyświetlane cały czas? Użyłem flagi ale jakoś nie pomaga.
  • REKLAMA
  • #4 7018448
    mazomen
    Poziom 16  
    A jakbyś w procedurze Menu umieścił pętlę i warunek po którym spełnieniu następowało by wyjście z pętli
  • #5 7020820
    ginger78
    Poziom 21  
    Wymyśliłem coś takiego:
    
    Do
      If Pinc.0 = 0 Then
         Waitms 100
         If Pinc.0 = 0 Then
          Toggle Portd.7                                        'flaga
      End If
          End If
    
        If Portd.7 = 1 Then
            Call Menu
        Else
            Call Praca
       End If
    
      Loop
     End
    


    i menu:

    
     Sub Menu
        Locate 1 , 1
        Lcd " Temp docelowa: "
        Locate 2 , 6
        Lcd Tr ; Chr(0)
    
    
       If Pinc.1 = 0 Then
          Incr Tr
       End If
    
          If Pinc.2 = 0 Then
             Decr Tr
          End If
    
    
              If Pinc.0 = 0 Then
                  Waitms 100
                  If Pinc.0 = 0 Then
                     Portd.7 = 0
                  End If
             End If
     End Sub
    


    Teraz działa tak jak chciałem :D
    Przy przejściu do i z menu nie ma czyszczenia LCD, mogę wstawić tam spacje ale to nie jest chyba najlepsze rozwiązanie. Gdy wstawię cls w pętli (np przed locate lub call menu/praca) wyświetlacz miga. Jest jakieś inne wyjście?
REKLAMA