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

[Mega32][Bascom] Prosty termostat - ustawianie temperatur

Elektronik_Kraków 18 Mar 2011 23:29 1925 1
  • #1 18 Mar 2011 23:29
    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.


    Code:

    $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.

    0 1
  • #2 19 Mar 2011 20:46
    arktik1
    Poziom 27  

    A co to jest?:

    Code:
    Config Porta.3 = Output
    
    Reset Porta.3

    i dalej
    Code:

    Config Porta.3 = Input
    Set Porta.3

    To nie będzie działać prawidłowo.

    0