wielokanałowy ściemniacz


Witam, mam pytanie czy jest możliwe sterowanie ATMEGA8 transformatorów elektronicznych do halogenów po stronie 230V i ewentualnie ile można uzyskać kanałów.Chodzi mi już od dłuższego czasu po głowie taki wielokanałowy (4-6 kanałów)ściemniacz z możliwością regulacji każdego kanału za pomocą poziomowego menu(kanał 1,póżniej 2 itd)wyświetlaniem tego co i jak reguluję na LCD oraz zapisem wprowadzonych zmian. Jakie elementy najlepiej użyć jako wykonawcze?




Portret użytkownika marekszy

Ściemniacz

jestem po pierwszych testach praktycznych, niestety coś jest źle, wszystko działa za wolno.
przy mocy 100 żarówka świeci 100%, przy mocy 80 żarówka świeci około 2s i 1s zgaszona,przy 20 świeci ok.1s a 2s jest wygaszona.Po prostu pulsuje z różnymi czasami.
Procesor ustawiłem na kwarc zewnętrzny external XTAL 1111:1111,także prawidłowo.
Na dzisiaj zakończę testy, muszę powoli zbierać się do pracy.

Portret użytkownika matrix

Re: Ściemniacz

Zarzucę sobie tą procedurę na płytkę testową i zobaczę co jest nie teges. Niestety ja będę mógł taktować z częstotliwością 8MHz i zamienić set out_1 na reset out_1. Do tego nie wiem jak podpiąć przebieg 50Hz bo nie bardzo mam skąd.

Portret użytkownika marekszy

Ściemniacz

Po małych zmianach wreszcie działa
Zmieniłem wartość ładowaną do TIMER1 na 65342, 97 us (dałem 3 us.opóźnienia wynikające z opóźnienia od detektora '0') oraz przeniosłem z

zero_fazy
Timer1 = 65342
: do
przerwanie:
Timer1 = 65342

Teraz na spokojnie trzeba zrobić przyciski i wyświetlanie.
Matrix -tok twojego rozumowania zadziałał doskonale, dzięki, na pewno jeszcze z tym powalczymy.
pozdr.
Timer1 = 65516 wywoływał przerwania co 10 us

Portret użytkownika matrix

Re: Ściemniacz

Cieszę się niezmiernie, tymbardziej że było to czysto teoretyczne wywody wymyślane na szbko. Bez przemysleń głębszych i bez kombinacji.

Teraz to ja czekam na jakieś wideo i pełny kod. Jeśli nie chcesz udostępnić całego tutaj to możesz posłać na

Portret użytkownika marekszy

Ściemniacz

Do całego kodu to jeszcze daleka droga, ale spoko, będzie wszystko.
Na pewno jeszcze nie raz będziesz skazany aby mi pomóc.

Portret użytkownika marekszy

Ściemniacz

dopisałem częściową obsługę przycisków i wyświetlanie, jednak program jest niestabilny, potrafi się zwiesić lub resetować ,może ktoś na to zerknąć co jest nie tak, parokrotne wpięcie innego urządzenia do sieci natychmiast kończy się resetem i nie jest to chyba kwestia zasilania.

                                              '************************sciemniacz 6 kanalowy**********************
$regfile = "m8def.dat"
$crystal = 16000000
 
Config Portb = &B11111111 : Portb = &B00000000
Config Portc = &B11111111 : Portc = &B00000000
Config Portd = &B11000000 : Portd = &B11111111
 
Config Lcdpin = Pin , Db4 = Portc.2 , Db5 = Portc.3 , Db6 = Portc.4 , Db7 = Portc.5 , E = Portc.1 , Rs = Portc.0
Config Lcd = 16 * 2
Cls
Cursor Off Noblink
 
Config Timer0 = Timer , Prescale = 256
Enable Timer0 : On Timer0 Prztimer0
 
Config Timer1 = Timer , Prescale = 8
Enable Timer1 : On Timer1 Przerwanie
 
Config Int1 = Rising                                        'rising wyzwala zbocze narastające PD.3
 
Enable Int1
Enable Interrupts
On Int1 Zero_fazy                                           'detekcja przejścia przez 0
Enable Timer1
Stop Timer1
 
 
Out_1 Alias Portb.0
Out_2 Alias Portb.1
Out_3 Alias Portb.2
Out_4 Alias Portb.3
Out_5 Alias Portb.4
Out_6 Alias Portb.5
 
 
  '* * * * * * * * * * Konfiguracja Uc Koniec * * * * * * * * * * * * * * * *
  '* * * * * * * * * * * * * * * * Zmienne * * * * * * * * * * * * * * * * * *
Dim Flaga_4ms As Bit
Dim Flaga_100ms As Bit , Dzielnik As Byte , Dzielnik2 As Byte
Dim Sw As Byte , Stan_sw As Byte , Licznik_sw As Byte
Dim Poz_menu As Byte
Dim Moc_out_0 As Byte , Moc_out_1 As Byte , Moc_out_2 As Byte , Moc_out_3 As Byte , Moc_out_4 As Byte , Moc_out_5 As Byte , Moc_out_6 As Byte
Dim Licznik As Byte
Dim Zmienna As Byte
Dim Wysw As Byte
Dim Procent As Byte
Dim Moc_out As Byte
'* * * * * * * * * * * * * *zmienne koniec * * * * * * * * * * * * * * * * * *
'***************************warunki poczatkowe********************************
 Moc_out_1 = 100
 Moc_out_2 = 80
 Moc_out_3 = 60
 Moc_out_4 = 40
 Moc_out_5 = 20
 Moc_out_6 = 5
 
