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 mirley

Re: Ściemniacz

Szczerze mówiąc to też chciałem zrealizować taki ściemniacz tylko że na pilota i bez jakichkolwiek wyświetlaczy.... nawet rozpocząłem wstępną analizę problemu ale na razie wstrzymałem realizację. Nie wiem czy uda mi się napisać program regulatora fazowego dla więcej niż jednego kanału w bascomie. Co do regulacji transformatora klasycznego to napewno nie lubia jak przebieg staje się niesinusoidalny. Co do trafa elektronicznego to trzeba by trochę poznać jego budowę. Jeśli to zwykła przetwornica z mostkiem prostowniczym na wejściu to powinno dać radę się podłączyć ale regulacja taka jest bez sensu bo przetwornica wewnątrz będzie chciała dostroić na wyjściu 12V do halogenów.

Co do elementów wykonawczych to wiadomo: triaki

-

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 marekszy

Ściemniacz

Poszukałem i trochę poczytałem, przerobiłem Twój schemat (PORT.D to wyjścia),i znalazłem schemat detekcji "0" oraz stopień wykonawczy.Możesz popatrzeć jak to pasuje i czy da się zgrać to wszystko programowo.Odnośnie przycisków to np.S1-menu, S2 to +, S3 to -, S4 i S5 jeszcze nie wiem,ale na pewno się przydadzą. Na LCD wyświetlanie nr.kanału ,a w drugiej lini pasek regulacji dla wyświetlonego kanału. Powiedz od czego zacząć,aby nie było znowu bałaganu

i ten chyba najlepszy

Portret użytkownika mirley

Re: Ściemniacz

Zacznij od obsługi przerwania zewnętrznego i policzenia zer w sieci. Powinieneś mieć wynik zawsze 100 na sekundę. Dopiero jak to zadziała to możesz próbować sterowania triakiem. Odnośnie sterowania i wykrywania 0 to najlepiej wygląda ostatni schemat.

W bascomie będzie to strasznie trudno napisać, tak aby dobrze działało. Szczególnie dla układu wielokanałowego

-

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 marekszy

Ściemniacz

Nic nie mogę z tym ruszyć,straciłem dużo czasu na szukaniu, coś tam jest o sterowaniu transformatorów elektronicznych, jednach wszystko powierzchownie opisane.Dla mnie nie musi być płynna regulacja,może być skokowa, ale nie wiem nadal jak zacząć i co mam powyliczać.możesz dać mi coś na początek abym to sprawdził i pokombinował z jednym kanałem, a później może już poleci.

Portret użytkownika mirley

Re: Regulacja mocy

-

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 marekszy

wielokanałowy ściemniacz

No i przyszedł czas aby spróbować to trochę ruszyć.Przejżałem link od ciebie i nie chodzi mi o przebudowę układów zasilających lecz o sterowanie gotowymi już transformatorami elektronicznymi.Poczytałem na elektrodzie i udaje się im regulować je za pomocą AVR-ów sterownikiem fazowym, niestety jest tam to opisywane niezbyt zrozumiale dla mnie.
Spróbuję pokombinować z regulacją 1 transf. i jak to się uda to założenia są takie:
1. 4 kanały regulowane niezależnie
2. 1 kanał on/off na przekaźniku
3. zapis 3 scen do trzech przycisków
4. zał/wyłączenie jednym przyciskiem
5. przyciskiem menu wybór który kanał do regulacji
6. przyciski +/-
No i dodatkowo wszystko na LCD.
Jak myślisz ,jest to do wykonania w BASCOM-ie.
Podobny projekt stestowałem na ATTINY 2313(czterokanałowy regulator oswietlenia AVT2749)i prawie nieźle to śmigało tylko niestety większość na pilota a mi chodzi o sterowanie przyciskami.

Portret użytkownika mirley

RE: Sciemniacz

Jak się da zrobić na pilota to tym bardziej na przyciski. Zacznij jednak od jednego kanału, apotem spróbujesz dodac pozostałe

-

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 marekszy

wielokanałowy ściemniacz

Witam,znalazłem coś do regulacji 1 kanału, trochę przerobiłem i potestowałem.
Wszystko ładnie śmiga nawet z transformatorami elektronicznymi, tylko niestety nie wiem jeszcze dlaczego przy transformat.elektr. przy ściemnieniu poniżej 50% przebija(uszkadza) mi triaki(może przepięcia) ,ale to pewnie da się jakoś załatwić.
Jak możesz zernąć na programik i pokierować dalej to będę wdzięczny.
przejście przez zero jest na INT1(PD3)reszta bez zmian.

'*******4_kanalowy regulator oswietlenia******
$regfile = "m8def.dat"
$crystal = 16000000
 
Config Portb = &B11111111 : PORTB = &B11111111
Config Portc = &B11111111 : PORTC = &B11111111
Config Portd = &B00000000 : PORTD = &B11111111
 
Config Lcdpin = Pin , Db4 = Portc.3 , Db5 = Portc.2 , Db6 = Portc.1 , Db7 = Portc.0 , E = Portc.4 , Rs = Portc.5
Config Lcd = 16 * 2
Cursor Off : Cls
 
Config Timer1 = Timer , Prescale = 8
Config Int1 = Rising                                        'rising wyzwala zbocze narastające
 
Stop Timer1
On Timer1 Irq_timer1
On Int1 Zero                                                'detekcja przejścia przez 0
Enable Timer1
Enable Int1
Enable Interrupts
 
 
Config Pinb.1 = Output
Bramka Alias Portb.1
'*********************************************************
 
Dim Moc As Word
Dim Table As Word
Dim Procent As Byte
 
 
 
Moc = 10                                                    'zacznij od 50% mocy
'**********************************************************
Lcd "4 kan.reg.fazowy"
Lowerline
Lcd "   wersja nr.1  "
Wait 2
Cls
'**********************************************************
 
Do
Waitms 100                                                  'opóźnienie dla przycisków
 
If Pind.0 = 0 Then                                          'przycisk +moc
 Incr Moc
 If Moc = 21 Then
 Moc = 20
 End If
End If
 
If Pind.1 = 0 Then                                          'przycisk -moc
 Decr Moc
 If Moc = -1 Then
 Moc = 0
 End If
End If
 
Locate 1 , 4 : Lcd "kanal nr.1"
Procent = Moc * 5                                           '20 kroków skok co 5%
Locate 2 , 5 : Lcd Procent ; "% mocy "
 
Loop
 
 
Irq_timer1:
 Bramka = 1
 Stop Timer1
Return
 
Zero:
 Bramka = 0
 Table = Lookup(moc , Tablica)
 Load Timer1 , Table
 
 Start Timer1
Return
 
Tablica:
Data 0%
Data 17129% , 15903% , 14936% , 14097% , 13333% , 12620% , 11940% , 11282% , 10638% , 10000%
Data 9362% , 8718% , 8060% , 7380% , 6667% , 5903% , 5064% , 4097% , 2871% , 100%

Portret użytkownika mirley

Re: regulator mocy

No włąśnie i tu myślę że jesteś w tym samym punkcie jakim byłem jakiś czas temu. Chodzi o to że wykorzystujesz timer1 do bezpośredniego odliczania czasu dla jednego z kanałów. Jak chcesz drugi kanał to powinieneś miec drugi timer itd., a procek tyle nie ma żeby zrobić 4 kanały.

Spróbuj zrobic tak:
1. Niech timer1 działa cały czas w kółko
2. W momencie wystąpienia 0 zapisz do zmiennej aktualną wartośc timera + wartość z tabelki z mocą. Jeśli będzie ponad 65536 to powinno się przekręcić i zacząć od zera.
3. W pętli Do loop bezpośrednio sprawdzaj ifem czy aktualna wartość timera nie jest równa tej zmiennej i jeśli jest to Bramka = 1

