( ADS1115s)
( June 2016)
( Application: 4-channel 16-bit ADC on prototying board with I2C bus transfer)
( Note: Rev 1 Pi uses BSC0 on pins 3 & 5; Rev 2 uses BSC1)
( Uses RiscOS I2C calls and module 'GPIO' from Tank)

CR ." ADS1115s"

HEX
240 CONSTANT IIC_Control

( R0,R1,R2....)
CODE IIC_Ctrl
R2 POP,
R1 POP,
R0 POP,
IIC_Control SWI,
PC R14 MOV,
END-CODE

0 GPEnabI2C

48 CONSTANT ADCaddr

DECIMAL
0 VARIABLE channel

( Define BYTE arrays:)
: byte_array 4/ 1+ 4* <BUILDS ALLOT DOES> + ;
4 byte_array Data_1
4 byte_array Data_3
4 byte_array adc_val

HEX
( Fill BYTE arrays:)
: fill_struct_1
  ( 00000001) 01 0 Data_1 C!
  ( 11000011) C3 channel @ 4 << OR 1 Data_1 C!        ( single-shot conversion)
  ( 10000011) 83 2 Data_1 C!     ( 128 sps - default)
;

: fill_struct_3
  ( 10010000)  90 0 Data_3 C!
  ( 00000000)   0 1 Data_3 C!   ( now points to Conversion reg)
  ( 10010001)  91 2 Data_3 C! ;

: SPS  ( n...) 5 <<  3 +  2 Data_1 C! ;
: 8sps   0 SPS ;  : 16sps  1 SPS ;  : 32sps  2 SPS ;  : 64sps  3 SPS ;
: 128sps 4 SPS ;  : 250sps 5 SPS ;  : 465sps 6 SPS ;  : 860sps 7 SPS ;

( fill structures for channel no. and speed:)

128sps fill_struct_1 fill_struct_3 

: sel_channel  ( 0 to 3....)
  channel ! C3 channel @ 4 << OR 1 Data_1 C! ;

DECIMAL
( low-level GPIO control:)
( short delay using only Forth words:)
4500 VARIABLE smt
: sm_delay  0 DO I I * DROP LOOP ;  ( n ...) 
: dt smt @ sm_delay ;

: request_ADC
 ADCaddr 1 <<    0 Data_1   3  IIC_Ctrl ;

: read_ADC
 ADCaddr 1 <<       0 Data_3    2  IIC_Ctrl  ( select conversion reg)
 ADCaddr 1 << 1+    0 adc_val   2  IIC_Ctrl  ( read 2 x 8-bit values from ADC)
;

: rd_ADS1115        ( .....n)
   request_ADC
   read_ADC
   0 adc_val C@ 8 <<
   1 adc_val C@ +  ;

: ADC_loop   ( n...)
  4500 smt !  860sps   rd_ADS1115 DROP  ( discard first reading)
  0 TIME=
  0 DO rd_ADS1115 . LOOP
  TIME ." csec= " . CR
;