'************************warunki poczatkowe koniec****************************
 Lcd " LADUJE PROGRAM"
 Lowerline
 Lcd " PROSZE CZEKAC"
 Wait 5
 Cls
'*****************************petla glowna************************************
Do
  If Flaga_4ms = 1 Then
    Flaga_4ms = 0
     Gosub Przyciski
  End If
   If Flaga_100ms = 1 Then
    Flaga_100ms = 0
     Gosub Wyswietlanie
  End If
 Loop
End
'***************petla glowna koniec*****************
 
'*******przerwanie timer0*****************
Prztimer0:
 Timer0 = 6
 Flaga_4ms = 1
 Incr Dzielnik
 If Dzielnik = 25 Then                                      '25*4ms = 100ms
   Dzielnik = 0
   Flaga_100ms = 1
   Incr Dzielnik2
   If Dzielnik2 = 10 Then                                   '10*100ms=1s'
    Dzielnik2 = 0
   End If
 End If
Return
 
 
'***********************************************
Zero_fazy:
Set Out_1                                                   'wlaczanie wyjsc
Set Out_2
Set Out_3
Set Out_4
Set Out_5
Set Out_6
 
Start Timer1
Return
 
 
Przerwanie:
 
Timer1 = 65342                                              'wpisujemy taką wartość by wywołać przerwanie 100x na jedną połówkę sinusoidy
  Incr Zmienna                                              'zwiększamy zmienną
    If Zmienna = 100 Then                                   'jeśli osiągnie 100% to
       Zmienna = 0                                          'zerujemy ją
       Stop Timer1                                          'stopujemy timer
    End If
 
      If Zmienna >= Moc_out_1 Then Reset Out_1              'sprawdzamy czy już wyłączyć wyjście
       If Zmienna >= Moc_out_2 Then Reset Out_2
         If Zmienna >= Moc_out_3 Then Reset Out_3
           If Zmienna >= Moc_out_4 Then Reset Out_4
            If Zmienna >= Moc_out_5 Then Reset Out_5
             If Zmienna >= Moc_out_6 Then Reset Out_6
 
Return
'***************wyswietlanie*****************************
Wyswietlanie:
      Select Case Poz_menu
        Case 0:
          Wysw = Moc_out_0
            Locate 1 , 1 : Lcd "   DIMMER x 6      "
            Locate 2 , 1 : Lcd "   w.testowa       "
        Case 1:
          Wysw = Moc_out_1
            Locate 1 , 1 : Lcd "    STREFA 1    "
             Procent = Moc_out_1 * 1
            Locate 2 , 1 : Lcd Procent ; "% mocy       "
        Case 2:
          Wysw = Moc_out_2
            Locate 1 , 1 : Lcd "    STREFA 2    "
             Procent = Moc_out_2 * 1
            Locate 2 , 1 : Lcd Procent ; "% mocy       "
        Case 3:
          Wysw = Moc_out_3
            Locate 1 , 1 : Lcd "    STREFA 3    "
             Procent = Moc_out_3 * 1
            Locate 2 , 1 : Lcd Procent ; "% mocy       "
        Case 4:
          Wysw = Moc_out_4
            Locate 1 , 1 : Lcd "    STREFA 4    "
             Procent = Moc_out_4 * 1
            Locate 2 , 1 : Lcd Procent ; "% mocy       "
        Case 5:
          Wysw = Moc_out_5
            Locate 1 , 1 : Lcd "    STREFA 5    "
             Procent = Moc_out_5 * 1
            Locate 2 , 1 : Lcd Procent ; "% mocy       "
        Case 6:
          Wysw = Moc_out_6
            Locate 1 , 1 : Lcd "    STREFA 6    "
             Procent = Moc_out_6 * 1
            Locate 2 , 1 : Lcd Procent ; "% mocy       "
      End Select
 
 
 
'**************przyciski*********************************
 
Przyciski:
  Sw = Pind And &B11110100                                  'maskowanie nieużywanych pinów
 
