Elektroda.pl
Elektroda.pl
X

Search our partners

Find the latest content on electronic components. Datasheets.com
Elektroda.pl
Please add exception to AdBlock for elektroda.pl.
If you watch the ads, you support portal and users.

Sterownik czasowy-Atmega8,program w BASCOM AVR oddam 25pkt

magik128 27 Mar 2008 00:40 3590 4
  • #1
    magik128
    Level 22  
    Witam

    Głowię się od pewnego czasu nad małym problemem.A więc mam program w który ma załączać triaki o określonym przedziale czasowym. Problem pojawia się przy przejściu zegara przez godzinę 00:00. Początkowo aby zlikwidować ten problem napisałem program w ten sposób:



    -O godzinie X ma włączać wyjście,a o Y ma je wyłączyć. Wszystko działa ok,ale gdybym chciał np ustawić godzinę X jako 12:00 ,a Y jako np 13 i ustawić zegar na aktualną godzinę 12:30 to program w tym cyklu już nie zareaguje (zadziała dopiero po następnym przejściu przez godzinę 12.)

    W tym wypadku korzystałem tylko z warunków zawierających "="

    -Aby zlikwidować niedogodność czekania całej doby na reakcję sterownika,napisałem aby załączał o godzinie większej lub równej X,a wyłączał o godzinie równej Y z dodatkowym ustawianiem flagi wykonania zadania.Przy czym gdy flaga jest ustawiona (cykl się zakończył),to warunek sprawdzania godziny jest w ogóle nie sprawdzany (inaczej układ cały czas by załączał aż do godziny 24:00 ponieważ warunek większy niż byłby cały czas spełniony).Niby pomogło,ale teraz pojawia się problem ustawienia godzin przechodzących przez północ.Np godzina X=23:00 godzina Y=01:00. W tym wypadku gdy nastawię zegar na godzinę 23:30 to układ zareaguje i włączy wyjście.Ale gdy nastawię już np na 00:30 to nie zareaguje,mimo iż moim celem jest że powinien.
    (w tym wypadku korzystałem z warunków dla włączania >=,a dla wyłączania tylko z = i ustawienia flagi tak aby wykonywanie tej funkcji było zablokowane,aż nastąpi godzina 00:00 i flaga zostanie odblokowana.

    Z takim problemem na pewno spotkał się już niejeden programista i mam gorącą nadzieje że ktoś zna rozwiązanie tego problemu przejścia przez godzinę 00:00.
  • #3
    magik128
    Level 22  
    całość jest bardzo rozbudowana bo sterownik ma robić i inne rzeczy (prawie 8kb)

    podam te fragmenty o które mi chodzi:
    Code:

    Sub Aux


       Readeeprom Aux_g_on , 2
       Readeeprom Aux_m_on , 3
       Readeeprom Aux_g_off , 4
       Readeeprom Aux_m_off , 5

          If Aux1_1_wyk = 0 Then
          If Aux1 = 0 Then
          If Godziny = Aux_g_off Then
          If Minuty = Aux_m_off Then
          Set Aux2
           Aux1_1_wyk = 1
          End If
          End If
          Else
          If Godziny >= Aux_g_on Then
          If Minuty >= Aux_m_on Then
          Reset Aux1
          End If
          End If
          End If
          End If

       Readeeprom Aux_g_on , 6
       Readeeprom Aux_m_on , 7
       Readeeprom Aux_g_off , 8
       Readeeprom Aux_m_off , 9

          If Aux1_2_wyk = 0 Then
          If Aux1 = 0 Then
          If Godziny = Aux_g_off Then
          If Minuty = Aux_m_off Then
          Set Aux1
           Aux1_2_wyk = 1
          End If
          End If
          Else
          If Godziny >= Aux_g_on Then
          If Minuty >= Aux_m_on Then
          Reset Aux1
          End If
          End If
          End If
          End If


        Readeeprom Aux_g_on , 10
        Readeeprom Aux_m_on , 11
        Readeeprom Aux_g_off , 12
        Readeeprom Aux_m_off , 13
          If Aux2_1_wyk = 0 Then
          If Aux2 = 0 Then
          If Godziny = Aux_g_off Then
          If Minuty = Aux_m_off Then
          Set Aux2
           Aux2_1_wyk = 1
          End If
          End If
          Else
          If Godziny >= Aux_g_on Then
          If Minuty >= Aux_m_on Then
          Reset Aux2
          End If
          End If
          End If
          End If



       Readeeprom Aux_g_on , 14
       Readeeprom Aux_m_on , 15
       Readeeprom Aux_g_off , 16
       Readeeprom Aux_m_off , 17

          If Aux2_2_wyk = 0 Then
          If Aux2 = 0 Then
          If Godziny = Aux_g_off Then
          If Minuty = Aux_m_off Then
          Set Aux2
           Aux2_2_wyk = 1
          End If
          End If
          Else
          If Godziny >= Aux_g_on Then
          If Minuty >= Aux_m_on Then
          Reset Aux2
          End If
          End If
          End If
          End If



          If Godziny = 0 Then                                   'reset wykoniania aux2 po przejsciu przez 00:00
          If Minuty = 0 Then
          Aux2_1_wyk = 0
          End If
          End If

          If Godziny = 0 Then                                   'reset wykoniania aux1 po przejsciu przez 00:00
          If Minuty = 0 Then
           Aux1_1_wyk = 0
          End If
          end if

           If Godziny = 0 Then                                   'reset wykoniania aux2 po przejsciu przez 00:00
          If Minuty = 0 Then
          Aux2_2_wyk = 0
          End If
          End If

          If Godziny = 0 Then                                   'reset wykoniania aux1 po przejsciu przez 00:00
          If Minuty = 0 Then
           Aux1_2_wyk = 0
          End If
          end if

    End Sub

    Tutaj jest podprogram sterowania wyjściami. Czas wyłączenia i włączenia zapisuje w EEPROMIE wczesniej w menu

    Code:
    Dim Sekundy As Byte                                         'zmienna do przechwoywania wart sekund
    
    Dim Minuty As Byte                                          'zmienna do przechwoywania wart minut
    Dim Godziny As Byte                                         'zmienna do przechwoywania wart godzin
    Dim Wart_bcd As Byte

    Dim Nowa As Bit                                             'flaga zezwolenia wyświetlenia danych na LCD
    Dim Aux2_1_wyk As Bit                                       'flaga wykonania obsługi pierwszej czesci AUX2
    Dim Aux2_2_wyk As Bit                                       'flaga wykonania obsługi drugiej czesci AUX2
    Dim Aux1_1_wyk As Bit                                       'flaga wykonania obsługi pierwszej czesci AUX1
    Dim Aux1_2_wyk As Bit                                       'flaga wykonania obsługi drugiej czesci AUX1
    Dim Wyk_karm As Bit                                         'flaga wykonania karmienia


    Dim Aux_g_on As Byte                                        'zmienna pomocnicza z wartoscia godziny zalaczania wyjsc AUX
    Dim Aux_m_on As Byte                                        'zmienna pomocnicza z wartoscia minut wylaczenia wyjsc AUX
    Dim Aux_g_off As Byte                                        'zmienna pomocnicza z wartoscia godziny zalaczania wyjsc AUX
    Dim Aux_m_off As Byte 


    Deklaracje zmiennych które są używane w tym podprogramie i przerwaniu dla zegara

    Code:
    Odmierz_1s:
    
       Counter1 = Counter1 + 49911

       Incr Sekundy
       Set Nowa
       If Sekundy = 60 Then
          Sekundy = 0
          Reset Wyk_karm
          Incr Minuty
          If Minuty = 60 Then
             Minuty = 0
             Incr Godziny
             If Godziny = 24 Then
                Godziny = 0

              End If
           End If
        End If
    Return

    Obsługa przerwania od Timer1 ,dla zegara.

    Całość ma sterować dwoma wyjściami. Dla każdego wyjścia mam mieć dwa okresy działania.

    Aktywny stan wyjściowy to stan niski
  • #4
    tarpiote
    Level 12  
    Jeśli ten pierwszy sposób działał (tzn:
    Quote:
    -O godzinie X ma włączać wyjście,a o Y ma je wyłączyć. Wszystko działa ok,ale gdybym chciał np ustawić godzinę X jako 12:00 ,a Y jako np 13 i ustawić zegar na aktualną godzinę 12:30 to program w tym cyklu już nie zareaguje (zadziała dopiero po następnym przejściu przez godzinę 12.)

    to można chyba po prostu dodać procedurę która w momencie ustawiania zegara sprawdzi godziny X i Y i w razie konieczności włączy wyjście (które o godzinie Y już normalnym trybem zostanie wyłączone)...

    edit: przy drugim rozwiązaniu natomiast trzebaby dodać warunek, że jeśli X>Y to włączać ma się przy godz>=0 a nie >=X. No a flagę trzebaby zawsze kasować nie o 0:00, a o godzinie =X
  • #5
    magik128
    Level 22  
    Ja dokładnie szukam jakiejś procedury sprawdzonej i prostrszej.Bascom jest pamięciożerny,a ja musze oszczędzać. Ja myślałem nad takimi sposobami,ale wątpię żeby były najoptymalniejsze



    Rozwiązałem teoretycznie swój problem.

    Jeżeli rozpatrywać przedział czasowy od godziny 00:00 do 23:59 czyli dobę nie ma żadnego problemu. Możemy założy,że jeżeli użytkownik wybierze okres czasu nie przechodzący przez godzinę 00:00 (północ) to wystarczy dać warunek większy niż godzina X i mniejszy niż godzina Y. Teraz wystarczy zauważyć,że okres nie przechodząc przez godzinę 00:00 spełnia warunek Y>X. Wiedząc to wystarczy przy nie spełnieniu tego warunku do godziny Y dodać 24 godziny i dalej korzystać z porównywania większy niż X, mniejszy niż Y.

    Wieczorem sprawdzę ten pomysł,oraz ile pamięci taki algorytm mi zajmie