Elektroda.pl
Elektroda.pl
X

Search our partners

Find the latest content on electronic components. Datasheets.com
Elektroda.pl
Please add exception to AdBlock for elektroda.pl.
If you watch the ads, you support portal and users.

[bascom] [atmega8] menu w programie do termostatu

ginger78 14 Sep 2009 21:10 2368 4
  • #1
    ginger78
    Level 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).

    Code:

    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

  • #2
    Maciek4141
    Level 22  
    A może by tak:
    Code:
    Config Portc = Input
  • #3
    ginger78
    Level 21  
    Porty mam ustawione tak:
    Code:

    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.
  • #4
    mazomen
    Level 15  
    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
    ginger78
    Level 21  
    Wymyśliłem coś takiego:
    Code:

    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:

    Code:

     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?