Nie wiem czy to zadziała ale jeśli tak to nie będzie potrzebne przerwanie od T1 i będzie można zrobić kilka takich zmiennych i kilka ifów w do loop.

W do loop nie ma prawa być wait'a ale o tym pewnie wiesz.

-

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 marekszy

regulator mocy

niestety nie jestem tak dobry w programowaniu,muszę poszukać w necie i podpatrzyć jak to powinno wyglądać.Pewnie trochę mi z tym zejdzie,ale dzięki.

Możesz mi napisać jak to powinno być ,a ja sprawdzę czy działa.

Portret użytkownika marekszy

regulator mocy

Mirley ,możesz jeszcze popatrzeć jak rozwiązane są 4 kanały + przekażnik w kicie AVT2749,z tym,że nie potrzebuję sterowania z pilota,a przyciskami,no i na atmege8. Podaje tam przejście przez "0" na PD6(attiny2313),jednak jego układ nie radzi sobie z transf.elektr.

'Listing 1
 
Inttim1:
Portd.0 = Onofflmgl.0                    'zświecenie/gaszenie lampy głównej
Timer1 = 64566                           'timer1 liczy 970 cykli zegara, czyli
                                         'przerwanie co około 97us
If Licznik >= 50 Then
$asm
sbic pind, 6                             'sprawdzaj stan końcówki PIND6, jeśli jest
'równa 1, to
$end Asm                  
Gosub Zero                               'skocz do podprogramu Zero
End If
Incr Licznik
If Onoffall = 255 Then                   'jeśli zezwolenie_globalne_na_włączanie_lamp = 1, to
If Licznik > Lmram(1) Then Reset Portd.5 '}
If Licznik > Lmram(2) Then Reset Portd.4 ' } zapalaj odpowiednio lampy do wartości
'tablicy Lmram
If Licznik > Lmram(3) Then Reset Portd.3 '}
If Licznik > Lmram(4) Then Reset Portd.1 '}
End If
Return
(......)
Zero:
Licznik = 1                              'przy każdym przechodzeniu napięcia sieci
                                         'przez zero zeruj licznik i
Portd = Portd Or &B1111110               'wygaś wszystkie 4 lampy
Incr Timefader
Return

Całość kodu i opis ze schematem mogę tobie podesłać jak byś chciał na to popatrzeć ,jest na at90s2313 ale po przeróbce na attiny2313 też działa.

Portret użytkownika marekszy

wielokanałowy ściemniacz

Po wielu testach jednak triaki nie nadają się do sterowania transformatorami elektronicznymi, regulacja powoduje ich częste przebicia.Rozebrałem sterownik DALI i mają to rozwiązane na 2 MosFet-ach .Znalazłem podobny schemat

Układ detekcji zera pozostawię na PC814(prosty i działa).
Możesz napisać jak wysterować to nza pomocą atmegi8 ,aby przetestować jak działa i czy idziemy w dobrą stronę,
link do opisu schematu
http://www.elektroda.pl/rtvforum/topic2080445.html#9888102
Jest jeszcze jeden schemat ale to ty sam oceń
http://www.elektroda.pl/rtvforum/topic1731781.html#8353502

Portret użytkownika marekszy

wielokanałowy ściemniacz

Mirley możesz napisać jak to prawidłowo rozpocząć na początek dla jednego kanału na tranzystorach Mosfet.
Trochę sie dowiedziałem jak to powinno wyglądać.
Detekcja "0" podana będzie na INT0, w przerwaniu po wykryciu "0" jest zerowany licznik i wpisanie do rejestru
porównawczego wartości z tabeli po której ma się wyłączyć stopień mocy.Wykożystać należy przerwanie pochodzące od układu
porównującego licznika OCRn, w momencie gdy wartośc licznika i wartość OCRn są równe wyzwalane zostaje przerwanie.
Są to rady kolegi z elektrody i jemu to działa z tym schematem wcześniej,jednak ilość kanałów przy tym rozwiązaniu
może być niewystarczająca (ilość kanałów porównawczych w atmedze8).
Tabela dla triaka pewnie będzie i tutaj odpowiednia,tyle,że będzie odwrotnie.

'*******4_kanalowy regulator oswietlenia******
$regfile = "m8def.dat"
$crystal = 16000000
 
Config Portb = &B11111111 : PORTB = &B11111111
Config Portc = &B11111111 : PORTC = &B11111111
Config Portd = &B00000000 : PORTD = &B11111111
 
Config Lcdpin = Pin , Db4 = Portc.3 , Db5 = Portc.2 , Db6 = Portc.1 , Db7 = Portc.0 , E = Portc.4 , Rs = Portc.5
Config Lcd = 16 * 2
Cursor Off : Cls
 
Config Timer1 = Timer , Prescale = 8
Config Int1 =  rising/falling                                       '??rising/falling

Stop Timer1
On Timer1 Irq_timer1
On Int1 Zero                                                'detekcja przejścia przez 0
Enable Timer1
Enable Int1
Enable Interrupts
 
 
Config Pinb.1 = Output
Bramka Alias Portb.1

Portret użytkownika mirley

Re: Sterowanie fazowe

Przede wszystkim to czy napewno jest sterowanie fazowe? Jak dokładnie chcesz aby działał taki układ z mosfetami? Chyba musimy od tego zacząć bo piszesz że po pewnym czasie od 0 sieci wyłączasz stopień mocy. Sterowanie fazowe w klasycznym ujęciu włącza triak po pewnym czasie od 0 sieci aż do następnego 0.

-

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 marekszy

wielokanałowy ściemniacz

Mirlej wkleję tobie zarys działania jaki podesłał mi kolega Postman5 :
"Generalnie podłączenie poszczególnych elementów wygląda tak:
- wyjście z układu detekcji zera fazy na wejście przerwaniowe uC
- wyjście uC steruje tranzystorem Q4 przedstawionym na rysunku na forum

Od strony programowej:
moc jaką dostarczymy do odbiornika wynika z tego jaki kawałek sinusoidy pojawi sie na wyjściu stopnia mocy, czyli na jak długo go "włączymy". Czas ten musi być mierzony od momentu przejścia przez zero - stąd podłączenie układu detekcji zera do wejścia przerwaniowego. W obsłudze przerwania musimy załączyć wyjście i zacząć odmierzać czas po którym musimy "wyłączyć" wyjście.
Najlepiej uzyć do tego timer'a. Po odmierzeniu czasu musimy "wyłączyć" wyjście i czekać na następne zero fazy. "Wyłączanie" również dobrze jest wykonać w przerwaniu tym razem od timer'a."
Działa to podobnie do regulacji fazowej z tym ,że nie załączmy przed "0" i triak w zerze wyłączy się sam, a tutaj odliczanie zaczyna się automatycznie po przejściu przez "0" ,a "my" wyłączamy po odliczeniu.
Niestey Postman5 pisze w "C", ale mogę się dopytać to co potzeba.
Zerknąłeś na te 2 linki wyżej?
Dokładam tobie jeszcze wykres

przy triaku załączamy w każdej połówce na czas "t" i wyłączamy w "0"
przy tranzystorach załączamy w "0" i wyłączamy po czsie "t"

Portret użytkownika mirley

Re: Regulacja mocy

Cały czas sprawa rozbija się o:

Quote:
Najlepiej uzyć do tego timer'a. Po odmierzeniu czasu musimy "wyłączyć" wyjście i czekać na następne zero fazy. "Wyłączanie" również dobrze jest wykonać w przerwaniu tym razem od timer'a."