If Sw <> &B11110100 And Stan_sw = Sw Then
    Incr Licznik_sw
    If Licznik_sw = 100 Then
      Licznik_sw = 0
      Select Case Stan_sw
 
        Case &B11010100                                      'zapis bedze pozniej PD5
 
 
 
        Case &B11100100                                     'on/off bedzie pozniej PD4
 
 
         Case &B11110000:                                   'poz menu(7 pozycji 0/1/2/3/4/5/6/7)  PD2
           Incr Poz_menu
           If Poz_menu = 7 Then
             Poz_menu = 0
           End If
 
 
         Case &B01110100                                    'moc (+) S1 PD7
          Select Case Poz_menu
 
            Case 1:
              If Moc_out = 0 Then
               If Moc_out_1 < 100 Then Incr Moc_out_1
                Else
                 Moc_out = 0
              End If
 
            Case 2:
              If Moc_out = 0 Then
               If Moc_out_2 < 100 Then Incr Moc_out_2
                Else
                 Moc_out = 0
              End If
 
            Case 3:
              If Moc_out = 0 Then
               If Moc_out_3 < 100 Then Incr Moc_out_3
                Else
                 Moc_out = 0
              End If
 
            Case 4:
              If Moc_out = 0 Then
               If Moc_out_4 < 100 Then Incr Moc_out_4
                Else
                 Moc_out = 0
              End If
 
            Case 5:
              If Moc_out = 0 Then
               If Moc_out_5 < 100 Then Incr Moc_out_5
                Else
                 Moc_out = 0
              End If
 
            Case 6:
              If Moc_out = 0 Then
               If Moc_out_6 < 100 Then Incr Moc_out_6
                Else
                 Moc_out = 0
              End If
          End Select
 
        Case &B10110100                                     'moc(-)  S2 PD6
          Select Case Poz_menu
            Case 1:
              If Moc_out = 0 Then
               If Moc_out_1 > 0 Then Decr Moc_out_1
                Else
                 Moc_out = 0
              End If
 
            Case 2:
              If Moc_out = 0 Then
               If Moc_out_2 > 0 Then Decr Moc_out_2
                Else
                 Moc_out = 0
              End If
 
            Case 3:
              If Moc_out = 0 Then
                 If Moc_out_3 > 0 Then Decr Moc_out_3
                Else
                 Moc_out = 0
              End If
 
            Case 4:
              If Moc_out = 0 Then
                 If Moc_out_4 > 0 Then Decr Moc_out_4
                Else
                 Moc_out = 0
              End If
 
            Case 5:
              If Moc_out = 0 Then
                 If Moc_out_5 > 0 Then Decr Moc_out_5
                Else
                 Moc_out = 0
              End If
 
            Case 6:
              If Moc_out = 0 Then
                 If Moc_out_6 > 0 Then Decr Moc_out_6
                Else
                 Moc_out = 0
              End If
         End Select
    End Select
   End If
  Else
    Stan_sw = Sw
    Licznik_sw = 80
  End If
Return

testowałem także na płytce testowej sam program bez podłączonych wyjść z procesora i bez detekcji "0" i robi to samo.
Jeszcze powalczę z zasilaniem,ale i tak poproszę o sprawdzenie poprawności kodu.

Portret użytkownika matrix

Re: Ściemniacz

Możesz mi wyjaśnić jak działa sekcja przycisków? Nie kminię jej ni w ząb. Po co używasz liczb binarnych?
Rozumiem że wykrywasz naciśnięcie któregokolwiek przycisku?

Czy jak usuniesz sekcję obsługi przycisków to wszystko jest git?

Wytłumacz mi początek czyli to:

Przyciski:
  Sw = Pind And &B11110100                                  'maskowanie nieużywanych pinów
 
If Sw <> &B11110100 And Stan_sw = Sw Then
    Incr Licznik_sw
    If Licznik_sw = 100 Then
      Licznik_sw = 0
      Select Case Stan_sw

Nie bardzo wiem czemu to ma służyć?

Jakoś to wszystko strasznie zagmatwałeś.

Portret użytkownika marekszy

http://mirley.firlej.org/obsl

http://mirley.firlej.org/obsluga_klawiatury_wieloprzyciskowej
Tutaj masz wszystko opisane, stosowałem takie rozwiązanie i muszę przyznać ,że jest proste i niezawodne.
Nie pisałem ,że po dodaniu obsługi przycisków zaczęło wariować ,tylko przy ustawieniach mocy na "sztywno" i bez wyświetlania nie było widoczne.
Obstawiam jednak "szpilki" od zasilania, tym bardziej ,że właśnie uwaliłem 1 ATMEGĘ TQFP32 przy programowaniu, pokombinuję i dam znać.

Portret użytkownika matrix

Re: Ściemniacz

No właśnie nie za bardzio kminię ten kawałek:

If Sw <> &B11110000 And Stan_sw = Sw Then
    Incr Licznik_sw
    If Licznik_sw = 100 Then

Po co zliczanie zmiennej Licznik_sw do 100 ?

Portret użytkownika marekszy

Ściemniacz

przecież Mirley dosyć dokładnie to opiał, czas reakcji na zadiałanie przycisków i jego trzymanie.pierwsze naciśnięcie czas reakcji 80ms a gdy będziemy trzymać dalej będzie wywoływany co 400ms.Na prawdę fajnie to działa i daje dużo możliwości.

Portret użytkownika marekszy

Ściemniacz

Pierwsze testy na płycie testowej są w miarę zadowalające.Resety i zwieszanie się programu wynikały z braku odpowiedniej ilości kondensatorów 100nF na każdym VCC procesora.

Sprawdziłem ,mam brak regulacji między 80-99%, tzn.od 80% nic się nie dzieje do 99% (cały czas świeci na 80%) dopiero 100% daje pełną moc światła.?

No i działa tak jak należy, zmieniłem wartość ładowaną do TIMER1 na 62900 (164us) przy PRESCALE 1, nie mam pojęcia czemu tak wyszło,ale jest ok.Jeszcze pobawię się z wyświetlaniem mocy za pomocą lini, ||||||||||||| 50% coś w tym stylu .

Portret użytkownika marekszy

Ściemniacz

zapis mam gotowy

Case &B11010100                                      'zapis  PD5
        Writeeeprom Moc_out_1 , 2
        Writeeeprom Moc_out_2 , 4
        Writeeeprom Moc_out_3 , 6
        Writeeeprom Moc_out_4 , 8
        Writeeeprom Moc_out_5 , 10
        Writeeeprom Moc_out_6 , 12

