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.