Jeśli tak zrobisz to będziesz miał tyle kanałów ile timerów, bo jeden timer może odmierzać tylko jeden przedział czasu

-

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 gosc

wielokanałowy ściemniacz

A jak proponujesz to rozwiązać? Mamy jeszcze 3 wyjścia porównujące ,to 3 kanały .

Portret użytkownika marekszy

wielokanałowy ściemniacz

Czemu teraz bywasz na stronie tylko sporadycznie ,a na odpowiedź czekamy po tygodniu?zapomniałem się zalogować. A możesz napisać jak przerobić program z postu 8 aby załączał w "0" i wyłączał po czasie T ,muszę przetestować jeszcze czy ten układ z tranzystorami na pewno działa.
Ewentualnym rozwiązaniem sterowania kilkoma kanałami mogą być pojedyncze bloki wykonawcze na attiny2313 sterowane za pomocą 1 atmegi8,ale to bardziej skomplikowane.

Portret użytkownika mirley

Re: ściemniacz

Irq_timer1:
 Bramka = 0
 Stop Timer1
Return
 
Zero:
 Bramka = 1
 Table = Lookup(moc , Tablica)
 Load Timer1 , Table
 
 Start Timer1
Return

A nie wystarczy poprostu zamienić sygnałów tak jak zrobiłem wyżej? Teraz jak będzie 0 to na pinie bramka ustawi się 1 a po przerwaniu timera zostanie ustawione 0.

Na stronę zaglądam rzadziej bo po pracuje nad wieloma ciekawymi projektami, które udostępnie niebawem: Przedwzmacniacz stereo z regulacją tonów na wzmacniaczach operacyjnych, Wzmacniacz 200W na tranzystorach, Wzmacniacz 2x450W na tranzystorach, układy soft startu do trafa, zabezpieczenia głośników i wskaźnik wysterowania z prostownikiem liniowym i pomiarem średniej mocy. Poza tym niecałe 2 miesiące temu się ożeniłem więc dajcie spokój :)

-

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 marekszy

wielokanałowy ściemniacz

Witam.postanowiłem zrobić kilka pojedynczych regulatorów ,a później pomyślę jak je razem połączyć za pomocą np.ATMEGI8.
Regulator działa bez problemu w 99 krokach, jednak nie wiem jak zrobić wyświetlanie mocy na 2 wyświetlaczach LED, zostawiłem na segmenty PB.0 do PB.7 oraz anody PD.5 i PD.6.
Czy aby to zrobić muszę odpalić dodatkowo TIMER0? i tam w przerwaniu dołożyć wyświetlanie, czy też masz jakiś inny pomysł.
Odnośnie Waitms w pętli gł. przy takim rozwiązaniu nie mogę się go pozbyć.

'*******1_kanalowy regulator oswietlenia******
$regfile = "attiny2313.dat"
$crystal = 10000000
 
Config Portb = &B11111111 : Portb = &B11111111
Config Portd = &B01110000 : Portd = &B01101111
 
 
Config Timer1 = Timer , Prescale = 8
Config Int1 = Rising                                        'rising wyzwala zbocze narastające
 
Stop Timer1
On Timer1 Irq_timer1
On Int1 Zero                                                'detekcja przejścia przez 0
Enable Timer1
Enable Int1
Enable Interrupts
 
 
Config Pind.4 = Output
Bramka Alias Portd.4
'*********************************************************
 
Dim Moc As Word
Dim Table As Word
Dim Wysw_moc As Byte
 
 
 
Readeeprom Moc , 2                                          'odczyt z pamieci eeprom
If Moc > 99 Then
Moc = 50                                                     'zacznij od 50% mocy
'**********************************************************
 
 
Do
Waitms 100                                                  'opóźnienie dla przycisków
 
If Pind.0 = 0 Then                                          'przycisk +moc
 Incr Moc
 If Moc = 100 Then
 Moc = 99
 End If
End If
 
If Pind.1 = 0 Then                                          'przycisk -moc
 Decr Moc
 If Moc = -1 Then
 Moc = 0
 End If
End If
 
If Pind.2 = 0 Then                                          'SW zapis do eeprom
 Writeeeprom Moc , 2
End If
End If
 
Wysw_moc = Moc * 1
 
Loop
End
 
Irq_timer1:
 Bramka = 0
 Stop Timer1
Return
 
Zero:
 Bramka = 1
 Table = Lookup(moc , Tablica_pwm)
 Load Timer1 , Table
 
 Start Timer1
Return
 
 
Tablica_pwm:
Data 801% , 1135% , 1392% , 1611% , 1804% , 1979% , 2142% , 2294% , 2437% , 2574%
Data 2704% , 2830% , 2951% , 3068% , 3182% , 3292% , 3400% , 3505% , 3609% , 3710%
Data 3809% , 3906% , 4002% , 4097% , 4190% , 4282% , 4373% , 4462% , 4551% , 4639%
Data 4726% , 4812% , 4898% , 4983% , 5067% , 5151% , 5234% , 5317% , 5400% , 5482%
Data 5563% , 5645% , 5726% , 5807% , 5888% , 5968% , 6049% , 6129% , 6210% , 6290%
Data 6371% , 6451% , 6532% , 6612% , 6693% , 6774% , 6855% , 6937% , 7018% , 7100%
Data 7183% , 7266% , 7349% , 7433% , 7517% , 7601% , 7688% , 7774% , 7861% , 7949%
Data 8038% , 8127% , 8218% , 8310% , 8403% , 8498% , 8594% , 8691% , 8790% , 8891%
Data 8995% , 9100% , 9208% , 9318% , 9432% , 9549% , 9670% , 9796% , 9926% , 10063%
Data 10206% , 10358% , 10521% , 10696% , 10889% , 11108% , 11365% , 11699%

Portret użytkownika mirley

Re; ściemniacz

Dodaj obsługę do timera 0 co 4ms i tam multipleksuj wyświetlacz LED

-

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 marekszy

ściemniacz

mam to zrobione tylko ze względu na opóźnienie wait w pętli gł. bardzo mrugają.jak zrobić aby wywalić obsługę przycisków z pętli i dołożyć obsługę na zasadzie "jedno naciśnięcie sw1 rozjaśnia,ponowne ściemnia", natomiast sw2 funkcję on/off.

$regfile = "attiny2313.dat"
$crystal = 10000000
 
Config Portb = &B11111111 : Portb = &B11111111
Config Portd = &B01110000 : Portd = &B01101111
 
Config Timer0 = Timer , Prescale = 256
Enable Timer0 : On Timer0 Prztimer0
 
Config Timer1 = Timer , Prescale = 8
Config Int1 = Rising                                        'rising wyzwala zbocze narastające PD.3
 
Stop Timer1
On Timer1 Irq_timer1
On Int1 Zero                                                'detekcja przejścia przez 0
Enable Timer1
Enable Int1
Enable Interrupts
 
 
Config Pind.4 = Output
Bramka Alias Portd.4
'*********************************************************
 
Dim Moc As Word
Dim Table As Word
Dim Dzielnik(2) As Byte                                     'dzielniki timera
Dim Flaga_4ms As Bit , Flaga_100ms As Bit , Flaga_1s As Bit 'flagi
Dim Mux As Bit
Dim Wysw As Byte , Wysw1 As Byte , Wysw10 As Byte
 
Readeeprom Moc , 2                                          'odczyt z pamieci eeprom
If Moc > 50 Then
Moc = 20                                                    'zacznij od 20% mocy
'**********************************************************
 