odzcyt także
'***************************warunki poczatkowe********************************
 Readeeprom Moc_out_1 , 2
  If Moc_out_1 > 50 Then                                    'gdy moc_out_1 większa od 50 wczytaj 50
    Moc_out_1 = 50
  End If
 Readeeprom Moc_out_2 , 4
  If Moc_out_2 > 50 Then
    Moc_out_2 = 50
  End If
 Readeeprom Moc_out_3 , 6
  If Moc_out_3 > 50 Then
    Moc_out_3 = 50
  End If
 Readeeprom Moc_out_4 , 8
  If Moc_out_4 > 50 Then
    Moc_out_4 = 50
  End If
 Readeeprom Moc_out_5 , 10
  If Moc_out_5 > 50 Then
    Moc_out_5 = 50
  End If
 Readeeprom Moc_out_6 , 12
  If Moc_out_6 > 50 Then
    Moc_out_6 = 50
  End If

natomiast jak napisać on/off dla jednego przecisku aby zał i wyłączyć out_1 do out_6

Case &B11100100
  out_1 = 0 'lub reset out_1
  out_2 = 0
  'i tak do out_6
  'co dalej aby ponownie włączyć

Portret użytkownika matrix

Re: jak napisać on/off dla jednego przecisku

A coś dokładniej? Jakieś wytyczne? W którym to ma być miejscu? Coś więcej opisz.

Tak na szybko to napisz sobie procedurę obsługi krótko i długo trzymanego przycisku. Jak długo trzymasz to przechodzisz przez takie mikro menu pomiędzy on/off dla out_1 do out_6 czyli:

długo
  on/off out_1
    krótko=zmiana w pętli on->off->on->off.....
długo
  on/off out_2
    krótko=zmiana w pętli on->off->on->off.....
długo
  on/off out_3
    krótko=zmiana w pętli on->off->on->off.....
długo
  on/off out_4
    krótko=zmiana w pętli on->off->on->off.....
długo
  on/off out_5
    krótko=zmiana w pętli on->off->on->off.....
długo
  on/off out_6
    krótko=zmiana w pętli on->off->on->off.....

Czaisz bazę?

Portret użytkownika marekszy

Ściemniacz

Na pewno się przyda obsługa długo/krótko,ale nie tutaj,mam na myśli coś innego.
Mam na myśli użycie jednego przycisku on/off, 1 raz nacisnę to gaszę wszystkie wyjścia, ponownie nacisnę wszystkie wyjścia załączone z nastawami jasności jakie były zapisane.
jeszcze dodatkowo zapis do eeprom stanu on/off aby po zaniku zasilania był zapamiętany stan.

'**************przyciski*********************************
 
Przyciski:
  Sw = Pind And &B11110100                                  'maskowanie nieużywanych pinów
 
If Sw <> &B11110100 And Stan_sw = Sw Then
    Incr Licznik_sw
    If Licznik_sw = 50 Then
      Licznik_sw = 0
      Select Case Stan_sw
 
       Case &B11010100                                      'zapis  PD5
        Writeeeprom Moc_out_1 , 2
        Writeeeprom Moc_out_2 , 4
        Writeeeprom Moc_out_3 , 6
        Writeeeprom Moc_out_4 , 8
        Writeeeprom Moc_out_5 , 10
        Writeeeprom Moc_out_6 , 12
 
 
        Case &B11100100                                     'on/off PD4
        'tutaj co ma się dziać po naciśnięciu PD4
        'wygaszenie wszystkich lamp 
        'załączenie wszystkich lamp
        'zapis stanu do eeprom
 
         Case &B11110000:                                   'poz menu(7 pozycji 0/1/2/3/4/5/6/7)  PD2
           Incr Poz_menu
           If Poz_menu = 7 Then
             Poz_menu = 0
           End If
 
 
         Case &B01110100                                    'moc (+) S1 PD7
          Select Case Poz_menu
 
            Case 1:
              If Moc_out = 0 Then
               If Moc_out_1 < 50 Then Incr Moc_out_1
                Else
                 Moc_out = 0
              End If
 
            Case 2:
              If Moc_out = 0 Then
               If Moc_out_2 < 50 Then Incr Moc_out_2
                Else
                 Moc_out = 0
              End If
 
            Case 3:
              If Moc_out = 0 Then
               If Moc_out_3 < 50 Then Incr Moc_out_3
                Else
                 Moc_out = 0
              End If
 
            Case 4:
              If Moc_out = 0 Then
               If Moc_out_4 < 50 Then Incr Moc_out_4
                Else
                 Moc_out = 0
              End If
 
            Case 5:
              If Moc_out = 0 Then
               If Moc_out_5 < 50 Then Incr Moc_out_5
                Else
                 Moc_out = 0
              End If
 
            Case 6:
              If Moc_out = 0 Then
               If Moc_out_6 < 50 Then Incr Moc_out_6
                Else
                 Moc_out = 0
              End If
          End Select
 
        Case &B10110100                                     'moc(-)  S2 PD6
          Select Case Poz_menu
            Case 1:
              If Moc_out = 0 Then
               If Moc_out_1 > 0 Then Decr Moc_out_1
                Else
                 Moc_out = 0
              End If
 
            Case 2:
              If Moc_out = 0 Then
               If Moc_out_2 > 0 Then Decr Moc_out_2
                Else
                 Moc_out = 0
              End If
 
            Case 3:
              If Moc_out = 0 Then
                 If Moc_out_3 > 0 Then Decr Moc_out_3
                Else
                 Moc_out = 0
              End If
 
            Case 4:
              If Moc_out = 0 Then
                 If Moc_out_4 > 0 Then Decr Moc_out_4
                Else
                 Moc_out = 0
              End If
 
            Case 5:
              If Moc_out = 0 Then
                 If Moc_out_5 > 0 Then Decr Moc_out_5
                Else
                 Moc_out = 0
              End If
 
            Case 6:
              If Moc_out = 0 Then
                 If Moc_out_6 > 0 Then Decr Moc_out_6
                Else
                 Moc_out = 0
              End If
         End Select
    End Select
   End If
  Else
    Stan_sw = Sw
    Licznik_sw = 30
  End If
