' {$STAMP BS2} ' {$PBASIC 2.5} CLK CON 0 ' Clock to all SDO CON 1 ' Serial Data TO device SDO2 PIN 1 ' Serial Data TO device for Bit Bang SDI CON 2 ' Serial Data FROM device CS_ADC CON 4 ' Chip select for A/D; 0 = active CS_VGA CON 3 ' Chip select for LMP8100 series; 0 = active CS_DAC CON 5 ' Chip select for D/A; 0 = active LCD CON 15 ' LCD serial output - use 32 config VAR Word ' Configuration bits for ADC. AD VAR Word ' A/D variable to hold 12-bit AD result. CH VAR Nib ' A/D channel 0-3 DACOUT VAR Word ' Variable for DAC output AD1 VAR Word ' Variable to hold 12-bit AD 1 result. AD2 VAR Word ' Variable to hold 12-bit AD 2 result. AD3 VAR Word ' Variable to hold 12-bit AD 3 result. AD4 VAR Word ' Variable to hold 12-bit AD 4 result. 'VGA VAR Word 'word sent to vga VGA1 VAR Byte ' VGA1 alisa to send byte for second controller in series ' VGA1a to send VGA2 VAR Byte ' VGA2 alias byte for second controller in series ' VGA1a to send OFFSET VAR Word ' zero offset value. RESULT VAR Word ' Calculated weight for display btnwrk VAR Byte ' BUTTON scratch pad X VAR Nib ' Temporary variable RNG VAR Byte ' Preamplification range 0-15 LSTRNG VAR Nib ' Last Range - used by autoranging routine '############ Initilaize SEROUT LCD,32,[22,12,17] ' Clear and turn on backlight on LCD display Main: 'Bus Initialization HIGH CS_VGA ' Deactivate VGA . HIGH CS_ADC ' Deactivate ADC . HIGH CS_DAC ' Deactivate DAC . btnwrk = 0 ' Clear cal button GOTO measure ' Jump over calibration routine and go directly to measurement '############### Calibraton Routine calibrate: ' Calibration routine called by button press SEROUT LCD,32,[22,12,17] ' Clear display 'set vga's initial gain VGA1 = 0 ' VGA1 = follower VGA2 = 0 ' VGA2 = Follower GOSUB setvga ' Send Bytes to VGA 'dummy DACOUT =0 ' Clear variable CH = 0 ' Select D/A channel 0 (VGA 1 GRT) GOSUB writedac ' Set DAC 'Vin = 1 ' Set bias point to 1V 2.5Vref = 610uV/Step DACOUT =1800 ' for 0.2Vout @ 1V in > x2=1.8V=2954 x16=1.05333=1726 CH = 0 ' for 0.1Vout @ 1V in > x2=1.9V=2954 x16=1.06=1735 GOSUB writedac ' for 0.2Vout @ 0.2Vin = x2=1.8V=2954 x16=0.2v=329 DACOUT =329 CH = 1 GOSUB writedac PAUSE 100 FOR RNG = 0 TO 15 SEROUT LCD,32,[128," Calibrating",148," Range ",DEC RNG DIG 1, DEC RNG DIG 0," "] VGA1 = RNG VGA2=0 GOSUB setvga DEBUG "Range :",DEC RNG,CR 'read all ADC channels 1.2mV/count GOSUB scanadc ' DEBUG "Full Gain, un-Zeroed Reading",CR ' Display data. DEBUG "channel 1 (raw): ",DEC AD1,CR ' Display data. ' DEBUG "channel 2 (vga1 out): ",DEC AD2,CR ' Display data. ' DEBUG "channel 3 (vga2 out): ",DEC AD3,CR ' Display data. ' DEBUG "channel 4 (Vref bus): ",DEC AD4,CR ' Display data. SEROUT LCD,32,[128," Zeroing "] ' Zero channel 1 dacout=((((ad1*(VGA1+1))-195)*2 )/VGA1) DEBUG "DACOUT1 : ",DEC dacout,CR ' Display data. CH=0 WRITE ((RNG*2)+40), Word dacout GOSUB writedac PAUSE 100 'read all ADC channels 1.2mV/count GOSUB scanadc ' DEBUG "Full Gain, CH1 Zeroed Reading",CR ' Display data. ' DEBUG "channel 1 (raw): ",DEC AD1,CR ' Display data. ' DEBUG "channel 2 (vga1 out): ",DEC AD2,CR ' Display data. ' DEBUG "channel 3 (vga2 out): ",DEC AD3,CR ' Display data. ' DEBUG "channel 4 (Vref bus): ",DEC AD4,CR ' Display data. 'zero channel 2 dacout=(((AD2*(VGA2+1))-140)/VGA2)*2 DEBUG "DACOUT2 : ",DEC dacout,CR ' Display data. CH=1 GOSUB writedac PAUSE 100 'measure offset average 5 times ch=2 offset = 0 FOR x = 0 TO 5 GOSUB readadc offset = offset + AD ' DEBUG "offset : ",DEC offset," AD ",DEC AD,DEC x,CR ' Display data. GOSUB readadc PAUSE 500 NEXT offset = offset/X DEBUG "Range: ",DEC rng," Offset:",DEC offset,CR ' Display data. WRITE RNG*2, Word offset NEXT 'RNG '********** Begin measure 'Determine Range measure: GOSUB scanadc autoscale: RNG=0 SELECT AD1 CASE <1030 '<0.9g RNG=15 CASE < 1031 '.1-.5g RNG=14 CASE < 1035 '1g RNG=13 CASE < 1035 '1g RNG=12 CASE < 1134 '1-2g RNG=8 CASE < 1173 '1-2g RNG=7 CASE < 1218 '1-2g RNG=6 CASE < 1274 '1-2g RNG=5 CASE < 1348 '2-3g RNG=4 CASE < 1453 '3-4g RNG=3 CASE < 1610 '4-6g RNG=2 CASE < 1887 '6-7g RNG=1 CASE < 2381 RNG=0 ENDSELECT 'RNG=10 DEBUG DEC RNG,CR IF LSTRNG = RNG THEN GOTO skipme DEBUG "RANGE CHANGE!!!**",CR READ RNG*2, Word offset READ (RNG*2)+40, Word dacout DEBUG "Range:", DEC RNG,CR DEBUG "Offset:", DEC offset,CR DEBUG "dacout:", DEC dacout,CR ' SEROUT LCD,32,[148,DEC RNG DIG 1, DEC RNG DIG 0] VGA1 = RNG VGA2=0 GOSUB setvga CH=0 GOSUB writedac CH=0 GOSUB writedac skipme: 'read all ADC channels 1.221mV/count Formula for mV: 14464 ** AD4 + AD4 GOSUB scanadc ' DEBUG DEC((VGA1+1) * (VGA2+1))," Gain, Fully Zeroed Reading",CR ' Display data. DEBUG "channel 1 (raw): ",DEC AD1,CR ' Display data. ' DEBUG "channel 2 (vga1 out): ",DEC AD2,CR ' Display data. DEBUG "channel 3 (vga2 out): ",DEC AD3,CR ' Display data. DEBUG "channel 4 (Vref bus): ",DEC AD4,CR ' Display data. DEBUG "Zeroed 3 (vga2 out): ",DEC AD3-offset,CR ' Display data. DEBUG "Offset : ",DEC offset,CR ' Display dat ' DEBUG DEC((VGA1+1) * (VGA2+1))," Gain, Fully Zeroed Reading",CR ' Display data. ' DEBUG "channel 1 (raw): ",DEC 14320 ** AD1 + AD1,"mV",CR ' Display data. ' DEBUG "channel 2 (vga1 out): ",DEC 14320 ** AD2 + AD2,"mV",CR ' Display data. ' DEBUG "channel 3 (vga2 out): ",DEC 14320 ** AD3 + AD3,"mV",CR ' Display data. ' ' DEBUG "channel 4 (Vref bus): ",DEC 14320 ** AD4 + AD4,"mV",CR ' Display data. result = 14320 ** (AD3-offset) + (AD3-Offset) ' value in mV ' DEBUG "Delta V: ",DEC result,"mv",CR ' Display data. ' result = ((AD3-offset) */ 15073 ) ' result = ((AD3-offset * 434) + (AD3-offset ** 22806 ))/((VGA1+1)*(VGA2+1)) ' result = ((AD3-offset * 4) + (AD3-offset ** 20338 )) ' result = ((AD3-offset * 4) + (AD3-offset ** 22806 ))/((VGA1+1)*(VGA2+1)) result = ((AD3-offset * 4) + (AD3-offset ** 26175 ))/((VGA1+1)*(VGA2+1)) ' DEBUG "Convered: ",DEC result DIG 4,DEC result DIG 3,".", DEC result DIG 2,DEC result DIG 1, DEC result DIG 0,"mg",CR ' Display data. ' SEROUT LCD,32,[128,"1:",DEC 14320 ** AD1 + AD1,"mV",136,"2:",DEC 14320 ** AD2 + AD2,"mV",CR] 'SEROUT LCD,32,[148,"3:",DEC 14320 ** AD3 + AD3,"mV",156,"4:",DEC 14320 ** AD4 + AD4,"mV",CR] ' SEROUT LCD,32,[148,"3:",DEC 14320 ** AD3 + AD3,"mV",156,"X:",DEC 14320 ** (AD3-offset) + (AD3-Offset),"mv",CR] SEROUT LCD,32,[143,"*"] BUTTON 14,0,255,20,btnwrk,1,calibrate IF AD3 < offset OR AD3>4083 THEN GOTO measure PAUSE 100 SEROUT LCD,32,[143," "] SEROUT LCD,32,[128,DEC RNG DIG 1, DEC RNG DIG 0," ",DEC result DIG 4,DEC result DIG 3,".", DEC result DIG 2,DEC result DIG 1, DEC result DIG 0," ",151,"Milligrams"] 'SEROUT LCD,32,[148,"DEC ",DEC AD1," ",DEC 14418**AD1 + AD1,"mV "] ' Display data. 'PAUSE 500 LSTRNG = RNG GOTO measure ' Endless loop. scanadc: CH=0 GOSUB readadc ' Get data from ADC. AD1=AD CH=1 GOSUB readadc ' Get data from ADC. AD2=AD CH=2 GOSUB readadc ' Get data from ADC. AD3=AD CH=3 GOSUB readadc ' Get data from ADC. AD4=AD RETURN readadc: config.BIT11 = CH.BIT0 config.BIT12 = CH.BIT1 LOW CS_ADC ' Activate the ADC. SHIFTOUT SDO,CLK,MSBFIRST,[config\16] ' Send config bits. SHIFTIN SDI,CLK,LSBFIRST,[AD\16] ' Get data bits. HIGH CS_ADC ' Deactivate the ADC. RETURN ' Return to program. setvga: top: config.HIGHBYTE=VGA2 config.LOWBYTE=VGA1 HIGH CS_VGA HIGH CLK HIGH SDO2 PAUSE 10 LOW CS_VGA ' Drop CS config = config REV 16 'reverse direction for LSBfirst FOR x=1 TO 15 SDO2= config.BIT0 ' DEBUG DEC ? config.BIT0,CR config = config >> 1 PAUSE 10 HIGH CLK 'clock in SDO2A PAUSE 10 LOW CLK LOW SDO2 NEXT SDO2= config.BIT0 'send last bit 'DEBUG " ",DEC ? config.BIT0,CR PAUSE 10 HIGH CLK 'clock in SDO2A PAUSE 10 HIGH CS_VGA RETURN writedac: dacout.BIT12 = 1 dacout.BIT13 = 0 dacout.BIT14 = CH.BIT0 dacout.BIT15 = CH.BIT1 LOW CS_DAC ' Activate the DAC. SHIFTOUT SDO,CLK,MSBFIRST,[dacout\16] ' Send data bits. HIGH CS_DAC ' Deactivate the DAC. RETURN