'**********************************************************
 
Do
 
 If Flaga_4ms = 1 Then
    Flaga_4ms = 0
    Wysw = Moc
    Gosub Wyswietlanie
 
 End If
 
Waitms 100
                                                  'opóźnienie dla przycisków
 
If Pind.0 = 0 Then                                          'SW +moc
 Incr Moc
 If Moc = 100 Then
 Moc = 99
 End If
End If
 
If Pind.1 = 0 Then                                          'SW -moc
 Decr Moc
 If Moc = -1 Then
 Moc = 0
 End If
End If
 
 
If Pind.2 = 0 Then                                          'SW zapis do eeprom
 Writeeeprom Moc , 2
End If
End If
 
Loop
End
'***********************************************8
'************ Przerwanie timer 0 ***************
'***********************************************
Prztimer0:
  Timer0 = 100
  Set Flaga_4ms
  Incr Dzielnik(1)
  If Dzielnik(1) = 25 Then
    Dzielnik(1) = 0
    Set Flaga_100ms
    Incr Dzielnik(2)
    If Dzielnik(2) = 10 Then
      Dzielnik(2) = 0
      Set Flaga_1s
 
 
    End If
  End If
 
Return
'******** Przerwanie timer 0 Koniec ************
Wyswietlanie:
 
  Mux = Not Mux
  If Mux = 1 Then
    Set Portd.5
    Wysw10 = Wysw / 10
    Wysw10 = Lookup(wysw10 , Tabela)
    Portb = Wysw10
    Reset Portd.6
  Else
    Set Portd.6
    Wysw1 = Wysw Mod 10
    Wysw1 = Lookup(wysw1 , Tabela)
    Portb = Wysw1
    Reset Portd.5
  End If
Return
 
 
 
Irq_timer1:
 Bramka = 0
 Stop Timer1
Return
 
Zero:
 Bramka = 1
 Table = Lookup(moc , Tablica1)
Load Timer1 , Table
 
Start Timer1
Return
 
 
Tablica1:
Data 801% , 1135% , 1392% , 1611% , 1804% , 1979% , 2142% , 2294% , 2437% , 2574%
Data 2704% , 2830% , 2951% , 3068% , 3182% , 3292% , 3400% , 3505% , 3609% , 3710%
Data 3809% , 3906% , 4002% , 4097% , 4190% , 4282% , 4373% , 4462% , 4551% , 4639%
Data 4726% , 4812% , 4898% , 4983% , 5067% , 5151% , 5234% , 5317% , 5400% , 5482%
Data 5563% , 5645% , 5726% , 5807% , 5888% , 5968% , 6049% , 6129% , 6210% , 6290%
Data 6371% , 6451% , 6532% , 6612% , 6693% , 6774% , 6855% , 6937% , 7018% , 7100%
Data 7183% , 7266% , 7349% , 7433% , 7517% , 7601% , 7688% , 7774% , 7861% , 7949%
Data 8038% , 8127% , 8218% , 8310% , 8403% , 8498% , 8594% , 8691% , 8790% , 8891%
Data 8995% , 9100% , 9208% , 9318% , 9432% , 9549% , 9670% , 9796% , 9926% , 10063%
Data 10206% , 10358% , 10521% , 10696% , 10889% , 11108% , 11365% , 11699%
 
Tabela:
    Data 40 , 235 , 50 , 162 , 225 , 164 , 36 , 234 , 32 , 160
  'znak:  0     1        2      3       4       5       6     7      8     9

Udało mi się wywalić 'Waitms" z pętli gł., a wstawiłem tam flagę 100ms i działa wszystko prawidłowo.Pozostaje tylko problrm jak zrobić +moc/-moc na sw1 oraz on/off na sw2

Portret użytkownika mirley

Re: Przyciski

Zauważyłem coś w przyciskach.... nie będzie ci działał poprawnie warunek dla zmniejszania mocy bo zmiennna Moc nie przyjmuje nigdy wartości -1. Przynajmniej nie powinien działać bo jak masz moc = 0 i odejmiesz 1 to wartość Moc = 65535. Dla pewności lepiej daj najpierw sprawdzanie ifa czy moc > 0 a jeśli tak to dopiero zmniejsz wartośc o 1. To samo dla zwiększania

Co do on/off to ja bym to zrobił tak że jeśli moc> 0 to moc = 0 else moc = 99, ewentualnie jak jest poniżej połowy to idzie do max a jak powyżej to do min

-

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 marekszy

Przyciski

Masz rację odnośnie tego ,że przy moc=0 wskoczy wartość moc=65535 ,ale wywaliłem 0 z tabeli i nie ma problemu, to poprawię.Chodzi mi jednak o to aby obsłużyć +/- moc jednym przyciskiem,tzn.naciskam to rośnie ,puszczm i ponownie naciskam to maleje, pusczam i naciskam-znowu rośnie.
Jeszcze odnośnie on/off czy nie lepiej użyć stop Timer1/start Timer1 (tak sobie myślę),wówczas zadana moc z tabeli pozostanie bez zmian.

Portret użytkownika mirley

Re: Przycisk

Aha nie zrozumiałem na początku..... ja by zrobił zmianną flagę która za każdym puszczeniem przycisku będzie się zmianiac na przeciwną. A raczej chyba trzeba będzie dac dwie flagi bo jedna musi się ustawiać jak przycisk jest niewciśnięty a po kliknięciu przycisku i ewentualnym trzymaniu druga flaga musi się zmienić tylko raz więc będzie:

If Pind.0 = 0 Then  
  if flaga1 = 1 then
   flaga1 = 0
    toggle flaga2
  end if
 
  'obsługa przycisku z sprawdzeniem czy flaga 2 jest 1 czy 0 i w zależności od tego kierunek zmiany mocy.
Else
  Flaga1 = 1
End if

-

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 marekszy

Re; ściemniacz

Witam ponownie.Możesz mi powiedzieć czy jest możliwe rozwiązanie sterowania kilku kanałów na zasadzie wystawiania przerwań od TIMER1,to znaczy:
ustawiamy TIMER1 aby startował w trakcie przejścia przez "0"i zliczał w/g tablicy1 wartość maksymalną 65535 (zakładając ,że jest to cały okres od "0" do "0")i po zliczeniu się zeruje.
zadajemy dla TIMERA1 np.kilka wartości(dla kanału 1,2,3..) aby wystawił dla nich przerwania (flaga1,flaga2,flaga3...)
w momencie przejścia przez "0"startuje TIMER1 oraz załączane są wyjścia out1,out2,out3...i w momencie wystawienia flagi1 wyłączy out1, flagi2 wyłączy out2,flagi3-out3...i tak w kółko, "0" załącza wszystko, flagi wyłączają poszczególne wyjścia.

no i oczywiście jeszcze możliwość zmiany tych wartości z przycisków.
Jak by było to możliwe to do tego tylko LCD i spawa byłaby załatwiona.

Portret użytkownika mirley

Re: Timer

Pomysł wydaje się dobry i według mnie teoretycznie zadziała.... trzeba to sprawdzić w praktyce bo w programie pojawią się opóźnienia, które moga zdyskwalifikować tą ideę

-

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 marekszy

Re: Timer

podpowiesz jak ustawić TIMER1 aby zliczał do 65535 i się zerował, a następnie startował od wyzwolenia z INT1 w momencie przejścia przez "0" i tak w koło ?,oraz wystawić flagi. Będę miał teraz trochę wolnego czasu to bym to poćwiczył, jak to ruszy z nastawami na stałę to będzie można pomyśleć co dalej.
I jeszcze ciekawe czy np.przy tych samych wartościach dla kanału1 i kanału2 wystawi się flaga1 i flaga2
Do tego chcę przejść z tym na ATMEGA8,portB jako wyjścia, a na porcie D przyciski