Return

Portret użytkownika gosc

zrób dodatkowa flage i przez

zrób dodatkowa flage i przez toggle ja zmieniaj.jak będzie 1 to wyłącz wszystko i zapisz w pamięci jak 0 to odwrotnie.

Portret użytkownika marekszy

Ściemniacz

nie bardzo wiem jak to napisać?

Portret użytkownika gosc

tam gdzie masz ''tutaj co ma

tam gdzie masz ''tutaj co ma się dziać po naciśnięciu PD4'' zrob

toggle flaga
a w programie
if flaga =1 then' cos co masz zrobić
if flaga =0 then 'coś tam co ma sie zrobić
Przynajmniej ja bym tak próbował.

Portret użytkownika marekszy

Ściemniacz

dzięki,jutro pokombinuję i zobaczymy co z tego wyjdzie, dam znać.

Portret użytkownika marekszy

Ściemniacz

niby proste on/off ,ale mam problem.To co dopisałem

Dim On_off As Bit

'****************zero fazy*******************************
Zero_fazy:
 If On_off = 1 Then                                         'przycisk on/off
   Set Out_1                                                'wlaczanie wyjsc
   Set Out_2
   Set Out_3
   Set Out_4
   Set Out_5
   Set Out_6
   Start Timer1
 End If
Return

Przyciski:
  Sw = Pind And &B11110100                                  'maskowanie nieużywanych pinów
 
If Sw <> &B11110100 And Stan_sw = Sw Then
    Incr Licznik_sw
    If Licznik_sw = 50 Then
      Licznik_sw = 0
      Select Case Stan_sw
 
       Case &B11010100                                      'zapis  PD5
        Writeeeprom Moc_out_1 , 2
        Writeeeprom Moc_out_2 , 4
        Writeeeprom Moc_out_3 , 6
        Writeeeprom Moc_out_4 , 8
        Writeeeprom Moc_out_5 , 10
        Writeeeprom Moc_out_6 , 12
 
        Case &B11100100                                     'on/off  PD4
         Toggle On_off
 
         Case &B11110000:                                   'poz menu(7 pozycji 0/1/2/3/4/5/6/7)  PD2
           Incr Poz_menu
           If Poz_menu = 7 Then
             Poz_menu = 0
           End If

A teraz co jest nie tak
przycisk powinien wyłączać/wyłączać wszystkie wyjścia ,jednak działa dopiero jak zmienię na chwilę moc na każdym wyjściu.
Po załadowaniu programu nie działa ,jak zmienię moc_out_1 działa tylko wł. i wył. out_1, zmienię dodatkowo moc_out_2 działa wł. i wył.out_1 i out_2,
jeżeli ruszę każdy z kanałów to działa wł. i wył. wszystkich wyjść, tak jak w teori ma robić.
Dodatkowo jeszcze dochodzi zapis z automatu po zał. i po wył. aby po zaniku napięcia wiedział czy był wył. czy też zał.Jak zapisać wartość Bit,

Portret użytkownika Grzeniu 73

a jeżeli weźmiesz

a jeżeli weźmiesz tak:

Zero_fazy:
 If On_off = 1 Then                                         'przycisk on/off
 Writeeeprom Moc_out_1 , 2
   Out_1 =0
...
...
 if On_off=0 then
  Readeeprom  moc_out_1,2
   ...
   ... 

w sumie łatwiejsze to sie wydawało:)Nie mam złożonego tego układu ,a ja nie umiem bez testowania nic napisać :) ale walcz z tym to możne sie kiedyś przyda:)

Portret użytkownika marekszy

Ściemniacz

Niestety dzisiaj tego nie sprawdzę(cały dzień jestem w pracy),najwcześniej jutro,dam znać jak to wygląda.
Nie rozumiem czemu dajesz zapis i odczyt mocy w tym miejscu

If On_off = 1 Then                                         'przycisk on/off
 Writeeeprom Moc_out_1 , 2

if On_off=0 then
  Readeeprom  moc_out_1,2

Zapis mocy poszczególnych kanałów mam zrobiony celowo pod osobnym przyciskiem ,że jak już zdecyduję się na ustawienia to wtedy zapisuję, natomiast on/off ma stan tylko 0/1 i to ma być zapisane z automatu po zmianie.Przycisk on/off ma wyłączać i włączać wszystkie wyjścia jednocześnie.
Przećwiczyłem również wyłączanie INT1

disable INT1

ale też z marnym skutkiem, zatrzymanie Timera1 nie wchodzi w grę ,całaść mruga.

Portret użytkownika Grzeniu 73

Moze zle Cie zrozumiałem.Ja

