sterownik czasowy


Witam, mam pewien problem z uzupełnieniem mojego kodu sterownika czasowego.

         Case 0:
            Locate 1 , 1 : Lcd "Poniedzialek    "
            Locate 2 , 1 : Lcd "Ster.NR"
            Num(1) = 1
 
            If S2 = 0 Then
               Incr A3
               If A3 > 8 Then A3 = 1
               Waitms 200
               Call Beep
            End If
            If S3 = 0 Then
               Decr A3
               If A3 < 1 Then A3 = 8
               Waitms 200
               Call Beep
            End If
            A3 = A3
            Aa(1) = Aa(1) + Num(1)
            Aa(2) = Aa(2) + Num(1)
            Aa(3) = Aa(3) + Num(1)
            Locate 4 , 1
            Lcd "AA1-" ; Aa(1) : Lcd " AA2-" ; Aa(2) : Lcd " AA3-" ; Aa(3)
            If A3 = 1 Then
               Locate 2 , 9 : Lcd " 1    "
               Aa(1) = 1                                    ' Zmienna dla sterownika nr1
               Aa(2) = 2
               Aa(3) = 2
 
            End If
            If A3 = 2 Then
               Locate 2 , 9 : Lcd " 2 "
               Aa(1) = 2                                    ' Zmienna dla sterownika nr2
               Aa(2) = 1
               Aa(3) = 2
 
            End If
            If A3 = 3 Then
               Locate 2 , 9 : Lcd " 3 "
               Aa(1) = 2                                    ' Zmienna dla sterownika nr3
               Aa(2) = 2
               Aa(3) = 1
 
            End If
            If A3 = 4 Then
               Locate 2 , 9 : Lcd "1-2"
               Aa(1) = 1                                    ' Zmienna dla sterownika nr1                                       '
               Aa(2) = 1                                    ' Zmienna dla sterownika nr2
               Aa(3) = 2
 
            End If
            If A3 = 5 Then
               Locate 2 , 9 : Lcd "1-3"
               Aa(1) = 1                                    ' Zmienna dla sterownika nr1
               Aa(2) = 2                                    ' Zmienna dla sterownika nr3
               Aa(3) = 1
 
            End If
            If A3 = 6 Then
               Locate 2 , 9 : Lcd "2-3"
               Aa(1) = 2                                    ' Zmienna dla sterownika nr2
               Aa(2) = 1                                    ' Zmienna dla sterownika nr3
               Aa(3) = 1
 
            End If
            If A3 = 7 Then
               Locate 2 , 9 : Lcd "ALL OFF"
               Aa(1) = 2                                    ' Zmienna dla sterownika nr1
               Aa(2) = 2                                    ' Zmienna dla sterownika nr2
               Aa(3) = 2                                    ' Zmienna dla sterownika nr3
 
            End If
            If A3 = 8 Then
               Locate 2 , 9 : Lcd "ALL ON "
               Aa(1) = 1                                    ' Zmienna dla sterownika nr1
               Aa(2) = 1                                    ' Zmienna dla sterownika nr2
               Aa(3) = 1                                    ' Zmienna dla sterownika nr3
 
            End If

Ten kawałek kodu odnosi się do jednego dnia w którym jest wybrana opcja który sterownik czasowy ma zadziałać w danym dniu.
I tak np. wybieram opcję A3 = 5 w której są zawarte trzy stery czasowe i tylko 1 i 2 ma być włączony, a 3 nieaktywny.
Moje pytanie jest takie, w jaki sposób odczytać te wartości w danym dniu aby mogły być włączone wybrane sterowniki?
Poniżej kod sterowników w których się już pogubiłem. Bardzo proszę o pomoc.

Rem **************************************************************************
Rem ****************** Sprawdzam sterowniki czasowe **************************
Rem **************************************************************************
Sprawdzam_stery:
Rem sterownik nr.1
 
   If Aa(1) = Aa(1) Or Ab(1) = Ab(1) Or Ac(1) = Ac(1) Or Ad(1) = Ad(1) Or Ae(1) = Ae(1) Or Af(1) = Ae(1) Or Ag(1) = Ae(1) Then
 
      If Godziny = Czas_1 And Minuty = Czas_2 And Sekundy = 0 Then
         Locate 3 , 18 : Lcd "ON "
         Pk1 = Wlacz
      End If
   End If
 
