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.


RetourMain Page