; *** COMPILED WITH SX/B VERSION 2.00.30 07/20/2009 *** ;' ========================================================================= ;' ;' File...... PING.SXB ;' Purpose... ;' Author.... Jon Williams ;' E-mail.... jwilliams@efx-tek.com ;' Started... ;' Updated... ;' ;' ========================================================================= ;' ------------------------------------------------------------------------- ;' Program Description ;' ------------------------------------------------------------------------- ;' ------------------------------------------------------------------------- ;' Conditional Compilation Symbols ;' ------------------------------------------------------------------------- ;'{$DEFINE English} ' measure in inches ;' ------------------------------------------------------------------------- ;' Device Settings ;' ------------------------------------------------------------------------- ID "Ping)))" ;ID "Ping)))" DEVICE SX28, OSCXT2, BOR42 ;DEVICE SX28, OSCXT2, BOR42 DEVICE TURBO, OPTIONX, STACKX ; DEFINE SYSTEM VARIABLES __RAM EQU $00 RBC EQU $06 RBC_LSB EQU $06 RBC_MSB EQU $07 __PARAM1 EQU $08 __PARAM2 EQU $09 __PARAM3 EQU $0A __PARAM4 EQU $0B __PARAM5 EQU $0C __PARAMCNT EQU $0C __WPARAM12 EQU $08 __WPARAM12_LSB EQU $08 __WPARAM12_MSB EQU $09 __WPARAM23 EQU $09 __WPARAM23_LSB EQU $09 __WPARAM23_MSB EQU $0A __WPARAM34 EQU $0A __WPARAM34_LSB EQU $0A __WPARAM34_MSB EQU $0B __WPARAM45 EQU $0B __WPARAM45_LSB EQU $0B __WPARAM45_MSB EQU $0C __INTPARAMFSR EQU $F7 __TRISA EQU $FD TRIS_A EQU $FD __TRISB EQU $FE TRIS_B EQU $FE __TRISC EQU $FF TRIS_C EQU $FF __REMAINDER EQU $08 __WREMAINDER EQU $08 __WREMAINDER_LSB EQU $08 __WREMAINDER_MSB EQU $09 ; Define ShiftIn & ShiftOut Constants LSBFIRST EQU 0 MSBFIRST EQU 1 MSBPRE EQU 0 LSBPRE EQU 1 MSBPOST EQU 2 LSBPOST EQU 3 __DEFAULT EQU $00 ; Default Bank Value _TO EQU TO ; _TO is an alias for the TimeOut status bit LIST Q=53 LIST Q=65 FREQ 20000000 ;FREQ 20_000_000 __FREQMHZ EQU 20 ;' ------------------------------------------------------------------------- ;' IO Pins ;' ------------------------------------------------------------------------- PingIO EQU RA.0 ;PingIO PIN RA.0 ;' ------------------------------------------------------------------------- ;' Constants ;' ------------------------------------------------------------------------- ;' ------------------------------------------------------------------------- ;' Variables ;' ------------------------------------------------------------------------- distance EQU $0D ;distance VAR Word ' distance distance_LSB EQU distance distance_MSB EQU distance+1 tmpB1 EQU $0F ;tmpB1 VAR Byte ' for subs/funcs tmpB2 EQU $10 ;tmpB2 VAR Byte tmpW1 EQU $11 ;tmpW1 VAR Word tmpW1_LSB EQU tmpW1 tmpW1_MSB EQU tmpW1+1 ;' ------------------------------------------------------------------------- ;' Subroutine / Function / Task Declarations ;' ------------------------------------------------------------------------- __GET_DISTANCE: ;GET_DISTANCE FUNC 2, 0 ' read from Ping))) JMP @GET_DISTANCE __DELAY_MS: ;DELAY_MS SUB 2, 2, Word ' shell for PAUSE JMP @DELAY_MS __DELAY_US: ;DELAY_US SUB 2, 2, Word ' shell for PAUSEUS JMP @DELAY_US ;' ========================================================================= RESET __PROGSTART ; PROGRAM Start __PROGSTART: CLR RA CLR RB CLR RC MOV FSR,#$08 SB FSR.3 SETB FSR.4 CLR IND IJNZ FSR,@$-3 MOV FSR,#__TRISA MOV IND,#255 INC FSR MOV IND,W INC FSR MOV IND,W CLR FSR JMP @Start ORG $+2 ; FOR DEBUGGER ;' ========================================================================= Start: ;Start: MODE $0E ; PLP_A = %0001 MOV !RA,#%0001 MODE $0E ; PLP_B = %0000_0000 MOV !RB,#%0000_0000 MODE $0E ; PLP_C = %0000_0000 MOV !RC,#%0000_0000 Main: ;Main: CALL @__GET_DISTANCE ; distance = GET_DISTANCE MOV distance_LSB,__PARAM1 MOV distance_MSB,__PARAM2 WATCH distance, 8, UDEC ' use Debug --> Run ; WATCH distance, 8, UDEC ' use Debug --> Run BREAK ; BREAK MOV __PARAM1,#100 ; DELAY_MS 100 CLR __PARAM2 CALL @__DELAY_MS JMP @Main ; GOTO Main ;' ------------------------------------------------------------------------- ;' Subroutine / Function / Task Code ;' ------------------------------------------------------------------------- ;' Use: result = GET_DISTANCE ;' -- reads distance from Ping))) sensor ;' -- units based on Conditional Compilation directive GET_DISTANCE: ;FUNC GET_DISTANCE result = tmpW1 ; result VAR tmpW1 result_LSB = tmpW1_LSB result_MSB = tmpW1_MSB SETB PingIO ; HIGH PingIO ' "ping" the sensor MOV FSR,#__TRISA CLRB IND.0 MODE $0F MOV !RA,IND BANK $00 SETB PingIO MOV __PARAM1,#10 ; DELAY_US 10 CLR __PARAM2 CALL @__DELAY_US CLRB PingIO ; PingIO = 0 MOV __PARAM1,#5 ; DELAY_US 5 ' let output settle CLR __PARAM2 CALL @__DELAY_US MOV FSR,#__TRISA ; INPUT PingIO ' setup for return pulse SETB IND.0 MODE $0F MOV !RA,IND BANK $00 CLR result_LSB ; result = 0 ' clear return value CLR result_MSB JNB PingIO, $ ; \ JNB PingIO, $ ' wait for leading edge __DO_1: ; DO ' time the echo INC result_LSB ; INC result ADDB result_MSB,Z ; '{$IFDEF English} MOV __PARAM3,#2 ; PAUSEUS 73.746 ' measure inches MOV __PARAM4,#38 DJNZ __PARAM4,@$ DJNZ __PARAM3,@$-3 ; '{$ELSE} ; PAUSEUS 29.034 ' measure centimeters ; '{$ENDIF} JB PingIO,@__DO_1 ; LOOP UNTIL PingIO = 0 ' stop on falling edge CLC ; result = result >> 1 ' remove return trip RR result_MSB RR result_LSB MOV __PARAM1,result_LSB ; RETURN result MOV __PARAM2,result_MSB RETP ; ENDFUNC ;' ------------------------------------------------------------------------- ;' Use: DELAY_MS duration ;' -- shell for PAUSE DELAY_MS: ;SUB DELAY_MS ; '{$IFUSED DELAY_MS} MOV __PARAM1,__WPARAM12_LSB ; PAUSE __wparam12 OR W,__WPARAM12_MSB JZ @$+21 MOV W,++__WPARAM12_MSB MOV __PARAM2,W MOV __PARAM3,#16 MOV __PARAM4,#144 DJNZ __PARAM4,@$ DJNZ __PARAM3,@$-3 DJNZ __PARAM1,@$-10 DJNZ __PARAM2,@$-13 ; '{$ENDIF} RETP ; ENDSUB ;' ------------------------------------------------------------------------- ;' Use: DELAY_US duration ;' -- shell for PAUSEUS DELAY_US: ;SUB DELAY_US ; '{$IFUSED DELAY_US} MOV __PARAM1,__WPARAM12_LSB ; PAUSEUS __wparam12 OR W,__WPARAM12_MSB JZ @$+16 MOV W,++__WPARAM12_MSB MOV __PARAM2,W MOV __PARAM4,#3 DJNZ __PARAM4,@$ DJNZ __PARAM1,@$-5 DJNZ __PARAM2,@$-8 ; '{$ENDIF} RETP ; ENDSUB ;' ========================================================================= ;' User Data ;' ========================================================================= ;********************************************************************** ; SX/B VARIABLE MEMORY MAP: [B]=Byte; [b0-7]=Bit, [W]=Word, (#)=Array ; $00 = __RAM(0), W[B], IND[B] ; $01 = __RAM(1), RTCC[B] ; $02 = __RAM(2), PC[B] ; $03 = __RAM(3), STATUS[B], PA2[b7], PA1[b6], PA0[b5], _TO[b4], PD[b3], Z[b2], DC[b1], C[b0] ; $04 = __RAM(4), FSR[B] ; $05 = __RAM(5), PORTA[B], RA[B], PingIO[b0] ; $06 = __RAM(6), RBC[W], RBC_LSB[B], PORTB[B], RB[B] ; $07 = __RAM(7), RBC_MSB[B], PORTC[B], RC[B] ; $08 = __RAM(8), __PARAM1[B], __WPARAM12[W], __WPARAM12_LSB[B], __REMAINDER[B], __WREMAINDER[W], __WREMAINDER_LSB[B] ; $09 = __RAM(9), __PARAM2[B], __WPARAM12_MSB[B], __WPARAM23[W], __WPARAM23_LSB[B], __WREMAINDER_MSB[B] ; $0A = __RAM(10), __PARAM3[B], __WPARAM23_MSB[B], __WPARAM34[W], __WPARAM34_LSB[B] ; $0B = __RAM(11), __PARAM4[B], __WPARAM34_MSB[B], __WPARAM45[W], __WPARAM45_LSB[B] ; $0C = __RAM(12), __PARAM5[B], __PARAMCNT[B], __WPARAM45_MSB[B] ; $0D = __RAM(13), distance[W], distance_LSB[B] ; $0E = __RAM(14), distance_MSB[B] ; $0F = __RAM(15), tmpB1[B] ; $10 = __RAM(16), tmpB2[B] ; $11 = __RAM(17), tmpW1[W], tmpW1_LSB[B] ; $12 = __RAM(18), tmpW1_MSB[B] ; $13 = __RAM(19) ; $14 = __RAM(20) ; $15 = __RAM(21) ; $16 = __RAM(22) ; $17 = __RAM(23) ; $18 = __RAM(24) ; $19 = __RAM(25) ; $1A = __RAM(26) ; $1B = __RAM(27) ; $1C = __RAM(28) ; $1D = __RAM(29) ; $1E = __RAM(30) ; $1F = __RAM(31) ; $30 = __RAM(48) ; $31 = __RAM(49) ; $32 = __RAM(50) ; $33 = __RAM(51) ; $34 = __RAM(52) ; $35 = __RAM(53) ; $36 = __RAM(54) ; $37 = __RAM(55) ; $38 = __RAM(56) ; $39 = __RAM(57) ; $3A = __RAM(58) ; $3B = __RAM(59) ; $3C = __RAM(60) ; $3D = __RAM(61) ; $3E = __RAM(62) ; $3F = __RAM(63) ; $50 = __RAM(80) ; $51 = __RAM(81) ; $52 = __RAM(82) ; $53 = __RAM(83) ; $54 = __RAM(84) ; $55 = __RAM(85) ; $56 = __RAM(86) ; $57 = __RAM(87) ; $58 = __RAM(88) ; $59 = __RAM(89) ; $5A = __RAM(90) ; $5B = __RAM(91) ; $5C = __RAM(92) ; $5D = __RAM(93) ; $5E = __RAM(94) ; $5F = __RAM(95) ; $70 = __RAM(112) ; $71 = __RAM(113) ; $72 = __RAM(114) ; $73 = __RAM(115) ; $74 = __RAM(116) ; $75 = __RAM(117) ; $76 = __RAM(118) ; $77 = __RAM(119) ; $78 = __RAM(120) ; $79 = __RAM(121) ; $7A = __RAM(122) ; $7B = __RAM(123) ; $7C = __RAM(124) ; $7D = __RAM(125) ; $7E = __RAM(126) ; $7F = __RAM(127) ; $90 = __RAM(144) ; $91 = __RAM(145) ; $92 = __RAM(146) ; $93 = __RAM(147) ; $94 = __RAM(148) ; $95 = __RAM(149) ; $96 = __RAM(150) ; $97 = __RAM(151) ; $98 = __RAM(152) ; $99 = __RAM(153) ; $9A = __RAM(154) ; $9B = __RAM(155) ; $9C = __RAM(156) ; $9D = __RAM(157) ; $9E = __RAM(158) ; $9F = __RAM(159) ; $B0 = __RAM(176) ; $B1 = __RAM(177) ; $B2 = __RAM(178) ; $B3 = __RAM(179) ; $B4 = __RAM(180) ; $B5 = __RAM(181) ; $B6 = __RAM(182) ; $B7 = __RAM(183) ; $B8 = __RAM(184) ; $B9 = __RAM(185) ; $BA = __RAM(186) ; $BB = __RAM(187) ; $BC = __RAM(188) ; $BD = __RAM(189) ; $BE = __RAM(190) ; $BF = __RAM(191) ; $D0 = __RAM(208) ; $D1 = __RAM(209) ; $D2 = __RAM(210) ; $D3 = __RAM(211) ; $D4 = __RAM(212) ; $D5 = __RAM(213) ; $D6 = __RAM(214) ; $D7 = __RAM(215) ; $D8 = __RAM(216) ; $D9 = __RAM(217) ; $DA = __RAM(218) ; $DB = __RAM(219) ; $DC = __RAM(220) ; $DD = __RAM(221) ; $DE = __RAM(222) ; $DF = __RAM(223) ; $F0 = __RAM(240) ; $F1 = __RAM(241) ; $F2 = __RAM(242) ; $F3 = __RAM(243) ; $F4 = __RAM(244) ; $F5 = __RAM(245) ; $F6 = __RAM(246) ; $F7 = __RAM(247), __INTPARAMFSR(0) ; $F8 = __RAM(248), __INTPARAMFSR(1) ; $F9 = __RAM(249), __INTPARAMFSR(2) ; $FA = __RAM(250), __INTPARAMFSR(3) ; $FB = __RAM(251), __INTPARAMFSR(4) ; $FC = __RAM(252), __INTPARAMFSR(5) ; $FD = __RAM(253), TRIS_A(0) ; $FE = __RAM(254), TRIS_B(0) ; $FF = __RAM(255), TRIS_C(0)