( This modified program is posted by abhishek ( i have used the i2c code given in devantech compass example ( for SRF08 sonars following code ( you can use below macros to fire sonar--wait for 65 ms--read range--readings ( I2c codde is exactly same as given in example, SCRUB VARIABLE BITLINE EEWORD ( temp variable for result VARIABLE SONARSTARTADDRESS EEWORD VARIABLE SBUFFOFFSET EEWORD VARIABLE SONARFIRESTATE EEWORD : SCL? TA0 ON? ; EEWORD ( test if SCL is allowed high, not down by another : SCL+ SCL? DROP ; EEWORD ( actual usage for I2C to see if line released : SCL- TA0 OFF ; EEWORD ( I/O turned off : SDA? TA1 ON? ; EEWORD : SDA+ SDA? DROP ; EEWORD : SDA- TA1 OFF ; EEWORD : I2CSTART ( sequence to begin i2c comms SDA+ ( bring SDA low while SCL is high then SCL low to begin clocking SCL+ SDA- SCL- SDA+ ( LET GO DATA ; EEWORD : I2CSTOP ( sequence to end i2c comms SDA- ( bring SCL high while SDA is low, then DA high too SCL+ SDA+ ; EEWORD : CLK. SCL+ SCL- ; EEWORD : CLK.? SCL+ ( clock in the ack' bit SDA? SCL- ; EEWORD : ACK.? SDA+ ( MAKE LINE HIGH SO SLAVE CAN ACK WITH LOW CLK.? SDA+ ; EEWORD : ACK.! SDA- CLK. SDA+ ; EEWORD HEX : BITLINE> ( BIT SHIFT OUT BITLINE @ 2* DUP BITLINE ! 100 AND IF SDA+ ELSE SDA- THEN CLK. SDA+ ( LET GO ; EEWORD : >BITLINE ( BIT SHIFT IN CLK.? IF 1 ELSE 0 THEN BITLINE @ 2* + BITLINE ! ; EEWORD : I2COUTBYTE BITLINE ! BITLINE> BITLINE> BITLINE> BITLINE> BITLINE> BITLINE> BITLINE> BITLINE> ACK.? ; EEWORD : I2CINBYTE 0 BITLINE ! >BITLINE >BITLINE >BITLINE >BITLINE >BITLINE >BITLINE >BITLINE >BITLINE BITLINE @ ; EEWORD ( macro used for firing sonars ( to fire sonar :- address SONAR-FIRE ( for sonar with address E0. HEX E0 SONAR-FIRE : SONARFIRE I2CSTART I2COUTBYTE DROP 00 I2COUTBYTE DROP 51 I2COUTBYTE DROP ( units: 50/in, 51/cm, 52/uS ) I2CSTOP ; EEWORD ( to read range data from sonar ( i m reading range only , ( to read range from sonar :- ( address SONARGETRANGE : SONARGETRANGE ( setting up register I2CSTART DUP I2COUTBYTE DROP 02 I2COUTBYTE DROP ( if u want to read photosensor reading ( then put 01 instead of 02 above ( reading value I2CSTART 1 + I2COUTBYTE DROP I2CINBYTE ACK.! >< I2CINBYTE I2CSTOP OR DECIMAL U. HEX ; EEWORD ( to setup sonar ( i m having 10 soanrs, so broadcasting the setup data : SETUPSONAR I2CSTART 00 DUP . I2COUTBYTE DROP 02 DUP . I2COUTBYTE DROP 46 DUP . I2COUTBYTE DROP I2CSTOP I2CSTART 00 DUP . I2COUTBYTE DROP 01 DUP . I2COUTBYTE DROP 0D DUP . I2COUTBYTE DROP I2CSTOP ; EEWORD ( ******** changing SRF08 address ******** ) : SEQUENCE-CMD I2CSTART 00 I2COUTBYTE DROP 00 I2COUTBYTE DROP I2COUTBYTE DROP I2CSTOP ; EEWORD : NEW-ADDR ( n --- ) ( Where n: E0,E2,E4,E6,E8,EA,EC,EE,F0,F2,F4,F6,F8,FA,FC,FE ) A0 SEQUENCE-CMD AA SEQUENCE-CMD A5 SEQUENCE-CMD SEQUENCE-CMD ; EEWORD ( ************ test range **************** ) ( * continuous display range on terminal * ) ( * range unit in Centimeter * ) : DELAY 8000 0 DO LOOP ; EEWORD : GET-RANGE (
--- ) BEGIN DUP SONARFIRE DELAY DUP SONARGETRANGE ?TERMINAL UNTIL DROP ; EEWORD