Rem Sterownik nr.2
   If Num(1) = 1 Or Num(2) = 2 Or Num(3) = 3 Or Num(4) = 4 Or Num(5) = 5 Or Num(6) = 6 Or Num(7) = 7 Then       ' sprawdzam dzień tygodnia
      If Aa(2) = 1 Or Ab(2) = 1 Or Ac(2) = 1 Or Ad(2) = 1 Or Ae(2) = 1 Or Af(2) = 1 Or Ag(2) = 1 Then
 
         If Godziny = St_1 And Minuty = St_2 And Sekundy = 0 Then
            Locate 4 , 18 : Lcd "ON "
            Pk2 = Wlacz
         End If
      End If
   End If
Rem sterownik nr.3
 
   If Aa(3) = 1 Or Ab(3) = 1 Or Ac(3) = 1 Or Ad(3) = 1 Or Ae(3) = 1 Or Af(3) = 1 Or Af(3) = 1 Then
 
      If Godziny = St5 And Minuty = St6 And Sekundy = 0 Then
         Locate 4 , 18
         Pk3 = Wlacz
      End If
   End If
 
 
 
   If Godziny = Czas_3 And Minuty = Czas_4 Then             ' wyłącz sterownik 1
      Pk1 = Wylacz
      Locate 3 , 18 : Lcd "OFF"
   End If
   If Godziny = St_3 And Minuty = St_4 Then
      Pk2 = Wylacz
      Locate 4 , 18 : Lcd "OFF"
   End If
   If Godziny = St7 And Minuty = St8 Then
      Pk3 = Wylacz
   End If




Portret użytkownika mirley

Re; Sterownik czasowy

Tak w sumie to nie wiem w czym do końca jest problem..... masz jakąś tablicę która zawiera konfigurację które sterowniki mają działać.... trzeba do tego zegara z kalendarzem aby liczyć dni wywołujesz podprocedurę z tymi case'ami która zależy od aktualnego dnia. Ona ładuje do zmiennych jakie chcesz odpowiednie ustawienia i tyle...

Potem uruchamiasz procedurki po kolei do wszystkich sterowników i te które mają nie działać w danym dniu poprostu nic nie robią

Jeśli nie zrozumiałem o co chodzi to wyjaśnij dokładnie co chcesz uzyskac... najlepeij w punktach

-

UWAGA! Możliwy jest zakup zaprogramowanych uC i zestawów elementów itp. do niektórych projektów. O dostępność proszę pytać via email. Konkretne oferty pojawiają się w cenniku.

Portret użytkownika Karlos123

Sterownik czasowy

Witam, przepraszam że mój opis problemu był taki skromny, ale chyba sobie już poradziłem tak czy siak na symulatorze proteusie działa.

            Aa(1) = Aa(1) + Num(1)
            Aa(2) = Aa(2) + Num(1)
            Aa(3) = Aa(3) + Num(1)

