[ m51 @ 18.11.2012. 13:41 ] @
Zdravo,

imam jedan problem pa rekoh možda ovde nađem pomoć. Da napomenem da sam prethodno detaljno proučio literaturu i internet. Hoću da regulišem intenzitet osvetljenja sijalice dobro poznatom faznom regulacijom pomoću mikrokontrolera i trijaka. Principi su poznati, za detekciju prolaska kroz nulu koristim pin 7 mikrokontrolera ATTINNY25. Kad mrežni napon prođe kroz nulu generiše se spoljni prekid. Šema je u prilogu. Problem je da pri regulaciji osvetljaja napon na sijalici ne raste kontinualno kao što zelim već je to nešto nedefinisano. Vizuelni efekat je da osvetljaj podrhtava dok se sijalica potpuno ne upali. Nemam ideju u čemu je problem, a sumnjam u izbor trijaka-bio mi je pri ruci BTA16 pa sam uzeo njega. Program je:
Code:
$regfile = "attiny25.dat"
$hwstack = 32


Declare Sub Kontrola_vremena

Dim I As Byte
Dim K As Byte
Dim Kontrola As Bit
Dim Vreme_sek As Byte

Config Pinb.0 = Output                                      'gate signal
Config Pinb.2 = Input                                       'SPOLJNI PREKID

Config Int0 = Change
On Int0 Prekid                                              'prekidna rutina
Reset Kontrola

K = 45
Vreme_sek = 10
Enable Interrupts                                           'dozvoli prekide
Enable Int0                                                 'i spoljni INT0

' u glavnoj petlji se vrsi provera da li je ostvaren fazni pomeraj
' kroz celu poluperiodu.znaci sijalica od nula do maksimunma
Do

If Kontrola = 1 Then
Disable Int0                                                'zabrani prekid ako je sijalica na maksimumu osvetljaja

Kontrola = 0
Portb.0 = 1
Call Kontrola_vremena
End If

Loop


Sub Kontrola_vremena
'ovim potprogramom se ostvaruje uslov da sijalica svetli jos 10 sekundi
'od trenutka kada postigne maksimalni osvetljaj
For I = 0 To Vreme_sek
Wait 1
Next I
Portb.0 = 0                                                 ' i onda se ugasi

End Sub Kontrola Vremena




Prekid:
Disable Int0                                                'zabrani prekid
Decr K                                                      'korak je 200 uS a K je umnozak
For I = 0 To K
Waitus 200
Next I                                                      'kad prodje vreme faznog pomaka
Set Portb.0                                                 'setuj gejt trijaka
Waitus 50                                                   'sacekaj 50 uS
Reset Portb.0                                               'resetuj gejt
If K = 0 Then                                               'ako je ostvaren fazni pomeraj kroz celu poluperiodu
Kontrola = 1                                                'setuj kontrolni fleg
K = 45                                                      'priprema promenljive za novi ciklus pomeraja faze
End If

Enable Int0
Return
End




Unapred zahvalan za svaku pomoć. Koliko vidim pretragom tema ima iskusnih po ovom pitanju.
[ bogdan.kecman @ 18.11.2012. 17:16 ] @
ja sam prvi koji gura mcu svuda ali zasto ovde mcu? zar ti nije lakse diak+triak, sitna pasiva i pot? (moze i sa mcu-om naravno no ja ne mogu da citam ovaj basic da vidim sta si zabrljao, podseca me na neke mnogo ruzne stvari pa ce sacekati ove nase basicase :D )
[ veselinovic @ 18.11.2012. 19:14 ] @
U podprogramu kontrola vremena bi trebalo da bude 10 sekundi?
[ m51 @ 18.11.2012. 19:54 ] @
Za Bogdana

ovo je deo složenijeg projekta tako da mora MCU.

Za Veselinovića

