MikeDD
- 4th July 2007, 17:41
I found this code some years ago and do not know its source. There was only a text descrption of the circuit. I don't understand what the xxxx_ACTIVE subroutines are pulsing GPIO.0 for. GPIO.3 and 5 are in/out and 2 is for an LED. Any ideas?
DEVICE 12F675
'WORKING STANDARD LANC CONTROL FOR 12F675 CHECKED 10/05/2004
'THIS VERSION USE A BC107 AS OPEN COLLECTOR ON THE SIGNAL INPUT
'AS OPPOSED TO TH 2N 2907 PNP TRANSISTOR WHICH HAD A PROBLEM THAT
'THE VOLTAGE IS NOT PULLED TO GROUND BUT TO AROUND 0.8V WHEN LOW
'THE SOFTWARE NO OUTPUT AND INVERTED DATA STREAM ALSO INVERTING THE STOP BIT AND
'START BIT
'WHICH COULD NOT BE DONE BY JUST SPECIFYING DATA INVERTED WHEN USING RSOUT
SET_OSCCAL
'OSCCAL=$60 ' PROGRAM WITH PROTECTION ON WATCHDOG OFF ,INTERNAL OSC,MCLR OFF,
CMCON=7
ADCON0=0
ANSEL=0
CONFIG WDT_OFF , PWRTE_ON ,MCLRE_OFF
ALL_DIGITAL=TRUE
DECLARE XTAL 4
DECLARE RSIN_PIN GPIO.3
DECLARE RSIN_MODE TRUE
DECLARE SERIAL_BAUD 9600
DECLARE RSIN_TIMEOUT 20000
DECLARE RSOUT_PIN GPIO.5
DECLARE RSOUT_MODE TRUE
SYMBOL LED =GPIO.2
DIM GAP,FBYTE0,FBYTE1,FBYTE2,FBYTE3,FBYTE4,FBYTE5,FBYT E6,FBYTE7,COMMAND,DO_AGAIN
DIM REC_STATUS,FLIPFLOP,TRIGGER
DIM GAPCOUNT AS WORD
DIM OLD AS BYTE
DIM FAULT_COUNTER AS WORD
TRISIO=%011010
start: INPUT GPIO.5
FBYTE0=%00011000^$FF
GOTO MAIN
GAP_TIME: GAPCOUNT=0
DO: IF GPIO.3 <>1 THEN GOTO GAP_TIME
GAPCOUNT=GAPCOUNT+1
IF GAPCOUNT <150 THEN GOTO DO
COMMANDOUT: 'OUTPUT GPIO.5
WHILE GPIO.3=1 :WEND
'RSOUT FBYTE0
OUTPUT GPIO.5
SET GPIO.5 'START BIT
DELAYUS 94 '11100111
CLEAR GPIO.5 'FIRST LSB BIT
DELAYUS 104 'BIT1
DELAYUS 104 'BIT2
DELAYUS 104 'BIT3
SET GPIO.5
DELAYUS 104 'BIT4
DELAYUS 104 'BIT5
CLEAR GPIO.5
DELAYUS 104 'BIT6
DELAYUS 104 'BIT7
DELAYUS 104 'BIT8
DELAYUS 104 'STOP BIT
INPUT GPIO.5
WHILE GPIO.3=1 :WEND
'RSOUT COMMAND
OUTPUT GPIO.5
SET GPIO.5
DELAYUS 94 'STOP BIT
IF COMMAND=$3A THEN
CLEAR GPIO.5
DELAYUS 104 'BIT1 LSB
SET GPIO.5
DELAYUS 104 'BIT2
CLEAR GPIO.5
DELAYUS 104 'BIT3
SET GPIO.5
DELAYUS 104 'BIT4
DELAYUS 104 'BIT5
DELAYUS 104 'BIT6
CLEAR GPIO.5
DELAYUS 104 'BIT7
DELAYUS 104 'BIT8
DELAYUS 104 'STOP BIT
ELSE
'RSOUT COMMAND
CLEAR GPIO.5
DELAYUS 104 'BIT1 LSB
DELAYUS 104 'BIT2
DELAYUS 104 'BIT3
DELAYUS 104 'BIT4
SET GPIO.5
DELAYUS 104 'BIT5
DELAYUS 104 'BIT6
CLEAR GPIO.5
DELAYUS 104 'BIT7
DELAYUS 104 'BIT8
DELAYUS 104 'STOP BIT
INPUT GPIO.5
ENDIF
FBYTE2=RSIN
FBYTE3=RSIN
FBYTE4=RSIN
FBYTE5=RSIN
FBYTE6=RSIN
RETURN
INTERPRET: LET FBYTE4=FBYTE4^$FF
IF FBYTE4=OLD THEN GOTO DONE
LET OLD=FBYTE4
IF FBYTE4=$02 THEN GOSUB STOP_ACTIVE
IF FBYTE4=$01 THEN GOSUB FAULT_ACTIVE
IF FBYTE4=$04 THEN GOSUB RECORD_ACTIVE
IF FBYTE4=$32 THEN GOSUB FAULT_ACTIVE
IF FBYTE4=$62 THEN GOSUB FAULT_ACTIVE
DONE: RETURN
STOP_ACTIVE: REC_STATUS=0
CLEAR GPIO.2 ' RECORDING IS ACTIVE LED
SET GPIO.0 'PULSE1
DELAYMS 500
CLEAR GPIO.0
DELAYMS 500
SET GPIO.0 'PULSE2
DELAYMS 500
CLEAR GPIO.0
DELAYMS 500
SET GPIO.0 'PULSE3
DELAYMS 500
CLEAR GPIO.0
RETURN
FAULT_ACTIVE: FAULT_COUNTER=0
SET GPIO.0 'PULSE1
DELAYMS 100
CLEAR GPIO.0
DELAYMS 100
SET GPIO.0 'PULSE2
DELAYMS 100
CLEAR GPIO.0
DELAYMS 100
SET GPIO.0 'PULSE3
DELAYMS 100
CLEAR GPIO.0
DELAYMS 100
SET GPIO.0 'PULSE4
DELAYMS 100
CLEAR GPIO.0
DELAYMS 100
SET GPIO.0 'PULSE5
DELAYMS 100
CLEAR GPIO.0
RETURN
RECORD_ACTIVE: REC_STATUS=1
SET GPIO.0
SET GPIO.2 ' RECORDING IS ACTIVE LED
DELAYMS 3000
CLEAR GPIO.0
RETURN
MONITOR: WHILE GPIO.1=0
TRIGGER=0
WEND
'TRIGGER=GPIO.1
IF TRIGGER=1 THEN GOTO DONEMON
IF TRIGGER =0 THEN GOSUB INVRECSTATUS
DONEMON: RETURN
INVRECSTATUS: IF REC_STATUS =1 THEN FLIPFLOP=0
IF REC_STATUS =0 THEN FLIPFLOP=1
REC_STATUS=FLIPFLOP
RETURN
LOAD_COMMAND: IF REC_STATUS=0 THEN COMMAND=$30'^$FF 'NEW COMMAND = STOP
IF REC_STATUS=1 THEN COMMAND=$3A'^$FF 'NEW COMMAND = REC
RETURN
MAIN: GAP=0 : GAPCOUNT=0 : FBYTE1=0 : FBYTE2=0 : FBYTE3=0 : FBYTE4=0
FBYTE5=0 : FBYTE6=0 : FBYTE7=0 : DO_AGAIN=0
TRIGGER=0 : FLIPFLOP=0 : FAULT_COUNTER=0 : gpio.0=0 : gpio.2=0
COMMAND=$00^$FF
'SET GPIO.5
RERUN: DO_AGAIN=0
AGAIN3: GAPCOUNT=0
GOSUB GAP_TIME
DO_AGAIN =DO_AGAIN+1
IF DO_AGAIN<=5 THEN GOTO AGAIN3
GOSUB INTERPRET
'DELAYMS 1000 ' WAIT WHILE TRIGGER MIGHT STILL BE ACTIVATED
GOSUB MONITOR
IF TRIGGER=0 THEN GOSUB LOAD_COMMAND
'CHANGED ON 9/9/2003 'IF TRIGGER=1 THEN GOSUB LOAD_COMMAND
TRIGGER=1
GOTO RERUN
END
DEVICE 12F675
'WORKING STANDARD LANC CONTROL FOR 12F675 CHECKED 10/05/2004
'THIS VERSION USE A BC107 AS OPEN COLLECTOR ON THE SIGNAL INPUT
'AS OPPOSED TO TH 2N 2907 PNP TRANSISTOR WHICH HAD A PROBLEM THAT
'THE VOLTAGE IS NOT PULLED TO GROUND BUT TO AROUND 0.8V WHEN LOW
'THE SOFTWARE NO OUTPUT AND INVERTED DATA STREAM ALSO INVERTING THE STOP BIT AND
'START BIT
'WHICH COULD NOT BE DONE BY JUST SPECIFYING DATA INVERTED WHEN USING RSOUT
SET_OSCCAL
'OSCCAL=$60 ' PROGRAM WITH PROTECTION ON WATCHDOG OFF ,INTERNAL OSC,MCLR OFF,
CMCON=7
ADCON0=0
ANSEL=0
CONFIG WDT_OFF , PWRTE_ON ,MCLRE_OFF
ALL_DIGITAL=TRUE
DECLARE XTAL 4
DECLARE RSIN_PIN GPIO.3
DECLARE RSIN_MODE TRUE
DECLARE SERIAL_BAUD 9600
DECLARE RSIN_TIMEOUT 20000
DECLARE RSOUT_PIN GPIO.5
DECLARE RSOUT_MODE TRUE
SYMBOL LED =GPIO.2
DIM GAP,FBYTE0,FBYTE1,FBYTE2,FBYTE3,FBYTE4,FBYTE5,FBYT E6,FBYTE7,COMMAND,DO_AGAIN
DIM REC_STATUS,FLIPFLOP,TRIGGER
DIM GAPCOUNT AS WORD
DIM OLD AS BYTE
DIM FAULT_COUNTER AS WORD
TRISIO=%011010
start: INPUT GPIO.5
FBYTE0=%00011000^$FF
GOTO MAIN
GAP_TIME: GAPCOUNT=0
DO: IF GPIO.3 <>1 THEN GOTO GAP_TIME
GAPCOUNT=GAPCOUNT+1
IF GAPCOUNT <150 THEN GOTO DO
COMMANDOUT: 'OUTPUT GPIO.5
WHILE GPIO.3=1 :WEND
'RSOUT FBYTE0
OUTPUT GPIO.5
SET GPIO.5 'START BIT
DELAYUS 94 '11100111
CLEAR GPIO.5 'FIRST LSB BIT
DELAYUS 104 'BIT1
DELAYUS 104 'BIT2
DELAYUS 104 'BIT3
SET GPIO.5
DELAYUS 104 'BIT4
DELAYUS 104 'BIT5
CLEAR GPIO.5
DELAYUS 104 'BIT6
DELAYUS 104 'BIT7
DELAYUS 104 'BIT8
DELAYUS 104 'STOP BIT
INPUT GPIO.5
WHILE GPIO.3=1 :WEND
'RSOUT COMMAND
OUTPUT GPIO.5
SET GPIO.5
DELAYUS 94 'STOP BIT
IF COMMAND=$3A THEN
CLEAR GPIO.5
DELAYUS 104 'BIT1 LSB
SET GPIO.5
DELAYUS 104 'BIT2
CLEAR GPIO.5
DELAYUS 104 'BIT3
SET GPIO.5
DELAYUS 104 'BIT4
DELAYUS 104 'BIT5
DELAYUS 104 'BIT6
CLEAR GPIO.5
DELAYUS 104 'BIT7
DELAYUS 104 'BIT8
DELAYUS 104 'STOP BIT
ELSE
'RSOUT COMMAND
CLEAR GPIO.5
DELAYUS 104 'BIT1 LSB
DELAYUS 104 'BIT2
DELAYUS 104 'BIT3
DELAYUS 104 'BIT4
SET GPIO.5
DELAYUS 104 'BIT5
DELAYUS 104 'BIT6
CLEAR GPIO.5
DELAYUS 104 'BIT7
DELAYUS 104 'BIT8
DELAYUS 104 'STOP BIT
INPUT GPIO.5
ENDIF
FBYTE2=RSIN
FBYTE3=RSIN
FBYTE4=RSIN
FBYTE5=RSIN
FBYTE6=RSIN
RETURN
INTERPRET: LET FBYTE4=FBYTE4^$FF
IF FBYTE4=OLD THEN GOTO DONE
LET OLD=FBYTE4
IF FBYTE4=$02 THEN GOSUB STOP_ACTIVE
IF FBYTE4=$01 THEN GOSUB FAULT_ACTIVE
IF FBYTE4=$04 THEN GOSUB RECORD_ACTIVE
IF FBYTE4=$32 THEN GOSUB FAULT_ACTIVE
IF FBYTE4=$62 THEN GOSUB FAULT_ACTIVE
DONE: RETURN
STOP_ACTIVE: REC_STATUS=0
CLEAR GPIO.2 ' RECORDING IS ACTIVE LED
SET GPIO.0 'PULSE1
DELAYMS 500
CLEAR GPIO.0
DELAYMS 500
SET GPIO.0 'PULSE2
DELAYMS 500
CLEAR GPIO.0
DELAYMS 500
SET GPIO.0 'PULSE3
DELAYMS 500
CLEAR GPIO.0
RETURN
FAULT_ACTIVE: FAULT_COUNTER=0
SET GPIO.0 'PULSE1
DELAYMS 100
CLEAR GPIO.0
DELAYMS 100
SET GPIO.0 'PULSE2
DELAYMS 100
CLEAR GPIO.0
DELAYMS 100
SET GPIO.0 'PULSE3
DELAYMS 100
CLEAR GPIO.0
DELAYMS 100
SET GPIO.0 'PULSE4
DELAYMS 100
CLEAR GPIO.0
DELAYMS 100
SET GPIO.0 'PULSE5
DELAYMS 100
CLEAR GPIO.0
RETURN
RECORD_ACTIVE: REC_STATUS=1
SET GPIO.0
SET GPIO.2 ' RECORDING IS ACTIVE LED
DELAYMS 3000
CLEAR GPIO.0
RETURN
MONITOR: WHILE GPIO.1=0
TRIGGER=0
WEND
'TRIGGER=GPIO.1
IF TRIGGER=1 THEN GOTO DONEMON
IF TRIGGER =0 THEN GOSUB INVRECSTATUS
DONEMON: RETURN
INVRECSTATUS: IF REC_STATUS =1 THEN FLIPFLOP=0
IF REC_STATUS =0 THEN FLIPFLOP=1
REC_STATUS=FLIPFLOP
RETURN
LOAD_COMMAND: IF REC_STATUS=0 THEN COMMAND=$30'^$FF 'NEW COMMAND = STOP
IF REC_STATUS=1 THEN COMMAND=$3A'^$FF 'NEW COMMAND = REC
RETURN
MAIN: GAP=0 : GAPCOUNT=0 : FBYTE1=0 : FBYTE2=0 : FBYTE3=0 : FBYTE4=0
FBYTE5=0 : FBYTE6=0 : FBYTE7=0 : DO_AGAIN=0
TRIGGER=0 : FLIPFLOP=0 : FAULT_COUNTER=0 : gpio.0=0 : gpio.2=0
COMMAND=$00^$FF
'SET GPIO.5
RERUN: DO_AGAIN=0
AGAIN3: GAPCOUNT=0
GOSUB GAP_TIME
DO_AGAIN =DO_AGAIN+1
IF DO_AGAIN<=5 THEN GOTO AGAIN3
GOSUB INTERPRET
'DELAYMS 1000 ' WAIT WHILE TRIGGER MIGHT STILL BE ACTIVATED
GOSUB MONITOR
IF TRIGGER=0 THEN GOSUB LOAD_COMMAND
'CHANGED ON 9/9/2003 'IF TRIGGER=1 THEN GOSUB LOAD_COMMAND
TRIGGER=1
GOTO RERUN
END