$MOD_AT52 $TITLE(E-Mi - DMX Scanner V.3.3) $NOPAGING $DEBUG ; Variables Description ========================================================== Xcom DATA 070h ; X poloha Ycom DATA 071h ; Y poloha Ccom DATA 072h ; Color Gcom DATA 073h ; Gobo Kcom DATA 074h ; Klapka Pcom DATA 075h ; Prisma Xout DATA 076h ; X poloha Yout DATA 077h ; Y poloha Cout DATA 078h ; Color Gout DATA 079h ; Gobo Kout DATA 07Ah ; Klapka Pout DATA 07Bh ; Prisma TxSlot DATA 07Ch ; Cislo prave vysielaneho slotu Slot DATA 07Dh ; Cislo prave prijimaneho DMX slotu SlotNo DATA 07Eh ; Pocet prijatych slotov (0..2) Addr DATA 07Fh ; Pociatocna DMX adresa z DIP switch Break BIT 07Fh ; Zachyteny DMX Break, caka sa na StartCode=0 Slave BIT 07Eh ; Osetrenie jedineho zapisu do SCOM po prepnuti do rezimu slave ; ked sa donho furt zapisuje tak straca prijimane DMX sloty Xpol DATA 030h ; Skutocna X poloha zrkadla Mx 0..255 Xdif DATA 031h ; Regulacna odchylka ziadanej polohy od skutocnej Xspd DATA 032h ; Okamzita rychlost Mx -15..0..15 Xdir BIT 07Dh ; Potrebny smer motora Mx Ran1 DATA 03Bh Ran2 DATA 03Ch Str1Del DATA 03Dh ; Strobo Delay Str2Del DATA 03Eh XYPh DATA 03Fh ; Pomocna pre fazy X a Y Ypol DATA 040h ; Skutocna Y poloha zrkadla My 0..255 Ydif DATA 041h ; Regulacna odchylka ziadanej polohy od skutocnej Yspd DATA 042h ; Okamzita rychlost My -15..0..15 Ydir BIT 07Ch ; Potrebny smer motora My Ran3 DATA 04Bh Ran4 DATA 04Ch Pwm DATA 04Dh ; Pwm citac 0..3 Delay1 DATA 04Eh Delay2 DATA 04Fh Cpom DATA 050h ; Zachytena pozadovana poloha kotuca farby Cpol DATA 051h ; Skutocna okamzita poloha kotuca farby Cspd DATA 052h ; Okamzita rychlost kotuca farby Cdel DATA 053h ; Casovac pre rychlost kotuca farby - brane z PWM modulacie 5kHz Cstep BIT 07Bh ; Priznak docasovania casovaca rychlosti Mc Cdiv DATA 020h ; Pomocna pre zdvojnasobenie poctu krokov motora Mc Cdivb BIT 000h ; /\ Gpom DATA 060h ; Zachytena pozadovana poloha kotuca gob Gpol DATA 061h ; Skutocna okamzita poloha kotuca gob Gspd DATA 062h ; Okamzita rychlost kotuca gob Gdel DATA 063h ; Casovac pre rychlost kotuca gob - brane z PWM modulacie 5kHz Gstep BIT 07Ah ; Priznak docasovania casovaca rychlosti Mg Gdiv DATA 021h ; Pomocna pre zdvojnasobenie poctu krokov motora Mg Gdivb BIT 008h ; /\ Mirror BIT 079h ; Zrkadlovy automaticky chod MonoCG BIT 078h ; Rovnake farby a goba BassPom BIT 077h ; Pomocna detektora nabeznej hrany Bass Strobo BIT 076h VPol1 DATA 022h ; REGISTER VYCHODZICH POLOH X a Y VPol2 DATA 023h ; REGISTER VYCHODZICH POLOH C a G Xvlavo BIT 010h Xdoraz BIT 011h Xvych BIT 012h Yhore BIT 013h Ydoraz BIT 014h Yvych BIT 015h Crychlo BIT 018h Cpomaly BIT 019h Cvych BIT 01Ah Grychlo BIT 01Bh Gpomaly BIT 01Ch Gvych BIT 01Dh AllVP BIT 01Fh ; Interrupt vectors ============================================================== ORG 0000h ; Inicializacia IO po resete MOV P0,#0h ; Motory Mx,My MOV P2,#0h ; Motory Mc,Mg AJMP INIT ; Nastav IO zariadenia NOP ORG 000Bh ; Vektor prerusenia TF0 Motor Mx AJMP MxInt NOP ORG 001Bh ; Vektor prerusenia TF1 Motor My AJMP MyInt NOP ORG 0023h ; Vektor prerusenia od serioveho kanalu RI+TI JB RI,Recv JB TI,Send RETI NOP ORG 002Bh ; Vektor prerusenia TF2 PwmOut AJMP PwmOut NOP ; DMX512A Serial Communication =================================================== Recv: PUSH ACC ; Ulozenie menenych registrov do zasobnika PUSH PSW CLR RI ; Nulovanie priznaku prijateho slova JB RB8,OkSlot ; Ak je platny bit8=1 tak je to platny Slot, inak DMX Break JB P3.0,DMXErr ; Ak je na vstupnej linke log 1 je DMX Error MOV A,SBUF ; Break test JNZ DMXErr ; Ak su Data nenulove, neni Break, je to len DMX Error JB P3.0,DMXErr ; Ak je na vstupnej linke log 1 je DMX Error MOV Slot,#0 ; Ak bol Break, vynuluj citac prijatych slotov MOV SlotNo,#0 ; Nuluj pocet nacitanych DMX slov SETB Break ; Zapni cakanie na DMX StartCode POP PSW ; Obnovenie registrov zo zasobnika POP ACC RETI ; Navrat z prerusenia OkSlot: JNB Break,DSlot ; Ak sa necaka na StartCode preskoc MOV A,SBUF ; Nacitanie prijateho start kodu JNZ DMXErr ; StartCode po Breaku je nenulovy, DMX Error, cakaj na dalsi Break CLR Break ; StartCode=0 Ok, dalsie data su postupne datove DMX sloty MOV A,P1 ; Nacitaj DMX adresu z DIP Switchu CPL A MOV Addr,A ; Uloz bity predvolenej DMX adresy POP PSW ; Obnovenie registrov zo zasobnika POP ACC RETI ; Navrat z prerusenia DMXErr: MOV SlotNo,#6 ; Cakaj na dalsi Break ak nezachytilo StartCode POP PSW ; Obnovenie registrov zo zasobnika POP ACC RETI ; Navrat z prerusenia DSlot: MOV A,SlotNo CJNE A,#6,TstNxt ; Ak sa nenacitalo potrebny pocet slotov tak testuj POP PSW ; Obnovenie registrov zo zasobnika POP ACC RETI ; Navrat z prerusenia TstNxt: JNZ RecNxt ; Ak sa nacital prvy tak nacitaj este druhy a treti MOV A,Slot CJNE A,Addr,NextS ; Cakaj na potrebnu adresu slotu RecNxt: MOV A,SlotNo ; Nacitanie data slotu ADD A,#070h ; Naplnenie adries 70h,71h,72h,73h,74h,75h MOV R0,A MOV @R0,SBUF ; Save Data Slot INC SlotNo POP PSW ; Obnovenie registrov zo zasobnika POP ACC RETI ; Navrat z prerusenia NextS: INC Slot ; Zvysit prijatu DMX adresu POP PSW ; Obnovenie registrov zo zasobnika POP ACC RETI ; Navrat z prerusenia NOP ; Vysielanie --------------------------------------------------------------------- Send: PUSH ACC ; Ulozenie menenych registrov do zasobnika PUSH PSW CLR TI ; Nulovanie priznaku vyslaneho bajtu JNB P3.2,SendR ; Ak je svetlo v slave rezime nevysielaj data MOV A,TxSlot JB Acc.4,SendR ; Po odvisielani 16 slotov prestan vysielat ANL A,#11111100b JNZ VysliSlot ; Ak je cislo vysielaneho slotu vacsie ako 3 vysli DMX slot MOV A,TxSlot ; Ak je cislo vysielaneho slotu mensie ako 4 (0,1,2,3) CJNE A,#03h,SBreak ; A ak sa nerovna 3 vysli break (0,1,2) SETB P3.1 ; Ak je cislo vysielaneho slotu 3, skonci signal break MOV SBUF,#0h ; a vysli nulu - StartCode AJMP SendEnd SBreak: CLR P3.1 ; Break pocas vysielania slotov 0,1,2 MOV SBUF,#0h ; Vysli nieco aby sa po odvysielani vyvolalo prerusenie AJMP SendEnd VysliSlot: MOV A,TxSlot ; A=TxSlot 0..2 DMX Break, 3 StartCode, 4..15 vysielane sloty ADD A,#070h-4 ; Vytvor adresy pre nepriame adresovanie vysielanych dat MOV R1,A ; Bude sa vysielat 12 slotov z adries 70..7Bh MOV SBUF,@R1 ; Vysli slot SendEnd: INC TxSlot ; Dalsi vyslaty Slot SendR: POP PSW ; Obnovenie registrov zo zasobnika POP ACC RETI ; Navrat z prerusenia ; End Of DMX512A Serial Communication ============================================ ; PWM Vystupy -------------------------------------------------------------------- PwmOut: PUSH ACC ; Ulozenie menenych registrov do zasobnika PUSH PSW PUSH DPH PUSH DPL MOV A,Xpol ; Nacitanie polohy motora Mx, 16 krokov * 16 mikrokrokov ANL A,#0Fh ; Len najnizsie 4 bity 0..15 je aktualny krok RL A ; Posunutie o dva bity do lava *4 RL A ORL A,Pwm ; Pridanie PWM kroku 0..3 najnizsie 2 bity MOV DPTR,#0850h ; Priprava pointra na tabulku faz motora Mx - 16 miktokrokov MOVC A,@A+DPTR ; Nacitanie stavu faz podla tabulky Mx MOV XYph,A ; Ulozenie faz do pomocnej premennej INC Pwm ; Inkrementacia PWM krokov ANL Pwm,#3 ; Len spodne dva bity 0..3 MOV A,Ypol ; Nacitanie polohy motora My, 8 krokov * 32 mikrokrokov ANL A,#01Fh ; Len najnizsich 5 bitov 0..31 je aktualny krok RL A ; Posunutie o dva bity do lava *4 RL A ORL A,Pwm ; Pridanie PWM kroku 0..3 najnizsie 2 bity MOV DPTR,#0950h ; Priprava pointra na tabulku faz motora My - 32 mikrokrokov MOVC A,@A+DPTR ; Nacitanie stavu faz podla tabulky My ORL A,XYph ; Zlucenie faz motorov Mx a My MOV P0,A ; Poslatie na vystupnu branu P0 DJNZ Cdel,NoColorStep ; Dekrementuj citac pre rychlost farby Color MOV A,Cspd ; Ak je prave treba dalsi krok nastav znova citac MOV DPTR,#0A20h ; podla tabulky rychlosti MOVC A,@A+DPTR ; MOV Cdel,A SETB Cstep ; A nastav priznak dalsieho kroku Color NoColorStep: DJNZ Gdel,NoGoboStep ; Dekrementuj citac pre rychlost posuvu Goba MOV A,Gspd ; Ak je prave treba dalsi krok nastav znova citac MOV DPTR,#0A30h ; podla tabulky rychlosti MOVC A,@A+DPTR ; MOV Gdel,A SETB Gstep ; A nastav priznak dalsieho kroku Goba NoGoboStep: DJNZ Str1Del,NoStrobo ; Dekrementuj citac pre rychlost Strobo Klapky DJNZ Str2Del,NoStrobo MOV Str1Del,#255 MOV A,Kcom ; Do A vlozit rychlost stroboklapky ANL A,#0F0h ; Len najvyssie 4 bity SWAP A ; Dat ich dole vzkikne cislo 0..15 JZ BlOut ; Ak je DMX kanal 5 nula sprav blackout CPL A ; Neguj ANL A,#0Fh ; Len najnizsie bity JZ FuOut ; Ak je DMX kanal 5 255 sprav full out MOV Str2Del,A ; Dosad rychlost strobo klapky od 5kHz/255 / 15 az 2 CPL P3.6 ; Blikni AJMP NoStrobo BlOut: MOV Str2Del,#255 SETB P3.6 ; Zaclon AJMP NoStrobo FuOut: MOV Str2Del,#255 CLR P3.6 ; Odclon NoStrobo: POP DPL ; Obnovenie registrov zo zasobnika POP DPH POP PSW POP ACC CLR T2CON.7 ; Nulovanie priznaku prerusenia od casovaca 2 RETI NOP MxInt: ; Pohyb motora Mx -------------------------------------------------------------- PUSH ACC ; Ulozenie menenych registrov do zasobnika PUSH PSW PUSH DPH PUSH DPL MOV A,Xcom ; Detekcia smeru potreby otacania a okamzitej odchyky CLR C SUBB A,Xpol ; Porovnanie ziadanej a skutocnej polohy motora Mx JC XTrebaVzad ; Ak je ziadana poloha mensia ako skutocna, chod vzad XtrebaVpred: CLR Xdir ; Ak je ziadana poloha vacsia ako skutocna, chod vpred AJMP Xrozdiel ; Absolutna odchylka je v A XtrebaVzad: MOV A,Xpol ; Ziskanie absolutnej regulacnej odchylky do A CLR C SUBB A,Xcom ; V A je kladna absolutna odchylka SETB Xdir ; Priznak Vzad Xrozdiel: MOV Xdif,A ; Ulozenie regulacnej odchylky do Xdif Xrychlost: CLR C ; Riadenie rychlosti podla okamzitej odchylky a smeru SUBB A,#16 ; Rozbehova a dobehova rampa z regulacnej odchylky v A JC XSpomaluj ; Ak je odchylka mensia ako 16 spomaluj, inak zrychluj XZrychluj: JB Xdir,XZrychliVzad ; Ak treba ist vzad, Zrychluj vzad XZrychliVpred: MOV A,Xspd ; Inak zrychluj vpred JB Acc.7,XViacVpred ; Ak je rychlost zaporna, zvysuj vpred bez obmedzenia MOV A,Xdif ; Obmedzenie rychlosti podla reg odchylky ANL A,#0E0h ; Zaokruhlenie, len najvyssie 3 bity SWAP A ; Deleno 16 je 0..15 RR A ; Deleno 2 je 0..7 ADD A,#7 ; +7 je 7..14 a to je obmedzovanie rychlosti vzhladom k odchylke CLR C SUBB A,Xspd ; Obmedzenie rychlosti vpred je 8..15 JNC XViacVpred ; Ak este rychlost nepresiahla maximalnu rychlost vpred zvysuj tiez AJMP XEndSpd XViacVpred: INC Xspd ; Zvacsi rychlost vpred AJMP XEndSpd XZrychliVzad: ; Zrychluj vzad MOV A,Xspd JNB Acc.7,XViacVzad ; Ak je rychlost kladna, zrychluj vzad bez obmedzovania MOV A,Xdif ; Obmedzovanie rychlosti vzad podla regulacnej odchylky ANL A,#0E0h ; Zaokruhlenie, len najvyssie 3 bity SWAP A ; Deleno 16 je 0..15 RR A ; Deleno 2 je 0..7 CPL A ; Negacia je -1..-8 CLR C SUBB A,#6 ; -6 je -7..-14 a to je obmedzovanie rychlosti vzhladom k odchylke SUBB A,Xspd ; Obmedzenie rychlosti vpred je -8..-15 JC XViacVzad ; Ak je maximalna rychlost zapornejsia ako rychlost vzad zrychluj vzad AJMP XEndSpd XViacVzad: DEC Xspd ; Zvacsi rychlost vzad AJMP XEndSpd XSpomaluj: MOV A,Xspd JZ XPosun ; Ak je rychlost 0 testuj zhodnost polohy JB ACC.7,XMenejVzad ; Ak je rychlost zaporna zniz rychlost XMenejVpred: DEC Xspd ; Ak je rychlost kladna zniz rychlost AJMP XEndSpd XMenejVzad: INC XSpd ; Znizenie zapornej zychlosti AJMP XEndSpd XPosun: MOV A,Xcom CJNE A,Xpol,XMimo ; Ak je rychlost 0 a neni v polohe vnutit rychlost 1 alebo -1 AJMP XCasovac ; Ak je rychlost 0 a je v polohe stoj a len casuj XMimo: JB Xdir,XMimoVzad ; vnutit rychlost 1 alebo -1 XMimoVpred: MOV Xspd,#01 ; Rychlost +1 AJMP XEndSpd XMimoVzad: MOV Xspd,#0FFh ; Rychlost -1 XEndSpd: MOV A,Xspd JZ XCasovac JB ACC.7,XKrokVzad ; Fyzicky krok motora XKrokVpred: INC Xpol ; Inkrementovat polohu AJMP XCasovac XKrokVzad: DEC Xpol ; Dekrementuj skutocnu polohu XCasovac: ; Nastavenie casovaca pre danu rychlost posuvu motora MOV A,Xspd JNB ACC.7,XRychlKladna ; Absolutna hodnota rychlosti je kladna CPL A ; Absolutna hodnota dvojkovym doplnkom zaporneho cisla INC A XRychlKladna: MOV DPTR,#0800h ; Nacitanie rychlostnej krivky z tabulky MOVC A,@A+DPTR MOV TH0,A ; Nastavenie rychlosti casovaca 1 MOV TL0,#0 INC Ran2 DEC Ran4 POP DPL ; Obnovenie registrov zo zasobnika POP DPH POP PSW POP ACC RETI ; Navrat z prerusenia NOP MyInt: ; Pohyb motora My -------------------------------------------------------------- PUSH ACC ; Ulozenie menenych registrov do zasobnika PUSH PSW PUSH DPH PUSH DPL MOV A,Ycom ; Detekcia smeru potreby otacania a okamzitej odchyky CLR C SUBB A,Ypol ; Porovnanie ziadanej a skutocnej polohy motora My JC YTrebaVzad ; Ak je ziadana poloha mensia ako skutocna, chod vzad YtrebaVpred: CLR Ydir ; Ak je ziadana poloha vacsia ako skutocna, chod vpred AJMP Yrozdiel ; Absolutna odchylka je v A YtrebaVzad: MOV A,Ypol ; Ziskanie absolutnej regulacnej odchylky do A CLR C SUBB A,Ycom ; V A je kladna absolutna odchylka SETB Ydir ; Priznak Vzad Yrozdiel: MOV Ydif,A ; Ulozenie regulacnej odchylky do Ydif Yrychlost: CLR C ; Riadenie rychlosti podla okamzitej odchylky a smeru SUBB A,#16 ; Rozbehova a dobehova rampa z regulacnej odchylky v A JC YSpomaluj ; Ak je odchylka mensia ako 16 spomaluj, inak zrychluj YZrychluj: JB Ydir,YZrychliVzad ; Ak treba ist vzad, Zrychluj vzad YZrychliVpred: MOV A,Yspd ; Inak zrychluj vpred JB Acc.7,YViacVpred ; Ak je rychlost zaporna, zvysuj vpred bez obmedzenia MOV A,Ydif ; Obmedzenie rychlosti podla reg odchylky ANL A,#0E0h ; Zaokruhlenie, len najvyssie 3 bity SWAP A ; Deleno 16 je 0..15 RR A ; Deleno 2 je 0..7 ADD A,#7 ; +7 je 7..14 a to je obmedzovanie rychlosti vzhladom k odchylke CLR C SUBB A,Yspd ; Obmedzenie rychlosti vpred je 8..15 JNC YViacVpred ; Ak este rychlost nepresiahla maximalnu rychlost vpred zvysuj tiez AJMP YEndSpd YViacVpred: INC Yspd ; Zvacsi rychlost vpred AJMP YEndSpd YZrychliVzad: ; Zrychluj vzad MOV A,Yspd JNB Acc.7,YViacVzad ; Ak je rychlost kladna, zrychluj vzad bez obmedzovania MOV A,Ydif ; Obmedzovanie rychlosti vzad podla regulacnej odchylky ANL A,#0E0h ; Zaokruhlenie, len najvyssie 3 bity SWAP A ; Deleno 16 je 0..15 RR A ; Deleno 2 je 0..7 CPL A ; Negacia je -1..-8 CLR C SUBB A,#6 ; -6 je -7..-14 a to je obmedzovanie rychlosti vzhladom k odchylke SUBB A,Yspd ; Obmedzenie rychlosti vpred je -8..-15 JC YViacVzad ; Ak je maximalna rychlost zapornejsia ako rychlost vzad zrychluj vzad AJMP YEndSpd YViacVzad: DEC Yspd ; Zvacsi rychlost vzad AJMP YEndSpd YSpomaluj: MOV A,Yspd JZ YPosun ; Ak je rychlost 0 testuj zhodnost polohy JB ACC.7,YMenejVzad ; Ak je rychlost zaporna zniz rychlost YMenejVpred: DEC Yspd ; Ak je rychlost kladna zniz rychlost AJMP YEndSpd YMenejVzad: INC YSpd ; Znizenie zapornej zychlosti AJMP YEndSpd YPosun: MOV A,Ycom CJNE A,Ypol,YMimo ; Ak je rychlost 0 a neni v polohe vnutit rychlost 1 alebo -1 AJMP YCasovac ; Ak je rychlost 0 a je v polohe stoj a len casuj YMimo: JB Ydir,YMimoVzad ; vnutit rychlost 1 alebo -1 YMimoVpred: MOV Yspd,#01 ; Rychlost +1 AJMP YEndSpd YMimoVzad: MOV Yspd,#0FFh ; Rychlost -1 YEndSpd: MOV A,Yspd JZ YCasovac JB ACC.7,YKrokVzad ; Fyzicky krok motora YKrokVpred: INC Ypol ; Inkrementovat polohu AJMP YCasovac YKrokVzad: DEC Ypol ; Dekrementuj skutocnu polohu YCasovac: ; Nastavenie casovaca pre danu rychlost posuvu motora MOV A,Yspd JNB ACC.7,YRychlKladna ; Absolutna hodnota rychlosti je kladna CPL A ; Absolutna hodnota dvojkovym doplnkom zaporneho cisla INC A YRychlKladna: MOV DPTR,#0900h ; Nacitanie rychlostnej krivky z tabulky MOVC A,@A+DPTR MOV TH1,A ; Nastavenie rychlosti casovaca 1 MOV TL1,#0 INC Ran1 DEC Ran3 POP DPL ; Obnovenie registrov zo zasobnika POP DPH POP PSW POP ACC RETI ; Navrat z prerusenia NOP Delay: MOV Delay1,#0FFh ; Delay DelayH: MOV Delay2,#0FFh DelayL: NOP NOP NOP NOP NOP DJNZ Delay2,DelayL DJNZ Delay1,DelayH RET ; Device Initialisation ========================================================== ORG 0500h ; Inicializacia CPU po resete INIT: MOV P0,#0h ; Motory X a Y MOV P1,#0FFh ; DIP Switch Adresa MOV P2,#0h ; Motory Color a Gobo MOV P3,#0FFh ; Ostatne I/O ACALL Delay MOV P0,#0h ; Motory X a Y MOV P1,#0FFh ; DIP Switch Adresa MOV P2,#0h ; Motory Color a Gobo MOV P3,#01111111b ; Ostatne I/O, vypne prizmu, zostane zaklapnute strobo MOV SP,#80h ; Ukazovatel zasobniku do nevyuzitej rozsirenej pamate ; RAM x52 adresovanej len nepriamo - 80h..FFh MOV TMOD,#00010001b ; Dva 16bitove interne casovace 0 a 1 (Fosc/12)/THn:TLn MOV TCON,#01010000b ; Povolenie oboch casovacov 0X a 1Y MOV SlotNo,#06 ; Nastavenie pociatocneho cakania na DMX512 Break MOV PCON,#00000000b ; Rychlost seriovky 16MHz/64=250kb (DMX512A 1998 USITT) MOV SCON,#10011000b ; Seriovy kanal v rezime 2 - 9bit UART - prijem MOV RCAP2L,#0 MOV RCAP2H,#255 ; 255:0 = 5kHz MOV T2MOD,#00000000b ; Inicializacia aut. casovaca 2 (Fosc/12)/(65535-[RCAP2H:RCAP2L]) MOV T2CON,#00000100b ; Spustenie casovaca 2 s automatickym prednastavenim v RCAP2H:RCAP2L MOV Xcom,#0 ; Inicializacia polohy X MOV Xpol,#255 MOV Xspd,#0 MOV Ycom,#255 ; Inicializacia polohy Y MOV Ypol,#0 MOV Yspd,#0 MOV Ccom,#0 MOV Cpom,#0 ; Inicializacia farby MOV Cpol,#0 MOV Cspd,#0 MOV Cdiv,#0 MOV Gcom,#0 MOV Gpom,#0 ; Inicializacia goba MOV Gpol,#0 MOV Gspd,#0 MOV Gdiv,#0 MOV VPol1,#0 ; Zapnutie hladania Vychodzich Poloh MOV VPol2,#0 ACALL Delay MOV IP,#00010000b ; Nastavenie poradia preruseni - seriovka nadradena MOV IE,#10101010b ; Povolenie preruseni casovacov 0,1,2 - bez seriovky ACALL Delay ; Main loop ====================================================================== Loop: MOV A,Pcom ; Prizma ----------------------------------------------- MOV C,Acc.7 ; Bit 7 do CY CPL C ; Negacia CY MOV P3.7,C ; Ak je nastavwny bit7 na DMX slote 6 tak zapni prismu ; Color Motion ------------------------------------------------------------------------- JNB Cstep,NoCStep ; Ak nieje cas posunut Mc preskoc CLR Cstep ; Ak je cas posunut, zmaz tento posun a vykonaj ho MOV A,Cpom ; Testuj polohu motora CJNE A,Cpol,Cmove ; Ak motor neni v polohe polohuj Cstop: MOV A,Ccom ; Ak je motor v polohe nacitaj dalsiu polohu ANL A,#0F0h ; Len najvyssie 4 bity SWAP A ; Deleno 16 je 0..15 MOV DPTR,#0A00h ; Nacitanie z tabulky poloh farebneho kotuca MOVC A,@A+DPTR MOV Cpom,A ; Ulozenie pozadovanej novej polohy kotuca AJMP NoCStep Cmove: MOV A,Cpom ; Porovnanie polohy motora CLR C SUBB A,Cpol ; Porovnanie ziadanej a skutocnej polohy motora JC Crev ; Ak je ziadana poloha mensia ako skutocna, chod vzad Cfor: INC Cdiv JB Cdivb,Csped INC Cpol ; Ak je ziadana poloha vacsia ako skutocna, chod vpred - Krok Vpred AJMP Csped ; Absolutna odchylka v A Crev: MOV A,Cpol ; Ziskanie absolutnej regulacnej odchylky do A CLR C SUBB A,Cpom ; Absolutna odchylka v A DEC Cdiv JNB Cdivb,Csped DEC Cpol ; Vzad Csped: CLR C SUBB A,#8 ; Porovnanie velkosti regulacnej odchylky JC Cdecel ; Ak je odchylka mensia ako 8(x2), spomaluj Caccel: MOV A,Cspd ; inak zrychluj CJNE A,#15,Cviac ; Zrychluje pokial nedosiahne rychlost 15 AJMP Coutp Cviac: INC Cspd ; Zrychli +1 AJMP Coutp Cdecel: MOV A,Cspd JZ Coutp ; Ak je rychlost 0 neznizuj uz rychlost DEC Cspd ; Ak nieje rychlost 0, zniz rychlost Coutp: MOV A,Cpol ; Nacitanie polohy do A ANL A,#3 ; Odstranenie najvyssich bitov RL A ; Posunutie o bit vlavo ANL Cdiv,#1 ; Najnizsi bit pridat z pridavneho registra ORL A,Cdiv MOV DPTR,#0A40h ; Nacitanie novych hodnot faz z tabulky MOVC A,@A+DPTR ANL P2,#0F0h ; Zmazanie nizsich 4 bitov ORL P2,A ; Naplnenie nizsich 4 bitov novou hodnotou faz motora Mc MOV A,Ran4 ; Randomize XCH A,Ran1 SWAP A MOV Ran4,A NoCstep: ; End Color Motion ----------------------------------------------------- ; Gobo Motion -------------------------------------------------------------------------- JNB Gstep,NoGStep ; Ak nieje cas posunut Mg preskoc CLR Gstep ; Ak je cas posunut, zmaz tento posun a vykonaj ho MOV A,Gpom ; Testuj polohu motora CJNE A,Gpol,Gmove ; Ak motor neni v polohe polohuj Gstop: MOV A,Gcom ; Ak je motor v polohe nacitaj dalsiu polohu ANL A,#0F0h ; Len najvyssie 4 bity SWAP A ; Deleno 16 je 0..15 ; Strobing -------------------------------------------------------- CJNE A,#15,NoStrb ; Pri hodnote 255 tj 15 strobuje a preskakuje furt na hodnoty 14 a 15 JB Strobo,SLight ; Ak nechces tak daj pred tieto riadky ; SETB Strobo ;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MOV A,#15 AJMP NoStrb SLight: MOV A,#14 CLR Strobo NoStrb: ; Strobing -------------------------------------------------------- MOV DPTR,#0A10h ; Nacitanie z tabulky poloh farebneho kotuca MOVC A,@A+DPTR MOV Gpom,A ; Ulozenie pozadovanej novej polohy kotuca AJMP NoGStep Gmove: MOV A,Gpom ; Porovnanie polohy motora CLR C SUBB A,Gpol ; Porovnanie ziadanej a skutocnej polohy motora JC Grev ; Ak je ziadana poloha mensia ako skutocna, chod vzad Gfor: INC Gdiv JB Gdivb,Gsped INC Gpol ; Ak je ziadana poloha vacsia ako skutocna, chod vpred - Krok Vpred AJMP Gsped ; Absolutna odchylka v A Grev: MOV A,Gpol ; Ziskanie absolutnej regulacnej odchylky do A CLR C SUBB A,Gpom ; Absolutna odchylka v A DEC Gdiv JNB Gdivb,Gsped DEC Gpol ; Vzad Gsped: CLR C SUBB A,#8 ; Porovnanie velkosti regulacnej odchylky JC Gdecel ; Ak je odchylka mensia ako 8(x2), spomaluj Gaccel: MOV A,Gspd ; inak zrychluj CJNE A,#15,Gviac ; Zrychluje pokial nedosiahne rychlost 15 AJMP Goutp Gviac: INC Gspd ; Zrychli +1 AJMP Goutp Gdecel: MOV A,Gspd JZ Goutp ; Ak je rychlost 0 neznizuj uz rychlost DEC Gspd ; Ak nieje rychlost 0, zniz rychlost Goutp: MOV A,Gpol ; Nacitanie polohy do A ANL A,#3 ; Odstranenie najvyssich bitov RL A ; Posunutie o bit vlavo ANL Gdiv,#1 ; Najnizsi bit pridat z pridavneho registra ORL A,Gdiv MOV DPTR,#0A50h MOVC A,@A+DPTR ANL P2,#0Fh ; Zmazanie vyssich 4 bitov ORL P2,A ; Naplnenie vyssich 4 bitov novou hodnotou faz motora Mg MOV A,Ran3 ; Randomize XCH A,Ran2 SWAP A MOV Ran3,A NoGstep: ; End Gobo Motion ------------------------------------------------------ JNB AllVP,FindVP ; Mode Master/Slave -------------------------------------------------------------- JB P3.2,Master ; Ak je svetlo ako master chod na master riadenie JB Slave,ToLoop SETB Slave ; Do registra SCON sa nesmie zapisovat pocas prijmu lebo strati DMX slot MOV PCON,#00000000b ; Rychlost seriovky 16MHz/64=250kb (DMX512A 1998 USITT) MOV SCON,#10011000b ; Ak neni svetlo ako master tak zapni prijem seriovym kanalom MOV IP,#00010000b ; Nastavenie poradia preruseni - seriovka nadradena MOV IE,#10111010b ; Povolenie preruseni od casovacov 0,1,2 a seriovky ToLoop: AJMP Loop ; Chod na zaciatok loop ; Master mode -------------------------------------------------------------------- Master: CLR Slave JNB P3.3,Bass ; Ak je signal bass (Log0) skontroluj nabeznu hranu MOV A,Xspd JNZ pLoop ; Ak nieje signal bass a oba motory X a Y stoja MOV A,Yspd JNZ pLoop SETB BassPom ; Ak nieje signal bass zapni zachytenie dalsej nabeznej hrany signalu Bass pLoop: AJMP Loop Bass: JNB BassPom,pLoop ; Ak je signal bass a nabezna hrana uz bola tak nic CLR BassPom ; Osetrenie zachytenia nabeznej hrany CLR ES ; Vypnutie vysielania seriovky AJMP Automatic FindVP: ; Hladanie vychodzich poloh ---------------------------------------------------- ; Vychodzia poloha X JB Xvych,EndVPX ; Ak bola najdena VPX preskakuj hladanie VPX MOV A,Xcom CJNE A,Xpol,EndVPX ; Po starte sa toci motor Mx z 255 do polohy 0 ACALL Delay JB Xvlavo,Xslow SETB Xvlavo ; Ak dojde do polohy 0 este spravi -96 mikrokrokov pomaly keby sa odrazil od dorazky MOV Xpol,#96 AJMP EndVPX Xslow: JB Xdoraz,Xinpos ; Ak Dojde 100% na dorazku, este posune na +32 lebo dorazka je daleko SETB Xdoraz MOV Xcom,#32 ; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< Posunutie X0 od dorazky <<<<<<<<<<<<<<<<<<< AJMP EndVPX Xinpos: SETB Xvych ; Ak dojde do +32 vynuluje vsetko a je vo VPX MOV Xcom,#0 MOV Xpol,#0 ACALL Delay EndVPX: ; Vychodzia poloha Y JNB Xvych,EndVPY JB Yvych,EndVPY ; Ak bola najdena VPY preskakuj hladanie VPY MOV A,Ycom CJNE A,Ypol,EndVPY ; Po starte sa toci motor My z 0 do polohy 255 ACALL Delay JB Yhore,Yslow SETB Yhore ; Ak dojde do polohy 255 este spravi -35 mikrokrokov (~2kroky) pomaly MOV Ypol,#223 ; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< Posunutie Y0 od dorazky <<<<<<<<<<<<<<<<<<< AJMP EndVPY Yslow: JB Ydoraz,Yinpos ; Ak Dojde 100% na dorazku posune na +32 SETB Ydoraz ; uz ostava hore - dorazka je Y=255 AJMP EndVPY Yinpos: SETB Yvych ; Ak dojde, ostane vsetko 255 (dole) a je vo VPY MOV Ycom,#255 MOV Ypol,#255 ACALL Delay MOV Cpom,#250 ; Inicializacia farby MOV Cpol,#0 ; Po zapnuti pojde 64 z 50tich krokov motora vzad EndVPY: ; Vychodzia poloha farby JNB Yvych,EndVPC JB Cvych,EndVPC ; Ak bola najdena VPC preskakuj hladanie VPC JNB P3.4,Cfast ; Ak neni na clone chod rychlo vpred SETB Cpomaly MOV A,Cpol ADD A,#1 ; Ak je na clone spomal a chod pomaly kym z nej nezide JC CNoVP MOV Cpom,A AJMP EndVPC Cfast: SETB Crychlo JNB Cpomaly,EndVPC ; Ak neni clona a ak ani nebola chod rychlo CNoVP: SETB Cvych ; Ak neni clona a bola, je VPC a zresetuj polohy MOV Cpol,#0 MOV Cpom,#0 MOV Ccom,#0 MOV Cspd,#0 MOV Cdiv,#0 MOV Gpom,#250 ; Inicializacia goba MOV Gpol,#0 ; Po zapnuti pojde 64 krokov vzad EndVPC: ; Vychodzia poloha goba JNB Cvych,EndVPG JB Gvych,EndVPG ; Ak bola najdena VPC preskakuj hladanie VPC JNB P3.5,Gfast ; Ak neni na clone chod rychlo vpred SETB Gpomaly MOV A,Gpol ADD A,#1 ; Ak je na clone spomal a chod pomaly kym z nej nezide JC GNoVP MOV Gpom,A MOV Gcom,A AJMP EndVPG Gfast: SETB Grychlo JNB Gpomaly,EndVPG ; Ak neni clona a ak ani nebola chod rychlo GNoVP: SETB Gvych ; Ak neni clona a bola, je VPC a zresetuj polohy MOV Gpol,#0 MOV Gpom,#0 MOV Gcom,#0 MOV Gspd,#0 MOV Gdiv,#0 MOV IE,#10111010b ; Povolenie preruseni casovacov 1,2,3 + SERIOVKA DMX MOV P3,#00111111b ; Ostatne I/O, vypne prismu aj otvori stroboklapku ; Scanner je pripraveny vo vychodzich polohach SETB AllVP EndVPG: AJMP Loop ; Koniec programu hladania vychodzich poloh -------------------- ; Automatic X Y C G -------------------------------------------------------------- Automatic: MOV A,Ran1 ; Nahodny vyber X CLR C RRC A ADD A,#64 MOV Xcom,A JNB Mirror,NoMirX ; Mirroring parnych svetiel v zostave CPL A NoMirX: MOV Xout,A MOV A,Ran2 ; Nahodny vyber Y CLR C RRC A ADD A,#64 MOV Ycom,A JNB Mirror,NoMirY ; Mirroring parnych svetiel v zostave CPL A NoMirY: MOV Yout,A MOV A,Ran3 ; Zapnutie a vypnutie mirroringu X a Y ANL A,#019h JNZ NoChMirror CPL Mirror NoChMirror: MOV A,Ran4 ; Rezim Monocolor Monogobo ANL A,#019h JNZ NoChMono CPL MonoCG NoChMono: MOV A,Ran3 ANL A,#07h ; Ak su nizsie 3 bity nulove, zmena farby JNZ NoColorCh MOV A,Ran3 ; Zmena farby podla vyssich 4-bitov MOV Ccom,A MOV Cout,A JNB MonoCG,NoColorCh MOV Cout,Ran1 NoColorCh: MOV A,Ran4 ANL A,#07h ; Ak su nizsie 3 bity nulove, zmena goba JNZ NoGoboCh MOV A,Ran4 ; Zmena goba podla vyssich 4-bitov MOV Gcom,A MOV Gout,A JNB MonoCG,NoGoboCh MOV Gout,Ran2 NoGoboCh: MOV Kcom,#255 MOV Kout,#255 MOV Kcom,#0 MOV Kout,#0 MOV A,Ran1 ; Randomize XRL A,Ran2 XCH A,Ran4 RR A XCH A,Ran2 RR A XCH A,Ran3 XRL A,Ran1 MOV Ran1,A MOV PCON,#00000000b ; Rychlost seriovky 16MHz/64=250kb (DMX512A 1998 USITT) MOV SCON,#10001000b ; Seriovy kanal v rezime 2 - 9bit UART, zakazany prijem MOV IP,#00010000b ; Nastavenie poradia preruseni - seriovka nadradena MOV IE,#10111010b ; Povolenie preruseni od casovacov 0,1,2 a seriovky MOV TxSlot,#0h ; Znovuzacatie vysielania od slotu 0 CLR P3.1 ; Nuteny break MOV SBUF,#0h ; Vysielanie prveho slotu break signalu SETB ES ; Nasledne sa uz vysielanie chyti cez prerusenie AJMP Loop ; Koniec programu Master rezimu scannera ----------------------- ; Koniec hlavnej slucky ---------------------------------------------------------- ; Data Table ===================================================================== ORG 0800h ; Tabulka rychlosti pre Mx 0..15, 100..800Hz SpdX: DB 204,204,207,212,217,224,230,238,242,244,245,246,247,248,249,249 ORG 0850h ; Tabulka faz motora Mx 16 mikrokrokov Ph16X: DB 1000b,1000b,1000b,1000b;0 DB 1000b,1100b,1000b,1100b;1 DB 1100b,1100b,1100b,1100b;2 DB 1100b,0100b,1100b,0100b;3 DB 0100b,0100b,0100b,0100b;4 DB 0100b,0110b,0100b,0110b;5 DB 0110b,0110b,0110b,0110b;6 DB 0110b,0010b,0110b,0010b;7 DB 0010b,0010b,0010b,0010b;8 DB 0010b,0011b,0010b,0011b;9 DB 0011b,0011b,0011b,0011b;10 DB 0011b,0001b,0011b,0001b;11 DB 0001b,0001b,0001b,0001b;12 DB 0001b,1001b,0001b,1001b;13 DB 1001b,1001b,1001b,1001b;14 DB 1001b,1000b,1001b,1000b;15 ORG 0900h ; Tabulka rychlosti pre My 0..15, 100..800Hz SpdY: DB 204,204,207,212,217,224,230,238,242,244,245,246,247,248,249,249 ORG 0950h ; Tabulka faz motora My 32 mikrokrokov Ph32Y: DB 10000000b,10000000b,10000000b,10000000b;0 DB 11000000b,10000000b,10000000b,10000000b;1 DB 10000000b,11000000b,10000000b,11000000b;2 DB 11000000b,11000000b,10000000b,11000000b;3 DB 11000000b,11000000b,11000000b,11000000b;4 DB 01000000b,11000000b,11000000b,11000000b;5 DB 11000000b,01000000b,11000000b,01000000b;6 DB 01000000b,01000000b,11000000b,01000000b;7 DB 01000000b,01000000b,01000000b,01000000b;8 DB 01100000b,01000000b,01000000b,01000000b;9 DB 01000000b,01100000b,01000000b,01100000b;10 DB 01000000b,01100000b,01100000b,01100000b;11 DB 01100000b,01100000b,01100000b,01100000b;12 DB 01100000b,01100000b,00100000b,01100000b;13 DB 01100000b,00100000b,01100000b,00100000b;14 DB 00100000b,00100000b,01100000b,00100000b;15 DB 00100000b,00100000b,00100000b,00100000b;16 DB 00110000b,00100000b,00100000b,00100000b;17 DB 00100000b,00110000b,00100000b,00110000b;18 DB 00100000b,00110000b,00110000b,00110000b;19 DB 00110000b,00110000b,00110000b,00110000b;20 DB 00110000b,00110000b,00010000b,00110000b;21 DB 00110000b,00010000b,00110000b,00010000b;22 DB 00010000b,00010000b,00110000b,00010000b;23 DB 00010000b,00010000b,00010000b,00010000b;24 DB 10010000b,00010000b,00010000b,00010000b;25 DB 00010000b,10010000b,00010000b,10010000b;26 DB 00010000b,10010000b,10010000b,10010000b;27 DB 10010000b,10010000b,10010000b,10010000b;28 DB 10000000b,10010000b,10010000b,10010000b;29 DB 10010000b,10000000b,10010000b,10000000b;30 DB 10000000b,10000000b,10010000b,10000000b;31 ORG 0A00h ; Polohy kotuca farieb 0..15, Motor ma 50x4 krokov = hodnoty 0..200 PosCol: DB 000,017,034,051,067,084,101,118,134,151,167,184,202,202,202,202 ORG 0A10h ; Polohy kotuca gob 0..15, posledna hodnota automaticky preskakuje na predposlednu - strobuje PosGob: DB 167,000,034,034,067,067,101,101,134,134,167,167,202,202,167,202 ORG 0A20h ; Tabulka rychlosti farby 0..15 vypocitavane z PWM frekvencie 5kHz - 20..380Hz SpdCol: DB 255,83,50,36,28,23,19,17,15,14,13,12,12,12,12,12 ORG 0A30h ; Tabulka rychlosti goba 0..15 vypocitavane z PWM frekvencie 5kHz - 20..380Hz SpdGob: DB 255,83,50,36,28,23,19,17,15,14,13,12,12,12,12,12 ORG 0A40h ; Tabulka faz motora Mc 8 mikrokrokov Ph8Col: DB 00000001b,00000011b,00000010b,00000110b,00000100b,00001100b,00001000b,00001001b ORG 0A50h ; Tabulka faz motora Mg 8 mikrokrokov Ph8Gob: DB 00010000b,00110000b,00100000b,01100000b,01000000b,11000000b,10000000b,10010000b END; Program end ====================================================================