Moze zle Cie zrozumiałem.Ja myślałem w ten sposób,ze po wyłączeniu off zapisuje stan wszystkich out,a po włączeniu wczytuje wszystkie poprzednie ustawienia. Tak zrobiłem sobie w stacji lutowniczej wciskam przycisk zapisuje stan i usypia kolbę po następnym wciśnięciu wczytuje poprzednie ustawienia,ale to dla jednego kanału. Myślę ,ze zasada będzie ta sama. Ten sposób musi działać,tylko trzeba pomyśleć jak go zapisać. Moze w pętli głównej, albo obsłudze samego przycisku. Ja czasami jak juz jestem zdesperowany :) kopiuje sobie cały fragment i wklejam go w inne miejsca. Zdarza mi sie ,ze zapisanie go w innym miejscu rozwiązuje problemy. Tak to jest ja człowiek zajmuje sie programowaniem ,tylko dla zabawy:)

Portret użytkownika marekszy

Ściemniacz

Niestety nie mam pomysłu (jak na razie),więc postanowiłem rozwiązać on/off trochę inaczej.
Mam wolne piny PD.0 i PD.1, ustawie je jako wyjścia i za pomocą przycisku PD.4 będę załączał przekaźnik który będzie rozłączał zasilanie +5V idące na transoptory modułów wykonawczych.

Jak najprościej to napisać w obsłudze przycisków aby po naciśnięciu PD.4 załączyło przekaźnik na PD.0,a po ponownym naciśnięciu PD.4 wyłączyło go i po każdej zmianie przekaźnika zapisywało jego stan do eeprom.

Ok, mam to już zrobione,może nie najprościej,ale wszystko działa włącznie z zapisem,a to najważniejsze
ustawiłem portd.0 i portd.1 jako wyjścia i przypisałem zera

Config Portd = &B00000011 : Portd = &B11111100 

przypisałem przekaźniki do wyjść
Pk_1 Alias Portd.0
Pk_2 Alias Portd.1

zmienna
Dim On_off As Byte

w pętli głównej skok do programu od on_off

Do
  If Flaga_4ms = 1 Then
    Flaga_4ms = 0
     Gosub Przyciski
     Gosub Sterowanie
  End If

program obsługi on_off
Sterowanie:
  Select Case On_off
   Case 0:
    Reset Pk_1
    Reset Pk_2
   Case 1:
    Set Pk_1
    Set Pk_2
  End Select
 Return

no i obsługa przycisku z zapisem
Case &B11100100                                     'on/off  PD4
         If On_off = 0 Then
            On_off = 1
          Else
            On_off = 0
         End If
      Writeeeprom On_off , 14

oczywiście na początku odzcyt
Readeeprom On_off , 14

No to prwie już koniec,jeszcze trochę "wodotrysków" i co najważniejsze:
jeszcze nie wiem jak ale trzeba dopisać coś takiego,że jak zostawię na obojętnie której poz_menu to np.po 2 min. powraca samoczynnie do poz_menu = 0. chodzi mi o ten kawałek
Case &B11110000:                                   'poz menu(7 pozycji 0/1/2/3/4/5/6)  PD2
           Incr Poz_menu
           If Poz_menu = 7 Then
             Poz_menu = 0
           End If

i wtedy następnym etapem (zapewne ostatnim)zapis i odczyt około 3 scen oświetlenia,ale to już na końcu.
Jeżeli macie jakieś sugestie to proszę o pomoc.

Portret użytkownika Grzeniu 73

przy przejściu do menu musisz

przy przejściu do menu musisz wystartować jakiś licznik ,ktory odliczy te dwie minuty.Tak musi sie dziać przy jakimkolwiek przycisku. Jak nie będziesz nic wciskal to doliczy do zera i ustawi poz_menu=0. W którymś z projektów tu na stronie jest cos takiego.

Portret użytkownika marekszy

Ściemniacz

autopowrót do menu gotowy

Dim Autopowrot As Byte

w pętli głównej

 If Flaga_1s = 1 Then                                    'co 1s
       Flaga_1s = 0
       If Poz_menu <> 0 Then                                'program do autopowrotu poz_menu
         Incr Autopowrot
        If Autopowrot = 15 Then                             'czas na powrot do poz_menu 0
        Poz_menu = 0
        End If
         Else
          Autopowrot = 0
      End If
    End If

i w obsłudze przycisków po każdym
end select

dałem
autopowrót = 0

jeszcze uwolnię dwa przyciski i dam na nich sceny. Potrzebuję do nich obsługę krótkie/długie przyciśnięcie. Przy długim będzie zapis sceny, a przy krótkim wczytanie.

Portret użytkownika Grzeniu 73

Właśnie o takim rozwiązaniu

Właśnie o takim rozwiązaniu myślałem.Długie i krótkie trzymanie to chyba bys musiał podobnie rozwiązać.Jak trzymasz przycisk to zwiększa sie jakiś licznik. Jak dojdzie np: do 5 to zrobi to a jak powyżej 5 to coś innego. Takiego czegoś jeszcze nie robiłem.Dobrze gdybyś zrobił jakaś diodę albo znaczek na wyświetlaczu,ze czasu już zapisano.

Portret użytkownika marekszy

Ściemniacz

Potrzebuję pomocy przy obsłudze wyświetlacza.Dopisałem 2 przyciski długie/krótkie przytrzymanie.
Przytrzymamy długo następuje zapis ustawień wyjść do SCENA 1,krótko to wczytanie SCENA 1, drugi dla SCENA 2.przy każdym resecie startuje od SCENA 1 i wtedy możemy się przełączać między scenami.
Ale chodzi mi o wyświetlanie ,mam teraz że jak przechodzę przez poz_menu do ustawiania jasności to
na wyświetlaczu mam