Ta zmienne a dokładnie aa(1),aa(2),aa(3) oznaczają aktywne bądź nie aktywne sterowniki czasowe, a tablicę num(1) wyrzuciłem
i przypisałem odpowiednio '+1 dla poniedziałku itd. dla wszystkich dni', na koniec ustawień przechodzę do procedurki zapisu w eepromie tych zmiennych.
Sub Zapis_dni
   Do
      Locate 1 , 1 : Lcd "Zapisz Ustawienia"
      Locate 2 , 1 : Lcd "TAK-S1_____NIE-S4"
      Locate 4 , 1 : Lcd "  time=" ; Sek : Lcd " [10s]"
      If S4 = 0 Then
         Cls
         Locate 1 , 1 : Lcd "   Ustawienia "
         Locate 2 , 1 : Lcd "       NIE    "
         Locate 3 , 1 : Lcd "    Zapisano! "
 
         Wait 1
         Gosub Menu_1
      End If
      If S1 = 0 Then
         Waitms 150
         If S1 = 0 Then
            Waitms 50
            Writeeeprom A3 , 170
            Writeeeprom Aa(1) , 172
            Writeeeprom Aa(2) , 174
            Writeeeprom Aa(3) , 176
            Waitms 50
            Writeeeprom A4 , 178
            Writeeeprom Ab(1) , 180
            Writeeeprom Ab(2) , 182
            Writeeeprom Ab(3) , 184
            Waitms 50
            Writeeeprom A5 , 186
            Writeeeprom Ac(1) , 188
            Writeeeprom Ac(2) , 190
            Writeeeprom Ac(3) , 192
            Waitms 50
            Writeeeprom A6 , 194
            Writeeeprom Ad(1) , 196
            Writeeeprom Ad(2) , 198
            Writeeeprom Ad(3) , 200
            Waitms 50
            Writeeeprom A7 , 202
            Writeeeprom Ae(1) , 204
            Writeeeprom Ae(2) , 206
            Writeeeprom Ae(3) , 208
            Waitms 50
            Writeeeprom A8 , 210
            Writeeeprom Af(1) , 212
            Writeeeprom Af(2) , 214
            Writeeeprom Af(3) , 216
            Waitms 50
            Writeeeprom A9 , 218
            Writeeeprom Ag(1) , 220
            Writeeeprom Ag(2) , 222
            Writeeeprom Ag(3) , 224
            Waitms 50
            'Writeeeprom Num_(1) , 226
            Call Beep
            Waitms 500
            Cls
            Locate 1 , 1 : Lcd "--- Ustawienia ---"
            Locate 2 , 1 : Lcd " >> Zapisano ! << "
            Waitms 1000
            Call Beep
            Cls
            Sekunde = 0
            Sek = 0
            Gosub Menu_1
         End If
      End If
   Loop Until Sek = 10
   Waitms 300
   Sekunde = 0
   Sek = 0
   'Readeeprom Num_(2) , 226
   Gosub Menu_1
End Sub

Następnie podczas pracy głównej pętli program sprawdza czy są wogóle włączone są sterowniki oraz które mogą być załączone
w danym dniu. Cały ten proces rozwiązałem w ten sposób, morze za bardzo rozciągnięty, ale działający, a to dla tego że nie za bardzo potrafię operować tablicami i innymi argumentami programowymi.
Poniżej to co działa, ale jak jest sposób na odchudzenie tego to byłbym bardzo wdzięczny.
Sprawdzam_dni:
' ta konfiguracja jest aktywna raz na dobę
   If Godziny = 0 And Minuty = 0 And Sekundy = 0 Or Sekundy = 1 Then
 
      Readeeprom Aa(1) , 172
      Readeeprom Aa(2) , 174
      Readeeprom Aa(3) , 176
      Readeeprom Ab(1) , 180
      Readeeprom Ab(2) , 182
      Readeeprom Ab(3) , 184
      Readeeprom Ac(1) , 188
      Readeeprom Ac(2) , 190
      Readeeprom Ac(3) , 192
      Readeeprom Ad(1) , 196
      Readeeprom Ad(2) , 198
      Readeeprom Ad(3) , 200
      Readeeprom Ae(1) , 204
      Readeeprom Ae(2) , 206
      Readeeprom Ae(3) , 208
      Readeeprom Af(1) , 212
      Readeeprom Af(2) , 214
      Readeeprom Af(3) , 216
      Readeeprom Ag(1) , 220
      Readeeprom Ag(2) , 222
      Readeeprom Ag(3) , 224
 
      Aa(1) = Aa(1) - Day
      Aa(2) = Aa(2) - Day
      Aa(3) = Aa(3) - Day
      Ab(1) = Ab(1) - Day
      Ab(2) = Ab(2) - Day
      Ab(3) = Ab(3) - Day
      Ac(1) = Ac(1) - Day
      Ac(2) = Ac(2) - Day
      Ac(3) = Ac(3) - Day
      Ad(1) = Ad(1) - Day
      Ad(2) = Ad(2) - Day
      Ad(3) = Ad(3) - Day
      Ae(1) = Ae(1) - Day
      Ae(2) = Ae(2) - Day
      Ae(3) = Ae(3) - Day
      Af(1) = Af(1) - Day
      Af(2) = Af(2) - Day
      Af(3) = Af(3) - Day
      Ag(1) = Ag(1) - Day
      Ag(2) = Ag(2) - Day
      Ag(3) = Ag(3) - Day
   End If
 
   Gosub Program_1
 
 
