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