'***************wyswietlanie*****************************
Wyswietlanie:
 
      Select Case Poz_menu
        Case 0:
          Wysw = Moc_out_0
            Locate 1 , 1 : Lcd "   DIMMER x 6      "        'poz_menu_0
            Locate 2 , 1 : Lcd "     V.2           "
        Case 1:
          Wysw = Moc_out_1
            Locate 1 , 1 : Lcd "    STREFA 1    "           'poz_menu_1
             Procent = Moc_out_1 * 2
            Locate 2 , 1 : Lcd Procent ; "% mocy       "
        Case 2:
          Wysw = Moc_out_2
            Locate 1 , 1 : Lcd "    STREFA 2    "           'poz_menu_2
             Procent = Moc_out_2 * 2
            Locate 2 , 1 : Lcd Procent ; "% mocy       "
        Case 3:
          Wysw = Moc_out_3
            Locate 1 , 1 : Lcd "    STREFA 3    "           'poz_menu_3
             Procent = Moc_out_3 * 2
            Locate 2 , 1 : Lcd Procent ; "% mocy       "
        Case 4:
          Wysw = Moc_out_4
            Locate 1 , 1 : Lcd "    STREFA 4    "           'poz_menu_4
             Procent = Moc_out_4 * 2
            Locate 2 , 1 : Lcd Procent ; "% mocy       "
        Case 5:
          Wysw = Moc_out_5
            Locate 1 , 1 : Lcd "    STREFA 5    "           'poz_menu_5
             Procent = Moc_out_5 * 2
            Locate 2 , 1 : Lcd Procent ; "% mocy       "
        Case 6:
          Wysw = Moc_out_6
            Locate 1 , 1 : Lcd "    STREFA 6    "           'poz_menu_6
             Procent = Moc_out_6 * 2
            Locate 2 , 1 : Lcd Procent ; "% mocy       "
      End Select

zapomniałem chyba return na końcu,ale działa.

po pozostawieniu na obojętnie którym case po kilkunastu sek. powraca automatycznie do

 Case 0:

Chciałbym aby w miejsce Case 0: było wyświetlane:
po wciśnięciu krótko 1 przycisku
SCENA 1
ON
po trzymaniu długo 1 przycisku
SCENA 1
ZAPIS
i powróciło do
SCENA 1
ON
i to samo z drugim przyciskiem........
Po naciśnięciu OFF
OFF
po ponownym naciśnięciu czyli ON
SCENA 1 (lub 2, zależy jaka jest ustawiona)
daję jak wykonana obsługa przycisków
Pk_1 Alias Portd.0
Scena_1 Alias Pind.2
Scena_2 Alias Pind.5

Dim Autopowrot As Byte
Dim Pomoc As Byte
Dim Pomoc_1 As Byte
Pomoc = 0
Pomoc_1 = 0

'*****************************petla glowna************************************
Do
  If Flaga_4ms = 1 Then                                     'co 4ms
     Flaga_4ms = 0
     Gosub Przyciski
     Gosub Sterowanie
  End If
   If Flaga_100ms = 1 Then                                  ' co 100ms
      Flaga_100ms = 0
 
       If Scena_1 = 0 Then                                  'dlugie przycisniecie PD 2
         If Pomoc < 255 Then Incr Pomoc
         If Pomoc = 30 Then
         Writeeeprom Moc_out_1 , 2                          'zapis sceny 1
         Writeeeprom Moc_out_2 , 4
         Writeeeprom Moc_out_3 , 6
         Writeeeprom Moc_out_4 , 8
         Writeeeprom Moc_out_5 , 10
         Writeeeprom Moc_out_6 , 12
         End If
        Else
        If Pomoc > 1 And Pomoc < 30 Then                    'krotkie przycisniecie PD2 
          Readeeprom Moc_out_1 , 2                          'wczytanie sceny 1
          Readeeprom Moc_out_2 , 4
          Readeeprom Moc_out_3 , 6
          Readeeprom Moc_out_4 , 8
          Readeeprom Moc_out_5 , 10
          Readeeprom Moc_out_6 , 12
        End If
          Pomoc = 0
        End If
       If Scena_2 = 0 Then                                  'dlugie przycisniecie PD 5
         If Pomoc_1 < 255 Then Incr Pomoc_1
         If Pomoc_1 = 30 Then                               'czas na zadzalanie dlugiego nacisniecia
           Writeeeprom Moc_out_1 , 16                       'zapis sceny 2
           Writeeeprom Moc_out_2 , 18
           Writeeeprom Moc_out_3 , 20
           Writeeeprom Moc_out_4 , 22
           Writeeeprom Moc_out_5 , 24
           Writeeeprom Moc_out_6 , 26
        End If
        Else
        If Pomoc_1 > 1 And Pomoc_1 < 30 Then                'krotkie przycisniecie PD 5
           Readeeprom Moc_out_1 , 16                        'wczytanie sceny 2
           Readeeprom Moc_out_2 , 18
           Readeeprom Moc_out_3 , 20
           Readeeprom Moc_out_4 , 22
           Readeeprom Moc_out_5 , 24
           Readeeprom Moc_out_6 , 26
        End If
        Pomoc_1 = 0
      End If
     Gosub Wyswietlanie
     End If
    If Flaga_1s = 1 Then                                    'co 1s
       Flaga_1s = 0
       If Poz_menu <> 0 Then                                'program do autopowrotu poz_menu
         Incr Autopowrot
        If Autopowrot = 10 Then                             'czas na powrot do poz_menu 0
        Poz_menu = 0
        End If
         Else
          Autopowrot = 0
      End If
    End If
 Loop