Sprawdzam_stery:
   Rem sterownik nr.1
 
 
   If X(1) = 1 Then                                         ' sprawdzam dzień tygodnia
      If Day > 7 Or Day < 1 Or X(4) = 0 Then Call Wylacznik_czasowy ' sprawdzam czy sterownik ON i dni od 1 do 7 - pn - nd
' sprawdzam ustawienia załączanych timerów czasowych w danym dniu
      If Aa(1) = 1 Or Ab(1) = 1 Or Ac(1) = 1 Or Ad(1) = 1 Or Ae(1) = 1 Or Af(1) = 1 Or Ag(1) = 1 Then
 
         If Godziny = Czas_1 And Minuty = Czas_2 And Sekundy = 0 Then
            Locate 3 , 18 : Lcd "ON "
            Pk1 = Wlacz
         End If
      End If
   End If
 
   Rem Sterownik nr.2
 
   If X(2) = 1 Then
     ' sprawdzam dzień tygodnia
      If Day > 7 Or Day < 1 Or X(5) = 0 Then Call Wylacznik_czasowy
      If Aa(2) = 1 Or Ab(2) = 1 Or Ac(2) = 1 Or Ad(2) = 1 Or Ae(2) = 1 Or Af(2) = 1 Or Ag(2) = 1 Then
 
         If Godziny = St_1 And Minuty = St_2 And Sekundy = 0 Then
            Locate 4 , 18 : Lcd "ON "
            Pk2 = Wlacz
         End If
      End If
   End If
   Rem sterownik nr.3
 
   If X(3) = 1 Then
                                   ' sprawdzam dzień tygodnia
      If Day > 7 Or Day < 1 Or X(6) = 0 Then Call Wylacznik_czasowy
      If Aa(3) = 1 Or Ab(3) = 1 Or Ac(3) = 1 Or Ad(3) = 1 Or Ae(3) = 1 Or Af(3) = 1 Or Ag(3) = 1 Then
         If Godziny = St5 And Minuty = St6 And Sekundy = 0 Then
            Locate 4 , 18
            Pk3 = Wlacz
         End If
      End If
   End If
Return
 
Sub Wylacznik_czasowy
   If Godziny = Czas_3 And Minuty = Czas_4 Then             ' wyłącz sterownik 1
      Pk1 = Wylacz
      Locate 3 , 18 : Lcd "OFF"
   End If
   If Godziny = St_3 And Minuty = St_4 Then
      Pk2 = Wylacz
      Locate 4 , 18 : Lcd "OFF"
   End If
   If Godziny = St7 And Minuty = St8 Then
      Pk3 = Wylacz
   End If
 
End Sub

Pozdrawiam.

Portret użytkownika Karlos123

Sterownik czasowy

Tak wygląda ekran na symulatorze

A jesze mam pytanie odnośnie timerów, sercem układu jest ATEGA328 i wykorzystuję w nim dwa timery jako czasomierze,
ale jest jeszcze jeden TIMER2 i moje pytanie czy mogę jego użyć do regulacji podświetlenia led? Jeżeli tak to bardzo bym poprosił o jakiś mały i prosty przykład użycia tego timera2.

Portret użytkownika EDC

Odp. Sterownik czasowy

Dla Atmega328P to będzie:

Config Timer2 = Pwm , Prescale = 1 , Compare_a_pwm = Clear Up , Compare_b_pwm = Disconnect
 
