Witam, Zrobiłem, a właściwie przerobiłem program zamieszczony tutaj na stronie który służył jak wyłącznik czasowy na obrót solara... z góry dziękuje za pomoc. '************* Konfiguracja uC ***************** '*********************************************** $regfile = "m8def.dat" $crystal = 8000000 Config Portc = &B11111111 : Portc = &B11111111 Config Portd = &B11111111 : Portd = &B11111111 Config Portb.0 = Input Portb.0 = 1 P1 Alias Pinb.0 Config Portb.1 = Input Portb.1 = 1 P2 Alias Pinb.1 Config Timer0 = Timer , Prescale = 64 Enable Timer0 : On Timer0 Prztimer0 Enable Interrupts '********** Konfiguracja uC Koniec ************ '****************** Zmienne ******************* '*********************************************** Dim N As Byte Dim Czasakt_g As Byte , Czasakt_m As Byte , Czasakt_s As Byte Dim Dwukropek As Bit Dim Dzielnik_60 As Byte Dim Zasilanie As Bit Dim Sekundy As Integer Dim Obrot As Integer Dim Poz_menu As Byte Dim Flaga_4ms As Bit , Flaga_1s As Bit Dim Timer_dziel250 As Byte , Timer_dziel2 As Bit Dim W(4) As Byte Dim Wartosc(2) As Byte Dim Ktory_w As Byte '************* Zmienne Koniec **************** '************ Warunki Poczatkowe *************** '*********************************************** Poz_menu = 0 Portc.1 = 1 Portc.0 = 1 '******* Warunki Poczatkowe Koniec *********** '************** Petla glowna ****************** '*********************************************** Do If Pinb.5 = 1 Then Zasilanie = 0 Portc = 255 Portd = 255 Idle Else Zasilanie = 1 End If If Flaga_4ms = 1 And Zasilanie = 1 Then Flaga_4ms = 0 Gosub Wyswietlanie Gosub Ust_godz End If Gosub Dioda Loop End '************ Petla glowna Koniec ************** '************ Przerwanie timer 0 *************** '*********************************************** Prztimer0: 'co 2ms Timer0 = 6 Timer_dziel2 = Not Timer_dziel2 If Timer_dziel2 = 1 Then 'co 4ms Set Flaga_4ms Incr Timer_dziel250 If Timer_dziel250 = 250 Then Timer_dziel250 = 0 Dwukropek = Not Dwukropek Set Flaga_1s Incr Czasakt_s If Czasakt_s = 60 Then Czasakt_s = 0 Incr Czasakt_m If Czasakt_m = 60 Then Czasakt_m = 0 Incr Czasakt_g If Czasakt_g = 24 Then Czasakt_g = 0 End If End If End If End If Return '******** Przerwanie timer 0 Koniec ************ '************ Inne *************** '*********************************************** Wyswietlanie: Incr Ktory_w If Ktory_w = 4 Then Ktory_w = 0 Select Case Poz_menu Case 0: 'czas Wartosc(1) = Czasakt_g Wartosc(2) = Czasakt_m Gosub Przelicz End Select Gosub Przedstaw_jako_znak Select Case Ktory_w Case 0: Set Portc.2 Portd = W(4) Reset Portc.5 Case 1: Set Portc.5 Portd = W(3) Reset Portc.4 Case 2: Set Portc.4 Portd = W(2) Reset Portc.3 Case 3: Set Portc.3 Portd = W(1) Reset Portc.2 End Select Return '****************************************************** Ust_godz: If P1 = 0 And P2 = 1 Then Do Loop Until P1 = 1 Decr Czasakt_g If Czasakt_g = 255 Then Czasakt_g = 23 End If If P2 = 0 And P1 = 1 Then Do Loop Until P2 = 1 Decr Czasakt_m If Czasakt_m = 255 Then Czasakt_m = 59 End If Return '****************************************************** Przedstaw_jako_znak: 'przeksztalca liczby na znaki wyswietlacza For N = 1 To 4 W(n) = Lookup(w(n) , Tabela) W(n).7 = Dwukropek Next N Return '****************************************************** Przelicz: 'przelicza 2 liczby dwucyfrowe na 4 znaki W(1) = Wartosc(1) / 10 W(2) = Wartosc(1) Mod 10 W(3) = Wartosc(2) / 10 W(4) = Wartosc(2) Mod 10 If W(1) = 0 Then W(1) = 10 Return '****************************************************** Dioda: Sekundy = 13 Obrot = 36 If Czasakt_g = 06 And Czasakt_m = 30 And Czasakt_s > 00 And Czasakt_s < Sekundy Then Portc.1 = 1 Portc.0 = 0 Else If Czasakt_g = 07 And Czasakt_m = 00 And Czasakt_s > 00 And Czasakt_s < Sekundy Then Portc.1 = 1 Portc.0 = 0 Else If Czasakt_g = 07 And Czasakt_m = 30 And Czasakt_s > 00 And Czasakt_s < Sekundy Then Portc.1 = 1 Portc.0 = 0 Else If Czasakt_g = 08 And Czasakt_m = 00 And Czasakt_s > 00 And Czasakt_s < Sekundy Then Portc.1 = 1 Portc.0 = 0 Else If Czasakt_g = 08 And Czasakt_m = 30 And Czasakt_s > 00 And Czasakt_s < Sekundy Then Portc.1 = 1 Portc.0 = 0 Else If Czasakt_g = 09 And Czasakt_m = 00 And Czasakt_s > 00 And Czasakt_s < Sekundy Then Portc.1 = 1 Portc.0 = 0 Else If Czasakt_g = 09 And Czasakt_m = 30 And Czasakt_s > 00 And Czasakt_s < Sekundy Then Portc.1 = 1 Portc.0 = 0 Else If Czasakt_g = 10 And Czasakt_m = 00 And Czasakt_s > 00 And Czasakt_s < Sekundy Then Portc.1 = 1 Portc.0 = 0 Else If Czasakt_g = 10 And Czasakt_m = 30 And Czasakt_s > 00 And Czasakt_s < Sekundy Then Portc.1 = 1 Portc.0 = 0 Else If Czasakt_g = 11 And Czasakt_m = 00 And Czasakt_s > 00 And Czasakt_s < Sekundy Then Portc.1 = 1 Portc.0 = 0 Else If Czasakt_g = 11 And Czasakt_m = 30 And Czasakt_s > 00 And Czasakt_s < Sekundy Then Portc.1 = 1 Portc.0 = 0 Else If Czasakt_g = 12 And Czasakt_m = 00 And Czasakt_s > 00 And Czasakt_s < Sekundy Then Portc.1 = 1 Portc.0 = 0 Else If Czasakt_g = 12 And Czasakt_m = 30 And Czasakt_s > 00 And Czasakt_s < Sekundy Then Portc.1 = 1 Portc.0 = 0 Else If Czasakt_g = 13 And Czasakt_m = 00 And Czasakt_s > 00 And Czasakt_s < Sekundy Then Portc.1 = 1 Portc.0 = 0 Else If Czasakt_g = 13 And Czasakt_m = 30 And Czasakt_s > 00 And Czasakt_s < Sekundy Then Portc.1 = 1 Portc.0 = 0 Else If Czasakt_g = 14 And Czasakt_m = 00 And Czasakt_s > 00 And Czasakt_s < Sekundy Then Portc.1 = 1 Portc.0 = 0 Else If Czasakt_g = 14 And Czasakt_m = 30 And Czasakt_s > 00 And Czasakt_s < Sekundy Then Portc.1 = 1 Portc.0 = 0 Else If Czasakt_g = 15 And Czasakt_m = 00 And Czasakt_s > 00 And Czasakt_s < Sekundy Then Portc.1 = 1 Portc.0 = 0 Else If Czasakt_g = 15 And Czasakt_m = 30 And Czasakt_s > 00 And Czasakt_s < Sekundy Then Portc.1 = 1 Portc.0 = 0 Else If Czasakt_g = 16 And Czasakt_m = 00 And Czasakt_s > 00 And Czasakt_s < Sekundy Then Portc.1 = 1 Portc.0 = 0 Else If Czasakt_g = 16 And Czasakt_m = 30 And Czasakt_s > 00 And Czasakt_s < Sekundy Then Portc.1 = 1 Portc.0 = 0 Else If Czasakt_g = 17 And Czasakt_m = 00 And Czasakt_s > 00 And Czasakt_s < Sekundy Then Portc.1 = 1 Portc.0 = 0 Else If Czasakt_g = 17 And Czasakt_m = 30 And Czasakt_s > 00 And Czasakt_s < Sekundy Then Portc.1 = 1 Portc.0 = 0 Else If Czasakt_g = 18 And Czasakt_m = 00 And Czasakt_s > 00 And Czasakt_s < Sekundy Then Portc.1 = 1 Portc.0 = 0 Else If Czasakt_g = 18 And Czasakt_m >= 30 And Czasakt_m < Obrot Then Portc.1 = 0 Portc.0 = 1 Else Portc.1 = 1 Portc.0 = 1 End If End If End If End If End If End If End If End If End If End If End If End If End If End If End If End If End If End If End If End If End If End If End If End If End If Return '****************************************************** '******** Inne Koniec ******************* Tabela: Data 192 , 249 , 164 , 176 , 153 , 146 , 130 , 248 , 128 , 144 , 255 , 7 , 136 'znak: 0 1 2 3 4 5 6 7 8 9 pusty t A
|
|||
Re: Sterownik
A jak wgrasz oryginalny program od sterownika czasowego to co się dzieje? występuje takie same problemy?
Twoja procedura, którą napisałeś jest prawie nieczytelna bo brak w niej prawidłowych wcięć.... Napisz dokładnie co chcesz uzyskać? Jak to ma działać w teorii?
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.
Orginalny program działa
Orginalny program działa poprawnie dokładnie tak jak w opisie bez żadnych problemów.
Uzyskać chcę aby przekaźnik1(triak1) załączany był od godziny 6.30 do godziny 18.00 co 0,5 godziny na 13 sekund a przekaźnik2(triak2)o 18.30 na 6 minut.
Ustawianie aktualnego czasu odbywało się na dwóch przyciskach jeden przesuwał by minuty a drugi godziny.
Ten program który kuzyn podał wyżej działa poprawnie z wyjątkiem godziny 7.00 gdzie po załączeniu przekaźnika zostaje na wyświetlaczu tylko 7 i przekaźnik jest włączony na stałe.Pozostałe nastawienia działają ok i działają prawidłowo.
Kłopotliwe jest też ustawianie aktualnego czasu bo podczas naciskania przycisków miga cały wyświetlacz ale godziny oraz minuty da się ustawić poprawnie.
Próbowałem usunąć z programu załączanie przekaźnika o 7.00 to problem przesuwa się na godzinę 7.30
Zamiast triaka zastosowałem przekaźnik 5v plus tranzystor bc558 i dwa rezystory 3k3 oraz dioda 1n4007
Re: Program Solar
No to tak.... najpierw trzeba z programu wywalić całą tą ostatnią procedurę Dioda. W pętli główej trzeba dodać Sprawdzanie ustwienia flagi 1s i jak flaga jest 1 to wywoływać procedurę sterowanie.
W procedurze sterowanie trzeba napisać po kolei:
1. Przeliczyć czasy na sekundy, czyli czas_sek = 60*60*godziny +60*minuty+sek
3. Zrobić ifa który sprawdza czy czas w sekundach jest w odpowiednim przedziale a jeśli nie to na 100% wyłącza triaka(przekaźnik)
4. Jeśli czas jest w przedziale to trzeba zrobić flagę praca_przerwa i licznik. Jak flaga jest 1 to np jest praca wtedy licznik liczy do 13 i zienia stan flagi na 0. Teraz liczy do 1800 bo to pół godziny i jak doliczy to znowu zmiana flagi na przeciwny. Jednocześnie zależnie od flagi trzeba ustawić triaka
5. Drugi kanał jest prostszy utawisz sobie po prostu przedział w którym triak zawsze działa a poza tym przedziałem nie działa
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.
o dziwo jakoś bez większych
o dziwo jakoś bez większych kombinacji dałem rade...
jak będę miał chwilę dłuższa to zrobię jak mówisz ale na razie sesja mnie goni.
wielkie dzięki za pomoc.
Pozdrawiam