;******************************************** ;*RUDDER DISPLAY/SENDER/DIMMER CONTROL UNIT! * ;******************************************** LIST P=16F57 ; ;16MHZ=.25uS/INSTR INDF EQU 0X00 TMR0 EQU 0X01 PCL EQU 0X02 STATUS EQU 0X03 FSR EQU 0X04 PORTA EQU 0X05 PORTB EQU 0X06 PORTC EQU 0X07 CDSCNT EQU 0X08 ;FOR OCC CDS SCAN TEMP EQU 0X09 ; W EQU 0X0A TIMER0 EQU 0X0B TIMER1 EQU 0X0C SSTATUS EQU 0X0D ;BIT 4 =DAYMODE FLAG BIT5=CDS LEV SET DATA TO ;DASHPIC ( CAN BE OVER WRITTEN BY PEDPIC ) DIMCNT EQU 0X0E DIM EQU 0X0F DIMSTP EQU 0X10 ADRUD EQU 0X11 RUDOLD EQU 0X12 CDSOLD EQU 0X13 CDSORG EQU 0X14 DASH EQU 0X15 DASHSTP EQU 0X16 DASHCNT EQU 0X17 RUDORG EQU 0X18 CDSBUF EQU 0X19 ;ESTIMATED DARK LEVEL(20K TO 200 OHMS) ;CAN BE UPDATED BY DASHPIC, AS WELL AS ;IS SENT TO DASHPIC FOR LOGGING REASONS RUDFINE EQU 0X1A ;PRIMARY GOAL:CHECK ANALOGUE INPUT AND CONVERT TO RUDDER LED ;GET CDSBUF FROM DASHPIC, OTHERWISE USE DEFAULT START ORG 07FF NOP ORG 0X00 MOVLW B'11111111' ;U/D IN TRIS PORTA MOVLW B'11110000' ;...&LEDS TRIS PORTB MOVLW B'11100011' ;C6 STARTS AS HI IMP TRIS PORTC MOVLW B'00000111' ;SETS FOR BULB OPTION CLRF SSTATUS MOVLW .200 ;A ROUGH GUESS, CAN BE SET FROM DASHPIC MOVWF CDSBUF CLRF DIMCNT MOVLW 0X3F MOVWF DIM MOVLW .8 ;8 IS CENTER OF FINE TUNE FROM DASH ;>8 INCREASES STARBORD POSITION,,,, MOVWF RUDFINE BTFSS PORTA,0 ;GOTO SET ROUTINE IF POWERED UP WITH UP PRESSED GOTO CDSSET BTFSS PORTA,1 ;GOTO AUTO-SET CDS LEV( BASED ON PRESENT LIGHT) GOTO CDSAUTO CSR NOP ;RETURN BCF SSTATUS,5 GOTO SPLASH ;--------- RUDDIM INCFSZ DIMCNT ;TURN ON IF 0 GOTO DITEST1 MOVF ADRUD,W MOVWF PORTB ;1 TO 15, 0 IS ALL OFF(BEFORE BIT3 INVERT) BTFSC SSTATUS,4 ;TURN OFF DASH IN DAYMODE GOTO DITEST1 MOVLW 0X01 ;[**NEW**] TO TURN OFF DASH LIGHTING WITH DIM SW XORWF DIM,W BTFSC STATUS,2 ;SKIP IF NO MATCH GOTO DITEST1 BSF PORTC,4 BSF PORTC,3 DITEST1 ;CHECKS WHETHER TURN OFF RUDD LEDS YET MOVF DIM,W XORWF DIMCNT,W BTFSS STATUS,2 ;SKIP IF YES() GOTO NEXT BCF PORTC,4 MOVLW 0X08 ;TURNS OFF LEDS FOR DIM STROBE BTFSS SSTATUS,4 ;SKIP IF IN "DAY " MODE SO LEDS FULL BRIGHT MOVWF PORTB ;1 TO 15, 0IS ALL OFF CALL RUDIN ;UPDATES ADRUD DECFSZ CDSCNT ;1 OF 256 DIMCNT'S GOTO CDSFILL CALL CDS ;GET CDS LEV GOTO DIMSW CDSFILL BTFSC SSTATUS,4 GOTO FLASHEND CLRF TIMER1 ;BACKGROUND FLASH LEDS FLASH ;LOW GLOW MOVF TIMER1,W MOVWF PORTB MOVLW 0X08 ;CLEAR TO ALL OFF AGAIN MOVWF PORTB INCF TIMER1 ;NO DELAY NEEDED BTFSS TIMER1,4 GOTO FLASH BCF PORTC,4 BCF PORTC,3 FLASHEND CALL DASHPIC ;<300uS,PLACE OTHER ROUT HERE THAT USE 1.3 mS CALL DELAY1 GOTO DASHCDS ;SEPARATED BY DELAY DASHCDSRET BTFSC SSTATUS,5 ;FROM A PRESET STARTUP MODE TO CDSDASH SEND GOTO CSR CALL DELAY1 ;80uS EACH ;CALL DELAY1 ;CALL DELAY1 ;CALL DELAY1 ;CALL DELAY1 ;CALL DELAY1 ;;CALL DELAY1 ;CALL DELAY1 ;80uS EACH ;CALL DELAY1 ;CALL DELAY1 ;CALL DELAY1 ;CALL DELAY1 ;CALL DELAY1 DIMSW BTFSS PORTA,0 CALL DIMUP BTFSS PORTA,1 CALL DIMDN NEXT GOTO RUDDIM CDS ;--------------------- ;CDS PIN IS PULLED HIGH, THEN DISCHARGES (FAST IF LIGHT, SLOW IF DARK) 1:100 MOVLW B'11100000' ;PULL CDS HI TRIS PORTB BSF PORTB,4 CALL DELAY1 ;SAME AS ADC FOR RUDDIN MOVLW B'11110000' ;READ CDS TRIS PORTB CALL DELAY1 ;BCF PORTC,3 ;JUST A TRY!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! BCF PORTC,4 CLRF TEMP CDSLP CALL DELAY2 CALL DELAY2 ;ADDED TO ALLOW MORE SENSITIVITY IN LOW LIGHT LEVELS INCF TEMP INCFSZ TEMP GOTO CDSLPJ DECF TEMP ;FE IF TOPPED OUT!( SO SUBWF CAN LEAVE1) GOTO CN CDSLPJ BTFSC PORTB,4 GOTO CDSLP DECF TEMP ;RE:'FE' CN MOVF TEMP,W ;GET CDS, LOWER IS BRIGHTER MOVWF CDSORG SUBWF CDSBUF,W ;IF RESULT IS POS THEN BRIGHTER(TURN OFF DASH.BRIGHTEN RUDDER) BTFSC STATUS,0 ;IF POS THEN CARY BIT= 1,SKIP IF NIGHT GOTO DAYMODE BCF SSTATUS,4 ;DAYMDE FLAG RETLW 0X00 DAYMODE BSF SSTATUS,4 RETLW 0X00 DIMSWEND GOTO RUDIN ;get adc rudin[*] ;send dat DASHPIC via dat/clk[*] ;set portb with rudder data ;inc dimstep buf,if carry then inc dimmer, turn off at >= dim[*] ;turn on at zero ovflo[*] ;incdashstep buf, if carry then incf dash, turn off at >=dash ;turn on at zero ovflo on dash ;in bulbstep buf, if carry then incf bulb,turn off at >= bulb ;turn on at zero bulb ;check cds ;if cds <= cdsbuf then set dim to 255, clr bulb and dash ports,set sstatus to stop out to ;port or TRIS them to inputs ;CHECK CDS:if cds > cds buff+1( setable from DASHPIC) de-TRIS and set dim to DIMOLD ;check data/clk for high input. ;check dimmer switch ;loop ;AS DIM GETS CLOSSER TO 0, STEPS DECREASE DOWN TO 1/255TH DIMUP MOVF DIM,W ;$28-SWAP-$82-&-$02 STEP//$D9-SWAP-$9D-&-0D MOVWF TEMP SWAPF TEMP ;MAKE HIGH BITS LOW BSF TEMP,0 ;MAKE AT LEAST 1 (1-15 STEP) BSF TEMP,1 MOVLW 0X0F ;CHOP TOP ANDWF TEMP RLF TEMP,W ADDWF DIMSTP BTFSS STATUS,0 ;CARRY? RETLW 0X00 INCFSZ DIM RETLW 0X00 DECF DIM ;TOP OFF AT 255 RETLW 0X00 DIMDN ;WEIRD ROUTINE BECAUSE OF TIMING FROM BRIGHT TO DIM MOVF DIM,W ;$28-SWAP-$82-&-$02 STEP//$D9-SWAP-$9D-&-0D MOVWF TEMP SWAPF TEMP ;MAKE HIGH BITS LOW BSF TEMP,0 ;MAKE AT LEAST 1 BSF TEMP,1 MOVLW 0X0F ;CHOP TOP ANDWF TEMP RLF TEMP,W SUBWF DIMSTP ;DIMSTEP BTFSC STATUS,0 ;CARRY? RETLW 0X00 DECFSZ DIM RETLW 0X00 INCF DIM ;BOTTOM AT 1 RETLW 0X00 DELAY1 MOVLW 0X3F ;3F CENTERED MOVWF TIMER0 DLP1 NOP NOP DECFSZ TIMER0 GOTO DLP1 RETLW 0X00 DELAY2 MOVLW 0X05 ; MOVWF TIMER0 DLP2 nop nop DECFSZ TIMER0 GOTO DLP2 RETLW 0X00 DCLK1 ;*******************CLOCK OUT DELAY MOVLW 0X07 ; MOVWF TIMER0 DILP1 DECFSZ TIMER0 GOTO DILP1 RETLW 0X00 DIM2 COMF DIM,W ; MOVWF TIMER0 DI2LP1 DECFSZ TIMER0 GOTO DI2LP1 RETLW 0X00 DELAY6 NOP ;RUD FINE ADJ FROM DASHPIC MOVF RUDFINE,W ;1-15 IS RANGE, 8 IS CENTERED () MOVWF TIMER0 DLP6 DECFSZ TIMER0 GOTO DLP6 RETLW 0X00 ;---------------======= T X TO DASHPIC DASHPIC MOVF RUDOLD,W ;IF NO CHANGE XORWF RUDORG,W ;ABORT RUDDER UPDATE BTFSC STATUS,2 RETLW 0X00 ;SEND DATA TO DASH 131uS TO 200uS ;SB IS CLK, WAIT FOR ACK FOR X CYC. START CLK AFTER ACK, DATA VALID ON DOWN CLK MOVLW B'11100001' ;C6 HI IMP,C1 OUTPUT(CLK) TRIS PORTC MOVLW 0X33 MOVWF TIMER1 ACKWT BSF PORTC,1 ;CLK BTFSC PORTC,0 ;WAIT FOR ACK- REMOVED FOR TESTING GOTO ACK DECFSZ TIMER1 GOTO ACKWT RETLW 0X01 ;DENOTES NOT SENT ACK BTFSC PORTC,0 ;WAIT FOR END OF ACK PULSE GOTO ACK ;NO NEED FOR TIMEOUT AS LO IS NATURAL STATE CLRF TIMER1 MOVLW B'11100000' ;C0&C1 OUT TRIS PORTC MOVF RUDORG,W MOVWF TEMP ;ROTATE BUFFER MOVWF RUDOLD BSF TEMP,7 ;DENOTES ***RUDDER POS DATA***** ;BIT 7 CLEARED IS CDS DATA SENDLP BSF PORTC,1 BTFSS TEMP,7 ;MSB SEND BCF PORTC,0 ;DATA LO BTFSC TEMP,7 BSF PORTC,0 ;DATA HI CALL DCLK1 ;DAT-CLK STABILIZATION DELAY BCF PORTC,1 ;CLOCK IN DAT CALL DCLK1 ;CLK LO DELAY BCF STATUS,0 ;STOP CARRY IN(HAbit!) RLF TEMP INCF TIMER1 BTFSS TIMER1,3 ;ALL 8? GOTO SENDLP MOVLW B'11100011' ;PUT BOTH BACK TO HIGH IMP TRIS PORTC RETLW 0X00 RUDIN CLRF ADRUD ;get rud a/d c BCF PORTC,6 MOVLW B'10100011' ;C6 A/D PULL LOW TRIS PORTC CALL DELAY1 MOVLW B'11100011' ;C6 A/D OPEN TRIS PORTC CALL DELAY6 ;FINE TUNE DELAYS CENT=8(25+2) CALL DELAY6 DECF ADRUD ;NEXT IS '0' ADLP INCF ADRUD CALL DELAY2 BTFSS PORTC,7 GOTO ADLP MOVF ADRUD,W ;TO COMPLETE TIME SLOT MOVWF TEMP BCF PORTC,3 ;PLACED HERE TO KEEP BULB PULSE LONGER(NEEDS IT!) ADLP2 INCF TEMP CALL DELAY2 BTFSS STATUS,2 GOTO ADLP2 GOOFFIX ;FIXES WIRING GOOF WITH 74138'S MOVF ADRUD,W MOVWF RUDORG ;FOR SEND MOVWF TEMP BTFSS ADRUD,3 ;INVERT BIT 3 BSF TEMP,3 BTFSC ADRUD,3 BCF TEMP,3 MOVF TEMP,W MOVWF ADRUD RETLW 0X00 ;----------------------0100----------------- ORG 0100 CDSSET CLRF ADRUD CSETLP SWAPF ADRUD MOVF ADRUD,W MOVWF TEMP SWAPF TEMP,W MOVWF PORTB BTFSS ADRUD,7 ;INVERT BIT 3 BSF PORTB,3 BTFSC ADRUD,7 BCF PORTB,3 SWAPF ADRUD DELAY3 ;NOT NORMAL RET DELAY! CLRF TIMER0 CLRF TIMER1 DL3LP NOP NOP DECFSZ TIMER0 GOTO DL3LP DECFSZ TIMER1 GOTO DL3LP BTFSC PORTA,0 ;CHECK SWITCH STIL ON GOTO CCDONE SWAPF ADRUD INCF ADRUD SWAPF ADRUD BTFSS STATUS,2 GOTO CSETLP CCDONE SWAPF ADRUD COMF ADRUD,W ;MAKE LOWEST THE HIGHEST FOR CDSBUF MOVWF CDSBUF GOTO DASHCDSPRESET CDSAUTO ;SETS CDS DIM LEV BASED ON PRESENT LEVEL CALL CDS ;DATA IS IN TEMP BUFFER MOVF TEMP,W MOVWF CDSBUF GOTO DASHCDSPRESET ;[[[ SEND CDS DATA WHEN CDS CHANGES. DASH PIC WILL RETURN A BYTE ]]] ;[[[ IMMEDIATELY. SEND FLAGGED BY TEMP,7 = 0. ;***note data and clock are reversed on bord! DASHCDSPRESET BSF SSTATUS,5 ;FLAG FOR A PRESET SEND TO DASHPIC DASHCDS MOVF CDSOLD,W ;IF NO CHANGE XORWF CDSORG,W ;ABORT RUDDER UPDATE BTFSC STATUS,2 GOTO DASHCDSRET ;SEND DATA TO DASH 131uS TO 200uS ;SB IS CLK, WAIT FOR ACK FOR X CYC. START CLK AFTER ACK, DATA VALID ON DOWN CLK MOVLW B'11100001' ;C6 HI IMP,C1 OUTPUT(CLK) TRIS PORTC MOVLW 0X33 MOVWF TIMER1 ACKWTCDS BSF PORTC,1 ;CLK BTFSC PORTC,0 ;WAIT FOR ACK- REMOVED FOR TESTING GOTO ACKCDS DECFSZ TIMER1 GOTO ACKWTCDS GOTO DASHCDSRET ; NOT SENT ACKCDS BTFSC PORTC,0 ;WAIT FOR END OF ACK PULSE GOTO ACKCDS ;NO NEED FOR TIMEOUT AS LO IS NATURAL STATE CLRF TIMER1 MOVLW B'11100000' ;C0&C1 OUT TRIS PORTC MOVF CDSORG,W MOVWF CDSOLD ;UPDATE OLD MOVWF TEMP ;ROTATE BUFFER,FIRST BIT = 0 RRF TEMP ;>>>/2 CDS DATA WILL BE 0-127 TO DASHPIC!! BCF TEMP,7 ;DENOTES CDS DATA BTFSS SSTATUS,5 ;SET IF CDS LEV PRESET TO DASHPIC (11XXXXXX) GOTO SENDLPCDS SWAPF CDSBUF,W MOVWF TEMP MOVLW B'00001111' ANDWF TEMP BSF TEMP,6 ;1100XXXX TO DASHPIC FOR CDS PRESET RECOVERY BSF TEMP,7 ; SENDLPCDS BSF PORTC,1 BTFSS TEMP,7 ;MSB SEND BCF PORTC,0 ;DATA LO BTFSC TEMP,7 BSF PORTC,0 ;DATA HI CALL DCLK1 ;DAT-CLK STABILIZATION DELAY BCF PORTC,1 ;CLOCK IN DAT CALL DCLK1 ;CLK LO DELAY BCF STATUS,0 ;STOP CARRY IN(HAbit!) RLF TEMP INCF TIMER1 BTFSS TIMER1,3 ;ALL 8? GOTO SENDLPCDS MOVLW B'11100011' ;PUT BOTH BACK TO HIGH IMP TRIS PORTC ;********* RX DASHPIC HERE! TO RX CDS UPDATE ;IF BIT 7 = 0 THEN CDS(/2) DATA, ELSE POSSIBLE FINE TUNE RUD MOVLW 0X33 MOVLW 0X10 ;TIMEOUT MOVWF TIMER1 CLRF TIMER0 RXLP1 BTFSC PORTC,1 ;WAIT FOR CLOCK FROM DASHPIC GOTO RXDASH DECFSZ TIMER1 GOTO RXLP1 GOTO DASHCDSRET ;WAS SENT BUT NO CDS DATA FROM DASH... RXDASH BTFSC PORTC,1 ;WAIT FOR HI TO LO TRANS THEN RLF DATA GOTO RXDASH RLF TEMP INCF TIMER0 MOVLW 0X33 ;FOR NEXT TIMEOUT MOVWF TIMER1 NOP ;INDUCTION REDUCTION NOP NOP BTFSS PORTC,0 BCF TEMP,0 BTFSC PORTC,0 BSF TEMP,0 BTFSS TIMER0,3 ;8 IN? GOTO RXLP1 BTFSC TEMP,7 ;IS RUDDER ADJ DATA??? GOTO RUDFINADJ RLF TEMP ; *2 BECAUSE DASHPIC IS 0-127(BIT 7 IS FLAG) BCF TEMP,0 MOVF TEMP,W MOVWF CDSBUF ;>>future<<< ;PERHAPS A RUDDER FINE TUNE COULD BE DENOTED BY BIT 7 = 1 ;WRITTEN TO DASHPIC FROM PED PC.. GOTO DASHCDSRET RUDFINADJ MOVLW B'00001111' ANDWF TEMP,W ;CHOP OFF FLAG MOVWF RUDFINE GOTO DASHCDSRET SPLASH CLRF PORTB CLRF PORTC CLRF TIMER1 MOVLW 0X08 MOVWF TEMP SPLP3 BTFSC TEMP,0 ;TO GO DOWN GOTO SPDWN MOVLW 0X00 MOVWF ADRUD ;TEMP FOR LED# SPLP2 INCF ADRUD MOVF ADRUD,W MOVWF PORTB SPLP CALL DELAY1 DECFSZ TIMER1 GOTO SPLP BTFSS ADRUD,4 GOTO SPLP2 DWNR DECFSZ TEMP GOTO SPLP3 CLRF TIMER1 BSF PORTC,3 LAMPTEST CALL DELAY1 CALL DELAY1 CALL DELAY1 DECFSZ TIMER1 GOTO LAMPTEST BSF PORTC,4 LEDTEST CALL DELAY1 CALL DELAY1 CALL DELAY1 INCF ADRUD SWAPF ADRUD,W MOVWF PORTB DECFSZ TIMER1 GOTO LEDTEST GOTO RUDDIM SPDWN DECF ADRUD MOVF ADRUD,W MOVWF PORTB SPLPD CALL DELAY1 DECFSZ TIMER1 GOTO SPLPD MOVF ADRUD,W BTFSS STATUS,2 ;0? GOTO SPDWN GOTO DWNR END