'**************sciemniacz 6 kanalowy*****************
$regfile = "m8def.dat"
$crystal = 16000000
 
Config Portb = &B11111111 : Portb = &B11111111
Config Portc = &B11111111 : Portc = &B11111111
Config Portd = &B11000000 : Portd = &B11111111
 
Config Lcdpin = Pin , Db4 = Portc.3 , Db5 = Portc.2 , Db6 = Portc.1 , Db7 = Portc.0 , E = Portc.4 , Rs = Portc.5
Config Lcd = 16 * 2
Cls
Cursor Off Noblink
 
Config Timer0 = Timer , Prescale = 256
Enable Timer0 : On Timer0 Prztimer0
 
Config Timer1 = Timer , Prescale = 8
Config Int1 = Rising                                        'rising wyzwala zbocze narastające PD.3
 
On Int1 Zero                                                'detekcja przejścia przez 0
Enable Timer1
Enable Int1
Enable Interrupts
 
  '* * * * * * * * * * Konfiguracja Uc Koniec * * * * * * * * * * * * * * * *
  '* * * * * * * * * * * * * * * * Zmienne * * * * * * * * * * * * * * * * * *
Dim Flaga_4ms As Bit
Dim Flaga_100ms As Bit , Dzielnik As Byte
Dim Sw As Byte , Stan_sw As Byte , Licznik_sw As Byte
 
'* * * * * * * * * * * * * *zmienne koniec * * * * * * * * * * * * * * * * * *
'***************************warunki poczatkowe********************************
 
 
'************************warunki poczatkowe koniec****************************
 Lcd " SCIEMNIACZ X 6"
 Lowerline
 Lcd "  wer.testowa 1"
 Wait 2
 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 timer 0*****************
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
 
 
'******************tabela*********************
Tablica1:
Data 801% , 1135% , 1392% , 1611% , 1804% , 1979% , 2142% , 2294% , 2437% , 2574%
Data 2704% , 2830% , 2951% , 3068% , 3182% , 3292% , 3400% , 3505% , 3609% , 3710%
Data 3809% , 3906% , 4002% , 4097% , 4190% , 4282% , 4373% , 4462% , 4551% , 4639%
Data 4726% , 4812% , 4898% , 4983% , 5067% , 5151% , 5234% , 5317% , 5400% , 5482%
Data 5563% , 5645% , 5726% , 5807% , 5888% , 5968% , 6049% , 6129% , 6210% , 6290%
Data 6371% , 6451% , 6532% , 6612% , 6693% , 6774% , 6855% , 6937% , 7018% , 7100%
Data 7183% , 7266% , 7349% , 7433% , 7517% , 7601% , 7688% , 7774% , 7861% , 7949%
Data 8038% , 8127% , 8218% , 8310% , 8403% , 8498% , 8594% , 8691% , 8790% , 8891%
Data 8995% , 9100% , 9208% , 9318% , 9432% , 9549% , 9670% , 9796% , 9926% , 10063%
Data 10206% , 10358% , 10521% , 10696% , 10889% , 11108% , 11365% , 11699%

to tak ,żeby od czegoś zacząć

Portret użytkownika mirley

Timery

Timer konfigurujesz jak kazdy inny

Config Timer1 = Timer , Prescale = 256
Enable Timer1 : On Timer1 Prztimer1

jesli chcesz żeby się zatrzymywał po odliczeniu jednego cyklu to trzeba w jego przerwaniu dac stop timer1
jesli ma startowac od w int1 trzeba dac poprostu start timer1.

Jeszcze w przerwaniu dał bym od razu ustawianie wartości początkowej żeby w int zrobić tylko start timer1

Trzeba się tez zastanowić tak jak mówiłem czy w ogóle zatrzymywac timer a nie tylko zapisywac jego wartości licznika od jakiej się startuje w chwili 0 i przy jakiej ma się dany kanał wyłaczyć lub włączyć.

-

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 marekszy

ściemniacz

Dzięki, możesz napisać jak to ma wyglądać w/g twojej koncepcji
Na portb mam 6 wyjść, natomiast na portd dołożymy przyciski

'************************sciemniacz 6 kanalowy**********************
$regfile = "m8def.dat"
$crystal = 16000000
 
Config Portb = &B11111111 : Portb = &B11111111
Config Portc = &B11111111 : Portc = &B11111111
Config Portd = &B11000000 : Portd = &B11111111
 
Config Lcdpin = Pin , Db4 = Portc.3 , Db5 = Portc.2 , Db6 = Portc.1 , Db7 = Portc.0 , E = Portc.4 , Rs = Portc.5
Config Lcd = 16 * 2
Cls
Cursor Off Noblink
 
Config Timer0 = Timer , Prescale = 256
Enable Timer0 : On Timer0 Prztimer0
 
Config Timer1 = Timer , Prescale = 256
Enable Timer1 : On Timer1 Prztimer1
 
Config Int1 = Rising                                        'rising wyzwala zbocze narastające PD.3
 
On Int1 Zero                                                'detekcja przejścia przez 0
 
Enable Int1
Enable Interrupts
 
  '* * * * * * * * * * 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
 
'* * * * * * * * * * * * * *zmienne koniec * * * * * * * * * * * * * * * * * *
'***************************warunki poczatkowe********************************
 
 
'************************warunki poczatkowe koniec****************************
 Lcd " SCIEMNIACZ X 6"
 Lowerline
 Lcd "  wer.testowa 1"
 Wait 2
 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
 
'******przerwanie timer1**********************
Przetimer1:
timer1=

jak napisać całe przerwanie do timer1 tak aby później była możliwość zmiany wartości dla poszczególnych kanałów za pomocą przycisków

Portret użytkownika marekszy

ściemniacz

Nie wiem czy tak można to zrobić -timer1 jest ustawiony na prescale1, przerwanie jest generowane co 100us, w ten sposób mam możliwość ustawienia 100 poziomów, bo pół okresu sinusoidy trwa 10ms, wiec 10ms / 100 = 100us.
Teraz zwiększając i zmniejszając wartości dzielników w teori mogę regulować kiedy mają się wyłączać kanały


'******przerwanie timer1**********************                       
Przetimer1:
timer1=63936                                                         
Flaga_100us = 1                                         '100us=63936 dla 100 kroków     prescale=1
  IF dzielnik3 = 25 Then                                '500us=57536 dla 50 kroków      prescale=1
     dzielnik3 = 0
     Flaga_out1 = 1
  If dzielnik4 = 35 Then
     Dzielnik4 = 0
     Flaga_out2 = 1 
  If dzielnik5 = 40 Then
     dzielnik5 = 0
     Flaga_out3 = 1
  If dzielnik6 = 60 Then
     dzielnik6 = 0
     Flaga_out4 = 1  
 
 ' i tak do out6   

Jak to by zadziałało to jak zrobić aby startował za każdym przejściem przez "0"
Co o tym myślisz, kanały załączają się także po przejściu przez "0" a wyłączają od flag out1/2/3...
Mirley jak będziesz miał chwilę możesz na to popatrzeć?

Portret użytkownika mirley

Re: Ściemniacz

Trochę mam za duzo na głowie..... Ustawiłeś prescale = 1 co znaczy że przerwanie występuje bardzo często. W przerwaniu należy zminimalizować ilość instrukcji.....Wywalił bym napewno tutaj te flagi i bezpośrednio resetował piny portów. W timerze daj liczniki liczące w dół albo jeden licznik..... Timer liczy za każdym przerwaniem incr licznik, w obsłudze zera włączasz wszystko, zerujesz licznik i ustawiasz timer1 = 63936.

