Witam
Jako ze to moj pierwszy post chcialbym z gory napisac ze jestem laikiem jesli chodzi o uC. Bawie sie tym od 2 tygodni, probowalem programowac w C ale niestety za wysokie progi. 2 dni temu zabralem sie za bascoma i wymodzilem programik do sterowania solarami, na dwoch czujkach ds1820. Mam prosbe do Was, czy jest cos w kodzie co mozna poprawic (zapewne tak) co mozna zrobic lepiej i ogolna opinie czy podczas zabawy z bascomem ide w dobrym kierunku ?
dziekuje i pozdrawiam
tutaj kod programu
ps
jesli ktos by pytal dlaczego na dwoch pinach atmegi daje 1wire to zrobione celowo
Jako ze to moj pierwszy post chcialbym z gory napisac ze jestem laikiem jesli chodzi o uC. Bawie sie tym od 2 tygodni, probowalem programowac w C ale niestety za wysokie progi. 2 dni temu zabralem sie za bascoma i wymodzilem programik do sterowania solarami, na dwoch czujkach ds1820. Mam prosbe do Was, czy jest cos w kodzie co mozna poprawic (zapewne tak) co mozna zrobic lepiej i ogolna opinie czy podczas zabawy z bascomem ide w dobrym kierunku ?
dziekuje i pozdrawiam
tutaj kod programu
ps
jesli ktos by pytal dlaczego na dwoch pinach atmegi daje 1wire to zrobione celowo
'Program obsługi kolektorow slonecznych na układzie DS1820 dołączonego
'do magistrali 1-Wire 2 pinow Atmega8 by levy^
$regfile = "m8def.dat" 'informuje kompilator o pliku 'dyrektyw mikrokontrolera
$crystal = 4000000 'informuje kompilator o częstotliwości oscylatora taktującego mikrokontroler
Config Lcd = 16 * 2 'konfiguracja typu wyświetlacza LCD
Config Lcdpin = Pin , Db4 = Portc.0 , Db5 = Portc.1 , Db6 = Portc.2 , Db7 = Portc.3 , E = Portc.4 , Rs = Portc.5 'konfiguracja linii mikrokontrolera‚ do których dołączono wyświetlacz LCD
Declare Sub Odcz_temp1 'procedura odczytu temperatury z układu DS1820 na kolektorze
Declare Sub Odcz_temp2 'procedura odczytu temperatury z układu DS1820 na bojlerze
Declare Sub Temperatura_lcd_kolektor
Declare Sub Temperatura_lcd_bojler
Declare Sub Delta
Declare Sub Obsluga_delty
Declare Sub Konfig
Declare Sub Maxtemp
Dim Temperatura1(2) As Byte 'tablica dwóch zmiennych typu Byte do pamiętania wartości temperatury kolektor
Dim Temperatura2(2) As Byte 'bojler
Dim Delta As Byte
Dim T1(2) As Byte 'zmienna pomocnicza do delty
Dim Tempzapis As Byte
Config Pind.2 = Input 'wejscia
Config Pind.3 = Input 'wejscie przycisku
Config Pind.0 = Output
Config Pind.0 = 0
Set Portd.2
Set Portd.3
Deflcdchar 0 , 7 , 5 , 7 , 32 , 32 , 32 , 32 , 32 'definicja znaku stopnia
Deflcdchar 1 , 21 , 32 , 14 , 31 , 31 , 14 , 32 , 21 'sloneczko
Deflcdchar 2 , 25 , 21 , 19 , 21 , 25 , 21 , 19 , 31 'kociol
Deflcdchar 3 , 32 , 32 , 4 , 10 , 10 , 17 , 31 , 32 'delta
Readeeprom Delta , 0
Readeeprom Tempzapis , 1
Cls
Cursor Off
Do 'początek pętli programu glownego
Call Konfig
Call Obsluga_delty
Call Odcz_temp1 'wywołanie procedury pomiaru temperatury czujki 1
Call Odcz_temp2
'sprawdzamy co minute
'Writeeeprom Temperatura1(1) , 1
'Writeeeprom Temperatura2(1) , 4
'Readeeprom Stalae1(1) , 1
'Lcd Stalae1(1)
Call Delta 'wyliczanie roznicy temperatury
Call Temperatura_lcd_kolektor
Call Temperatura_lcd_bojler
Call Maxtemp 'wywołanie procedury pomiaru temperatury czujki 2
' Wait 60 'sprawdzamy co minute
Loop 'koniec pętli Do...Loop
End 'koniec programu
Sub Odcz_temp1 'definicja procedury pomiaru temperatury
Config 1wire = Portb.0 'konfiguracja linii magistrali 1-Wire dla 1 czujki
1wreset 'reset magistrali 1-Wire
1wwrite &HCC 'opuszczenie zapisu numeru ID
1wwrite &H44 'start pomiaru temperatury
Waitms 500 'opóźnienie na czas pomiaru
1wreset 'reset magistrali 1-Wire
1wwrite &HCC 'opuszczenie zapisu numeru ID
1wwrite &HBE 'komenda odczytu zmierzonej temperatury
Temperatura1(1) = 1wread(2) 'odczyt zmierzonej temperatury do tablicy Temperatura
1wreset 'reset magistrali 1-Wire
If Err = 1 Then 'jeśli układ dołączony do magistrali nie odpowiada, to 'czyszczenie LCD
Cls
Home Lowerline
Lcd "Awaria czujki kolektora" 'wyświetlenie komunikatu o braku dołączonego układu czujki kolektora
End If
If Temperatura1(2) > 0 Then 'jeśli zmienna Temperatura(2)> 0, to temperatura ujemna przeliczenie temperatury ujemnej
Temperatura1(1) = 256 - Temperatura1(1)
End If 'koniec warunku
Temperatura1(1) = Temperatura1(1) / 2 'dalsze przeliczenie odczytanejtemperatury dodatniej jak i ujemnej
End Sub 'koniec procedury pomiaru
Sub Odcz_temp2 'definicja procedury pomiaru temperatury
Config 1wire = Portb.1 'konfiguracja linii magistrali 1-Wire dla 2 czujki
1wreset
1wwrite &HCC
1wwrite &H44
Waitms 500
1wreset
1wwrite &HCC
1wwrite &HBE
Temperatura2(1) = 1wread(2)
1wreset
If Err = 1 Then 'jeśli układ dołączony do magistrali nie odpowiada, to
Cls
Home Lowerline 'czyszczenie LCD
Lcd "Awaria czujki bojlera" 'wyświetlenie komunikatu o braku dołączonego układu
Waitms 700 ' czekanie na wskazania drugiego wyswietlacza, podczas braku czujki
End If
If Temperatura2(2) > 0 Then 'jeśli zmienna Temperatura(2)> 0, to temperatura ujemna przeliczenie temperatury ujemnej
Temperatura2(1) = 256 - Temperatura2(1)
End If 'koniec warunku
Temperatura2(1) = Temperatura2(1) / 2 'dalsze przeliczenie odczytanejtemperatury dodatniej jak i ujemnej
End Sub 'koniec procedury pomiaru czujki 2
Sub Temperatura_lcd_kolektor
If Temperatura1(2) = 0 Then
Home Upper 'jeśli wartość Temperatura(2)= 0, to temperatura dodatnia wyświetla temperatury dodatnie
Lcd Chr(1) ; " " ; Temperatura1(1) ; Chr(0) ; "C"
Else
Home Upper 'w przeciwnym razie wyświetla temperatury ujemne
Lcd Chr(1) ; " -" ; Temperatura1(1) ; Chr(0) ; "C"
End If
' if temperatura1(2)
End Sub
Sub Temperatura_lcd_bojler
If Temperatura2(2) = 0 Then ' nizsza linia
Locate 1 , 10
Lcd Chr(2) ; " " ; Temperatura2(1) ; Chr(0) ; "C"
Else
Lowerline
Lcd Chr(2) ; " -" ; Temperatura2(1) ; Chr(0) ; "C"
End If
End Sub
Sub Delta
T1(1) = Temperatura1(1) - Delta ' delta temperatury kolektor - bojler
If Temperatura2(1) <= T1(1) And Temperatura2(1) < 90 Then ' jesli temperatura bojlera osiagnie 90C wylacz pompe, obliczanie delty
If Temperatura2(1) = 0 Or Temperatura1(1) = 0 Then ' w razie uszkodzonej czujki wylacz pompe
Config Pind.0 = 0
Do
Loop
End If
Config Pind.0 = 1 'ustaw mase na pinie - wlacz pompe
Locate 2 , 8
Lcd "Pompa ON"
If Temperatura2(1) > Tempzapis Then ' jesli temperatura bojlera jest wieksza od zapamietanej zapisz do eepromu podczas pracy pompy
Tempzapis = Temperatura2(1) 'wyznaczamy maxymalna osiagnieta temperature bojlera
Writeeeprom Tempzapis , 1
End If
Else
Config Pind.0 = 0 ' wylacz pompe
Locate 2 , 8
Lcd "Pompa OFF"
End If
End Sub
Sub Obsluga_delty
' Delta = 4
Lowerline
Lcd Chr(3) ; "=" ; Delta
End Sub
Sub Konfig
If Pind.2 = 0 And Pind.3 = 0 Then 'jesli oba przyciski wcisniete
'menu glowne zmiany delty
Config Pind.0 = 0
Cls
Delta = 5
Home
Lcd "Zmiana delty"
Lowerline
Lcd Chr(3) ; "=" ; Delta ; " zalecana"
Wait 1
Do
If Pind.2 = 0 And Pind.3 = 0 Then 'jesli jeden i drugi wcisniety
Waitms 200 'zapisywanie do eeepromu tak/nie
If Pind.2 = 0 And Pind.3 = 0 Then
Home
Lcd "Zapisac w pamieci?"
Lowerline
Lcd "<-TAK NIE-> " ; Chr(3) ; "=" ; Delta
Wait 1
Do
If Pind.2 = 0 And Pind.3 = 1 Then
Writeeeprom Delta , 0 'zapis do eepromu
Cls
Return 'powrot do petli glownej
End If
If Pind.3 = 0 And Pind.2 = 1 Then ' jesli prawy przycisk to wroc tylko do programu
Cls
Return
End If
Loop
Cls
End If
End If
If Pind.2 = 0 And Pind.3 = 1 Then ' jesli przycisk lewy wcisniety a prawy nie to
Waitms 50 ' w menu glownym
If Pind.2 = 0 And Pind.3 = 1 Then
If Delta <= 20 And Delta > 1 Then 'wartosc maxymalna 20 przedzial wartosci 0 - 20
Decr Delta ' zmniejsz delte
Cls
Home
Lcd "Zmiana delty"
Lowerline
Lcd Chr(3) ; "=" ; Delta
Waitms 200
End If
End If
End If
'w dół 'jesli przycisk prawy wcisniety a lewy nie to
If Pind.3 = 0 And Pind.2 = 1 Then ' w menu glownym
Waitms 50
If Pind.3 = 0 And Pind.2 = 1 Then
If Delta >= 1 And Delta < 20 Then 'przedzial wartosci 0 - 20
Incr Delta 'zwieksz delte
Cls
Home
Lcd "Zmiana delty"
Lowerline
Lcd Chr(3) ; "=" ; Delta
Waitms 200
End If
End If
End If
Loop
End If
End Sub
' sprawdzanie prawym przyciskiem
Sub Maxtemp ' maxymalnej temperatury na bojlerze podczas dzialania pompy
If Pind.3 = 0 And Pind.2 = 1 Then 'czyli podczas dzialania naszego kolektora
Waitms 50
If Pind.3 = 0 And Pind.2 = 1 Then
Cls
Lcd "Max.temp.bojlera"
Lowerline
Lcd Tempzapis ; Chr(0) ; "C"
Wait 5
Cls
End If
End If
If Pind.3 = 1 And Pind.2 = 0 Then 'czyszczenie pamieci maxymalnej temperatury lewym przyciskiem
Waitms 50
If Pind.3 = 1 And Pind.2 = 0 Then
Cls
Lcd Tempzapis ; Chr(0) ; "C <- wymazac ?"
Lowerline
Lcd "<-NIE TAK->"
Wait 1 'czekaj nie tak szybko :)
Do
If Pind.3 = 0 And Pind.2 = 1 Then 'czyszczenie pamieci maxymalnej temperatury lewym przyciskiem
Waitms 50
If Pind.3 = 0 And Pind.2 = 1 Then
Writeeeprom Temperatura2(1) , 1
Waitms 100
Readeeprom Tempzapis , 1
Cls
Return
End If
End If
If Pind.3 = 1 And Pind.2 = 0 Then 'wyjscie z niczym, powrot do petli glownej
Waitms 50
If Pind.3 = 1 And Pind.2 = 0 Then
Cls
Return
End If
End If
Loop
Cls
End If
End If
End Sub