End
'***************petla glowna koniec*****************

'**************przyciski*********************************
 
Przyciski:
  Sw = Pind And &B11010000                                  'maskowanie nieużywanych pinów
 
If Sw <> &B11110000 And Stan_sw = Sw Then
    Incr Licznik_sw
    If Licznik_sw = 50 Then
      Licznik_sw = 0
      Select Case Stan_sw
 
        Case &B11000000                                     'on/off  PD4
         If On_off = 0 Then
            On_off = 1
          Else
            On_off = 0
         End If
      Writeeeprom On_off , 14                               'autozapis po kazdej zmianie stanu Pk on/off
 
         Case &B00010000:                                   'poz menu(7 pozycji 0/1/2/3/4/5/6/7) PD6/PD7
           Incr Poz_menu
           If Poz_menu = 7 Then
             Poz_menu = 0
           End If
 
 
         Case &B01010000                                    'moc (+) S1 PD7
          Select Case Poz_menu
 
            Case 1:
              If Moc_out = 0 Then
               If Moc_out_1 < 50 Then Incr Moc_out_1
                Else
                 Moc_out = 0
              End If
 
            Case 2:
              If Moc_out = 0 Then
               If Moc_out_2 < 50 Then Incr Moc_out_2
                Else
                 Moc_out = 0
              End If
 
            Case 3:
              If Moc_out = 0 Then
               If Moc_out_3 < 50 Then Incr Moc_out_3
                Else
                 Moc_out = 0
              End If
 
            Case 4:
              If Moc_out = 0 Then
               If Moc_out_4 < 50 Then Incr Moc_out_4
                Else
                 Moc_out = 0
              End If
 
            Case 5:
              If Moc_out = 0 Then
               If Moc_out_5 < 50 Then Incr Moc_out_5
                Else
                 Moc_out = 0
              End If
 
            Case 6:
              If Moc_out = 0 Then
               If Moc_out_6 < 50 Then Incr Moc_out_6
                Else
                 Moc_out = 0
              End If
          End Select
          Autopowrot = 0
 
        Case &B10010000                                     'moc(-)  S2 PD6
          Select Case Poz_menu
            Case 1:
              If Moc_out = 0 Then
               If Moc_out_1 > 0 Then Decr Moc_out_1
                Else
                 Moc_out = 0
              End If
 
            Case 2:
              If Moc_out = 0 Then
               If Moc_out_2 > 0 Then Decr Moc_out_2
                Else
                 Moc_out = 0
              End If
 
            Case 3:
              If Moc_out = 0 Then
                 If Moc_out_3 > 0 Then Decr Moc_out_3
                Else
                 Moc_out = 0
              End If
 
            Case 4:
              If Moc_out = 0 Then
                 If Moc_out_4 > 0 Then Decr Moc_out_4
                Else
                 Moc_out = 0
              End If
 
            Case 5:
              If Moc_out = 0 Then
                 If Moc_out_5 > 0 Then Decr Moc_out_5
                Else
                 Moc_out = 0
              End If
 
            Case 6:
              If Moc_out = 0 Then
                 If Moc_out_6 > 0 Then Decr Moc_out_6
                Else
                 Moc_out = 0
              End If
         End Select
         Autopowrot = 0
    End Select
   End If
  Else
    Stan_sw = Sw
    Licznik_sw = 30
  End If
Return

'**************sterowanie********************************
Sterowanie:                                                 'programik do obslugi Pk on/off
  Select Case On_off
   Case 0:
    Reset Pk_1
   Case 1:
    Set Pk_1
  End Select
 Return

niedługo wstawię pełny kod wraz z opisem, ale to dopiero po testach w prakyce, aby być pewnym na 100%.

Portret użytkownika Grzeniu 73

podaj mi maila swojego to Ci

podaj mi maila swojego to Ci podeśle rozwiązanie z wyświetlaniem w moim programie regulatora.

Portret użytkownika marekszy

Ściemniacz

Dzięki-

Portret użytkownika gosc

Witam Również zajmę się tym

Witam

Również zajmę się tym projektem w przeciągu tego miesiąca powinienem zacząć. Assembler Atmega8 kanałów będzie 6 lub standard 8 (nie wiem bo to tylko założenia wstępne) Cieszę się że istnieje ta strona wiele się nauczyłem i nigdy nie kopiowałem - dobra zrobiłem programator tak jak MIRLEY pokazał bo zaczynałem a programował mi kumpel atmega8 :)

Portret użytkownika marekszy

Ściemniacz

Ściemniacz ,a raczej sterownik oświetlenia od paru miesięcy działa bezawaryjnie, kod wymaga jeszcze trochę dopracowania ale wszystkie założenia się sprawdziły.Trochę przycina mi wyświetlacz (czasami trochę za długo myśli),ale ogólnie nie jest źle. Mam zapis dla 3 scen w których ustawiam oświetlenie z sześciu kanałów. Zmieniłem tylko zasilanie modułu wykonawczego, bez problemu układ ściemnia transformatory elektroniczne (te które mają taką opcję) i można wpiąć kilka szt. równolegle.