witam
Czy ktoś z wytrawnych bacom-owców mógłby mi podpowiedzieć jak poprawić kod
Program jest banalny dla was
ja dopiero się uczę
Napisałem program z menu przełączanym jednym klawiszem - zmienna Menu_id zliczana i ze względu na nią i ponowne naciśniecie klawisza wywołuję podprogramy - wszytko działało super dopóki nie dodałem pomiaru temperatury na znanym i lubianym ds18b20. Problem w tym że teraz gdy wyświetlam temp klawisz nie działa - tzn działa ale z dużym opóźnieniem a co więcej zaraz powraca do wyświetlania temp – pomimo tego że zmienna Menu_id odpowiedzialna wydawać by się mogło za wyświetlanie temp ma inna wartość. Rozkładam ręce ;(
[/code]
Czy ktoś z wytrawnych bacom-owców mógłby mi podpowiedzieć jak poprawić kod

Program jest banalny dla was


Napisałem program z menu przełączanym jednym klawiszem - zmienna Menu_id zliczana i ze względu na nią i ponowne naciśniecie klawisza wywołuję podprogramy - wszytko działało super dopóki nie dodałem pomiaru temperatury na znanym i lubianym ds18b20. Problem w tym że teraz gdy wyświetlam temp klawisz nie działa - tzn działa ale z dużym opóźnieniem a co więcej zaraz powraca do wyświetlania temp – pomimo tego że zmienna Menu_id odpowiedzialna wydawać by się mogło za wyświetlanie temp ma inna wartość. Rozkładam ręce ;(
Code:
$regfile = "m8def.dat" 'informuje kompilator o pliku
'dyrektyw mikrokontrolera
$crystal = 8000000 'informuje kompilator
'o częstotliwości oscylatora
'taktującego mikrokontroler
' -------------------- temperatura
Config 1wire = Portc.0
Deflcdchar 1 , 4 , 10 , 4 , 32 , 32 , 32 , 32 , 32 'znak stopnia
Dim T1 As Single
Dim T2 As Single
Dim B1 As Byte , B2 As Byte , R As Byte
Dim Tmp As String * 6
Dim Znak As String * 1
R = &HFF
Declare Sub 1wr 'podprogram resetujacy magistrale 1w
'----------------- temperatura
Config Portc.1 = Output
Config Portb.2 = Output
Config Portb.1 = Output
Config Portd.0 = Output
Config Pinb.3 = Input 'linia PB1 jako wejściowa
Config Pinb.4 = Input 'linia PB2 jako wejściowa
Config Pinb.5 = Input 'linia PB3 jako wejściowa
Config Lcd = 16 * 2 'konfiguracja typu wyświetlacza
'LCD
Config Lcdpin = Pin , Db4 = Portd.5 , Db5 = Portd.6 , Db6 = Portd.7 , Db7 = Portd.4 , E = Portd.3 , Rs = Portd.2 'konfiguracja linii
'mikrokontrolera, do których
'dołączono wyświetlacz
'LCD
Declare Sub Wybierz_menu 'procedura wedrujaca po menu
Declare Sub Dozuj_p1
Declare Sub Dozuj_p2
Declare Sub Dozuj_p3
Dim Menu_id As Byte
Dim Ilosc_ml_p1 As Byte
Dim Ilosc_ml_p2 As Byte
Dim Ilosc_ml_p3 As Byte
Dim Odliczanie As Byte
S1 Alias Pinb.3
S2 Alias Pinb.4
S3 Alias Pinb.5
Set Portb.3
Set Portb.4
Set Portb.5
Menu_id = 0
' ------------------------------------------ GŁÓWNA PĘTLA -----------------------------------
Ilosc_ml_p1 = 5
Ilosc_ml_p2 = 5
Ilosc_ml_p3 = 5
Cursor Off
Menu_id = 0
Do
Call Wybierz_menu
If S3 = 0 Then 'jeśli przyciśnięty S3, to
Waitms 25 'opóźnienie dla eliminacji drgań
'styków
If S3 = 0 Then
Incr Menu_id
Waitms 150
If Menu_id = 5 Then
Menu_id = 0
End If
Call Wybierz_menu
End If
End If
If Menu_id = 0 Then
Waitms 25
Do
Gosub Temperatura
'Lcd Znak ; Tmp ; Chr(1)
Loop Until S3 = 0
End If
If Menu_id = 1 Then
Waitms 25
Do
Call Dozuj_p1
Loop Until S3 = 0
End If
If Menu_id = 2 Then
Waitms 25
Do
Call Dozuj_p2
Loop Until S3 = 0
End If
If Menu_id = 3 Then
Waitms 25
Do
Call Dozuj_p3
Loop Until S3 = 0
End If
If Menu_id = 4 Then
Waitms 25
Do
Loop Until S3 = 0
End If
Loop
End 'koniec programu
' ------------------------------------------ KONIEC GŁÓWNA PĘTLA -----------------------------------
Sub Wybierz_menu
Cls
Select Case Menu_id
Case 0 : Lcd " Dozownik v 1.0 "
'Lowerline
Case 1 : Lcd "Dozuj P1"
Case 2 : Lcd "Dozuj P2"
Case 3 : Lcd "Dozuj P3"
Case 4 : Lcd "Dozownik auto"
End Select
Return
End Sub
Sub Dozuj_p1
Dim Ile_p1 As Byte
Dim S_p1 As String * 2
Waitms 25
Lowerline
S_p1 = Str(ilosc_ml_p1)
Lcd Format(s_p1 , "00") ; " ml"
If S1 = 0 Then
Waitms 25
If S1 = 0 Then
Cls
Lcd "Dozuj P1"
Incr Ilosc_ml_p1
Waitms 25
Lowerline
S_p1 = Str(ilosc_ml_p1)
Lcd Format(s_p1 , "00") ; " ml"
If Ilosc_ml_p1 = 41 Then
Ilosc_ml_p1 = 1
End If
End If
End If
If S2 = 0 Then
Waitms 25
If S2 = 0 Then
Portb.1 = 1
Ile_p1 = Ilosc_ml_p1
For Odliczanie = 0 To Ilosc_ml_p1
Cls
Lcd "Dozuj P1"
Lowerline
S_p1 = Str(ile_p1)
Lcd Format(s_p1 , "00") ; " ml"
Wait 1
Decr Ile_p1
Next Odliczanie
Portb.1 = 0
End If
End If
End Sub
Sub Dozuj_p2
Dim Ile_p2 As Byte
Dim S_p2 As String * 2
Waitms 25
Lowerline
S_p2 = Str(ilosc_ml_p2)
Lcd Format(s_p2 , "00") ; " ml"
If S1 = 0 Then
Waitms 25
If S1 = 0 Then
Cls
Lcd "Dozuj P2"
Incr Ilosc_ml_p2
Waitms 25
Lowerline
S_p2 = Str(ilosc_ml_p2)
Lcd Format(s_p2 , "00") ; " ml"
If Ilosc_ml_p2 = 41 Then
Ilosc_ml_p2 = 1
End If
End If
End If
If S2 = 0 Then
Waitms 25
If S2 = 0 Then
Portb.2 = 1
Ile_p2 = Ilosc_ml_p2
For Odliczanie = 0 To Ilosc_ml_p2
Cls
Lcd "Dozuj P2"
Lowerline
S_p2 = Str(ile_p2)
Lcd Format(s_p2 , "00") ; " ml"
Wait 1
Decr Ile_p2
Next Odliczanie
Portb.2 = 0
End If
End If
End Sub
Sub Dozuj_p3
Dim Ile_p3 As Byte
Dim S_p3 As String * 2
Waitms 25
Lowerline
S_p3 = Str(ilosc_ml_p3)
Lcd Format(s_p3 , "00") ; " ml"
If S1 = 0 Then
Waitms 25
If S1 = 0 Then
Cls
Lcd "Dozuj P3"
Incr Ilosc_ml_p3
Waitms 25
Lowerline
S_p3 = Str(ilosc_ml_p3)
Lcd Format(s_p3 , "00") ; " ml"
If Ilosc_ml_p3 = 41 Then
Ilosc_ml_p3 = 1
End If
End If
End If
If S2 = 0 Then
Waitms 25
If S2 = 0 Then
Portd.0 = 1
Ile_p3 = Ilosc_ml_p3
For Odliczanie = 0 To Ilosc_ml_p3
Cls
Lcd "Dozuj P3"
Lowerline
S_p3 = Str(ile_p3)
Lcd Format(s_p3 , "00") ; " ml"
Wait 1
Decr Ile_p3
Next Odliczanie
Portd.0 = 0
Menu_id = 4
End If
End If
End Sub
'xxxxxxxxxxxxxx pomiar temperatury xxxxxxxxxxxxxxxxxxxxxxxxxx
Temperatura:
1wreset '1wr
1wwrite &HCC 'skip ROM
1wwrite &H44 'convert T
Waitms 250
Waitms 250
1wreset '1wr
1wwrite &HCC 'skip ROM
1wwrite &HBE 'read
B1 = 1wread() 'czytam czojnik
B2 = 1wread()
1wreset '1wr
If B2 >= 248 Then 'jesli ujemna
B1 = R - B1 '255 - B1
B2 = R - B2 '255 - B2
Znak = "-"
Else
Znak = "+"
End If
T1 = B1 / 16 'w pawo o 4 bajty
T2 = B2 * 16 'w lewo o 4 bajty
T1 = T1 + T2
Tmp = Fusing(t1 , " ###.&")
Cls
Lcd Znak ; Tmp ; Chr(1)
Waitms 250
Waitms 250
Waitms 250
Waitms 50
Return
[/code]