W obsłudze timera sprawdzasz:

If licznik > moc_kanal1 then wyłącz port

nie ruszasz zmiennej licznik, ważne jest żeby się ona nie przepełniła czyli musisz zmieścić 100 przerwań w jednym cyklu sinusa Spróbuj coś takiego, ale osobiście zrobił bym 10 kroków co 1ms a nie co 100us.

-

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 marekszy

Ściemniacz

Mirley,witam po długiejprzerwie, próbowałem coś wymyślić jednak bez Twojej pomocy to się nie da zrobić.
Możesz mi podpowiedzieć jak ustawić w/g ciebie TIMER1 żeby liczył tak jak to ty założyłeś i jak to dalej pociągnąć?

                 '************************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 = 256
Enable Timer1 : On Timer1 Prztimer1
 
Config Int1 = Rising                                        'rising wyzwala zbocze narastające PD.3
 
On Int1 Zero                                                'detekcja przejścia przez 0
 
Enable Int1
Enable Interrupts
 
Config Pinb.0 = Output
Config Pinb.1 = Output
Config Pinb.2 = Output
Config Pinb.3 = Output
Config Pinb.4 = Output
Config Pinb.5 = Output
 
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 Moc_out_1 As Word
Dim Moc_out_2 As Word
Dim Moc_out_3 As Word
Dim Moc_out_4 As Word
Dim Moc_out_5 As Word
Dim Moc_out_6 As Word
 
 
'* * * * * * * * * * * * * *zmienne koniec * * * * * * * * * * * * * * * * * *
'***************************warunki poczatkowe********************************
 
 
'************************warunki poczatkowe koniec****************************
 Lcd " SCIEMNIACZ X 6"
 Lowerline
 Lcd "  wer.testowa 1"
 Wait 2
 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
 
'******przerwanie timer1**********************
Przetimer1:
Timer1 = 63936
 
 If Licznik > Moc_out_1 Then Out_1 = 0
  If Licznik > Moc_out_2 Then Out_2 = 0
   If Licznik > Moc_out_3 Then Out_3 = 0
    If Licznik > Moc_out_4 Then Out_4 = 0
     If Licznik > Moc_out_5 Then Out_5 = 0
      If Licznik > Moc_out_6 Then Out_6 = 0
 
 
Stop Timer1
Return
 
'***********************************************
Zero:
Out_1 = 1
Out_2 = 1
Out_3 = 1
Out_4 = 1
Out_5 = 1
Out_6 = 1
Start Timer1
Return                

Jest jeszcze do napisania kawał programu, a ja stoję w miejscu
i dlaczego pokazuje tutaj błędy 242,7,350,123
If Licznik > Moc_out_1 Then Out_1 = 0
  If Licznik > Moc_out_2 Then Out_2 = 0
   If Licznik > Moc_out_3 Then Out_3 = 0
    If Licznik > Moc_out_4 Then Out_4 = 0
     If Licznik > Moc_out_5 Then Out_5 = 0
      If Licznik > Moc_out_6 Then Out_6 = 0

Portret użytkownika matrix

Re: Ściemniacz

Już Ci mówię gdzie masz błędy:

Nie zadeklarowałeś na początku zmiennej licznik jako word

Różnica między tym:

Enable Timer1 : On Timer1 Prztimer1

a docelową etykietą czyli tym:

'******przerwanie timer1**********************
Przetimer1:
Timer1 = 63936

różnica jest w słowie Prztimer. Przy ustawieniu skoku każesz skakać do Prztimer a etykietę nazywasz Przetimer.

Na końcu tego:

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

Na końcu brak 2x end if a także brak return.
Jak będziesz miał jeszcze kłopoty to wal śmiało.

Portret użytkownika marekszy

Ściemniacz

dzięki ,faktycznie popełniłem literówkę ,jednak dalej mam te same komunikaty o błędach. Po dodaniu 2xEnd If i return do przerwania timer0 zszedł błąd 123.
Dodałem zmienną

Dim Licznik As Word

i jest ok,program się kompiluje, tylko czy idę w dobrym kierunku, w jaki sposób zmieniać moc_out_1,moc_out_2.....
Przyciski ustawiłem PD7-moc(+), PD6-moc(-),PD5-zapis, PD4-ON/OFF, PD2-menu

Portret użytkownika matrix

Re: Ściemniacz

W ogóle zacząć trzeba od tego że masz źle napisaną obsługę regulacji jasności od 0 do 100%.
W myśl Mirkowego programowego PWM'a, czyli:

Prztimer0:
 Incr Licznik
 If Licznik = 100 Then Licznik = 0
 
 If Licznik < Rled Then Set Rd Else Reset Rd
Return

Powinieneś mieć tak:

Przetimer1:
incr licznik
if licznik = 100 then licznik = 0
 
 If Licznik < Moc_out_1 Then set Out_1 else reset out_1
  If Licznik < Moc_out_2 Then set Out_2 else reset out_2
   If Licznik < Moc_out_3 Then set Out_3 else reset out_3
    If Licznik < Moc_out_4 Then set Out_4 else reset out_4
     If Licznik < Moc_out_5 Then set Out_5 else reset out_5
      If Licznik < Moc_out_6 Then set Out_6 else reset out_6
 
Return

Teraz regulując wartości zmiennych Moc_out_1 ... Moc_out_6 w zakresie 0 do 100 będziesz miał a przynajmniej powinieneś mieć regulację jasności jak się patrzy.

A pomijając wszystko to wcale nie musisz deklarować zmiennych licznik i Moc_out_1...6 jako word. Spokojnie powinny działać jako byte, ale wszystkie.

Portret użytkownika marekszy

Ściemniacz

Masz rację, poprawiłem i nie wykazuje tutaj błędów, jednak czemu wywaliłeś

Timer1 = 63936 
Stop Timer1

timer1 ma zliczać do 63396 i się zastopować (zerować) następnie po wyzwoleniu INT 1 ponownie wystartować (tak w koło)
Czy regulację mocy mam zrobić w/g tablicy
Tablica1:
Data 801% , 1135% , 1392% , 1611% , 1804% , 1979% , 2142% , 2294% , 2437% , 2574%
Data 2704% , 2830% , 2951% , 3068% , 3182% , 3292% , 3400% , 3505% , 3609% , 3710%
Data 3809% , 3906% , 4002% , 4097% , 4190% , 4282% , 4373% , 4462% , 4551% , 4639%
Data 4726% , 4812% , 4898% , 4983% , 5067% , 5151% , 5234% , 5317% , 5400% , 5482%
Data 5563% , 5645% , 5726% , 5807% , 5888% , 5968% , 6049% , 6129% , 6210% , 6290%
Data 6371% , 6451% , 6532% , 6612% , 6693% , 6774% , 6855% , 6937% , 7018% , 7100%
Data 7183% , 7266% , 7349% , 7433% , 7517% , 7601% , 7688% , 7774% , 7861% , 7949%
Data 8038% , 8127% , 8218% , 8310% , 8403% , 8498% , 8594% , 8691% , 8790% , 8891%
Data 8995% , 9100% , 9208% , 9318% , 9432% , 9549% , 9670% , 9796% , 9926% , 10063%
Data 10206% , 10358% , 10521% , 10696% , 10889% , 11108% , 11365% , 11699%

czy też masz inny pomysł.

Portret użytkownika matrix

Re: Ściemniacz

marekszy wrote:
jednak czemu wywaliłeś

Timer1 = 63936
Stop Timer1

