;=============================================================================== ; Mudeli kaamera juhtimise moodul. Sisend kuni 2-st kanalist. ; Fosc=8,0 MHz (sisemine generaator). Side: 19200,n,8,1 ; 12.9.2013.: algus ; Käsud! ;Koormused: 1- päästik, 2 - zoom+, 3 - zoom -, 4 - lamp ;Iga koormuse kohta: ;- bait 1: juhtiv raadiokanal (0-puudub), bitt7=1 -> õige kestusega pulss leitud, baidid 2,3: radiokanali alumine ja baidid 4,5:ülemine piir (0-ei huvita), ;- bait 6: lubav väljund (0- puudub, 1- päästik, 2- zoom+, 3 zoom-, 4 lamp), ;- bait 7: taimer ehk aeg tingimuste täitumise algusest (n*100ms), ;- bait 8: taimer ehk korduste vaheline aeg kui eelnevad tingimused täidetud (n*100ms, 0-puudub), ;- bait 9: väljundpulsi kestus (n*100ms), 0 -> PWM, FF -> pidevalt ;- bait 10: bitt2: triger =1, tingimuste täitmise ajaks ainult=0, ; bitt 1: aktiivne nivoo (0 või 1), ; bitt 0: passiivne HIGH-z = 0, 1= TTL nivoo ; ;Näide: 1, 0, 0,0, 4, 2, 0, 5,1 - päästik juhitav lambi väljundiga, 2s peale lambi aktiveerumist, 500ms pulss, ainult siis kui tingimused täidetud,aktiivne 0, ei ole lahtine kollektor ;Näide: 4, 1, 1200,1400, 0, 0, 0, 40,3 - lamp, juhitav RC1 kanalist, kestus 1200..1400us, lubavad väljundid puuduvad, taimerid puuduvad, pulsi kestus 4 sekundit, ainult siis kui tingimused täidetud, aktiivne nivoo 1, TTL. ; 20.10.: PIC16F1509. ;=============================================================================== ;*********************** Raudvärk ********************************************** include "P16F1509.inc" ; sel PICil tuleb confi sönad kirjutada peale end'i koodi löppu... __CONFIG _CONFIG1, _FOSC_INTOSC & _WDTE_OFF & _PWRTE_ON & _MCLRE_ON & _CP_OFF & _BOREN_OFF & _CLKOUTEN_OFF & _IESO_OFF & _FCMEN_OFF __CONFIG _CONFIG2, _WRT_OFF & _LPBOR_OFF & _STVREN_OFF & _BORV_HI & _LVP_OFF errorlevel -302 ; Compaileri vingumised ära errorlevel -305 errorlevel -306 ;*** väljundid *** #define PWM4 PORTC,.1 #define PWM3 PORTA,.2 #define PWM2 PORTC,.3 #define PWM1 PORTC,.5 #define OUT5 PORTC,.0 #define OUT6 PORTC,.2 #define OUT7 PORTB,.4 #define LED PORTC,.7 ; LEDi (+) ots. Vilgub kui pollitakse jne #define RS_TX PORTB,.7 ; saade RS485-le #define TRISPWM1 TRISC,.5 #define TRISPWM2 TRISC,.3 #define TRISPWM3 TRISA,.2 #define TRISPWM4 TRISC,.1 #define TRISOUT5 TRISC,.0 #define TRISOUT6 TRISC,.2 #define TRISOUT7 TRISB,.4 ;*** sisendid *** #define RS_RX PORTB,.5 ; vastuvõtt RS485-lt #define CH1 PORTA,.5 ; 1. RC kanal #define CH2 PORTA,.4 ; 2. RC kanal ;****** varioossed constaanzid ******** ;* taimerid * #define _100msaeg .12 ; ca 98 ms ;****** Side ******** #define FrameStart 0x24 ; paketi alguse sümbol #define FrameEnd 0x2A ; paketi lõpu sümbol ;****** käsud ******* #define cmdSet 'S' #define cmdRead 'R' #define cmdDur 'D' #define cmddur 'd' #define cmdgoto 'G' ; ************* Lipud **************** #define K0atON Flags,.0 ; koormuse 0 algusetaimer käib #define K0ktON Flags,.1 ; koormuse 0 kordustaimer käib #define K0ptON Flags,.2 ; koormuse 0 pulsi kestuse taimer käib #define K1atON Flags,.3 ; koormuse 1 algusetaimer käib #define K1ktON Flags,.4 ; koormuse 1 kordustaimer käib #define K1ptON Flags,.5 ; koormuse 1 pulsi kestuse taimer käib #define K2atON Flags,.6 ; koormuse 2 algusetaimer käib #define K2ktON Flags,.7 ; koormuse 2 kordustaimer käib #define K2ptON Flags1,.0 ; koormuse 2 pulsi kestuse taimer käib #define K3atON Flags1,.1 ; koormuse 3 algusetaimer käib #define K3ktON Flags1,.2 ; koormuse 3 kordustaimer käib #define K3ptON Flags1,.3 ; koormuse 3 pulsi kestuse taimer käib #define noRC Flags1,.4 ; kui koormust ei juhita RC järgi #define K0atTO Flags1,.5 ; koormuse 0 algusepulss valmis #define K1atTO Flags1,.6 ; koormuse 1 algusepulss valmis #define K2atTO Flags1,.7 ; koormuse 2 algusepulss valmis #define K3atTO Flags2,.0 ; koormuse 3 algusepulss valmis #define outpstat Flags2,.1 ; tüüriva väljundi seisund #define K0ptTO Flags2,.2 ; koormuse 0 algusepulss valmis #define K1ptTO Flags2,.3 ; koormuse 1 algusepulss valmis #define K2ptTO Flags2,.4 ; koormuse 2 algusepulss valmis #define K3ptTO Flags2,.5 ; koormuse 3 algusepulss valmis #define K0ktTO Flags2,.6 ; koormuse 0 algusepulss valmis #define K1ktTO Flags2,.7 ; koormuse 1 algusepulss valmis #define K2ktTO Flags3,.0 ; koormuse 2 algusepulss valmis #define K3ktTO Flags3,.1 ; koormuse 3 algusepulss valmis #define outppas Flags3,.2 #define outpakt Flags3,.3 #define ZERO STATUS,Z #define CARRY STATUS,C ; ***************************** ; ************** Mälu jaotus ********** #define memstart 0x20 cblock memstart ; *** serial *** Char Cmd CData CData1 serialtimer bytecnt ;***** pulsside kestuste mõõtmine ****** strt1H,strt1L,strt2H,strt2L pulse1H,pulse1L,pulse2H,pulse2L ;**** duration algus lõpp ;***** koormused ***** Koormus0:.10 ; päästik Koormus1:.10 ; Zoom + Koormus2:.10 ; Zoom - Koormus3:.10 ; Lamp ;***** setup ****** count ;***** taimerid *** _100mstaimer K0algusetmr K0kordusetmr K0pulsitmr K1algusetmr K1kordusetmr K1pulsitmr K2algusetmr K2kordusetmr K2pulsitmr K3algusetmr K3kordusetmr K3pulsitmr ;***** süsteem **** FSR0s FSR1s W_Temp S_Temp Flags Flags1 Flags2 Flags3 ; 0x6E endc ;=============================================================================== org .0 goto main ;=============================================================================== ; ******* Katckestused ******* ;=============================================================================== org 0004h ; movwf W_Temp ; seivi kontekst ; swapf STATUS,W ; movwf S_Temp ; movf FSR0L,W ; movwf FSR0s ; movf FSR1L,W ; movwf FSR1s banksel PIR1 btfsc PIR1,RCIF ; sideliini ots liigutas ennast? call SerInt ; siis serial banksel INTCON ; btfsc INTCON,TMR0IF ; side timeout(16,384ms) ? ; call TMR0int btfsc PIR1,TMR2IF ; süsteemi taimer tiksus 8,192 ms täis call TMR2int banksel .0 btfsc INTCON,IOCIF ; RC kanali sisendi muutus ? ; banksel IOCAF ; movf IOCAF,W ; btfsc ZERO ; goto _Pop ;; btfsc IOCAF,IOCIF ; RC kanali sisendi muutus ? call RCint _Pop: ; movf FSR0s,W ; movwf FSR0L ; movf FSR1s,W ; movwf FSR1L ; swapf S_Temp,W ; movwf STATUS ; taasta kontekst ; swapf W_Temp,F ; swapf W_Temp,W retfie ;=============================================================================== ; ******* süsteemi taimeri katckestus - 8,192 ms ******* ;=============================================================================== TMR2int: bcf PIR1,TMR2IF decfsz _100mstaimer goto TMR2_1 movlw _100msaeg movwf _100mstaimer TMR2_1:; btfss SerialTimerOn ; goto TMR2_2 ; decfsz serialtimer ; goto TMR2_2 ; call reset_ser TMR2_2: btfss K0atON ; koormuse 0 viiteaja taimer goto TMR2_3 decfsz K0algusetmr goto TMR2_3 bsf K0atTO bcf K0atON TMR2_3: btfss K0ktON ; koormuse 0 korduse aja taimer goto TMR2_4 decfsz K0kordusetmr goto TMR2_4 bsf K0ktTO bcf K0ktON TMR2_4: btfss K0ptON ; koormuse 0 pulsi kestuse taimer goto TMR2_5 decfsz K0pulsitmr goto TMR2_5 bsf K0ptTO bcf K0ptON TMR2_5: btfss K1atON ; koormuse 1 viiteaja taimer goto TMR2_6 decfsz K1algusetmr goto TMR2_6 bsf K1atTO bcf K1atON TMR2_6: btfss K1ktON ; koormuse 1 korduse aja taimer goto TMR2_7 decfsz K1kordusetmr goto TMR2_7 bsf K1ktTO bcf K1ktON TMR2_7: btfss K1ptON ; koormuse 1 pulsi kestuse taimer goto TMR2_8 decfsz K1pulsitmr goto TMR2_8 bsf K1ptTO bcf K1ptON TMR2_8: btfss K2atON ; koormuse 2 viiteaja taimer goto TMR2_9 decfsz K2algusetmr goto TMR2_9 bsf K2atTO bcf K2atON TMR2_9: btfss K2ktON ; koormuse 2 korduse aja taimer goto TMR2_10 decfsz K2kordusetmr goto TMR2_10 bsf K2ktTO bcf K2ktON TMR2_10: btfss K2ptON ; koormuse 2 pulsi kestuse taimer goto TMR2_11 decfsz K2pulsitmr goto TMR2_11 bsf K1ptTO bcf K1ptON TMR2_11: btfss K3atON ; koormuse 3 viiteaja taimer goto TMR2_12 decfsz K3algusetmr goto TMR2_12 bsf K3atTO bcf K3atON TMR2_12: btfss K3ktON ; koormuse 3 korduse aja taimer goto TMR2_13 decfsz K3kordusetmr goto TMR2_13 bsf K3ktTO bcf K3ktON TMR2_13: btfss K3ptON ; koormuse 3 pulsi kestuse taimer goto TMR2_14 decfsz K3pulsitmr goto TMR2_14 bsf K3ptTO bcf K3ptON TMR2_14: return ;;=============================================================================== ;; ******* seriali taimeri katckestus - 16,384 ms ******* ;;=============================================================================== ;TMR0int: btfss INTCON,TMR0IE ; return ; call reset_ser ; return ;=============================================================================== ; ******* int on change katckestus - 1./2. kanali pulsi mõõtmine ******* ;=============================================================================== RCint: bcf T1CON,TMR1ON ; arvutamise ajax kell seisma bcf INTCON,IOCIF btfss IOCAF,.5 ; 1. kanal ? goto RC2int ; eip, 2. kanal hoopis RC1int: btfsc IOCAP,.5 ; pulss algas või lõppes (mida ootasime) ? goto RC1algus ; ootasime algust ja see tuligi RC1lõpp: bcf IOCAP,.5 ; saime lõpu kätte, ootame nüüd jälle tõusvat fronti (pulsi algust ) bsf IOCAN,.5 bcf LED movf TMR1H,W ; lahutame alati suuremast väiksema subwf strt1H,W btfss ZERO goto notequal1 movf TMR1L,W subwf strt1L,W btfss CARRY goto ccp1suurem notequal1: btfss CARRY goto ccp1suurem ccp1väiksem: movf strt1H,W ; strt-CCPR1 movwf pulse1H movf strt1L,W movwf pulse1L movf TMR1H,W movwf strt1H movf TMR1L,W subwf pulse1L,F movf strt1H,W btfss CARRY incfsz strt1H,W subwf pulse1H,F ; dest = dest - source, WITH VALID CARRY (although the Z flag is not valid). goto RC1end ; arvutatud ja updatetud ccp1suurem: movf TMR1H,W ; pulsi kestus = stardi aeg - lõpu aeg: TMR1-strt movwf pulse1H movf TMR1L,W movwf pulse1L movf strt1L,W subwf pulse1L,F movf strt1H,W btfss CARRY incfsz strt1H,W subwf pulse1H,F ; dest = dest - source, WITH VALID CARRY (although the Z flag is not valid). ; goto RC1end ; arvutatud ja updatetud ;- bait 1: juhtiv raadiokanal (0-puudub), bitt7=1 -> õige kestusega pulss leitud, baidid 2,3: radiokanali alumine ja baidid 4,5:ülemine piir (0-ei huvita), RC1end: bsf T1CON,TMR1ON movlw Koormus0+.0 ; kas juhtimine RCpulsi järgi ja kas vahemikus ? Sätib biti 7 püsti kui vahemikus call compare1 movlw Koormus1+.0 call compare1 movlw Koormus2+.0 call compare1 movlw Koormus3+.0 call compare1 return RC1algus: bcf IOCAP,.5 ; ootame nüüd langevat fronti bsf IOCAN,.5 movf TMR1H,W movwf strt1H movf TMR1L,W movwf strt1L bsf T1CON,TMR1ON bsf LED return ;=============================================================================== ; ******* int on change katckestus - 1./2. kanali pulsi mõõtmine ******* ;=============================================================================== RC2int: btfsc IOCAP,.4 ; pulss algas või lõppes (mida ootasime) ? goto RC2algus ; ootasime algust ja see tuligi RC2lõpp: bcf IOCAP,.4 ; saime lõpu kätte, ootame nüüd jälle tõusvat fronti (pulsi algust ) bsf IOCAN,.4 movf TMR1H,W ; lahutame alati suuremast väiksema subwf strt2H,W btfss ZERO goto notequal2 movf TMR1L,W subwf strt2L,W btfss CARRY goto ccp2suurem notequal2: btfss CARRY goto ccp2suurem ccp2väiksem: movf strt2H,W ; strt-TMR1 movwf pulse2H movf strt2L,W movwf pulse2L movf TMR1H,W movwf strt2H movf TMR1L,W subwf pulse2L,F movf strt2H,W btfss CARRY incfsz strt2H,W subwf pulse2H,F ; dest = dest - source, WITH VALID CARRY (although the Z flag is not valid). goto RC2end ; arvutatud ja updatetud ccp2suurem: movf TMR1H,W ; pulsi kestus = stardi aeg - lõpu aeg: TMR1-strt movwf pulse2H movf TMR1L,W movwf pulse2L movf strt2L,W subwf pulse2L,F movf strt2H,W btfss CARRY incfsz strt2H,W subwf pulse2H,F ; dest = dest - source, WITH VALID CARRY (although the Z flag is not valid). ; goto RC2end ; arvutatud ja updatetud ;- bait 1: juhtiv raadiokanal (0-puudub), bitt7=1 -> õige kestusega pulss leitud, baidid 2,3: radiokanali alumine ja baidid 4,5:ülemine piir (0-ei huvita), RC2end: bsf T1CON,TMR1ON movlw Koormus0+.0 ; kas juhtimine RCpulsi järgi ja kas vahemikus ? Sätib biti 7 püsti kui vahemikus call compare1 movlw Koormus1+.0 call compare1 movlw Koormus2+.0 call compare1 movlw Koormus3+.0 call compare1 return RC2algus: bcf IOCAP,.4 ; ootame nüüd langevat fronti bsf IOCAN,.4 movf TMR1H,W movwf strt2H movf TMR1L,W movwf strt2L bsf T1CON,TMR1ON return ;=============================================================================== ; ******* 1. kanali pulsi võrdlus ******* ;- bait 1: juhtiv raadiokanal (0-puudub), bitt7=1 -> õige kestusega pulss leitud, ; baidid 2,3: radiokanali alumine ja baidid 4,5:ülemine piir (0-ei huvita) ;=============================================================================== compare2: movwf FSR0L ; RC2 kanali jaoks movwf FSR1L ; et hiljem saaks mugavalt "vahemikus" lippu sättida movf INDF0,W sublw .2 ; kas juhtimine RC2 kanali pulsi järgi ? btfss ZERO return goto compare1_00 ; edasi ühine kood compare1: movwf FSR0L movwf FSR1L ; et hiljem saaks mugavalt "vahemikus" lippu sättida movf INDF0,W sublw .1 ; kas juhtimine RC1 kanali pulsi järgi ? btfss ZERO return ; eip ! compare1_00: incf FSR0L,F ; viitame pulsi min. kestusele movf INDF0,W movwf strt1H incf FSR0L,F movf INDF0,W movwf strt1L movf pulse1H,W ; pulsi kestuse High Byte subwf strt1H,W ; võrdle lubatuga movwf count movf pulse1L,W ; pulsi kestuse Low Byte sublw strt1L ; võrdle lubatuga btfss CARRY decf count iorwf count,W ; Check for Equal to Zero btfsc ZERO ; If Not Zero, Jump Over goto compare1_0 ; Equals, Jump to the Code btfsc count,.7 ; If Number is Negative, execute goto compare1_0 ; Else, Jump Over bcf INDF1,.7 ; kestus väiksem kui alumine piir return compare1_0: incf FSR0L,F ; viitame pulsi max. kestusele movf INDF0,W movwf strt1H incf FSR0L,F ; viitame pulsi min. kestusele movf INDF0,W movwf strt1L movf pulse1H,W ; pulsi kestuse High Byte subwf strt1H,W ; võrdle lubatuga movwf count movf pulse1L,W ; pulsi kestuse Low Byte sublw strt1L ; võrdle lubatuga btfss CARRY decf count iorwf count,W ; Check for Equal to Zero btfsc ZERO ; If Not Zero, Jump Over goto compare1_1 ; Equals, Jump to the Code btfsc count,.7 ; If Number is Negative, execute goto compare1_1 ; Else, Jump Over bsf INDF1,.7 ; kestus väiksem kui ülemine piir -> ON vahemikus ! return compare1_1: bcf INDF1,.7 ; kestus suurem kui ülemine piir return ;=============================================================================== ; ******* Seriali INT ******* ; 0x24,'S' või 'R' või 'G' ; Set Algus, SetLõpp - salvesta alguse või lõpu ajaks ;=============================================================================== SerInt: banksel PIR1 bcf PIR1,RCIF ; katkestuse nõue maha banksel .0 banksel RCSTA movf RCSTA,W ; oli viga? andlw .6 ; Viga vastuvõtul? Maskeeri tarbetud staatuse bitid banksel .0 btfss ZERO goto ser_err ; oli viga, alusta uuesti banksel RCREG movf RCREG,W banksel .0 movwf Char incf bytecnt,F movf bytecnt,W ; mitmes bait oli sublw .1 btfss ZERO goto ser2 movf Char,W ; esimene sublw FrameStart ; peab olema paketi alguse sümbol btfss ZERO goto reset_ser ; ei olnud, alusta uuesti goto RREnd1 ; oli, kuula edasi ser2: movf bytecnt,W sublw .2 btfss ZERO goto ser3 movf Char,W ; teine movwf Cmd ; see on käsk goto RREnd1 ; kuula edasi ser3: movf bytecnt,W sublw .3 btfss ZERO goto ser4 movf Char,W ; kolmas movwf CData ; see on parameeter goto RREnd1 ; kuula edasi ser4: movf bytecnt,W sublw .4 btfss ZERO goto ser_err ; miski jama, teavita movf Char,W ; neljas sublw FrameEnd ; peab olema paketi lõpu sümbol btfss ZERO goto ser_err ; ei olnud, teavita ja alusta uuesti call reset_ser ; käsk käes... bsf LED ; ...liputa ! movf Cmd,W ; mis käsk oli ? sublw cmdSet ; set ? btfsc ZERO goto CMDset ; oli set movf Cmd,W ; mis käsk oli ? sublw cmdRead ; read ? btfsc ZERO goto CMDread ; oli read movf Cmd,W ; mis käsk oli ? sublw cmdDur ; duration (otse etteandmine) ? btfsc ZERO goto CMDDur ; oli duration + parameeter movf Cmd,W ; mis käsk oli ? sublw cmddur ; duration (+/-) ? btfsc ZERO goto CMDdur ; oli duration (+/-) movf Cmd,W ; mis käsk oli ? sublw cmdgoto ; GOTO Algus/Lõpp ? btfsc ZERO goto CMDgoto ; oli GOTO goto ser_err ; vale käsk, teavita ja alusta uuesti ;=============================================================================== CMDset: movf CData,W ; Set Algus või Set Lõpp sublw 'A' btfsc ZERO goto setalgus ; salvesta hetke pulsi kestus alguseks movf CData,W sublw 'L' btfsc ZERO goto setlopp ; salvesta hetke pulsi kestus lõpu väärtusex goto ser_err ; miski viga... setalgus: movf duration,W movwf algus ; call Save_Setup ; seivi EEPROMi goto answer ; korda käsku vastuseks setlopp: movf duration,W movwf lõpp ; call Save_Setup ; seivi EEPROMi goto answer ; korda käsku vastuseks ;=============================================================================== CMDread: movf CData,W ; Read Algus või Set Lõpp sublw '1' btfsc ZERO goto rdch1 ; loe kanali 1 pulsi kestus movf CData,W sublw '2' btfsc ZERO goto rdch2 ; loe kanali 2 pulsi kestus goto ser_err ; miski viga... rdch1: movf pulse1H,W movwf CData movf pulse1L,W movwf CData1 goto answer ; vasta rdch2: movf pulse2H,W movwf CData movf pulse2L,W movwf CData1 goto answer ; vasta ;=============================================================================== CMDDur: movf CData,W ; loe pulsi kestus movwf duration ; kirjuta jooxvax väärtusex movwf CData goto answer ; ja vasta ;=============================================================================== CMDdur: movf CData,W ; kestus + või - sublw '+' btfsc ZERO goto durplus ; suurenda pulsi kestust movf CData,W sublw '-' btfsc ZERO goto durminus ; vähenda pulsi kestust goto ser_err ; miski viga... durplus: movf duration,W ; juba max ? sublw 0xFF btfsc ZERO goto durend ; juba max ! incf duration,F ; kestus + 1 goto durend durminus: movf duration,W ; juba min ? sublw 0x00 btfsc ZERO goto durend ; juba min ! decf duration,F ; kestus - 1 goto durend durend: movf duration,W movwf CData goto answer ; vasta ;=============================================================================== CMDgoto: movf CData,W ; GOTO Algus või Set Lõpp sublw 'A' btfsc ZERO goto gotoalgus ; lae alguse pulsi kestus movf CData,W sublw 'L' btfsc ZERO goto gotolopp ; lae lõpu pulsi kestus goto ser_err ; miski viga... gotoalgus: movf algus,W movwf duration goto gotoend gotolopp: movf lõpp,W movwf duration goto gotoend gotoend: movwf CData goto answer ; korda käsku vastuseks ;=============================================================================== answer: movlw FrameStart ; start, käsk, data, end call SendCHAR movf Cmd,W call SendCHAR movf CData,W call SendCHAR movf CData1,W call SendCHAR movlw FrameEnd call SendCHAR bcf LED return ;=============================================================================== ser_err: movlw FrameStart ; start, ?, ?, end call SendCHAR movlw '?' call SendCHAR movlw '?' call SendCHAR movlw FrameEnd call SendCHAR bcf LED return ;=============================================================================== reset_ser: clrf bytecnt ; - baitide loendi clrf TMR0 bcf INTCON,TMR0IF bcf INTCON,TMR0IE banksel RCSTA bcf RCSTA,CREN bsf RCSTA,CREN banksel RCREG movf RCREG,W banksel .0 bcf LED return ;=============================================================================== RREnd1: clrf TMR0 ; vahikoer valvesse: 16,384 ms pärast vesi peale... bcf INTCON,TMR0IF bsf INTCON,TMR0IE return ;=============================================================================== ; *** saadame W-registri sisu ***** ;=============================================================================== SendCHAR: btfss PIR1,TXIF ; saatja valmis ? goto SendCHAR banksel TXREG movwf TXREG ; saada! banksel TXSTA snd_exit1: btfss TXSTA,TRMT ; kas saatja nihkeregister tühi (bait prosest väljas)? goto snd_exit1 banksel .0 return ;=============================================================================== ; ********************** põhiluup ********************************************** ;=============================================================================== main: call init bsf INTCON,PEIE ; luba peripheral intsid bcf LED bsf INTCON,GIE ; luba Interrupts Global out1:; movlw Koormus0 ; call chk_koormus ; vaata kas seda koormust saab juhtida goto out1 btfss outpakt ; väljund aktiivseks goto out1a bcf PWM3 btfsc INDF1,.1 bsf PWM3 banksel TRISA bcf TRISPWM3 banksel .0 goto out2 out1a: btfss outppas goto out2 bsf PWM3 btfsc INDF1,.1 bcf PWM3 banksel TRISA bsf TRISPWM3 banksel .0 out2: movlw Koormus1 call chk_koormus btfss outpakt ; väljund aktiivseks goto out2a bcf OUT5 btfsc INDF1,.1 bsf OUT5 banksel TRISC bcf TRISOUT5 banksel .0 goto out3 out2a: btfss outppas goto out3 bsf OUT5 btfsc INDF1,.1 bcf OUT5 banksel TRISC bsf TRISOUT5 banksel .0 out3: movlw Koormus2 call chk_koormus btfss outpakt ; väljund aktiivseks goto out3a bcf OUT5 btfsc INDF1,.1 bsf PWM4 banksel TRISC bcf TRISPWM4 banksel .0 goto out4 out3a: btfss outppas goto out4 bsf PWM4 btfsc INDF1,.1 bcf PWM4 banksel TRISC bsf TRISPWM4 banksel .0 out4: movlw Koormus3 call chk_koormus btfss outpakt ; väljund aktiivseks goto out4a bcf OUT6 btfsc INDF1,.1 bsf OUT6 banksel TRISC bcf TRISOUT6 banksel .0 goto out1 out4a: btfss outppas goto out1 bsf OUT6 btfsc INDF1,.1 bcf OUT6 banksel TRISC bsf TRISOUT6 banksel .0 goto out1 ;=============================================================================== ; **** Koormuste juhtimine ;Koormused: 1- päästik, 2 - zoom+, 3 - zoom -, 4 - lamp ;Iga koormuse kohta: ;- bait 1: juhtiv raadiokanal (0-puudub), bitt7=1 -> õige kestusega pulss leitud, baidid 2,3: radiokanali alumine ja baidid 4,5:ülemine piir (0-ei huvita), ;- bait 6: lubav väljund (0- puudub, 1- päästik, 2- zoom+, 3 zoom-, 4 lamp), ;- bait 7: taimer ehk aeg tingimuste täitumise algusest (n*100ms), kui 0 siis kohe ! ;- bait 8: väljundpulsi kestus (n*100ms), ;- bait 9: bitt2: triger =1, tingimuste täitmise ajaks ainult=0, ; bitt 1: aktiivne nivoo (0 või 1), ; bitt 0: passiivne HIGH-z = 0, 1= TTL nivoo ;- bait 10: taimer ehk korduste vaheline aeg kui eelnevad tingimused täidetud (n*100ms, 0-puudub), (timelapse pildistamiseks) ;=============================================================================== chk_koormus: btfsc INDF0,.7 goto ONN OFF: bcf PWM3 return ONN: bsf PWM3 return ;chk_koormus: bcf outpakt ; bcf outppas ; movwf FSR0L ; addlw .8 ; movwf FSR1L ; hilisemaks koormuse parameetrite kontrolliks ; movf INDF0,W ; andlw 0x7F ; btfsc ZERO ; goto koormus_outp ; ei juhita RC-pulsi järgi ; btfsc INDF0,.7 ; goto koormus_outp ; on juhtimine RC-pulsi järgi ja pulss on vahemikus ; btfsc K0ptON ; ei ole vahemikus, tee off aga alles siis kui pulss läbi ; goto pulse_on ; pulss tixub, oota lõppu ; goto koormus_off ; pulss läbi, tee kohe OFF ;koormus_outp: movlw .5 ; addwf FSR0L,F ; viita juhtivale väljundile ; movf INDF0,W ; btfss ZERO ; goto kX ; incf FSR0,F ; incf FSR0,F ; viita korduste taimerile ; goto no_output ; ei ole lubavat/tüürivat väljundit ;kX: movf INDF0,W ; milline koormus tüürib ? ; andlw 0x7F ; sublw .1 ; päästik ? ; btfss ZERO ; goto koormus_w2 ; eip ; bcf outpstat ; kopeeri tüüriva väljundi seis outpstat-lippu ; btfsc PWM3 ; bsf outpstat ; goto koormus_alev ; edasi uuri aktiivset nivood ;koormus_w2: movf INDF0,W ; andlw 0x7F ; sublw .2 ; Zoom+ ? ; btfss ZERO ; goto koormus_w3 ; eip ; bcf outpstat ; kopeeri tüüriva väljundi seis outpstat-lippu ; btfsc OUT5 ; bsf outpstat ; goto koormus_alev ; edasi uuri aktiivset nivood ;koormus_w3: movf INDF0,W ; andlw 0x7F ; sublw .3 ; Zoom- ? ; btfss ZERO ; goto koormus_w4 ; eip ; bcf outpstat ; kopeeri tüüriva väljundi seis outpstat-lippu ; btfsc PWM4 ; bsf outpstat ; goto koormus_alev ; edasi uuri aktiivset nivood ;koormus_w4: movf INDF0,W ; andlw 0x7F ; sublw .4 ; OUT6 ? ; btfss ZERO ; return ; eip - siis exiteerime sest nii ei saa olla ; bcf outpstat ; kopeeri tüüriva väljundi seis outpstat-lippu ; btfsc OUT6 ; bsf outpstat ;; goto koormus_alev ; edasi uuri aktiivset nivood ;koormus_alev: btfss INDF1,.1 ; jah, milline on aktiivne nivoo ? ; goto koormus_outp_0 ;koormus_outp_1: btfss outpstat ; aktiivne HIGH, kas on ka nii ? ; goto koormus_off1 ; passiivne, teeme off kui just pole trigeri režiimis (on ja off) ;koormus_outp_11:incf FSR0L,F ; on aktiivne, kas lülitada kohe või viitega ? ; movf INDF0,W ; btfsc ZERO ; goto no_delay ; lülitame kohe ; btfsc K0atON ; viitega. Kas viitetaimer juba käib ? ; goto delay_on ; jah ; movf INDF0,W ; ei veel, lae taimer ; movwf K0algusetmr ; bcf K0atTO ; bsf K0atON ; taimer tixuma ; return ; ilmselt pole tingimus täidetud seega eksiteerime ;koormus_outp_0: btfsc outpstat ; aktiivne LOW, kas on ka nii ? ; goto koormus_off1 ; passiivne, teeme off kui just pole trigeri režiimis (on ja off) ; goto koormus_outp_11 ;delay_on: btfss K0atTO ; alguseviide möödas ? ; return ; eip, exiteerime ;no_delay: bcf K0atON ; viitetaimer OFF ; bcf K0atTO ; taimauti ei ole enam ; incf FSR0,F ; viita korduste arvule ;no_output: ; movf INDF0,W ; korduste aeg (timelapse) ; ; btfsc ZERO ; ; goto no_retries ; ühekordne ; ; goto no_retries ; hetkel ei oska teha... ; ; ;no_retries: ; incf FSR0,F ; viita pulsi kestusele ; btfsc K0ptON ; pulss juba jooxeb ? ; goto pulse_on ; jah ; movf INDF0,W ; ei veel, lae taimer ; movwf K0pulsitmr ; bcf K0ptTO ; bsf K0ptON ; taimer tixuma ;;- bait 10: bitt2: triger =1, tingimuste täitmise ajaks ainult=0, ;; bitt 1: aktiivne nivoo (0 või 1), ;; bitt 0: passiivne HIGH-z = 0, 1= TTL nivoo ; bsf outpakt ; ja väljund aktiivsex ; return ; ilmselt pole tingimus täidetud seega eksiteerime ;pulse_on: btfss K0ptTO ; aeg täis ? ; return ; ei veel ;koormus_off: ;koormus_off1: bsf outppas ; ja väljund passiivsex ; bcf K0ptTO ; bcf K0ptON ; taimer stopp ;;INCF FSR,F, loe korduste vaheline paus ja rakenda kui ei ole 0 ; return ;=============================================================================== ; **** EEPROMi funktsioonid ;=============================================================================== ;=============================================================================== ; **** Loeb parameetrid (temperatuurid) EEPROMist ja kirjutab süsteemi ;=============================================================================== read_setup: movlw LOW(e_koormus0) ; konfi baidid koodimälus BANKSEL PMADRL ; Select Bank for PMCON registers MOVWF PMADRL movlw HIGH(e_koormus0) andlw 0x0F movwf PMADRH banksel .0 movlw .40 movwf count movlw Koormus0 movwf FSR0L clrf FSR0H rs_luup: call riid movf CData,W movwi INDF0++ decfsz count goto rs_luup ;=============================================================================== btfss (Koormus0+.9),.0 ; sätib pordid ja neisse kõigisse passiivsed nivood goto k0tris banksel TRISA bcf TRISA,.2 ; on TTL ehk port väljund banksel .0 goto k0out k0tris: banksel TRISA bsf TRISA,.2 ; on HIGH-Z väljund, port sisendiks banksel .0 k0out: bcf PWM3 btfss (Koormus0+.9),.1 bsf PWM3 ;=============================================================================== k1: btfss (Koormus1+.9),.0 ; koormus 1 goto k1tris banksel TRISC bcf TRISC,.0 ; on TTL ehk port väljund banksel .0 goto k1out k1tris: banksel TRISC bsf TRISC,.0 ; on HIGH-Z väljund, port sisendiks banksel .0 k1out: bcf OUT5 btfss (Koormus1+.9),.1 bsf OUT5 ;=============================================================================== k2: btfss (Koormus2+.9),.0 ; koormus 2 goto k2tris banksel TRISC bcf TRISC,.1 ; on TTL ehk port väljund banksel .0 goto k2out k2tris: banksel TRISC bsf TRISC,.1 ; on HIGH-Z väljund, port sisendiks banksel .0 k2out: bcf PWM4 btfss (Koormus2+.9),.1 bsf PWM4 ;=============================================================================== k3: btfss (Koormus3+.9),.0 ; koormus 3 goto k3tris banksel TRISC bcf TRISC,.2 ; on TTL ehk port väljund banksel .0 goto k3out k3tris: banksel TRISC bsf TRISC,.2 ; on HIGH-Z väljund, port sisendiks banksel .0 k3out: bcf OUT6 btfss (Koormus3+.9),.1 bsf OUT6 return ;=============================================================================== riid: banksel PMCON1 BCF PMCON1,CFGS ; Do not select Configuration Space BSF PMCON1,RD ; Initiate read NOP ; Ignored (Figure 10-2) NOP ; Ignored (Figure 10-2) banksel PMADRL incf PMADRL,F ; järgmine aadress banksel PMDATL MOVF PMDATL,W ; Get LSB of word banksel .0 MOVWF CData ; Store in user location return ;=============================================================================== ; *********************************** kirjutab konfi EEPROMi ******************* ;=============================================================================== wr_setup:; movlw e_koormus0 ; konfi baidid EEPROMis ; banksel EEADR ; movwf EEADR ; clrf EEADRH ; banksel .0 ; movlw .40 ; movwf count ; movlw Koormus0 ; movwf FSR0L ; clrf FSR0H ;wr_luup: movf INDF0,W ; call wr ; incf FSR0L,F ; decfsz count ; goto wr_luup ; return ; ;wr: ; banksel EEADR ; movwf EEDAT ; bsf EECON1,WREN ; luba kirjutamine ; movlw 55h ; lukust lahti ; movwf EECON2 ; movlw 0AAh ; movwf EECON2 ; bsf EECON1,WR ;wr_w_eeprom1: btfsc EECON1,WR ; ootame kirjutamise lõppu ; goto wr_w_eeprom1 ; bcf EECON1,WREN ; keela kirjutamine ; incf EEADR,F ; banksel .0 return ;=============================================================================== ; ******* Start ja init ******* ;=============================================================================== ;=============================================================================== ; ******* initsialiseerimine ******* ;=============================================================================== init: banksel OSCCON movlw b'01110010' ; sisemine 8 MHz oss movwf OSCCON ; **** WDT-d ei pruugi **** banksel .0 ; clrwdt ; WDT nullida clrf STATUS ; nullime kõik võimaliku clrf INTCON clrf PCLATH ; **** konf **** banksel OPTION_REG movlw b'00000100' movwf OPTION_REG ; WPUEN ON, langev front, TMR0 Fosc/4, x, prescaler 1:128 prescaler TMR0-le ; **** pordid **** banksel TRISA movlw B'11111011' ; sisendid/väljundid movwf TRISA movlw B'11101111' movwf TRISB movlw B'00000000' movwf TRISC movlw 0x00 banksel PORTA movwf PORTA ; movwf PORTB ; movwf PORTC ; banksel LATA movwf LATA ; movwf LATB ; movwf LATC ; banksel CM1CON0 movlw 0x04 movwf CM1CON0 ; analoog komparaator välja movwf CM2CON0 movlw 0x34 movwf CM1CON1 movwf CM2CON1 banksel ANSELA movlw 0x00 movwf ANSELA ; kõik digi movwf ANSELB movwf ANSELC banksel ADCON0 movwf ADCON0 ; A/D off banksel FVRCON movwf FVRCON ; tugipinge allikas off banksel DACCON0 movwf DACCON0 movwf DACCON1 banksel WPUA movwf WPUA ; pull-upid maha movwf WPUB bsf WPUB,.5 ; RX-le pull-up movlw 0xC0 ; pordid sellisesse lähteseisu banksel PORTA movwf PORTA movlw b'11100000' movwf PORTB movlw b'00000000' movwf PORTC bsf LED ;---- serial port -------------- ; USARTi häälestus banksel BAUDCON movlw b'00001000' ; BRG16=1 movwf BAUDCON banksel RCSTA movlw B'10010000' ; 8-bitine vv, ADDEN off movwf RCSTA banksel SPBRGL movlw .25 ; baudrate = 19200 @ 8MHz movwf SPBRGL movlw B'00100010' ; 8 bitine saade, BRGH low speed,asynchronous,saatja ON movwf TXSTA banksel .0 bsf PIR1,TXIF banksel .0 movlw 0x5E ; killime mälu sisu movwf Char movlw memstart+.1 movwf FSR0L clrf FSR0H km: clrf INDF0 incf FSR0L,F decfsz Char goto km call reset_ser ; **** setup **** call read_setup ; loe setup movlw _100msaeg movwf _100mstaimer ; **** Timer 1 **** movlw b'00010100';1' ; 1/2 prescaler, int osc, GO ! movwf T1CON ; mõõdab RC-pulsi kestust 1us täpsusega bcf PIR1,TMR1IF clrf TMR1L clrf TMR1H ; **** Timer 2 **** movlw b'00000111' ; 1/64 prescaler, GO ! movwf T2CON bcf PIR1,TMR2IF ; ületäit. lipp clrf TMR2 movlw 0xFF movwf PR2 ; **** WDT **** ; clrwdt ; WDT nullida ; **** katkestused **** banksel PIE1 clrf PIE1 clrf PIE2 bcf PIE1,TMR1IE bsf PIE1,RCIE ; luba seriali int bsf PIE1,TMR2IE ; ja TMR2 int (süsteemi taimer) banksel .0 clrf INTCON ; clear int. flags clrf PIR1 clrf PIR2 bsf INTCON,IOCIE ; luba RC-sisendite int-on-change katckestus movf PORTA,W bcf INTCON,IOCIF banksel IOCAF clrf IOCAF clrf IOCBF banksel IOCAP movlw 0x30 movwf IOCAP ; int on change vaid vastuvõtja sisenditele. Ootame + fronti movwf IOCAN ; clrf IOCAN clrf IOCBP clrf IOCBN ; bsf INTCON,PEIE ; luba peripheral intsid ; bcf LED ; bsf INTCON,GIE ; luba Interrupts Global return ; ************************************************************************************************************* ; ************ Konfi mälu ************************************************************************************* ; ************************************************************************************************************* ;Koormused: 1- päästik, 2 - zoom+, 3 - zoom -, 4 - lamp ;Iga koormuse kohta: ;- bait 1: juhtiv raadiokanal (0-puudub), baidid 2,3: radiokanali alumine ja baidid 4,5:ülemine piir (0-ei huvita), ;- bait 6: lubav väljund (0- puudub, 1- päästik, 2- zoom+, 3 zoom-, 4 lamp), ;- bait 7: taimer ehk aeg tingimuste täitumise algusest (n*100ms), ;- bait 8: taimer ehk korduste vaheline aeg kui eelnevad tingimused täidetud (n*100ms, 0-puudub), ;- bait 9: väljundpulsi kestus (n*100ms), ;- bait 10: bitt2: triger =1, tingimuste täitmise ajaks ainult=0, ; bitt 1: aktiivne nivoo (0 või 1), ; bitt 0: passiivne HIGH-z = 0, 1= TTL nivoo ; ;Näide: 0, 0,0, 4, 2, 0, 5,1 - päästik juhitav lambi väljundiga, 2s peale lambi aktiveerumist, 500ms pulss, ainult siis kui tingimused täidetud,aktiivne 0, ei ole lahtine kollektor ;Näide: 1, 1200,1400, 0, 0, 0, 40,3 - lamp, juhitav RC1 kanalist, kestus 1200..1400us, lubavad väljundid puuduvad, taimerid puuduvad, pulsi kestus 4 sekundit, ainult siis kui tingimused täidetud, aktiivne nivoo 1, TTL. org 0xA00 ; konfi mälu sisu e_koormus0: retlw 0x01 ; päästik: juhib RC-1 kanal retlw 0x00 retlw 0x00 retlw 0x00 retlw 0x00 retlw 0x04 retlw 0x14 retlw 0x00 retlw 0x05 retlw 0x00 e_koormus1: retlw 0x01 ; zoom +: juhib RC kanal1, aktiivne vahemikus 1200..1400 us,teised ei mõju, mõjub kohe,ei kordu,200us pulss,aktiivne 0, high-z retlw 0x04 retlw 0xB0 retlw 0x05 retlw 0x78 retlw 0x00 retlw 0x00 retlw 0x00 retlw 0x02 retlw 0x00 e_koormus2: retlw 0x01 ; zoom -: juhib RC kanal1, aktiivne vahemikus 1600..1800 us,teised ei mõju, mõjub kohe,ei kordu,200us pulss,aktiivne 0, high-z retlw 0x06 retlw 0x40 retlw 0x07 retlw 0x08 retlw 0x00 retlw 0x00 retlw 0x00 retlw 0x02 retlw 0x00 e_koormus3: retlw 0x02 ; lamp: juhib RC kanal2, aktiivne vahemikus 1600..1800 us,teised ei mõju, mõjub kohe,ei kordu,5s pulss,aktiivne 1, TTL retlw 0x06 retlw 0x40 retlw 0x07 retlw 0x08 retlw 0x00 retlw 0x00 retlw 0x00 retlw 0x32 retlw 0x03 END ; __CONFIG _CONFIG1, _FOSC_INTOSC & _WDTE_OFF & _PWRTE_ON & _MCLRE_ON & _CP_OFF & _BOREN_OFF & _CLKOUTEN_OFF & _IESO_OFF & _FCMEN_OFF ; __CONFIG _CONFIG2, _WRT_OFF & _LPBOR_OFF & _STVREN_OFF & _BORV_HI & _LVP_OFF ;******************************************************************************