Sterowanie obrotem solara


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...
jestem początkujący i nie wiem dlaczego o godzinie 7.00 po załączeniu przekaźnika program się zawiesza, zaś jak ustawię czas obrotu na 34 wyskakują jakieś krzaki "e8:88" :/
co w tym programie jest źle ?

z góry dziękuje za pomoc.
Pozdrawiam,
Kamil

'************* 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




Portret użytkownika mirley

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.

Portret użytkownika galica01

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

Portret użytkownika mirley

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.

Portret użytkownika Dj.Kisiel

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

 
'************* 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 Or Czasakt_g = 07 Or Czasakt_g = 08 Or Czasakt_g = 09 Or Czasakt_g = 10 Or Czasakt_g = 11 Or Czasakt_g = 12 Or Czasakt_g = 13 Or Czasakt_g = 14 Or Czasakt_g = 15 Or Czasakt_g = 16 Or Czasakt_g = 17 Or Czasakt_g = 18 Then
If Czasakt_m = 30 Or Czasakt_m = 00 Then
If Czasakt_s > 00 And Czasakt_s < Sekundy Then
Portc.1 = 1
Portc.0 = 0
Else
Portc.1 = 1
Portc.0 = 1
 
If Czasakt_g = 19 And Czasakt_m >= 00 And Czasakt_m < Obrot Then
Portc.1 = 0
Portc.0 = 1
 
 
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