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

[Atmega 8] [Bascom] Sterownik cyrkulacji C.W.U

cinek_14 27 Gru 2009 20:10 6197 14
  • #1 27 Gru 2009 20:10
    cinek_14
    Poziom 12  

    Witam
    Jestem w trakcie tworzenia Sterownika do Pompy Ciepłej wody Użytkowej (C.W.U) ten sterownik ma spełniać dwa warunki:
    1. Włączyć pompę, jeżeli temperatura zadana jest większa bądź równa temperaturze, jaka jest w bojlerze z ciepłą wodą
    2. Włączyć pompę o określonej porze np. od godziny 6.00 do godziny 8.00
    Mózgiem tego będzie ATMEGA8 układ czasowy to PCF8583, układ do mierzenia temperatury na zbiorniku to DS1820 Wyświetlacz LCD 2x16. Próbowałem już napisać coś w Bascom-ie, ale ciężko mi idzie (kod poniżej) i miał bym do was prośbę czy pomógłby mi ktoś zrobić Menu.
    Sterownik ma działać tak jak go włączę to w pierwszej linijce wyświetlacza ma być aktualny czas a w drugiej temperatura bojlera, jeżeli przyciśniemy około 2 sekund przycisk Menu(S5) to pokaże nam się w pierwszej linijce Ustaw temperaturę a w drugiej temperatura, którą regulujemy przyciskiem S3, S4, gdy przyciśniemy jeszcze raz menu to przejdziemy do drugiej opcji menu, czyli ustaw aktualny czas poruszanie się S3 do góry S4 w dół S1 Lewo S2 prawo następnie jak przyciśniemy menu to przejdziemy do Ustaw Pierwszy czas programowania poruszamy się tak samo jak przy ustawieniu aktualnego czasu i tymi ustawieni mamy np. takie 7:00 - 8:00 a gdy Będzie ustawienie 00:00 - 00:00 to programowanie czasu wyłączone i następne przyciśnięcie Menu spowoduje do przejścia dalej, czyli Ustaw 2 czas i tak samo jak poprzedni i tak 10 razy a gdy byśmy jakiegoś przycisku nie przycisnęli przez około 10 sekund to wróci do głównego programu, czyli wyświetli czas i temperaturę. I jeszcze jedna taka opcja, czyli ręczne włączanie pompy jak przycisk S6 przyciśnie się przez 3 sekundy pompa się włączy na wyświetlaczu będzie napisane w pierwszej linijce Ręczne wł., pompy a w drugiej linijce Włączona a jak ponownie się przyciśnie to będzie pisało wyłączona i przejdzie do głównego programy, czyli czas i temperatura.
    Przykład działania
    Czas 7:20
    Temp. Bojlera: 35 stopni C
    Menu:
    1.
    Temp. zadana
    30 stopni C
    2.
    Ustaw Czas
    7:20
    3.
    Ustawienie 1
    6:00 - 8:00
    4.
    Ustawienie 2
    14:00 - 16:00
    5.
    Ustawienie 3
    18:00 - 19:20
    6.
    Ustawienie 4
    21:00 - 22:30
    7.
    Ustawienie 5
    00:00 - 00:00
    8.
    Ustawienie 6
    00:00 - 00:00
    9.
    Ustawienie 7
    00:00 - 00:00
    10.
    Ustawienie 8
    00:00 - 00:00
    11.
    Ustawienie 9
    00:00 - 00:00
    12.
    Ustawienie 10
    00:00 - 00:00

    Mam nadzieje, że dobrze napisałem starałem się opisać to tak, abyście zrozumieli co mam na myśli.
    Proszę was o pomoc zrobiłem schemat, ale płytki i elementów jeszcze nie mam, bo muszę je dopiero zamówić a po drugi to jak nie zrobię programu to reszta nie ma sensu, ale jak będzie program to i sterownik zrobię. Poniżej jest to, na czym stanąłem i prosiłbym was o wyjaśnienia tak abym zrozumiał, bo chciałbym się nauczyć tworzenia takich programów, bo nawet to jak siedzę i czytam różne artykuły to już mnie powoli wciągnęło.

    Code:
    '##########Konfiguracja uC##########
    
    $sim
    $regfile = "m8def.dat"
    $crystal = 16000000

    Config Portc.0 = Input                                      'przyciski 1
    Config Portc.1 = Input                                      'przycisk 2
    Config Portc.2 = Input                                      'przycisk 3
    Config Portc.3 = Input                                      'przycisk 4
    Config Portd.3 = Input                                      'przycisk 5
    Config Portd.5 = Input                                      'przycisk 6

    Config Portb = Output                                       'LCD
    Config Portd.0 = Output                                     'LCD pobudzenie
    Config Portd.4 = Output                                     'pompa

    Config Lcdpin = Pin , Db4 = Portb.3 , Db5 = Portb.2 , Db6 = Portb.1 , Db7 = Portb.0 , E = Portb.4 , Rs = Portb.5       'mirley UPT M16
    Config Lcd = 16 * 2
    Cls
    Cursor Off Noblink

    Config 1wire = Pind.7                                       'DS18B20


    Config Scl = Portc.5
    Config Sda = Portc.4


    Pompa Alias Portd.4                                         'pin przypisany do zminnej pompa
    Lcd_light Alias Portd.0
    Sw1 Alias Portc.0                                           'Lewo
    Sw2 Alias Portc.1                                           'prawo
    Sw3 Alias Portc.2                                           'góra
    Sw4 Alias Portc.3                                           'dół
    Sw5 Alias Portd.3                                           'menu
    Sw6 Alias Portd.5                                           'pompa



    Set Portc.0
    Set Portc.1
    Set Portc.2
    Set Portc.3
    Set Portd.3
    Set Portd.5



    Declare Sub Odcz_temp
    Declare Sub W_pompa
    Declare Sub Ustaw_czas
    Declare Sub Ustaw_h
    Declare Sub Ustaw_m


    '*** DEKLARACJA PROCEDUR SUB ***
    Declare Sub Settime(byval S1 As Byte , Byval M1 As Byte , Byval H1 As Byte , Byval D1 As Byte , Byval Month1 As Byte)
    Declare Sub Gettime


    Enable Interrupts
    '#########Konfiguracja Koniec##########

    '#########Zmienne##########

    Dim Sw As Byte , Sw1 As Byte , Sw2 As Byte , Sw3 As Byte , Sw4 As Byte , Sw5 As Byte , Sw6 As Byte
    Dim Autolight As Byte

    Dim Menu As Byte


    Dim S As Byte , M As Byte , H As Byte , D As Byte , Month As Byte
    Dim Wm As Byte , Yd As Byte


    Dim Temperatura(2) As Byte                                  'DS1820
    Dim T_ust As Word , Warunek1 As Bit                         'termostat

    Dim Godziny As Byte , Minuty As Byte , Sekundy As Byte
    Dim Godziny_bcd As Byte , Minuty_bcd As Byte , Sekundy_bcd As Byte
    Dim Zapisz_czas As Bit

    Dim Pompa As Byte

    '##########Zmienne koniec#########

    '##########Początek##########
    Call Settime(10 , 1 , 1 , 29 , 11)                          'set time
    Lcd_light = 0
    Autolight = 20
    Cls
    Lcd "Sterownik Pompy"                                       'wyświtetl " "
    Lowerline                                                   'przejdz do nowej lini
    Lcd "Cyrkulacji"                                            'wyświetl " "

    Wait 5                                                      'czekaj 5sek

    Deflcdchar 0 , 7 , 5 , 7 , 32 , 32 , 32 , 32 , 32           'stopien

    Cls
    Do
        Call Gettime
        Call Odcz_temp
        Home
       Lcd Hex(h) ; ":" ; Hex(m) ; ":" ; Hex(s)
       Lowerline
       If Temperatura(2) = 0 Then
          Lcd "Temp: " ; Temperatura(1) ; Chr(0) ; "C"
       Else
          Lcd "Temp: -" ; Temperatura(1) ; Chr(0) ; "C"
          End If


    If Sw5 = 0 Then
       Waitms 25
       If Sw5 = 0 Then
          Do
             Gosub Menu
          Loop
       End If
    End If





     Debounce Sw5 , 0 , Menu , Sub                              'wejście do menu

     Debounce Sw6 , 0 , W_pompa , Sub                           'ręczne włączenie pompu




     Loop
    End                                                         'end program

    '##########MENU##########
    Menu:

     Cls
     Lcd "Ustaw Temp. "

     Debounce Sw5 , 0 , Ustaw_czas , Sub

     Incr T_ust
       If Sw3 = 0 Then
          Waitms 25
             If Sw3 = 0 Then
                T_ust = T_ust + 1
             End If
       End If
       If Sw4 = 0 Then
          Waitms 25
           If Sw4 = 0 Then
              T_ust = T_ust - 1
           End If
       End If

        If T_ust = 0 Then
           Warunek1 = 0
        End If
        If T_ust >= Temperatura(2) Then
          Warunek1 = 1
        End If
        Locate 2 , 7
        Lcd T_ust ; Chr(0) ; "C"

     '   Wait 7

     Return
    '##########MENU KONIEC##########
    '##########CZAS##########
    ' *** PROCEDURY ****

    'uwstaw czas
    Ustaw_czas:
       If Sw1 = 0 Then
          Waitms 25
             If Sw1 = 0 Then
                Gosub Ustaw_h
             End If
       End If


       If Sw2 = 0 Then
          Waitms 25
             If Sw2 = 0 Then
                Gosub Ustaw_m
             End If
       End If
     Return

     Ustaw_h:
     If Sw3 = 0 Then
       Waitms 25
          If Sw3 = 0 Then
             H = H + 1
          End If
     End If
     If Sw4 = 0 Then
       Waitms 25
          If Sw4 = 0 Then
             H = H - 1
          End If
     End If
     Return


     Ustaw_m:
       If Sw3 = 0 Then
          Waitms 25
             If Sw3 = 0 Then
                M = M + 1
             End If
       End If

       If Sw4 = 0 Then
          Waitms 25
             If Sw4 = 0 Then
                M = M - 1
             End If
       End If
       Return



    Return


      'odczyt
    Sub Gettime
        I2cstart                                                'generate start
        I2cwbyte &HA0                                           'write addres of PCF8583
        I2cwbyte 2                                              'select second register

        I2cstart                                                'generate repeated start
        I2cwbyte &HA1                                           'write address for reading info
        I2crbyte S , Ack                                        'read seconds
        I2crbyte M , Ack                                        'read minutes
        I2crbyte H , Ack                                        'read hours
        I2crbyte Yd , Ack                                       'read year and days
        I2crbyte Wm , Nack                                      'read weekday and month
        I2cstop                                                 'generate stop
    End Sub


    Sub Settime(s1 As Byte , M1 As Byte , H1 As Byte , D1 As Byte , Month1 As Byte)
        'values are stored as BCD values so convert the values first
        'zapis
        S1 = Makebcd(s1)                                        'seconds
        M1 = Makebcd(m1)                                        'minutes
        H1 = Makebcd(h1)                                        'hours
        D1 = Makebcd(d1)                                        'days
        Month1 = Makebcd(month1)                                'months


        I2cstart                                                'generate start
        I2cwbyte &HA0                                           'write address
        I2cwbyte 0                                              'select control register
        I2cwbyte 8                                              'set year and day bit for masking
        I2cstop                                                 'generate stop

        I2cstart                                                'generate start
        I2cwbyte &HA0                                           'write mode
        I2cwbyte 2                                              'select seconds Register
        I2cwbyte S1                                             'write seconds
        I2cwbyte M1                                             'write minutes
        I2cwbyte H1                                             'Write Hours
        I2cwbyte D1                                             'write days
        I2cwbyte Month1                                         'write months
        I2cstop
    End Sub


    '##########Koniec ustaw czas##########



    '##########Pompa##########
    W_pompa:

     Cls
     Lcd "Reczne Wł. Pompy"
     Lowerline


       If Sw6 = 0 Then
          Waitms 25
             If Sw6 = 0 Then
                Pompa = 1
             End If
       End If
      If Pompa = 1 Then
          Lcd "Wałączona"
      End If

      If Pompa = 0 Then
          Lcd "Wyłączona"
      End If
     Return

    '##########Odczyt temperatury##########
    Sub Odcz_temp

       1wreset
       1wwrite &HCC
       1wwrite &H44
       Waitms 750
       1wreset
       1wwrite &HCC
       1wwrite &HCB

       Temperatura(1) = 1wread(2)

       1wreset
       If Err = 1 Then

          Cls
          Lcd "Brak Ukladu!!!"
          Lowerline
          Lcd "Podlacz czujnik"
          Do

          Loop
       End If

       If Temperatura(2) > 0 Then
          Temperatura(1) = 256 = Temperatura(1)
       End If
       Temperatura(1) = Temperatura(1) / 2

    End Sub
    '##########Odczyt Temperatury Koniec##########





    Schemat

    0 14
  • #2 27 Gru 2009 22:28
    michalko12
    Specjalista - Mikrokontrolery

    Ja tylko dwa słowa odnośnie schematu -
    Nie zapomnij o resecie na złączu programującym.

    0
  • #3 27 Gru 2009 23:20
    cinek_14
    Poziom 12  

    Czyli schemat zrobiony poprawnie a program jak zrobić ten zegarek żeby go ustawić i aby działał poprawnie?

    0
  • #4 28 Gru 2009 19:11
    Wojtek75
    Poziom 23  

    No niestety raczej niepoprawny. O resecie kolega wyżej juz wspomniał nie zapomnij go ściągnąć przez rezystor do VCC. Poza tym patrzę na tego pcf'a 8583 którego masz na schemacie i przecieram oczy ze zdziwienia nie wiem czy sam tworzyłeś bibliotekę (jeżeli tak to do poprawki) czy znalazłeś to gdzieś w sieci, ale praktycznie żaden symbol nie zgadza się z numerem pinu na którym w rzeczywistości występuje.
    Tutaj masz notę tego układu: http://www.datasheetarchive.com/pdf-datasheets/Datasheets-24/DSA-467820.pdf porównaj sobie str.4.
    I jeszcze wałkowany średnio raz w tygodniu temat filtrowania napięcia na zasilaniu uC (kondensatory 100nF przy pinach zasilających).
    Co do kodu to na razie nie wygląda to zbyt dobrze. Musisz to uporządkować poczytaj helpa, jakąś literaturę, elektrodę.

    0
  • #5 28 Gru 2009 19:25
    tmf
    Moderator Mikrokontrolery Projektowanie

    No i D1 i D2 lepiej, zeby to byly diody Schottkiego, zamiast baterii lepiej wlozyc supercap (w koncu podtrzymywanie wiecej niz kilkadziesiat godzin nie bedzie konieczne), a przy RTC wsadzic trymer dla regulacji. Poza tym zamiast dawac zewnetrzny RTC czemu nie zrealizowac go programowo?

    0
  • #6 28 Gru 2009 20:14
    cinek_14
    Poziom 12  

    Po pierwsze to dziękuje za zainteresowanie się tematem.
    Wzorowałem się na projekcie
    http://mirley.firlej.org/prosty_sterownik_domowy
    tam jest Atmega16 ale mi taka nie była potrzebna wiec próbowałem coś sam zrobić a zrobiłem to na zewnętrznym ponieważ taki był w projekcie na którym się wzorowałem. Korzystałem z helpa i z książki "Programowanie mikrokontrolerów AVR w języku Bascom" Marcina Wiązania.
    Poprawiłem właśnie kod wzorowałem się na innych projektach(kod znajduje się zamiast tamtego)
    Diody dałem takie jak były w tym projekcie co się wzorowałem.
    Do złącza reset podłączyłem rezystor 10k i do zasilania.
    A co z programem i schematem pomoże mi ktoś to poprawić bardzo bym był wdzięczny

    0
  • #7 29 Gru 2009 21:21
    marco47
    Poziom 41  

    Witam kolegów
    Kolego cinek_14
    Przy rysowaniu schematu uzywaj polecenia NET a nie Wire
    Obudowy układów ustawiaj tak aby napisy lezały poziomo.
    Podaj schemat w pliku to go poprawię
    Co do programu , za bardzo rozbudowany
    Przykład rozwiązania menu

    Code:
     Select Case Menu
    
        Case 0:                                     
    'program do wykonania
        Case 1:                                     
    'program do wykonania
        Case 2:                                     
    'program do wykonania
        Case 3:                                       
    'program do wykonania
    End Select

    W kodzie przycisków odwołanie do numeru Menu
    Zresztą Sam do tego dojdziesz
    Zlikwiduj Waitms 25 i podobne . Program stoi i czeka , lepiej uzyj bitów pomocniczych dla przyciskow
    Code:
    If Przycisk = 1 Then                              'jeśli przyciśnięty switch_1
    
      M1 = 1                                          'ustaw bit pomocniczy
       If M1 = 1 And M2 = 0 Then                      'jeśli nadal wciśnięty
        'jakieś działania programu
             M2 = 1                                   'zablokuj dalsze zmiany do czasu zwolnienia switch_1
          Else
        M1 = 0 : M2 = 0                               'zeruj bity pomocnicze 
      End If
    End If

    działanie przycisku na naciśnięcie.
    Zacznij od szkieletu programu który piszesz.
    Zaremuj wszystko oprócz przycisków , wyświetlacza i testuj mozliwe rozwiązania.
    Dopiero jak się uporasz z jednym zagadnieniem przechodz do następnego . Nigdy nie staraj się pisać programu od początku do końca nie testując poszczególnych bloków kodu i ich wzajemnego współdziałania.
    Przyjemnego testowania

    0
  • #8 29 Gru 2009 23:18
    cinek_14
    Poziom 12  

    Witam z menu to chyba się już uporałem poszperałem po forum i znalazłem podobny sposób co Ty napisałeś ale wielkie dzięki za polecenie tego sposobu.
    Program jest obszerny ale teraz tak sobie pomyślałem żeby zamiast 10 programowań zrobić takie coś w menu aby określić liczbę programowań jeżeli chce się zaprogramować np. 5 czasów to ustawić 5 i one się pokarzą dalej w menu i je zaprogramować bo tak to trzeba by zrobić dużo warunków bo jak będzie ustawiony czas 00:00 - 00:00 to musi to być warunek za spełniony tak że jak by ktoś znał sposób żeby wybierać sobie ile ma być warunków to bardzo bym prosił o podanie sposobu.
    Druga rzecz to jak automatyczne zapisywać i powrócić do głównego ekranu (aktualny czas i aktualna temperatura) po pewnym czasie czyli jak np. nie naciśnie się żadnego przycisku to po 10 sekundach powróci na ekran główny bo jak jest to w pętli nieskończonej to nigdy nie wyjdzie z niej będzie to robił cały czas.
    A waitms 25 dodawałem dlatego że ten przykład brałem z książki cytat "odczekać 25ms w celu eliminacji drgań styków" więc dlatego to dodałem.
    I proszę o sprawdzenie tego co teraz napisałem i czy jest dobrze czy źle i jak by ktoś miał jakieś sugestie to proszę pisać.
    Schemat jest w załączniku spakowany programem winrar ponieważ rozszerzenie pliku jest niedozwolone.


    Code:


    '##########Konfiguracja zewnętrzna##########
    $sim
    $regfile = "m8def.dat"
    $crystal = 16000000

    Config Portc.0 = Input                                      'przyciski 1
    Config Portc.1 = Input                                      'przycisk 2
    Config Portc.2 = Input                                      'przycisk 3
    Config Portc.3 = Input                                      'przycisk 4
    Config Portd.3 = Input                                      'przycisk 5
    Config Portd.5 = Input                                      'przycisk 6

    Config Portb = Output                                       'LCD
    Config Portd.0 = Output                                     'LCD pobudzenie
    Config Portd.4 = Output                                     'pompa

    Config Lcdpin = Pin , Db4 = Portb.3 , Db5 = Portb.2 , Db6 = Portb.1 , Db7 = Portb.0 , E = Portb.4 , Rs = Portb.5       'mirley UPT M16
    Config Lcd = 16 * 2
    Cls
    Cursor Off Noblink

    Config 1wire = Pind.7                                       'DS18B20


    Config Scl = Portc.5
    Config Sda = Portc.4


    Pompa Alias Portd.4                                         'pin przypisany do zminnej pompa
    Lcd_light Alias Portd.0
    Sw1 Alias Portc.0                                           'Lewo
    Sw2 Alias Portc.1                                           'prawo
    Sw3 Alias Portc.2                                           'góra
    Sw4 Alias Portc.3                                           'dół
    Sw5 Alias Portd.3                                           'menu
    Sw6 Alias Portd.5                                           'pompa



    Set Portc.0
    Set Portc.1
    Set Portc.2
    Set Portc.3
    Set Portd.3
    Set Portd.5



    Declare Sub Odcz_temp
    Declare Sub W_pompa
    Declare Sub Ustaw_czas
    Declare Sub Ustaw_h
    Declare Sub Ustaw_m
    Declare Sub Menu
    Declare Sub Ustaw_temp
    Declare Sub Ustawienie1
    Declare Sub Ustawienie2
    Declare Sub Ustawienie3
    Declare Sub Ustawienie4
    Declare Sub Ustawienie5
    Declare Sub Ustawienie6
    Declare Sub Ustawienie7
    Declare Sub Ustawienie8
    Declare Sub Ustawienie9
    Declare Sub Ustawienie10



    '*** DEKLARACJA PROCEDUR SUB ***
    Declare Sub Settime(byval S1 As Byte , Byval M1 As Byte , Byval H1 As Byte , Byval D1 As Byte , Byval Month1 As Byte)
    Declare Sub Gettime


    Enable Interrupts
    '#########Konfiguracja Koniec##########

    '#########Zmienne##########

    Dim Sw As Byte , Sw1 As Byte , Sw2 As Byte , Sw3 As Byte , Sw4 As Byte , Sw5 As Byte , Sw6 As Byte
    Dim Autolight As Byte

    Dim Menu As Bit

    Dim Ustaw1 As Integer , Uhp1 As Integer , Ump1 As Integer , Uhk1 As Integer , Umk1 As Integer       'ustawienie programatora 1
    Dim Zero As Integer


    Dim Menuu As Byte , Plus As Byte , Sett As Bit,
    Dim Minus As Byte

    Dim S As Byte , M As Byte , H As Byte , D As Byte , Month As Byte
    Dim Wm As Byte , Yd As Byte

    Dim Temperatura(2) As Byte                                  'DS1820
    Dim T_ust As Integer ,                                      'termostat

    Dim Warunek1 As Bit , Warunek2 As Bit , Watunek3 As Bit

    Dim Godziny As Byte , Minuty As Byte , Sekundy As Byte
    Dim Godziny_bcd As Byte , Minuty_bcd As Byte , Sekundy_bcd As Byte
    Dim Zapisz_czas As Bit

    Dim Pompa As Byte

    '##########Zmienne koniec#########

    '##########Początek##########

    Lcd_light = 0
    Autolight = 20
    Cls
    Lcd "Sterownik Pompy"                                       'wyświtetl " "
    Lowerline                                                   'przejdz do nowej lini
    Lcd "Cyrkulacji"                                            'wyświetl " "

    Wait 5                                                      'czekaj 5sek

    Deflcdchar 0 , 7 , 5 , 7 , 32 , 32 , 32 , 32 , 32           'stopien

    Cls
    Do
        Call Gettime
        Call Odcz_temp
        Home
       Lcd Hex(h) ; ":" ; Hex(m) ; ":" ; Hex(s)
       Lowerline
       If Temperatura(2) = 0 Then
          Lcd "Temp: " ; Temperatura(1) ; Chr(0) ; "C"
       Else
          Lcd "Temp: -" ; Temperatura(1) ; Chr(0) ; "C"
          End If


    If Sw5 = 0 Then
       Waitms 25
          If Sw5 = 0 Then

             Call Menu                                          'wejście do menu

          End If
    End If

    If Sw6 = 0 Then
       Waitms 25
       If Sw6 = 0 Then

          Call W_pompa                                          'ręczne włączenie pompu

       End If
    End If


     Loop
    End                                                         'end program

    '##########MENU##########
    Sub Menu
    Menuu = 1
    Waitms 200
    Cls
    Locate 1 , 1
    Select Case Menuu
    Case Is = 1                                                 'Ustaw zad. temp.
    Case Is = 2                                                 'Ustaw aktualny czas
    Case Is = 3                                                 'Programator 1
    Case Is = 4                                                 'Programator 2
    Case Is = 5                                                 'Programator 4
    Case Is = 6                                                 'Programator 5
    Case Is = 7                                                 'Programator 6
    Case Is = 8                                                 'Programator 7
    Case Is = 9                                                 'Programator 8
    Case Is = 10                                                'Programator 9
    Case Is = 11                                                'Programator 10
    End Select

    If Sw5 = 0 And Menuu < 12 Then
    Incr Menuu
    Waitms 222
    End If

    If Sw5 = 0 And Menuu = 12 Then
    Menuu = 1
    Waitms 222
    End If

    If Sett = 0 And Menuu = 1 Then                              'ustawienie zadanej temperatury
    Call Ustaw_temp
    End If

    If Sett = 0 And Menuu = 2 Then
    Call Settime(10 , 1 , 1 , 29 , 11)                          'ustaw zegar
    End If

    If Sett = 0 And Menuu = 3 Then
    Call Ustawienie1
    End If

    If Sett = 0 And Menuu = 4 Then
    Call Ustawienie2
    End If

    If Sett = 0 And Menuu = 5 Then
    Call Ustawienie3
    End If

    If Sett = 0 And Menuu = 6 Then
    Call Ustawienie4
    End If

    If Sett = 0 And Menuu = 7 Then
    Call Ustawienie5
    End If

    If Sett = 0 And Menuu = 8 Then
    Call Ustawienie6
    End If

    If Sett = 0 And Menuu = 9 Then
    Call Ustawienie7
    End If

    If Sett = 0 And Menuu = 10 Then
    Call Ustawienie8
    End If

    If Sett = 0 And Menuu = 11 Then
    Call Ustawienie9
    End If

    If Sett = 0 And Menuu = 12 Then
    Call Ustawienie10
    End If

    Wait 7


    End Sub Menu
    '##########MENU KONIEC##########

    '##########Ustaw zadaną temperature
    Sub Ustaw_temp
    Cls

    Lcd "Ustaw Temp. zad."
    Lowerline
    Lcd "      " ; T_ust ; Chr(0) ; "C"

    If Sett = 0 And Ustaw1 = 1 Then                             'temp w góre
       If Sw3 = 0 Then
          Waitms 25
             If Sw3 = 0 Then
                T_ust = T_ust + 1
             End If
       End If
       If Sw4 = 0 Then                                          'temp w dół
          Waitms 25
             If Sw4 = 0 Then
                T_ust = T_ust - 1
             End If
       End If
    End If
    Wait 7                                                      'poczekaj 7 sek i wyjdz do aktualnej godziny i aktualnej temperatury
    Cls
    End Sub

    '##########Ustawienia programatora#########
    Sub Ustawienie1

    Ustaw1 = 1
    Waitms 200
    Cls


    Locate 1 , 1
    Select Case Menuu
    Case Is = 1
    Lcd "Prog1 Godz pocza"
    Case Is = 2
    Lcd "Prog1 Min pocza"
    Case Is = 3
    Lcd "Godz. koncowa"
    Case Is = 4
    Lcd "Min. koncowa"
    End Select

    Lowerline
    Lcd Uhp1 ; ":" ; Ump1 ; " - " ; Uhk1 ; ":" ; Umk1

    If Sw2 = 0 And Ustaw1 < 4 Then                              'poruszanie sie w ustawieniu programatora
    Incr Ustaw1
    Waitms 222
    End If

    If Sw2 = 0 And Ustaw1 = 4 Then
    Ustaw1 = 1
    Waitms 222
    End If


    If Sw1 = 0 And Ustaw1 > 1 Then
    Decr Ustaw1
    Waitms 222
    End If

    If Sw1 = 0 And Ustaw1 = 1 Then
    Ustaw1 = 4
    Waitms 222
    End If



    If Sett = 0 And Ustaw1 = 1 Then                             'ustawienie godziny początkowej
       If Sw3 = 0 Then
          Waitms 25
             If Sw3 = 0 Then
                Uhp1 = Uhp1 + 1
             End If
       End If
       If Sw4 = 0 Then
          Waitms 25
             If Sw4 = 0 Then
                Uhp1 = Uhp1 - 1
             End If
       End If
    End If

    If Sett = 0 And Ustaw1 = 2 Then                             'ustawienie minuty początkowej
       If Sw3 = 0 Then
          Waitms 25
             If Sw3 = 0 Then
                Ump1 = Ump1 + 1
             End If
       End If
       If Sw4 = 0 Then
          Waitms 25
             If Sw4 = 0 Then
                Ump1 = Ump1 - 1
             End If
       End If
    End If

    If Sett = 0 And Ustaw1 = 3 Then                             'ustawienie godziny końcowej
       If Sw3 = 0 Then
          Waitms 25
             If Sw3 = 0 Then
                Uhk1 = Uhk1 + 1
             End If
       End If
       If Sw4 = 0 Then
          Waitms 25
             If Sw4 = 0 Then
                Uhk1 = Uhk1 - 1
             End If
       End If
    End If

    If Sett = 0 And Ustaw1 = 4 Then                             'ustawienie minuty końcowej
       If Sw3 = 0 Then
          Waitms 25
             If Sw3 = 0 Then
                Umk1 = Umk1 + 1
             End If
       End If
       If Sw4 = 0 Then
          Waitms 25
             If Sw4 = 0 Then
                Umk1 = Umk1 - 1
             End If
       End If
    End If

    'dopisanie warunków: jeżeli czas początkowy jest równy czasu końcowemu wtedy warunek jest spełniony, a jeżeli nie to warunek będzie spełniony jak
    'godzina aktualna będzie równa lub większa od godziny nastawionej(uhp1)
    'minuta aktualna jest większa bądz równa od minuty ustawionej (umk1)
    'godzina aktualna jest mniejsza bądz równa od godziny ustawionej koncowej (uhk1)
    'minuta aktualna jet mniejsza bądz równa od minuty ustawionej końcowej (umk1)




    Wait 7                                                      'poczekaj 7 sek i wyjdz do aktualnej godziny i aktualnej temperatury
    Cls

    End Sub

    Sub Ustawienie2

    End Sub


    Sub Ustawienie3

    End Sub


    Sub Ustawienie4

    End Sub


    Sub Ustawienie5

    End Sub


    Sub Ustawienie6

    End Sub


    Sub Ustawienie7

    End Sub


    Sub Ustawienie8

    End Sub


    Sub Ustawienie9

    End Sub


    Sub Ustawienie10

    End Sub
    '#########Koniec ustawien programatora


    '##########CZAS##########

    Sub Settime(s1 As Byte , M1 As Byte , H1 As Byte , D1 As Byte , Month1 As Byte)
        'values are stored as BCD values so convert the values first
        'zapis
     Cls
      Lcd "Ustaw czas"
      Lowerline
      Lcd Hex(h) ; ":" ; Hex(m) ; ":" ; Hex(s)

           If Sw1 = 0 Then                                      'ustaw godzine
             Waitms 25
             If Sw1 = 0 Then
                        If Sw3 = 0 Then
                           Waitms 25
                           If Sw3 = 0 Then
                              H1 = H1 + 1
                           End If
                        End If
                        If Sw4 = 0 Then
                           Waitms 25
                           If Sw4 = 0 Then
                              H1 = H1 - 1
                           End If
                        End If
             End If
          End If


          If Sw2 = 0 Then                                       'ustaw minute
            Waitms 25
            If Sw2 = 0 Then
                       If Sw3 = 0 Then
                          Waitms 25
                          If Sw3 = 0 Then
                             M1 = M1 + 1
                          End If
                       End If

                       If Sw4 = 0 Then
                          Waitms 25
                          If Sw4 = 0 Then
                            M1 = M1 - 1
                          End If
                       End If
            End If
          End If
     S = 0                                                      'wyzeruj sekundy

        S1 = Makebcd(s1)                                        'seconds
        M1 = Makebcd(m1)                                        'minutes
        H1 = Makebcd(h1)                                        'hours
        D1 = Makebcd(d1)                                        'days
        Month1 = Makebcd(month1)                                'months


        I2cstart                                                'inicjalizacja magistrali I2C
        I2cwbyte &HA0                                           'podanie adresu PCF do zapisu
        I2cwbyte 0                                              'select control register
        I2cwbyte 8                                              'set year and day bit for masking
        I2cstop                                                 'generate stop

        I2cstart                                                'generate start
        I2cwbyte &HA0                                           'write mode
        I2cwbyte 2                                              'select seconds Register
        I2cwbyte S1                                             'write seconds
        I2cwbyte M1                                             'write minutes
        I2cwbyte H1                                             'Write Hours
        I2cwbyte D1                                             'write days
        I2cwbyte Month1                                         'write months
        I2cstop
    Cls
    End Sub
    '##########Koniec ustaw czas##########
    '##########Odczyt czasu##########

      'odczyt
    Sub Gettime
        I2cstart                                                'generate start
        I2cwbyte &HA0                                           'write addres of PCF8583
        I2cwbyte 2                                              'select second register

        I2cstart                                                'generate repeated start
        I2cwbyte &HA1                                           'write address for reading info
        I2crbyte S , Ack                                        'read seconds
        I2crbyte M , Ack                                        'read minutes
        I2crbyte H , Ack                                        'read hours
        I2crbyte Yd , Ack                                       'read year and days
        I2crbyte Wm , Nack                                      'read weekday and month
        I2cstop                                                 'generate stop
    End Sub

    '#########Koniec odczytu czasu########



    '##########Pompa##########
    W_pompa:

     Cls
     Lcd "Reczne Wł. Pompy"
     Lowerline


       If Sw6 = 0 Then
          Waitms 25
             If Sw6 = 0 Then
                Pompa = 1
             End If
       End If
      If Pompa = 1 Then
          Lcd "Wałączona"
      End If

      If Pompa = 0 Then
          Lcd "Wyłączona"
      End If
      Wait 7
      Cls
     Return

    '##########Odczyt temperatury##########
    Sub Odcz_temp

       1wreset
       1wwrite &HCC
       1wwrite &H44
       Waitms 750
       1wreset
       1wwrite &HCC
       1wwrite &HCB

       Temperatura(1) = 1wread(2)

       1wreset
       If Err = 1 Then

          Cls
          Lcd "Brak Ukladu!!!"
          Lowerline
          Lcd "Podlacz czujnik"
          Do

          Loop
       End If

       If Temperatura(2) > 0 Then
          Temperatura(1) = 256 = Temperatura(1)
       End If
       Temperatura(1) = Temperatura(1) / 2

    End Sub
    '##########Odczyt Temperatury Koniec##########

    0
  • #9 30 Gru 2009 00:39
    marco47
    Poziom 41  

    W pętli głównej zastosuj zmienną licznika która będzie zwiększana co obrót pętli i po dojściu do określonej liczby(czasu) wyzeruj , zapisz do pamięci i wyjdz z menu.
    Co do schematu czy musi być tak zagmatwana kolejność połączeń ?

    0
  • #10 30 Gru 2009 09:11
    cinek_14
    Poziom 12  

    A możesz dać jakiś przykład z tą pętlą? bo narazie nic mi nie przychodzi do głowy jak to można zrobić najlepiej jak byś mógł to na jakimś przykładzie z mojego programu.
    A połączenia są takie bo LCD był na porcie PORTC ale znowu tam jest pin SDA i SCL który idzie do zegara wiec LCD musiałem dać gdzie indziej i tak jakoś się to pomieszało.
    I dziękuje za poprawienie tego schematu wielkie dzięki.

    0
  • #11 30 Gru 2009 20:04
    marco47
    Poziom 41  

    Jak chcesz aby ktoś poprawił Twój program ( chyba nierealne) to dokładnie opisuj kazdą linijkę kodu , przeciez nikt nie jest jasnowidzem aby się domyślać co chciał autor zawrzeć w swoim kodzie . A z drugiej strony jak Ty poprawiasz własny kod nie mając opisanych linijek kodu . Przeciez jak po jakimś czasie będziesz chciał coś poprawić to dokładny opis będzie ratunkiem dla pamięci Twojej (dobrej tylko krótkiej - taki zart).

    0
  • #12 30 Gru 2009 22:17
    cinek_14
    Poziom 12  

    Właśnie prawie każdą linijkę skomentowałem sobie żebym wiedział na przyszłość to jest mój pierwszy program wiec jeszcze pewnie dużo rzeczy nie wiem.
    Możesz mi podpowiedzieć jedną rzecz bo nie wiem jak zrobić te warunki dla załączania pompy :| bo to musi być ze jak jest np 2 czasy ustawione na pierwszym czasie jak np jest ustawiony 7:30 - 9:00 a jest godzina 8:00 to pompa powinna się załączyć a jak na drugim programatorze jest ustawiona np. 14:00 - 15:30 to pompa się nie załączy wiec na każdy programator muszę dać warunek? A na końcu napisać sterowanie czyli
    Warunek1 to by była temperatura zadana czyli jak jest temperatura 40 a zadana jest temperatura 35 stopni więc warunek jest spełniony kod by był taki

    Code:

    if T_ust >= Temperatura(1) then       'jeżeli temperatura zadana jest większa bądź równa od temperatury aktualnej wtedy
         Warunek1 = 1                           'do warunek1 przypisz 1
    end if
    if T_ust < Temperatura(1) then         'jeżeli temperatura zadana jest mniejsza od temperatury aktualnej wtedy
         Warunek1 = 0                            'Warunek1 przypisz 0
    end if

    a dla programatora czasu przykład dla jednego ustawieni
    Code:

    if uhp1 = 0 then     'if ustaw godzine początkową 1 (uhp1) jest równe 0 wtedy
         Warunek2 = 1   'do warunek2 przypisz 1 itd.
    end if
    if ump1 = 0 then     'ump1 ustawienie minuty początkowej
         Warunek2 = 1
    end if
    if uhk1 = 0 then      uhk1 ustawienie godziny końcowej
         Warunek2 = 1
    end if
    if umk1 = 0 then      ' umk1 ustawienie minuty końcowej
         Warunek2 =1
    end if

    if uhp1 >= Hex(h) then     'jeżeli ustawienie godziny początkowej1 jest większe bądź równe od godziny aktualnej wtedy
         Warunek2 = 1            ' warunek2 przypisz 1
    end if
    if ump1 >= Hex(m) then    'jeżeli ustawienie minuty początkowej1 jest większe bądź równe od minuty aktualnej wtedy
         Warunek2 = 1
    end if
    if uhk1 <= Hex(h) then     'jeżeli ustawieni godziny1 końcowej jest mniejsze bądź równe od godziny aktualnej wtedy
         Warunek2 = 1            'warunek2 przypisz 1
    end if
    if umk1 <= Hex(m) then    'jeżeli ustawieni minuty1 końcowej jest mniejsze bądź równe od minuty aktualnej wtedy
         Warunek2 =1             'warunek2 przypisz 1
    end if

    if uhp1 < Hex(h) then     'jeżeli ustawienie godziny początkowej1 jest mniejsze  od godziny aktualnej wtedy
         Warunek2 = 0            ' warunek2 przypisz 0
    end if
    if ump1 < Hex(m) then    'jeżeli ustawienie minuty początkowej1 jest mniejsze od minuty aktualnej wtedy
         Warunek2 = 0             'warunek2 przypisz 0
    end if
    if uhk1 > Hex(h) then     'jeżeli ustawieni godziny1 końcowej jest większe od godziny aktualnej wtedy
         Warunek2 = 0            'warunek2 przypisz 0
    end if
    if umk1 > Hex(m) then    'jeżeli ustawieni minuty1 końcowej jest więsze od minuty aktualnej wtedy
         Warunek2 =0             'warunek2 przypisz 0
    end if

    dobrze ja to myślę z tymi ustawieniami czasu ??
    I jeszcze jedno mam pytanie czy ten schemat co mi poprawiłeś jest poprawny do tego programu?? bo nie wiem czy już zaczynać tworzenie płytki.

    0
  • Pomocny post
    #13 30 Gru 2009 23:05
    marco47
    Poziom 41  

    Są dwie metody tworzenia urządzenia.
    Jezeli to jest tak prosty schemat jak Twój , zaprojektuj płytkę na gotowo z wszystkimi mozliwymi dodatkami a program będziesz zapisywał sukcesywnie w miarę jak będziesz ulepszał kod programu . Taki układ testowy na gotowo.
    Druga metoda polega na budowie urządzenia testowego na jakiejś płycie testowej na której mozesz dowolnie modyfikować sam układ jak i program.To zalecane przy większych projektach . Mniej modyfikacji (przeróbek) na gotowym urządzeniu.
    Małe przypomnienie
    W czasie tworzenia schematu kozystaj z datasheet producenta elementu , aby mieć pewność co do rozmieszczenia pinów itp.
    Teraz następna sprawa
    Jak juz wyzej pisałem nie porywaj się nadmiernie na wielkość programu bo się zapętlisz w sobie.

    Code:
     If T_ust >= Temperatura(1) Then                  'jeżeli temperatura zadana jest większa bądź równa od temperatury aktualnej wtedy
    
         Warunek1 = 1                                 'do warunek1 przypisz 1
      Else
         Warunek1 = 0                            'Warunek1 przypisz 0
    End If




    Napisałeś
    Code:

    Config Portc.0 = Input                                      'przyciski 1
    Config Portc.1 = Input                                      'przycisk 2
    Config Portc.2 = Input                                      'przycisk 3
    Config Portc.3 = Input                                      'przycisk 4
    Config Portd.3 = Input                                      'przycisk 5
    Config Portd.5 = Input                                      'przycisk 6

    Config Portb = Output                                       'LCD
    Config Portd.0 = Output                                     'LCD pobudzenie
    Config Portd.4 = Output                                     'pompa

    Set Portc.0
    Set Portc.1
    Set Portc.2
    Set Portc.3
    Set Portd.3
    Set Portd.5

    Napisz tak:
    Code:

    Config Portb = &B11111111   'ustaw jako wyjścia
            Portb = &B00000000      'ustaw warunki początkowe
    Config Portc = &B00111000    'ustaw jako wyjścia i wejścia
            Portc = &B00000000       'ustaw warunki początkowe

    To jest przykład ale sam musisz to ustawić , jak zrozumiesz powyzsze

    0
  • #14 02 Sty 2010 00:05
    Michał_z1
    Poziom 16  

    Witam.
    Przecieram oczy ze zdumienia, zupełnie ja procesory intela, przerost formy nad treścią i po co to?? Czy nie prościej zbudować sterownik różnicowy?? Pilnuje sobie taki jaka jest temperatura w instalacji porównuje z bojlerem i włącza pompę na kilka-kilkanaście sekund, gdy woda ostygnie do 30 lub mniej wtedy urządzenie nie będzie reagowało, bo na co przemiatać zimną wodę, oj powtarzam się kiedyś już o tym na EL pisałem.
    pozdrawiam.

    0
  • #15 02 Sty 2010 22:29
    cinek_14
    Poziom 12  

    Dziękuje wszystkim za pomoc ale jednak raczej do zrobienia tego sterownika nie dojdzie ponieważ jest zbyt obszerny nie mieści się do ATmega8 poczytałem teraz na forum o takim sposobie z przerobionym wodomierzem ze zakłada się tam kontaktron magnetyczny na rurce z ciepłą wodą i gdy się odkręci na chwile ciepłą wodę wodomierz się zakręci i włączy pompkę na określony czas i do tego jakiś czujnik temperatury aby nie pchało zimnej wody jak zbiornik jest zimny i to będzie o wile krótszy kod i prostsze wykonanie ale bardzo wszystkim dziękuje za pomoc a szczególnie marco47. Za nowy projekt wezmę się jak czas pozwoli teraz zacznie się szkoła ale myśleć o tym będę i jakaś wstawka na forum będzie:D
    Jeszcze raz wielkie dzięki za pomoc
    Pozdrawiam

    0