PIC12F629 light dimmer .hex projekt
Moderators: pedja089, stojke369, [eDo], trax
PIC12F629 light dimmer .hex projekt
Eto i ja sam jedan od onih koji je napravio onaj light dimmer, i dosao do dijela kad je trebalo isprogramirat pic i kad ono vidim nema hexa za taj projekt
I nakon pola sata uzaludnog trazenja onako ljut odlucio sam napravit taj hex i podjelit ga s narodom, a ne trazit pare za takvu glupost.
Do sada nisam nikada programirao pic, ali zato ARM imam u malom prstu, koji je kudikamo slozeniji procesor. Procitao sam jednu knjigu o programiranju pica 16f84 i to je djecja igra u usporedbi s arm procesorima, jedino je malo zajebano sto pic koristi 14bitne rijeci pa ce vjerovatno trebat prosirivat s 8 na 16 bitova neke stvari al nebi smjelo bit problema. Dakle sintaksu sam naucio, logiku imam od prije .
Evo kako planiram to srediti:
Glani program bi prisluskivao GP0 ulaz (znaci onaj di je tipkalo) i kada bi se pritisnula tipka ulazi u potprogram za memoriranje tipaka na daljinskom. Taj potprogram bi cekao prvi signal iz TSOP prijemnika i nakon toga svakih 26uS (jer ir daljinci salju signale u intervalima od 38kHz, pa ih ocito tako i TSOP proslijeduje na svoj izlaz) pregledavao stanje na GP4 ulazu i tako za 8 bitova (digitalni kod kojeg salje daljinac dugacak je 7 bitova, ali zasto ne iskoristiti svih 8 kad ih vec imamo na raspolaganju u jednom registru). Sada taj kod koji smo dobili spremamo na neku adresu u EEPROMU i cjeli postupak ponavljamo za jos jednu tipku i nju spremamo na lokaciju iza.
E sad onaj dio gdje treba prepoznati koja je tipka pritisnuta i ovisno o tome pojacati / smanjiti zarulju. Ovo bi stavio u prekidni potprogram koji bi se aktivirao kad pic iz TSOPa detektira promjenu signala, ponovo ucitavat bitove koje salje tsop i usporedit cijelu rijec s one dvije koje imamo u EEPROMu i ako su identicne onda pojacat/smanjit zarulju. Takoder nakon niza "praznih" signala treba se vratiti iz potprograma.
Ukoliko je prepoznat signal na pojacavanje/smanjivanje treba pozvati jedan od ta 2 potprograma.
Regulacija jacine svjetljenja bi se izvela tako da ako zelimo da nam zarulja svijetli na max, pustimo 1 na izlaz GP5, ako zelimo da je ugasena onda 0. A za razine izmedu moramo neprestano palit gasit zarulju i to bi se nama cinilo kao da zarulja slabije svijetli. Tu se samo treba malo poigrat oko tih omjera upaljeno/ugaseno i da se lijepa regulacija napravit.
Jos cu detaljno procesljat datasheetove od PIC12F629 i TSOP1138 da vidim sve detalje i bacam se na pisanje programa. Svi koji ste voljni pomoc javite se. Ovdje cu javit napredak i eventualne probleme oko pisanja programa.
I samo jedno pitanje: jel zna netko cemu mu sluzi ovaj povrat iz zarulje na GP2? http://www.ivica-novakovic.from.hr/Pict ... 12f629.gif
I nakon pola sata uzaludnog trazenja onako ljut odlucio sam napravit taj hex i podjelit ga s narodom, a ne trazit pare za takvu glupost.
Do sada nisam nikada programirao pic, ali zato ARM imam u malom prstu, koji je kudikamo slozeniji procesor. Procitao sam jednu knjigu o programiranju pica 16f84 i to je djecja igra u usporedbi s arm procesorima, jedino je malo zajebano sto pic koristi 14bitne rijeci pa ce vjerovatno trebat prosirivat s 8 na 16 bitova neke stvari al nebi smjelo bit problema. Dakle sintaksu sam naucio, logiku imam od prije .
Evo kako planiram to srediti:
Glani program bi prisluskivao GP0 ulaz (znaci onaj di je tipkalo) i kada bi se pritisnula tipka ulazi u potprogram za memoriranje tipaka na daljinskom. Taj potprogram bi cekao prvi signal iz TSOP prijemnika i nakon toga svakih 26uS (jer ir daljinci salju signale u intervalima od 38kHz, pa ih ocito tako i TSOP proslijeduje na svoj izlaz) pregledavao stanje na GP4 ulazu i tako za 8 bitova (digitalni kod kojeg salje daljinac dugacak je 7 bitova, ali zasto ne iskoristiti svih 8 kad ih vec imamo na raspolaganju u jednom registru). Sada taj kod koji smo dobili spremamo na neku adresu u EEPROMU i cjeli postupak ponavljamo za jos jednu tipku i nju spremamo na lokaciju iza.
E sad onaj dio gdje treba prepoznati koja je tipka pritisnuta i ovisno o tome pojacati / smanjiti zarulju. Ovo bi stavio u prekidni potprogram koji bi se aktivirao kad pic iz TSOPa detektira promjenu signala, ponovo ucitavat bitove koje salje tsop i usporedit cijelu rijec s one dvije koje imamo u EEPROMu i ako su identicne onda pojacat/smanjit zarulju. Takoder nakon niza "praznih" signala treba se vratiti iz potprograma.
Ukoliko je prepoznat signal na pojacavanje/smanjivanje treba pozvati jedan od ta 2 potprograma.
Regulacija jacine svjetljenja bi se izvela tako da ako zelimo da nam zarulja svijetli na max, pustimo 1 na izlaz GP5, ako zelimo da je ugasena onda 0. A za razine izmedu moramo neprestano palit gasit zarulju i to bi se nama cinilo kao da zarulja slabije svijetli. Tu se samo treba malo poigrat oko tih omjera upaljeno/ugaseno i da se lijepa regulacija napravit.
Jos cu detaljno procesljat datasheetove od PIC12F629 i TSOP1138 da vidim sve detalje i bacam se na pisanje programa. Svi koji ste voljni pomoc javite se. Ovdje cu javit napredak i eventualne probleme oko pisanja programa.
I samo jedno pitanje: jel zna netko cemu mu sluzi ovaj povrat iz zarulje na GP2? http://www.ivica-novakovic.from.hr/Pict ... 12f629.gif
nisi postavio semu, ali ako mislis na ovo http://www.ivica-novakovic.from.hr/Lightdimmer.htm
onda sluzi za detektovanje nule, tj pocetka periode. jer se ovde regulacija vrsi tako sto se pomera vreme okidanja triaka. sto kasnije okine to ce svetlo slabije svetliti.
onda sluzi za detektovanje nule, tj pocetka periode. jer se ovde regulacija vrsi tako sto se pomera vreme okidanja triaka. sto kasnije okine to ce svetlo slabije svetliti.
Last edited by pedja089 on 04-07-2008, 15:38, edited 1 time in total.
mogu.
kao prvo da pojasnim triak najjednostavnije.
znaci pre dolaska impulsa na gejt triaka on ne vodi izmedju a1 i a2.
kada dodje impuls na gejt onda on vodi, tj ponasa se kao zatvoreni strujni krug sve dok napon izmedju a1 i a2 ne padne na nulu.
posto je mrezni napon sinusnog oblika on 2 puta prolazi kroz nulu, prvi put kad prelazi iz negative u pozitivnu vrednos i drugi put iz pozitivne u negativnu. to su kljucne tacke za regulaciju.
evo i grafika
http://www.elektronika.ba/forum/uploadz ... iagram.GIF
diagram je dat za sledecu semu
http://www.elektronika.ba/forum/uploadz ... 1_diag.GIF
na grafiku broj 1 je nacrtan sinusni napon a crvene tacke su nule, tj u tim tackama je napon 0V.
regulacija se vrsi tako sto se menja vreme dovodjenja impulsa na gate triaka. vreme dovodjenja impulsa je predstavljeno zelenom tackom.
znaci sto se ranije dovede impuls na gejt tiristora to ce sijalica jace svetleti.
a ako se dovede kasnije onda ce sijalica slabije svetleti.
a to se na grafiku vidi kao odnos toff i ton.
kao sto se vidi sa grafina impulsi na gejt se ne mogu dovesti bilo kada, nego se moraju sinhronizovati sa prestankom vodjenja triaka, tj sa trenutkom kada je mrezni napon u 0.
i kao sto se vidi na grafiku za jednu periodu moramo dovesti dva impulsa, prvi impuls za pozitivnu poluperiodu drugi za negativnu.
nadam se da sam bio jasan
kao prvo da pojasnim triak najjednostavnije.
znaci pre dolaska impulsa na gejt triaka on ne vodi izmedju a1 i a2.
kada dodje impuls na gejt onda on vodi, tj ponasa se kao zatvoreni strujni krug sve dok napon izmedju a1 i a2 ne padne na nulu.
posto je mrezni napon sinusnog oblika on 2 puta prolazi kroz nulu, prvi put kad prelazi iz negative u pozitivnu vrednos i drugi put iz pozitivne u negativnu. to su kljucne tacke za regulaciju.
evo i grafika
http://www.elektronika.ba/forum/uploadz ... iagram.GIF
diagram je dat za sledecu semu
http://www.elektronika.ba/forum/uploadz ... 1_diag.GIF
na grafiku broj 1 je nacrtan sinusni napon a crvene tacke su nule, tj u tim tackama je napon 0V.
regulacija se vrsi tako sto se menja vreme dovodjenja impulsa na gate triaka. vreme dovodjenja impulsa je predstavljeno zelenom tackom.
znaci sto se ranije dovede impuls na gejt tiristora to ce sijalica jace svetleti.
a ako se dovede kasnije onda ce sijalica slabije svetleti.
a to se na grafiku vidi kao odnos toff i ton.
kao sto se vidi sa grafina impulsi na gejt se ne mogu dovesti bilo kada, nego se moraju sinhronizovati sa prestankom vodjenja triaka, tj sa trenutkom kada je mrezni napon u 0.
i kao sto se vidi na grafiku za jednu periodu moramo dovesti dva impulsa, prvi impuls za pozitivnu poluperiodu drugi za negativnu.
nadam se da sam bio jasan
Last edited by pedja089 on 04-07-2008, 16:16, edited 2 times in total.
hm nemam pojma koliko minumalno mora trajati. trebao bi da je 1ms vise nego dovoljno. a on na gp2 verovatno detektuje samo kada napon prelazi iz negativne u pozitivnu polu periodu, pa onda ceka neko x vreme pa da impuls, pa onda ceka da na tom pinu dodje nula pa opet ceka x vreme pa daje impuls za negativnu poluperiodu.
grafik napona na GP2(crvenom bojom)
http://www.elektronika.ba/forum/uploadz ... agram1.GIF
edit:
posto si manje vise razumeo regulaciju, sad se treba pozabaviti RC5 protokolom....
evo ovde kako izgleda signal na izlazu tsop-a
http://website.lineone.net/~dezellis/rc5.htm
e sad tu ima jos jedan problem jer prijem podataka traje oko 28ms, a regulacija zahteva impuls na svakih 10 ms, tako da to nije bas jednostavno uklopiti
evo mozda i ovo pomogne
http://islab.oregonstate.edu/koc/ece575 ... sld001.htm
grafik napona na GP2(crvenom bojom)
http://www.elektronika.ba/forum/uploadz ... agram1.GIF
edit:
posto si manje vise razumeo regulaciju, sad se treba pozabaviti RC5 protokolom....
evo ovde kako izgleda signal na izlazu tsop-a
http://website.lineone.net/~dezellis/rc5.htm
e sad tu ima jos jedan problem jer prijem podataka traje oko 28ms, a regulacija zahteva impuls na svakih 10 ms, tako da to nije bas jednostavno uklopiti
evo mozda i ovo pomogne
http://islab.oregonstate.edu/koc/ece575 ... sld001.htm
ma sad neka bude tako, nema veze ako malo zmirne zarulja, u kasnijim verzijama ce se to sredit sa onim internim timerima
napisao sam jedan dio programa, jos tu fali dosta toga, danas me vise nema kod kuce pa cu sutra probat dovrsit i isprobat prvu verziju...
napisao sam jedan dio programa, jos tu fali dosta toga, danas me vise nema kod kuce pa cu sutra probat dovrsit i isprobat prvu verziju...
Code: Select all
list p=12f629
#include <p12f629.inc>
__CONFIG _CP_OFF & _WDT_OFF & _PWRTE_ON & _INTOSC_OSC
ADRESA equ 20h
BROJAC equ 21h
RIJEC equ 22h
CEK1 equ 23h
CEK2 equ 24h
RAZINA equ 25h
org 00h
goto main
org 04h
btfsc INTCON, 1 ; provjeri je li prekid izazvao GP2
goto daljinski ; ako nije, onda je daljinski s GP4
goto kraj
daljinski
clrf RIJEC
movlw 0Eh
movwf BROJAC
call primi ; primi rijec iz daljinskog
kraj
retfie
main
bcf STATUS,RP0 ; Bank0
clrf GPIO ; inicijalizacija GPIOa
movlw 07h ; namjesti pinove GP0, GP1, GP2
movwf CMCON ; kao digitalne I/O
bsf STATUS, RP0 ; bank1
movlw 11011000b ; ukljuci GIE, PEIE, INTE, GPIE
movwf INTCON
bsf IOC, 2 ; ukljucujemo nemaskirajuci prekid na GP2 za detekciju nule
bsf IOC, 4 ; isto tako za GP4
movlw 011111b ; postavi GP5 kao izlazni a ostale kao ulazne
movwf TRISIO
tipka
bcf STATUS,RP0 ; Bank0
btfss GPIO, 0 ; provjeravamo je li tipka ptitisnuta
goto tipka
; ako je pritisnuta zapocni programiranje
bsf STATUS, RP0 ; bank1
bcf IOC, 4 ; onemoguci prekid sa GP4
bsf STATUS, RP0 ; bank1
bsf IOC, 4 ; ponovo omoguci prekid
goto tipka ; vrati se
ee_read ; citanje EEPROMa sa adrese koju predajemo potprogramu preko W
bsf STATUS,RP0 ; bank1, MAKNUTI KASNIJE PO POTREBI!!!! ##########################
movwf EEADR ; stavljamo W u adresni registar eeproma
bsf EECON1,RD ; iniciramo citanje
movf EEDATA,W ; spremamo procitani podatak u W i tako ga vracamo nazad pozivatelju
return ; PC=LR
ee_write ; zapisujemo podatak koji predajemo potprogramu preko W registra na adresu koja se nalazi u registru ADRESA koji smo definirali na pocetku programa
bsf STATUS,RP0 ; bank1, MAKNUTI KASNIJE PO POTREBI!!!! ######################
bsf EECON1,WREN ; omogucujemo pisanje
bcf INTCON,GIE ; onemoguci prekide
movwf EEDATA ; upisujemo podatak koji zelimo upisati a koji smo predali potprogramu preko registra W
movf ADRESA, W ; adresu u W...
movwf EEADR ; upisujemo adresu na koju cemo upisati podatak
movlw 55h ; Otkljucavanje pisanja, obavezna procedura...
movwf EECON2 ; Otkljucavanje pisanja, obavezna procedura...
movlw AAh ; Otkljucavanje pisanja, obavezna procedura...
movwf EECON2 ; Otkljucavanje pisanja, obavezna procedura...
bsf EECON1,WR ; Inicijalizacija pisanja
bsf INTCON,GIE ; omoguci prekide
return ; PC=LR
primi ; potprogram koji prima rijec iz daljinskog i vraca je preko RIJEC
btfss GPIO, 4 ; procitaj bit
movlw 00b ; i spremi
movlw 01b ; ga u W
iorwf RIJEC, F
bcf STATUS, C ; ocisti carry zastavicu
rlf RIJEC, F ; rotiraj lijevo
movlw 08h
movwf CEK2
;;;;;;;;;;;;;;; cekanje od 1,8ms
cekaj1p8ms
movlw 0E0h
movwf CEK1
pet1
decsz CEK1
goto pet1
decsz CEK2
goto cekaj1p8ms
;;;;;;;;;;;;;;;
decfsz BROJAC ; smanji brojac za 1 i ako je on 0 vrati se iz potprograma
goto primi
return
end ; THE END :D
jel to ide sa interuptima ili ovako na zivo ? mozda je lakse setirati timer na prolazu kroz nulu pa kad je ower da pukne triaka... a das mu vrijednost po potrebi jacine svjetla, tu vrijednost nije loše definirati po tabeli koju stavis negdje na kraj, jer ako ides linearno neces dobiti linearitet, moras složiti ili proračun krivulje ili ga kao sto sam rekao predefinirati u tabeli (sto je lakse ako ima flasha)...
ja sam se malo zezao sa dimerima sa npr 8Ch, tu je veci problem tajminga i osluškivanja serial porta, sve mora biti strogo interuptirano, jer bas i nema mjesta gubljenju vremena....
ovo je sve dosta dobro izvedivo u asm-u, ali kako sam ja odgojen u basicu, nije mi bas bilo lako to posložiti pa sam nasao neki source u c-u, malo ga doradio i to služi svrsi....
inace prolaz kroz nulu se moze ocitavati samo u jednom ili u oba smjera (+i-) gretzom... i treba paziti po netu je vecina sorceova postelana na 60hz sto kod nas bas i ne radi....
...da sad sam pogledao kod i vidio da koristis int....
ja sam se malo zezao sa dimerima sa npr 8Ch, tu je veci problem tajminga i osluškivanja serial porta, sve mora biti strogo interuptirano, jer bas i nema mjesta gubljenju vremena....
ovo je sve dosta dobro izvedivo u asm-u, ali kako sam ja odgojen u basicu, nije mi bas bilo lako to posložiti pa sam nasao neki source u c-u, malo ga doradio i to služi svrsi....
inace prolaz kroz nulu se moze ocitavati samo u jednom ili u oba smjera (+i-) gretzom... i treba paziti po netu je vecina sorceova postelana na 60hz sto kod nas bas i ne radi....
...da sad sam pogledao kod i vidio da koristis int....
ja sam isto kao sorke odgojen na basicu, tako da u asm radim ono sto bas moram.
tebi trebaju 2 prekida prvi ja kada gp ide sa 0 na 1 pa u odnosu na taj prekid dajes impuls za pozitivnu poluperiodu, drugi prekid je kad ide iz 1 u nula pa u odnosu na taj prekid dajes impuls za neg poluperiodu. to sam ti vec objasnjavao....
tebi trebaju 2 prekida prvi ja kada gp ide sa 0 na 1 pa u odnosu na taj prekid dajes impuls za pozitivnu poluperiodu, drugi prekid je kad ide iz 1 u nula pa u odnosu na taj prekid dajes impuls za neg poluperiodu. to sam ti vec objasnjavao....
nisi me razumio, mene zanima hoce li se prekid generirati ovdje: http://www.max-save.org/pix/kdwjx8s.jpg ili ovdje: http://www.max-save.org/pix/j55zr89.jpg
odakle ti ideja da tu imas prekide?
pogledaj grafik
http://www.elektronika.ba/forum/uploadz ... agram1.GIF
tebi treba prekid da se generise na zadebljanim delovima crvene linije
pogledaj grafik
http://www.elektronika.ba/forum/uploadz ... agram1.GIF
tebi treba prekid da se generise na zadebljanim delovima crvene linije
negativni napon prepoznaje kao logicku nulu. pogledaj grafik, na grafiku se sve vidi....
crvenom linijom je predstavjen napon na gp2. to sto se ne vidi u negativnoj poluperiodi znaci da je 0V. a pogledaj u datasheetu od pica da na svakom ulazu imas zastitne diode prema vcc i vdd. sto znaci za pozitivnu polu periodu imas log 1 na picu za negativnu imas log 0.
nije mi jasno kako ne vidis sa grafika kada se stvara opadajuca ivica....
crvenom linijom je predstavjen napon na gp2. to sto se ne vidi u negativnoj poluperiodi znaci da je 0V. a pogledaj u datasheetu od pica da na svakom ulazu imas zastitne diode prema vcc i vdd. sto znaci za pozitivnu polu periodu imas log 1 na picu za negativnu imas log 0.
nije mi jasno kako ne vidis sa grafika kada se stvara opadajuca ivica....
evo dovrsio sam program, sad treba vidjet kako ce radit, jos trebam malo pregledat kod da nisam negdje slucajno u krivom banku...
http://www.elektronika.ba/forum/uploadz ... DIMMER.rar
http://www.elektronika.ba/forum/uploadz ... DIMMER.rar