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

[Mega32][Bascom] Prosty termostat - ustawianie temperatur

Elektronik_Kraków 18 Mar 2011 23:29 2351 1
REKLAMA
  • #1 9293930
    Elektronik_Kraków
    Poziom 13  
    Witam
    W ramach dalszego eksperymentowania z AVR i Bascom popełniłem połączenie odczytu z DS18B20 z sterowaniem wyjściem uC ( przez tranzystor FET ) + dodatkową atrakcję - buzer, który sygnalizuje wł/wył tranzystora/wyjścia. Chciałem dodać możliwość zmiany temp max i min, przez proste menu. Menu zrobiłem w oparciu inny mój kod obsługujący ustawianie PCF8583 i 100 % działający.

    Niestety w przypadku tego "projektu" następuje tylko chwilowe wejście do pierwszej opcji i wyjście po 1 sekundzie.


    
    $regfile = "m32def.dat"
    $crystal = 8000000
    $hwstack = 64
    $swstack = 64
    $framesize = 32
    Config Debounce = 30
    
    '********************* Konfiguracja wejść i wyjść
    
    Config Porta.1 = Output
    Reset Porta.1
    Config Porta.3 = Output
    Reset Porta.3
    
    Config Porta.5 = Input
    Set Porta.5
    Config Porta.6 = Input
    Set Porta.6
    Config Porta.4 = Input
    Set Porta.4
    Config Porta.3 = Input
    Set Porta.3
    
    '********************* Konfiguracja wyświetlacza
    Config Lcdbus = 4
    Config Lcdpin = Pin , Db4 = Portc.4 , Db5 = Portc.5 , Db6 = Portc.6 , Db7 = Portc.7 , E = Portc.2 , Rs = Portc.3
    Config Lcd = 16 * 2
    
    '********************* Konfiguracja znaku specjalnego LCD
    
    Deflcdchar 0 , 6 , 9 , 6 , 32 , 32 , 32 , 32 , 32           ' znak stopnia celcjusza
    
    '********************* Konfiguracja magistrali 1-Wire
    
    Config 1wire = Porta.0
    
    '********** Konfiguracja Timer1
    
    Config Timer1 = Timer , Prescale = 256
    Enable Timer1
    
    On Timer1 Czas
    Timer1 = 34286
    
    '********************* Konfiguracja Timer2
    
    Config Timer2 = Pwm , Prescale = 64 , Compare Pwm = Clear Up
    Enable Timer2
    
    '********** Włączenie przerwań
    
    Enable Interrupts
    
    '********************* Deklaracje zmiennych
    
    Dim Ds1(8) As Byte                                          'zmienna określająca numer układu
    Dim Ss As String * 6                                        'zmienna zawierająca przeliczoną i sformatowaną wartość wskazania układu
    Dim T1 As Integer                                           'zmienna odczytu dwóch bajtów z DS18B20
    Dim T_min As Integer
    Dim T_min1 As Integer
    Dim T_max As Integer
    Dim T_max1 As Integer
    Dim T_min_lcd As String * 6
    Dim T_max_lcd As String * 6
    Dim B As Byte
    Dim Ds1_id As Byte
    Dim Flaga_buzer As Bit
    Dim Start_menu As Byte
    Dim Licznik1 As Integer
    Dim Flaga_menu As Bit
    
    '********************* Deklaracja podprogramów
    Declare Sub Menu
    Declare Sub Ustaw_min
    Declare Sub Ustaw_max
    
    '********************* Przypisanie przyjaznych nazw do poszczególnych portów
    
    Led1 Alias Porta.1
    Buzer Alias Porta.3
    
    Enter Alias Pina.3
    Gora Alias Pina.4
    Dol Alias Pina.5
    Menu_ustaw Alias Pina.6
    
    '********************* Deklaracja wartości początkowych
    Ocr2 = 200
    T_min = 260
    T_max = 285
    
    Cursor Off                                                  'wyłącz kursor
    Cls                                                         'czyść ekran
    
    Ds1(1) = 1wsearchfirst()                                    'rozkaz szukania pierwszego układu
    
    Do
    
    Debounce Menu_ustaw , 0 , Menu , Sub
    
    
    '*************************** pomiar temp. na termometrze ds18b20
    
    '********** 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
                                                                 'czekaj 750 ms
    
    '********** magistrala 1-wire konwersja temperatury
    
    
    1wreset                                                     'reset magistrali 1-Wire
        1wwrite &HCC                                            'rozkaz funkcyjny SKIP ROM
       1wwrite &H44                                             'konwersja temperatury dla wszystkich DS18B20
    Wait 1
    
    
    '**************** pierwsze wejście - DS18B20 obliczenia + wyświetlanie **********
    
    T1 = T1 * 10
       T1 = T1 / 16
    
       Ss = Str(t1)
       Ss = Format(ss , " 0.0")                                 'formatuj według wzorca - jedno miejsce po przecinku
    
    
    Locate 1 , 1                                                'wyświetl w pozycji
    Lcd Ss ; Chr(0) ; "C "                                      'wyświetl wynik formatowania + znak specjalny + C
    
    '*************************** Ustawienie temperatur - włączenie i wyłączenie
    
    If T1 >= T_max Then                                         'jeśli temperatura wzrośnie do T_max ( 28.5 )
      Led1 = 1                                                  'włącz Led1 ( PA.1 )
     End If
    
    If T1 =< T_min Then                                         'jeśli temperatura spadnie do T_min ( 28.5 )
      Led1 = 0                                                  'wyłącz Led1 ( PA.1 )
     End If
    
    '*************************** Sygnalizacja zmian temperatury przez buzer
    
    If T1 >= T_max Or T1 =< T_min Then
       If Flaga_buzer = 0 Then
       Buzer = 1
       Waitms 200
       Buzer = 0
       Flaga_buzer = 1
       End If
        Else
        Flaga_buzer = 0
     End If
    
    Loop
    End
    
    '*********************** Podprogram ustawiania wartości temperatur
    
    Sub Menu:
    Start_menu = 0
    
    Do
    
    If Menu_ustaw = 0 Then
       Waitms 25
          If Menu_ustaw = 0 Then
             Incr Start_menu
             If Start_menu >= 3 Then
                Start_menu = 0
             End If
          End If
    End If
    
    Select Case Start_menu
       Case 0 :
       Case 1 :
          Locate 2 , 1
          Lcd "Ustaw min:"
          Wait 1 : Cls : Gosub Ustaw_min
       Case 2 :
          Locate 2 , 1
          Lcd "Ustaw max:"
          Wait 1 : Cls : Gosub Ustaw_max
    
       End Select
    
    If Enter = 0 Then
       Exit Do
    End If
    
     Loop
    End Sub
    
    Ustaw_min:
    
     If Gora = 0 Then
      T_min = T_min + 1
    
      Else
      If Dol = 0 Then
      T_min = T_min - 1
     End If
     End If
    
    T_min1 = T_min
    T_min_lcd = Str(t_min)
    T_min_lcd = Format(t_min_lcd , " 0.0")
     Locate 2 , 12
     Lcd T_min_lcd
    Return
    
    Ustaw_max:
    
       If Gora = 0 Then
        T_max = T_max + 1
       Else
      If Dol = 0 Then
       T_max = T_max - 1
    End If
    End If
    T_max1 = T_max
    T_max_lcd = Str(t_max)
    T_max_lcd = Format(t_max_lcd , " 0.0")
     Locate 2 , 12
     Lcd T_max_lcd
    Return
    
    Czas:
    Timer1 = Timer1 + 34286
    Incr Licznik1
    
    If Licznik1 = 12 Then
     Flaga_menu = 1
     Licznik1 = 0
     End If
    
    Return
    


    Timerem się proszę nie przejmować - miał służyć do wyjścia z menu, jeśli nic się nie naciska.
    Kilka razy udało się mi wejść do menu i zwiększanie/zmniejszanie wartości działa prawidłowo.
  • REKLAMA
REKLAMA