timer1 ma zliczać do 63396 i się zastopować (zerować) następnie po wyzwoleniu INT 1 ponownie wystartować (tak w koło)

Ponieważ pisałem co masz nie tak i co powinieneś poprawić. Nie zwracałem uwagi na timer. Jesli chcesz to możesz go tam wpisać z tym że ja wpisałbym go inaczej, mianowicie tak:

Przetimer1:
stop timer1
Timer1 = 63936
 
incr licznik
if licznik = 100 then licznik = 0
 
 If Licznik < Moc_out_1 Then set Out_1 else reset out_1
  If Licznik < Moc_out_2 Then set Out_2 else reset out_2
   If Licznik < Moc_out_3 Then set Out_3 else reset out_3
    If Licznik < Moc_out_4 Then set Out_4 else reset out_4
     If Licznik < Moc_out_5 Then set Out_5 else reset out_5
      If Licznik < Moc_out_6 Then set Out_6 else reset out_6
 
start timer1 
Return

Ogólnie to nie bardzo rozumiem Twój tok myślenia. po co Ci do tego tablica?
Jeśli powiedzmy do zmiennej Moc_out_1 wpiszesz wartość 50 to wyjście out_1 będzie świecić z połową mocy.
Wpisując różne wartości z przedziału 0 do 100 uzyskasz różne jasności świecenia z tym że zdaje się że to działa odwrotnie. Im mniejsza liczba tym jaśniej świeci. Tak mi się coś kojarzy jak to robiłem.

Portret użytkownika marekszy

Ściemniacz

Dzieki,postaram się dopisać obsługę przycisków i zobaczę co z tego wyjdzie.
Również masz rację ,że działa to odwrotnie ponieważ zamiast załączać wejście ma je wyłączyć po określonym czasie.
Moja logika działania ściemniacza : wejście INT1 wykrywa przejście przez zero,przy przejściu przez "0" w fazie następuje załączenie wszystkich wjść oraz startuje TIMER1, po osiągnięciu casu zadanego dla moc_out_1,moc_out_2....następuje wyłączenie poszczególnych wyjść out_1,out_2....
Tablica1 jest potrzebna do załadowania odpowiednich czasów w 100 krokach do moc_out_1....
Po zliczeniu przez TIMER1 do końca następuje jego zatrzymanie, i po przejściu przez "0" wszystko się powtarza.
Możesz to przeanalizować i napisać czy ta obsługa TIMER1 co podałeś załatwi to tak samo?Mam wrażenie ,że to typowy PWM i tak łatwo nie pójdzie.
Dzięki za pomoc, na pewno to jeszcze nie koniec.

Portret użytkownika matrix

Re: Ściemniacz

Powinieneś obrać jakieś konkretne założenia.

marekszy wrote:
Po zliczeniu przez TIMER1 do końca następuje jego zatrzymanie, i po przejściu przez "0" wszystko się powtarza.

Ale to nie będzie pracować jak trzeba, albo ja nie rozumiem koncepcji. Rozumiem że chcesz by załączanie triaków następowało z zerze sieci?

Wykrywanie przejścia przez zero możesz zrobić na zasadzie programowo-software'owej.
Na dole -> tej strony <- pobierz sobie schemat w eagle w wersji 6 coś tam. Tam jest układ wzmacniacza operacyjnego LM311 w roli "wykrywacza" przejścia przez zero. Info bierze z transformatora zasilającego. Do tego wystarczy odpowiednio i w odpowiednim miejscu użyć polecenia:

bitwait

i będziesz miał wykrywanie przejścia przez 0. Według mnie całość jest prostsza niż kombinujesz.

Możecie przedstawić mi jeszcze raz koncepcję? Mimo że przeczytałem temat od początku to nie bardzo wiem o co w tym wszystkim biega? Czym to ma sterować? Żarówkami czy czym? Jaka jest w ogóle koncepcja? Wyjasnijcie jeszcze raz bo mam pewien pomysł który wykorzysta tylko jeden timer dla dowolnej liczby kanałów.

Jaki jest czas trwania połówki sinusoidy od 0 do następnego 0?

Jeśli dobrze zrozumiałem to moja koncepcja jest taka:

Na osi widać zmienną która zwiększana jest przez timer od chwili wykrycia zera fazy. Wyglądało by to tak:

CONFIG TIMER0 = TIMER , PRESCALE = 1 'nie podoba mi się ten prescaler = 1
 
enable interrupts
enable timer0
on timer0 przerwanie
stop timer0
 
 
do
loop
end
 
zero_fazy:             'wykrywamy przejście przez 0
  reset wyjscie        'włączamy wyjście
   timer0 = 176        'ładujemy taką liczbę by w trakcie trwania półokresu
   start timer         'timer zliczył zmienną dokładnie do 100
return
 
przerwanie:
  incr zmienna              'zwiększamy zmienną
    if zmienna = 100 then   'jeśli osiągnie 100% to
       zmienna = 0          'zerujemy ją
       stop timer0          'stopujemy timer
    end if
      if zmienna >= moc then 'sprawdzamy czy już wyłączyć wyjście
         set wyjscie
      end if
    timer0 = 176        'ładujemy taką liczbę by w trakcie trwania półokresu
                        'timer zliczył zmienną dokładnie do 100
return

Rysunek powinien pomóc w zrozumieniu programu.
Trzeba by to przetestować, bo to czysta teoria.

Portret użytkownika marekszy

Ściemniacz

to nie zupełnie tak jak myślisz , później wrzucę schematy i opiszę j zasadę działania całości.To co wstawiłeś odnosi się do sterowania triakiem, sterowanie tranzystorami mosfet odbywa się trochę inaczej. Czemu mosfet a nie triaki- za pomocą tranzystorów mosfet można śmiało regulować transformatory elektroniczne.
Cieszy mnie Twoje zainteresowanie tym tematem.

Portret użytkownika marekszy

Ściemniacz

Regulację z opóźnionym odcięciem fazy opisałem w miarę przystępnie w poście 15.
Przy częstotliwości sieci 50Hz (taką mamy w Polsce) następuje 100 przejść przez '0' w ciągu 1sek. ,a co za tym idzie mamy także 100 połówek sinusoidy i właśnie te połówki tniemy.
Przypominam ,że sterowanie fazowe triakiem polega na włączeniu triaka po czsie X od przejścia przez "0" i samoczynnie się on wyłączy przy następnym przejściu.Im krótszy będzie czas załączenia triaka tym moc będzie mniejsza.

sterowanie z opóźnionym odcięciem fazy (to właśnie staramy się zrobić)polega na załączeniu tranzystorów w momencie przejścia przez "0" i wyłączenie ich po czsie X.działa to odwrotnie jak przy sterowaniu fazowym.

Detekcję przejścia przez "0" mam zrobioną na PC814 i podaję na INT1, działa bez problemu.

Schemat sterownika:

Schemat jednego modułu wykonawczego:

Jak będziesz potrzebował coś wyjaśnić to nie ma problemu.

Na wszystkich wyjściach OUT atmegi w momencie przejścia przez "0" ma się pojawić 1 ,a po czasie X wyznaczonym dla każdego z wyjść mają się wyłączać (i tak za każdym przejściem przez "0")

W poście 22 jest działający program dla jednego kanału, z tym ,że tam TIMER1 ma za każdym razem ładowaną odpowiednią wartość którą odlicza (przy takiej zasadzie może sterować tylko 1 kanałem).

Pozdrawiam

Portret użytkownika matrix

Re: Ściemniacz

