Elektroda.pl
Elektroda.pl
X
Please add exception to AdBlock for elektroda.pl.
If you watch the ads, you support portal and users.

[atmega8][bascom] co można poprawić w tym kodzie?

levy^ 15 Jul 2009 22:56 1957 6
Computer Controls
  • #1
    levy^
    Level 17  
    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

    
    '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
    
  • Computer Controls
  • #2
    wader_669
    Level 28  
    1. Co minute zapis do eeprom, nie wiem czy to dobry pomysl. Wiesz, ze eeprom posiada mala ograniczona ilosc zapisow? Lepiej dodaj jeszcze warunek, ze jak naprawde minute pozniej ta temperatura sie zmieni wtedy dopiero zapisuje.
    2. Ja bym dal odczyt temp w jednym subie po co 2 (tylko miejsce zajmuje), dodatkowo dodal jakas zmienna w zaleznosci od ktorej by sprawdzal czujnik1 lub 2. Po odczycie czujnika1 zwieksza by ta zmienna a a po odczyscie czujnika 2 by sie zmniejszal zmienna.
    3. W sub konfig przy pierwszym sprawdzaniu nie wykluczyles drgan stykow

    Dodano po 15 [sekundy]:

    dalej juz nie sprawzalem
  • Computer Controls
  • #3
    dawid512
    Level 32  
    Config 1wire zrób na początku po co za każdym razem go konfigurować. Po za tym DS potrzebuje 750ms na konwersję a nie 500. Program napisany dość poprawnie z wykorzystaniem podprogramów.
  • #4
    wader_669
    Level 28  
    4. Wkradl sie sie return do sub maxtemp.

    Wiec jednak troche dalej sprawdzilem.

    Co do 1 sugesti bym musial pomyslec, czy sie oplaca tak kombinowac,

    Dodano po 2 [minuty]:

    Szkoda, ze durny bascom nie posiada tablic 2 wymiarowych !!!!!!! Moze kiedys wpadna na to zeby to dodac.
  • #5
    levy^
    Level 17  
    wader_669 wrote:
    1. Co minute zapis do eeprom, nie wiem czy to dobry pomysl. Wiesz, ze eeprom posiada mala ograniczona ilosc zapisow? Lepiej dodaj jeszcze warunek, ze jak naprawde minute pozniej ta temperatura sie zmieni wtedy dopiero zapisuje.



    AD1 wiem ze eeprom ma ograniczona ilosc zapisow, tylko gdzie zrobilem cos nie tak ze zapisuje co minute wartosc do eepromu ? staralem sie za bardzo nie obciazac eepromu dlatego wartosc maxymalna porownuje do ostatniej zapamietanej i jesli jest wieksza wtedy nadpisuje

    AD2 jak tylko znajde chwilke to zadzialam, bardzo trafna uwaga, juz wiem jak to zrobic :)


    AD3
    zaraz poprawie


    AD4a jak inaczej moge zamiast return wrocic do petli glownej ?


    dzieki wielkie za zainteresowanie
  • Helpful post
    #6
    wader_669
    Level 28  
    le sorry, moj blad myslalem ze to program, a to byl koment do programu.

    Co do tego return. Jak dobrze widze to jest to sub a nie przerwanie lub podprogram. A wracasz z suba normalnie przez end sub.

    Dodano po 5 [minuty]:

    widze, ze masz tam petle to dodaj flage (zmienna jedno bitowa) do tego ifa i zrob loop until flaga.
    Dam ci przyklad:

    
    dim flaga as bit
    flaga=0
    do
    
    loop
    end
    
    sub ...
    do
    
    if cos tam then
    flaga=1
    end if
    
    loop until flaga=1
    flaga=0
    end sub
    


    Dodano po 5 [minuty]:

    A tak na marginesie calkiem spoko napisales program po 2 tyg. Ja mialem wieksze problemy jak zaczynalem :P
  • #7
    levy^
    Level 17  
    fajowo jutro go zastosuje, od 2 tygodni to ja mam zestaw uruchomieniowy zl2avr, wtedy zaczalem w C, a z bascomem zaczalem sie bawic 3 dni temu, duzo latwiejszy i przyjemniejszy ale nie daje tylu mozliwosci co C