Dim Pwm_val as byte 
 
Pwm_val = 55 'przykladowa wartosc
 
PWM2A = Pwm_val

Ten Timer w Mega328 ma dwa wyjścia. Konfigurujesz które Ci wygodnie albo oba. Drugie nazywa się PWM2B
Szukasz w nocie mikrokontorlera gdzie ma wyjście PWM2A i tam jest ten sygnał.
Tam gdzie wpiszesz "Disconnect" możesz drugi pin wykorzystać jak chcesz czyli standardowo Config Port i używasz jak innych.

-

BARTek
Moja strona

Portret użytkownika Karlos123

Sterownik czasowy

Dzięki Bartku zaraz się zabieram do roboty. Sprawdziłem i okazało się że po dodaniu tego kawałku kodu
program zwolnił do prawie zera.
Taką mam konfigurację timerów.

'Config Timer2 = Pwm , Prescale = 1 , Compare_a_pwm = Disconnect , Compare_b_pwm = Clear Up
Config Timer2 = Timer , Prescale = 8
Config Timer0 = Timer , Prescale = 64
Config Timer1 = Timer , Prescale = 256 , Noise_cancel = 1
On Timer0 Licznik0_500ms
On Timer1 Stoper_1s
On Timer2 Led_pwm

Jak ustawiłem Timer2 w tryb licznika to programowy pwm niby działa ale szybko się zmienia, a mnie chodzi o to
aby wartość była stała np. 70%
Poniżej fragment kodu zaczerpniętego od Pana Mirleja acz kolwiek trochę przerobiony.
Led_pwm:
 Incr Licznik5
 If Licznik5 = 100 Then Licznik5 = 0
 If Licznik5 < Led_out Then Set Pwm_led_1 Else Reset Pwm_led_1
Return

Jak zatrzymać te pulsowanie na wartość np.75% ?

Portret użytkownika EDC

Odp. Sterownik czasowy - PWM podswietlanie

Kiedy używasz sprzętowego PWM nie ma potrzeby tworzenia większego kodu do obsługi.
Jedyny minus to to ze jesteś przywiązany do dedykowanych pinów.
W Atmega328P dla Timer2 sa dedykowane piny PORTB.3 dla PWM2A i PORTD.3 dla PWM2B
Przykład który napisałem juz sam by sterował PWM na pinie PWM2A według poniższego schematu.

Ten dodatkowy kod w postaci On Timer2 Led_pwm musisz usunąć. To jest do innego rodzaju PWM

Ten sub "Led_pwm:" tez jest tu niepotrzebny.

Cały zamysł sprzętowych PWM`ów jest taki że wszystko dzieje się bez udziału procesora. Wszystko dzieje sie samo jak poustawiasz i nie zajmuje głównej aplikacji. Timer działa sam i generuje przebieg PWM na dedykowanych pinach.

-

BARTek
Moja strona

Portret użytkownika Karlos123

Sterownik czasowy

Ok, cały kod praktycznie już działa poza jednym faktem zapisu i odczytu tablic.
Oto kawałek kodu zapisu który nie działa prawidłowo bo jak wykonam taki zapis to wyświetlacz szaleje.
W jaki sposób można to zapisać prawidłowo ?
Bardzo proszę o pomoc w tej kwestji.

   Writeeeprom X(1) , 250
   Bitwait Eecr.1 , Reset
   Writeeeprom X(2) , 260
   Bitwait Eecr.1 , Reset
   Writeeeprom X(3) , 270
   Bitwait Eecr.1 , Reset
   Writeeeprom X(4) , 280
   Bitwait Eecr.1 , Reset
   Writeeeprom X(5) , 290
   Bitwait Eecr.1 , Reset
   Writeeeprom X(6) , 300
   Bitwait Eecr.1 , Reset
   Writeeeprom Wlacznik(1) , 310
   Bitwait Eecr.1 , Reset
   Writeeeprom Wlacznik(2) , 320
   Bitwait Eecr.1 , Reset
   Writeeeprom Wlacznik(3) , 330