No tak tylko że ja w dalszym ciągu nie widzę kłopotu i to nawet lepiej pasuje do tego co napisałem.
Poniżej przystosowane do Twoich założeń.

CONFIG TIMER0 = TIMER , PRESCALE = 1 'nie podoba mi się ten prescaler = 1
 
enable interrupts
enable timer0
on timer0 przerwanie
stop timer0
on int1 zero_fazy
 
 
do
loop
end
 
zero_fazy:             'wykryte przejście przez 0
   set wyjscie         'tu włączamy wyjście
   timer0 = 176        'wpisujemy taką wartość by wywołać przerwanie 100x na jedną połówkę sinusoidy
   start timer0
return
 
przerwanie:
  incr zmienna              'zwiększamy zmienną
    if zmienna = 100 then   'jeśli osiągnie 100% to
       zmienna = 0          'zerujemy ją
       stop timer0          'stopujemy timer
    end if
      if zmienna >= moc then 'sprawdzamy czy już wyłączyć wyjście
         reset wyjscie
      end if
return

Dzięki temu co napisałem wyżej wyjście (wyjścia) będzie włączone tylko przez czas kiedy zliczana zmienna jest mniejsza niż ustawiona moc. Gdy timer zliczy do 100 powinna akurat skończyć się połówka sinusoidy. Problemem może być tylko rozbieżność czasu trwania połówki sinusoidy i tego że przyjąłem że uda się zliczyć dokładnie do 100 w trakcie jej trwania. Jeśli nie będzie to 50Hz a trochę mniej lub trochę więcej to będzie mały kłopot. Ale to zapewne też da się obliczyć.

Portret użytkownika marekszy

Ściemniacz

Odnośnie tego czy TIMER zdąży zliczyć czy też nie, to jak będzie za mało przy ustawieniu 100% wyłączy wyjście przed końcem połówki sinusoidy (nie osiągnie max.mocy świecenia, ale pewnie będzie niezauważalne), natomiast jak za dużo to i tak wyjście będzie załączone do czasu następnego "0", a TIMER się wyzeruje przy przejściu i załaduje od nowa.
Timer0 mam pozostawiony do obsługi wyświetlacza i przycisków więc wszystkie Twoje operacje powinniśmy wykonać dla TIMER1

Portret użytkownika matrix

Re: Ściemniacz

W takim razie nawet lepiej. Przerwania liczę dla kwarcu 8MHz.
Co do obsługi wyświetlacza to po co Ci timer jak to jest lcd?

Może tak:?

CONFIG TIMER0 = TIMER , PRESCALE = 1 'nie podoba mi się ten prescaler = 1
 
enable interrupts
enable timer1
on timer1 przerwanie
stop timer1
on int1 zero_fazy
 
 
do
loop
end
 
zero_fazy:             'wykryte przejście przez 0
   set wyjscie         'tu włączamy wyjście
   timer1 = 65526      'wpisujemy taką wartość by wywołać przerwanie 100x na jedną połówkę sinusoidy
   start timer1
return
 
przerwanie:
  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 then 'sprawdzamy czy już wyłączyć wyjście
         reset wyjscie
      end if
return

Portret użytkownika marekszy

Ściemniacz

Nie wiem skąd wziąłeś wartość do TIMER1 przy kwarcu 16MHz,ale mi wychodzi 63936, prescaler 1,wtedy przerwanie mamy wywoływane co 0,00001s x 100 kroków = 0,01s i to x 100 połówek sinusoidy wynosi 1s tzn. mamy 50Hz/1s

Portret użytkownika matrix

Re: Ściemniacz

Do tej pory liczyłem przerwanie dla częstotliwości 8MHz co napisałem wyżej na początku. Ale skoro mówisz że jest to 16MHz to w takim razie musi to wyglądać tak:

CONFIG TIMER1 = TIMER , PRESCALE = 8 'nie podobało mi się prescaler = 1, więc mamy 8 i jest gites
 
enable interrupts
enable timer1
on timer1 przerwanie
stop timer1
on int1 zero_fazy
 
 
do
loop
end
 
zero_fazy:             'wykryte przejście przez 0
   set wyjscie         'tu włączamy wyjście
   timer1 = 65516      'wpisujemy taką wartość by wywołać przerwanie 100x na jedną połówkę sinusoidy
   start timer1
return
 
przerwanie:
  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 then 'sprawdzamy czy już wyłączyć wyjście
         reset wyjscie
      end if
return

Przepraszam za te błędy, ale w pracy jestem i trochę tak ukradkiem piszę. Powyższy kod powinien być już prawidłowy.
Timer1, kwarc 16MHz, prescaler = 8 i wartość jaką wpisujemy to 65516. Mamy wtedy dokładnie tak jak opisujesz czyli przerwanie co 0,00001s

Portret użytkownika marekszy

Ściemniacz

Teraz się zgadza, później to wszystko wrzucę do Bascoma dla 6 kanałów i zobaczę co pokaże. Jak będzie ok to czas na testy praktyczne i dopiero wtedy dalej.
Dzięki
Ciekawe co na to Mirley.

Portret użytkownika marekszy

Ściemniacz

Po wrzuceniu do Bascoma nie pokazuje błędów, więc w teori jest ok

                     '************************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_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
'* * * * * * * * * * * * * *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 " SCIEMNIACZ X 6"
 Lowerline
 Lcd "  wer.testowa 1"
 Wait 2
 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
Timer1 = 65516                                              'wpisujemy taką wartość by wywołać przerwanie 100x na jedną połówkę sinusoidy
Start Timer1
Return
 
 
Przerwanie:
  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:
 
 
 
 
 
 
 
'**************przyciski*********************************
Przyciski:

w warunkach początkowych zadałem wstępnie ustawienia mocy dla poszczególnych kanałów ,czas na testy praktyczne,dam znać jak poszło.

Portret użytkownika matrix

Re: Ściemniacz

Na początku jak deklarujesz timer1 to masz błąd, a raczej brak deklaracji podprogramu skoku

Config Timer1 = Timer , Prescale = 8
Enable Timer1 : On Timer1      '<- tu brakuje etykiety d jakiej ma skoczyć program podczas przerwania od timera1

I tutaj:

Zero_fazy:
Set Out_1                                                   'wlaczanie wyjsc
Set Out_2
Set Out_3
Set Out_4
Set Out_5
Set Out_6
'Start Timer1           <- to raczej wyrzuć bo najpierw trzeba wpisać wartość do timera a dopiero go wystartować
Timer1 = 65516                                              'wpisujemy taką wartość by wywołać przerwanie 100x na jedną połówkę sinusoidy
Start Timer1
Return

Na razie tyle zauważyłem.

Tą część:

Config Timer1 = Timer , Prescale = 8
Enable Timer1 : On Timer1
 
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
On Timer1 Przerwanie
Stop Timer1

zapisz tak:

Config Timer1 = Timer , Prescale = 8
Enable Timer1 : On Timer1 Przerwanie
 
Config Int1 = Rising                                        'rising wyzwala zbocze narastające PD.3
 
Enable Interrupts     'najpierw zezwolenie globalne
Enable Int1           'dopiero poszczególne
On Int1 Zero_fazy                                           'detekcja przejścia przez 0
Enable Timer1
'On Timer1 Przerwanie  <- to wywal bo jest wyżej
Stop Timer1

Jak zadeklarowałeś i ustawiłeś PORTB tak:

Config Portb = &B11111111 : Portb = &B00000000

To ten kawałek już nie jest potrzebny:

Config Pinb.0 = Output
Config Pinb.1 = Output
Config Pinb.2 = Output
Config Pinb.3 = Output
Config Pinb.4 = Output
Config Pinb.5 = Output