LIST P=12C508A,R=HEX ; ; MIXER FOR DLETA WIND & V-TAIL ; SUN, PU-NENG ; ; ; ; ; VERSION 1.0 (MAY/09/2004) 12C508A ; ; Mixing Y with X, a proportion of ChY is bi-directionally mixed with ChX ; d ChA = (Q(d ChX) + R(d ChY)) ; d ChB = (Q(d ChX) - R(d ChY)) ; ; where Q, R are the mixing ratio, 1 OR 0.5 ; ; JUMP1 JUMP2 Q Rr ; Off Off 1 1 (DEFAULT) ; Off On 1 0.5 ; On Off 0.5 1 ; On On 0.5 0.5 ; ; ChA GPIO4 ,OUTPUT ; ChB GPIO5 ,OUTPUT ; ChX GPIO2 ,INPUT ; ChY GPIO3 ,INPUT ; JUMP1 GPIO0--GND, ON=GND ; JUMP2 GPIO1--GND, ON=GND ; ; ; PROGRAMMER SETUP AS: OSC= IntRC, WDT= SET, CP= BLANK, MCLR= BLANK ; __CONFIG H'0FEE' ; ; DEFINE RAM ;----- SYSTEM --------- TMR0 EQU 1 ;TIMER 0 PCL EQU 2 ;PROGRAM COUNTER STATUS EQU 3 FSR EQU 4 ;BUFFER OF INDIRECT ADDR OSCCAL EQU 5 GPIO EQU 6 ; RP0 EQU 5 ;--------------------------- ; ;---- USER registers DEFINE ------ ; TMR1 EQU H'11' ; TMR2 EQU H'12' ; ChX EQU H'13' ; ChY EQU H'14' ChA EQU H'15' ChB EQU H'16' FLAGR EQU H'17' ;FLAG REGISTER X1 EQU H'1A' ; Y1 EQU H'1B' X EQU H'1C' ; Y EQU H'1D' ; ; ;---- VARIABLES DEFINE ---- ; W EQU 0 ;d VALUE FOR INCF...... F EQU 1 ;d VALUE NOISE EQU H'50' ;PULSE LESS THEN THIS DEFINE AS NOISE T1 EQU H'3C' ;60 * 100uS LOOP ;-------FLAG QQ EQU 0 ; RR EQU 1 FIR EQU 2 ; ;---- HARDWARE PINS DEFINE ---- ; ChA1 EQU 4 ChB1 EQU 5 ChXI EQU 2 ChYI EQU 3 SW1 EQU 0 SW2 EQU 1 ; ;========== MAIN PROGRAM ========= ; ORG 0 MOVWF OSCCAL ; ;-------SETUP (LL2=1,POINT=150) START MOVLW B'00001111' ;PA<5:2>=INPUT, OTHERS =OUTPUT TRIS GPIO MOVLW H'80' ;T0CS=0,ENABLE GP2, ENABLE GPPU0,1,3 OPTION ; CLRF GPIO ;SET ALL OUTPUT LOW ;--------------------------------- CLRF GPIO CLRF FLAGR BTFSS GPIO,SW1 ;SW OPEN=HIGH,QQ=0 BSF FLAGR,QQ BTFSS GPIO,SW2 BSF FLAGR,RR ;--------------------------------------------- ;-----------Who first ;-------WHEN VALID PULSE GO THROUGH, IS THERE > 6 mS BETWEEN? ;-------IF NOT, EXCHANGE THE SEQUENCE ; W1 CLRWDT BTFSS GPIO,2 GOTO W1 CLRF TMR1 ;READ INPIN PULSE WEITH W2 INCF TMR1,F ;START LOOP CLRWDT NOP ;10 uS LOOP NOP NOP NOP NOP BTFSC GPIO,2 ;UNTIL INPIN GO LOW GOTO W2 ;END LOOP W3 MOVLW NOISE SUBWF TMR1,W SKPC ;IF f > w, C= 1,SKIP GOTO W1 ;ELSE IT'S NOISE, CLRF TMR2 ;READ INPIN PULSE WEITH W4 INCF TMR2,F ;START LOOP CLRWDT MOVLW 0x21 MOVWF TMR1 W5 DECFSZ TMR1,F ;(3uS * 33)+7=106 uS LOOP GOTO W5 BTFSS GPIO,3 ;UNTIL INPIN GO HIGH GOTO W4 ; W6 CLRF TMR1 ;READ INPIN PULSE WEITH W7 INCF TMR1,F ;START LOOP CLRWDT NOP ;10 uS LOOP NOP NOP NOP NOP BTFSC GPIO,3 ;UNTIL INPIN GO LOW GOTO W7 ;END LOOP W8 MOVLW NOISE SUBWF TMR1,W SKPC ;IF f > w, C= 1,SKIP GOTO W1 ;ELSE IT'S NOISE, back to w1 W9 MOVLW T1 SUBWF TMR2,W SKPC ;IF f > w, C= 1,JUMP GOTO W101 ; BCF FLAGR,FIR ; PIN3 GO FIRST GOTO R101 ;-------------------------------- W101 CLRWDT BTFSS GPIO,3 GOTO W101 CLRF TMR1 ;READ INPIN PULSE WEITH W102 INCF TMR1,F ;START LOOP CLRWDT NOP ;10 uS LOOP NOP NOP NOP NOP BTFSC GPIO,3 ;UNTIL INPIN GO LOW GOTO W102 ;END LOOP W103 MOVLW NOISE SUBWF TMR1,W SKPC ;IF f > w, C= 1,SKIP GOTO W101 ;ELSE IT'S NOISE, CLRF TMR2 ;READ INPIN PULSE WEITH W104 INCF TMR2,F ;START LOOP CLRWDT MOVLW 0x21 MOVWF TMR1 W105 DECFSZ TMR1,F ;(3uS * 33)+7=106 uS LOOP GOTO W105 BTFSS GPIO,2 ;UNTIL INPIN GO HIGH GOTO W104 ; W106 CLRF TMR1 ;READ INPIN PULSE WEITH W107 INCF TMR1,F ;START LOOP CLRWDT NOP ;10 uS LOOP NOP NOP NOP NOP BTFSC GPIO,2 ;UNTIL INPIN GO LOW GOTO W107 ;END LOOP W108 MOVLW NOISE SUBWF TMR1,W SKPC ;IF f > w, C= 1,SKIP GOTO W101 ;ELSE IT'S NOISE, back to w1 W109 MOVLW T1 SUBWF TMR2,W SKPC ;IF f > w, C= 1,JUMP GOTO W1 ; BSF FLAGR,FIR ; PIN2 GO FIRST GOTO R1 ;--------------------------------------------------- ;-------READ VALID PULSES, LIMIT THE NUMBER 100<200 ;-------PUT NUMBERS IN X, Y REGISTERS R1 CLRWDT BTFSS GPIO,2 GOTO R1 CLRF TMR1 ;READ INPIN PULSE WEITH R2 INCF TMR1,F ;START LOOP CLRWDT NOP ;10 uS LOOP NOP NOP NOP NOP BTFSC GPIO,2 ;UNTIL INPIN GO LOW GOTO R2 ;END LOOP R3 MOVLW NOISE SUBWF TMR1,W SKPC ;IF f > w, C= 1,SKIP GOTO R1 ;ELSE IT'S NOISE, MOVLW .99 SUBWF TMR1,W SKPC ;IF f > w, C= 1, SKIP GOTO R31 ;ELSE TMR1 < 100, MOVLW .200 SUBWF TMR1,W SKPC ;IF f > w, C= 1, SKIP GOTO R4 ;ELSE TMR1 >200, MOVLW .200 MOVWF TMR1 GOTO R4 R31 MOVLW .100 MOVWF TMR1 R4 MOVF TMR1,W ;ChXI IS FIRST MOVWF X R5 CLRWDT BTFSS GPIO,3 GOTO R5 CLRF TMR1 ;READ INPIN PULSE WEITH R6 INCF TMR1,F ;START LOOP CLRWDT NOP ;10 uS LOOP NOP NOP NOP NOP BTFSC GPIO,3 ;UNTIL INPIN GO LOW GOTO R6 ;END LOOP R7 MOVLW NOISE SUBWF TMR1,W SKPC ;IF f > w, C= 1,SKIP GOTO R5 ;ELSE IT'S NOISE, READ FIRST AGAIN MOVLW .99 SUBWF TMR1,W SKPC ;IF f > w, C= 1, SKIP GOTO R71 ;ELSE TMR1 < 100, MOVLW .200 SUBWF TMR1,W SKPC ;IF f > w, C= 1, SKIP GOTO R8 ;ELSE TMR1 >200, MOVLW .200 MOVWF TMR1 GOTO R8 R71 MOVLW .100 MOVWF TMR1 R8 MOVF TMR1,W ;ChXI NOT FIRST MOVWF Y GOTO C10 ;------------------ R101 CLRWDT BTFSS GPIO,3 GOTO R101 CLRF TMR1 ;READ INPIN PULSE WIDTH R102 INCF TMR1,F ;START LOOP CLRWDT NOP ;10 uS LOOP NOP NOP NOP NOP BTFSC GPIO,3 ;UNTIL INPIN GO LOW GOTO R102 ;END LOOP R103 MOVLW NOISE SUBWF TMR1,W SKPC ;IF f > w, C= 1,SKIP GOTO R101 ;ELSE IT'S NOISE, MOVLW .99 SUBWF TMR1,W SKPC ;IF f > w, C= 1, SKIP GOTO R131 ;ELSE TMR1 < 100, MOVLW .200 SUBWF TMR1,W SKPC ;IF f > w, C= 1, SKIP GOTO R104 ;ELSE TMR1 >200, MOVLW .200 MOVWF TMR1 GOTO R104 R131 MOVLW .100 MOVWF TMR1 R104 MOVF TMR1,W ;ChXI IS FIRST MOVWF Y R105 CLRWDT BTFSS GPIO,2 GOTO R105 CLRF TMR1 ;READ INPIN PULSE WIDTH R106 INCF TMR1,F ;START LOOP CLRWDT NOP ;10 uS LOOP NOP NOP NOP NOP BTFSC GPIO,2 ;UNTIL INPIN GO LOW GOTO R106 ;END LOOP R107 MOVLW NOISE SUBWF TMR1,W SKPC ;IF f > w, C= 1,SKIP GOTO R105 ;ELSE IT'S NOISE, READ FIRST AGAIN MOVLW .99 SUBWF TMR1,W SKPC ;IF f > w, C= 1, SKIP GOTO R171 ;ELSE TMR1 < 100, MOVLW .200 SUBWF TMR1,W SKPC ;IF f > w, C= 1, SKIP GOTO R108 ;ELSE TMR1 >200, MOVLW .200 MOVWF TMR1 GOTO R108 R171 MOVLW .100 MOVWF TMR1 R108 MOVF TMR1,W ;ChXI NOT FIRST MOVWF X GOTO C10 ;------------------ ;--------------------------------------------------- ;-------GET ChA, ChB FROM X,Y,q,r C10 CLRWDT BTFSC FLAGR,QQ ;q=0, NORAL GOTO C30 BTFSC FLAGR,RR GOTO C20 ;-------------------------- MOVLW .50 ;QQ=0, RR=0 SUBWF X,W MOVWF X1 ; XX=X-50 MOVLW .100 SUBWF Y,W MOVWF Y1 ; YY=Y-100 ADDWF X1,W ; MOVWF ChA ; A=(X-50)+(Y-100) MOVLW .50 ; ADDWF X,W MOVWF X1 ; XX=X+50 MOVF Y1,W SUBWF X1,W MOVWF ChB ; B=(X+50)-(Y-100) GOTO P1 ;----------------------------- C20 MOVLW .25 ;QQ=0, RR=1 SUBWF X,W MOVWF X1 ; XX=X-25 MOVLW .100 SUBWF Y,W MOVWF Y1 ; YY=Y-100 BCF STATUS,0 RRF Y1,F ;YY=(Y-100)/2 MOVF Y1,W ADDWF X1,W ; MOVWF ChA ; A=(X-25)+((Y-100)/2) MOVLW .25 ; ADDWF X,W MOVWF X1 ; XX=X+25 MOVF Y1,W SUBWF X1,W MOVWF ChB ; B=(X+25)-((Y-100)/2) GOTO P1 ;--------------------------------- C30 BTFSC FLAGR,RR ; GOTO C40 ;-------------------------- MOVLW .100 ;QQ=1,RR=0 SUBWF X,W MOVWF X1 BCF STATUS,0 RRF X1,F ; XX=(X-100)/2 MOVLW .100 SUBWF Y,W MOVWF Y1 ; YY=Y-100 MOVLW .75 ADDWF X1,W ADDWF Y1,W MOVWF ChA ; A=75+((X-100)/2)+(Y-100) MOVLW .175 ; ADDWF X1,F MOVF Y1,W SUBWF X1,W MOVWF ChB ; B=175+((X-100)/2)-(Y-100) GOTO P1 ;--------------------------------- C40 MOVF X,W ;QQ=1, RR=1 MOVWF X1 BCF STATUS,0 RRF X1,F ; XX=X/2 MOVF Y,W MOVWF Y1 BCF STATUS,0 RRF Y1,F ;YY=Y/2 MOVF Y1,W ;RRF DO NOT INVOLVE W ADDWF X1,W ; MOVWF ChA ; A=(X/2)+(Y/2) MOVLW .150 ; ADDWF X1,F MOVF Y1,W SUBWF X1,W MOVWF ChB ; B=(150+(X/2))-(Y/2) GOTO P1 ; ;------------------------------- ;-------RESTRICT ChA, ChB BETWEEN 100~200 ;-------AND OUTPUT ChA, ChB (*10uS) TO PIN 0,1 P1 CLRWDT MOVLW .99 SUBWF ChA,W SKPC ;IF f > w, C= 1, SKIP GOTO P11 ;ELSE TMR1 < 100, MOVLW .200 SUBWF ChA,W SKPC ;IF f > w, C= 1, SKIP GOTO P12 ;ELSE TMR1 >200, MOVLW .200 MOVWF ChA GOTO P12 P11 MOVLW .100 MOVWF ChA ;------------------ P12 MOVLW .99 SUBWF ChB,W SKPC ;IF f > w, C= 1, SKIP GOTO P13 ;ELSE TMR1 < 100, MOVLW .200 SUBWF ChB,W SKPC ;IF f > w, C= 1, SKIP GOTO P15 ;ELSE TMR1 >200, MOVLW .200 MOVWF ChB GOTO P15 P13 MOVLW .100 MOVWF ChB ;-------------------- P15 BSF GPIO,ChA1 P2 CLRWDT ;10uS LOOP NOP NOP NOP NOP NOP NOP DECFSZ ChA,F GOTO P2 ; END OF LOOP BCF GPIO,ChA1 BSF GPIO,ChB1 P3 CLRWDT ; 10uS LOOP NOP NOP NOP NOP NOP NOP DECFSZ ChB,F GOTO P3 ; END OF LOOP BCF GPIO,ChB1 BTFSC FLAGR,FIR GOTO R1 ;MAIN PROGRAM LOOP GOTO R101 ;========================================================== END