4. The PIC's program
slightly changed !!!
Don't forget to disable the WDT and to set the oscillator parameter to XT. LIST P=16F84 PORTA EQU 5 PORTB EQU 6 TRISA EQU 85H TRISB EQU 86H STATUS EQU 3 INTCON EQU 0BH OPTREG EQU 81H TMR0 EQU 1 RP0 EQU 5 TOIF EQU 2 ZF EQU 2 ; USER DEFINED BITS IR EQU 1 ULTRA EQU 0 LED EQU 3 #DEFINE BANK0 BCF STATUS,RP0 ;SELECT BANK 0 #DEFINE BANK1 BSF STATUS,RP0 ;SELECT BANK 1 CBLOCK 0CH ;VARIABLE BLOCK
TIME ;THE TIME-DELAY BETWEEN IR AND US-IMPACT
CNTMSEC ;MSEC COUNT REGISTER IN WAIT SUBROUTINE
CNTSEC_4 ;1/4 SEC REGISTER IN WAIT SUBROUTINE
ENDC
;**************************
;* MAIN PROGRAM ENTRY *
;**************************
ORG 0
BANK1 CLRF TRISB^80H ;PORTB ALL OUTPUTS MOVLW B'00000110' ;TIMER0 PRESCALE 1:128 MOVWF OPTREG^80H MOVLW B'00000011' ;CONFIGURE ONLY PORT A0 AND A1 AS INPUTS MOVWF TRISA^80H ; BANK0 MOVLW B'00000011'
ANDWF PORTA,F ;CLEAR PORTA, BUT DON'T AFFECT A0 NOR A1
CLRF PORTB ;CLEAR PORTB
MOVLW 0x0C ;12*250ms=3SEC
CALL NSEC_4 ;WAIT THESE 3 SEC on power-up
BSF PORTA,LED ;LED ON to indicate device is working
MOVLW 0xFA ;WAIT 250 MSEC
CALL NMSEC
BCF PORTA,LED ;LED OFF
;NOW WE CAN START WITH MAIN PROGRAM GOTO PING ;******************************************************************* ;THESE MICRO4 AND NMSEC SUBROUTINES I FOUND SOMEWHERE ON THE INTERNET
MICRO4 ADDLW 0xFF ;SUBSTRACT 1 FROM W!
BTFSS STATUS,ZF ;SKIP WHEN YOU REACH ZERO
GOTO MICRO4 ;MORE LOOPS
RETURN
NMSEC MOVWF CNTMSEC ;W TO MSEC COUNT REGISTER
MSECLOOP MOVLW 0xF8 ;ALLOW FOR 8 MICROSEC OVERHEAD
CALL MICRO4 ;248 * 4 + 2 = 994 HERE
NOP ;MAKE REST OF LOOP
NOP ;ADD UP TO 6 MICROSECONDS
DECFSZ CNTMSEC,F ;DECREMENT COUNT, SKIP WHEN ZERO
GOTO MSECLOOP ;MORE LOOPS
RETURN
NSEC_4 MOVWF CNTSEC_4 ;W TO QUARTER OF A SECOND COUNTER
FSECLOOP MOVLW 0xEA
CALL NMSEC ;250 MSEC
DECFSZ CNTSEC_4,F ;DECREMENT COUNT,SKIP WHEN ZERO
GOTO FSECLOOP ;MORE LOOPS
RETURN
;**************************************************************
; WAIT FOR IR-PING PING BTFSS PORTA,IR ;SKIP IF HIGH=IR-IMPACT
GOTO PING ;DO THIS AGAIN AND AGAIN
CLRF TMR0 ;RESET TIMER
BCF INTCON,TOIF ;CLEAR OVERFLOW CONDITION IF EVER
BSF PORTA,LED ;LED ON
PONG BTFSC PORTA,ULTRA ;SKIP IF LOW = NO US-IMPACT
GOTO SEND ;SEND MESSAGES TO RCX
BTFSS INTCON,TOIF ;SKIP IF TIME OVERFLOW = OUT OF RANGE
GOTO PONG ;DO THIS OVER AGAIN UNTIL TIMER OVERFLOW
;SEND ERROR MESSAGE TO RCX
MOVLW B'00010000' ;OUT OF RANGE ERROR
MOVWF PORTB
MOVLW 0x17 ;WAIT
CALL NMSEC ;23 MSEC
CLRF PORTB ;CLEAR OUTPUT
BCF PORTA,LED ;LED OFF
GOTO PING ;START CYCLE AGAIN
;NOW SIGNAL IS OK, DEVICE MAY SEND MESSAGES SEND MOVF TMR0,W ;W=TMR0,CHECK TIME
MOVWF TIME ;STORE TIME
;NOW LOW-BYTE, HIGH-BYTE TRANSFER PROTOCOLE MOVLW B'00011111' ;START-MESSAGE
MOVWF PORTB ;SEND IT TO RCX
MOVLW 0x0A ;WAIT
CALL NMSEC ;10 MSEC
MOVLW B'00001111' ;LOAD LOW-BYTE MASK
ANDWF TIME,W ;W=LOW-BYTE OF TIME
MOVWF PORTB ;SEND LOWBYTE TO RCX
MOVLW 0x0A ;WAIT
CALL NMSEC ;10 MSEC
MOVLW B'00011111' ;PAUSE-MESSAGE
MOVWF PORTB ;SEND IT TO RCX
MOVLW 0x0A ;WAIT
CALL NMSEC ;10 MSEC
MOVLW B'11110000' ;LOAD HIGH-BYTE MASK
ANDWF TIME,F ;TIME=HIGH-BYTE(TIME) - LOW-BYTE INFORMATION LOST
SWAPF TIME,W ;W GETS THE TIME-HIGH-BYTE AS LOW-BYTE
MOVWF PORTB ;SEND TIME-HIGH-BYTE TO RCX
MOVLW 0x0A ;WAIT
CALL NMSEC ;10 MSEC
MOVLW B'00011111' ;STOP-MESSAGE
MOVWF PORTB ;SEND IT TO RCX
MOVLW 0x0A ;WAIT
CALL NMSEC ;10 MSEC
CLRF PORTB ;RESET OUTPUT
BCF PORTA,LED ;LED OFF
GOTO PING
END
|
Note that the whole transfer protocole needs around 50 msec. If there is an out-of-range condition, the protocole needs only 23 msec.