Ideja je da se sijalica lagano pali od 0 do maksimalnog osvetljaja pa da posle toga bude upaljena još 10 sekundi i da se onda ugasi.
[ bogdan.kecman @ 18.11.2012. 21:10 ] @
mozda sam omasio posto je basic bas gadan a ti i taj gadan basic gadno pises :( ali mnogo ti dugo traje ovaj interrupt, na tri mesta palis i gasis triak, ne vidim zasto, treba da palis i gasis triak iskljucivo iz interapta ako ces ovako da ga radis, ne mzoes da ga palis i gasis u glavnoj petlji, subprogramu i u interaptu, nije ni cudo da treperi... ti treba da imas jednu volatile varijablu koja definise "intenzitet" svetla i onda u interaptu u odnosu na tu varijablu kontrolises kvadrant u kom ti sijalica radi.. e sad varijanta da ti cimnes interapt kada prodjes kroz nulu (100Hz) pa onda u interaptu cekas 0-10ms da bi ugasio svetlo ti ne ostavlja dovoljno vremena za ostatak programa (a kazes da je veliki projekat, dakle taj mcu treba nekog djavola radit osim sto ce da glumi diak) tako da moras da radis sa nekim timerom + externim interaptom, kada dobijes externi interapt ti startas tajmer pa ti tajmer generise drugi interapt gde ces da ugasis lampu a u medjuvremenu radis sta ima da radis, tako da imas na ext int "pali lampu + u zavisnosti od zeljenog intenziteta setuje timer" a na timer interapt ugasis lampu... ostalo vreme u glavnoj petlji radi sta zelis i po potrebi samo promeni varijablu koja ti cuva intenzitet na zeljeni i ostavi interapte da odrade dimovanje

[ veselinovic @ 19.11.2012. 06:15 ] @
cek,
u tom bejziku
Wait x
znaci cekaj x sekundi, ili x milisekundi?
[ m51 @ 19.11.2012. 06:19 ] @
Za sada samo odgovor na post Veselinovića (žurim, pa Bogdanov post malo kasnije)

Wait -sekunde
Waitms-milisekunde
Waitus-mikrosekunde
[ magnat @ 19.11.2012. 09:20 ] @
Meni se chini da detekcija prolaska kroz nulu nije dobra, a i chemu optotrijak kad detekcija kroz nulu nije galvanski odvojena.

Ovde ima kako se to radi link

Testirao,probao, namam zamerki.

[Ovu poruku je menjao magnat dana 19.11.2012. u 10:31 GMT+1]
[ m51 @ 19.11.2012. 13:32 ] @
Da zahvalim aktivnima i odgovorim na neke nedoumice.

1.Način detekcije prolaska kroz nulu koji ja koristim se pominje na više mesta između ostalog i link.

2.Optokapler koristim zbog trijaka koji traži visoku struju za okidanje (taj je bio pri ruci), a i smetnja treba da prođe otpornik od 1M tako da..

3. Da pojasnim dodatno program koji je ovde znatno skraćen , a i takav generiše istu vrstu smetnje-sijalica vidljivo podrhtava.
Znači u glavnoj petlji proverava da li je sijalica dimovana od 0 do maksimuma. Ka da je to ostvareno drži je upaljenom još 11 sekundi
Code:
Do

If Kontrola = 1 Then
Disable Int0                                     'zabrani prekid ako je sijalica na maksimumu osvetljaja

Kontrola = 0
Portb.0 = 1                                     'kada jeste nastavi da drži sijalicu upaljenom 
Call Kontrola_vremena                       ' poziva potprogram koji obezbeđuje da sijalica bude upaljena još 10 sekundi
End If
Loop
  


evo tog potprograma i ovako sijalica ipak svetli još jedanaest sek (0 do 10)
Code:
Sub Kontrola_vremena
'ovim potprogramom se ostvaruje uslov da sijalica svetli jos 10 sekundi
'od trenutka kada postigne maksimalni osvetljaj
For I = 0 To Vreme_sek
Wait 1
Next I
Portb.0 = 0                                                 ' i onda se ugasi

End Sub Kontrola Vremena


u prekidnoj rutini fazno pomera trenutak paljenja trijaka. Korak pomeraja je 200uS *K. Promenljiva K se dekrementire svakim ulaskom u prekidnu rutinu. Kada dođe do 0 setuje se kontrola fleg koji govori da je osvetljaj na maksimumu
Code:
Prekid:
Disable Int0                                                'zabrani prekid
Decr K                                                      'korak je 200 uS a K je umnozak
For I = 0 To K
Waitus 200
Next I                                                      'kad prodje vreme faznog pomaka
Set Portb.0                                                 'setuj gejt trijaka
Waitus 50                                                   'sacekaj 50 uS
Reset Portb.0                                               'resetuj gejt
If K = 0 Then                                               'ako je ostvaren fazni pomeraj kroz celu poluperiodu
Kontrola = 1                                                'setuj kontrolni fleg
K = 45                                                      'priprema promenljive za novi ciklus pomeraja faze
End If

Enable Int0
Return
[ magnat @ 19.11.2012. 16:32 ] @
U tvojoj shemi se nevidi kako si napojio kontroler a i kako je spojen nulti vod sa GND kontrolera. Mislim da tu fali jedan
otpornik od 1M.
[ m51 @ 19.11.2012. 17:04 ] @
Tačno je da da sam gnd kontrolera spojio direktno na masu napajanja bez otpornika od 1M, što je razlika u odnosu na predlog iz linka koji sam napred postavio. Probaću sa tim pa javljam rezultate.

[Ovu poruku je menjao m51 dana 19.11.2012. u 18:32 GMT+1]
[ m51 @ 19.11.2012. 17:46 ] @
Stavio sam otpornik od 1M između gnd pina kontrolera i mase napajanja i stvar se ne menja.
[ Genie_1984 @ 19.11.2012. 23:45 ] @
Pošto na šemi nema kristala verovatno koristiš interni oscilator koji radi na 8MHz pa bi trebalo da dodaš
Code:


$crystal = 1000000  'ako je FUSE bit CLKDIV8=1 



odnosno

Code:


$crystal = 8000000  ''ako je FUSE bit CLKDIV8=0



pošto je podrazumevana vrednost 4MHz a to se koristi za proracun Wait funkcija

Code:


End Sub Kontrola Vremena



Nedostaje "_" ali izgleda da to nije problem u BASCOM-u :)

Pozdrav