10   !*************************************************
20   !*
30   !* FILE       :  CPDIST
40   !* DESCRIPTION:  Program for Charge Pumping Test
50   !* PRODUCT    :  4155,4156
60   !* REVISION   :  Rev.A.01.00
70   !*
80   !*   (c) Copyright Agilent Technologies 1998
90   !*              All right reserved.
100  !*
110  !*
120  !*  Customer shall have the personal, non-
130  !* transferable right to use, copy or modify
140  !* this SAMPLE PROGRAM for Customer's internal
150  !* operations.  Customer shall use the SAMPLE
160  !* PROGRAM solely and exclusively for its own
170  !* purpose and shall not license, lease, market
180  !* or distribute the SAMPLE PROGRAM or modification
190  !* or any part thereof.
200  !*
210  !*  Agilent shall not be liable for the quality,
220  !* performance or behavior of the SAMPLE PROGRAM.
230  !* Agilent especially disclaims that the operation
240  !* of the SAMPLE PROGRAM shall be uninterrupted or
250  !* error free.  This SAMPLE PROGRAM is provided
260  !* AS IS.
270  !*
280  !*  AGILENT DISCLAIMS THE IMPLIED WARRANTIES OF
290  !* MERCHANTABILITY AND FITNESS FOR A PARTICULAR
300  !* PURPOSE.
310  !*
320  !*  Agilent shall not be liable for any infringement
330  !* of any patent, trademark copyright or other
340  !* proprietary rights by the SAMPLE PROGRAM or
350  !* its use. Agilent does not warrant that the SAMPLE
360  !* PROGRAM is free from infringements or such
370  !* right of third parties. However, Agilent will not
380  !* knowingly infringe or deliver a software that
390  !* infringes the patent, trademark, copyright or
400  !* other proprietary right of a third party.
410  !*
420  !*************************************************
430  !
440    COM @Hp415x,@Form_off,INTEGER Hpib_sc
450    COM /File_name1/ Setup_file$[12],Save_ascii$[12],Save_data$[12]
460    COM /Condition1/ REAL Pulse_base,Pulse_peak,Pulse_freq,Peak_hold,Fix_trans
470    COM /Condition2/ INTEGER No_of_meas
480    COM /Condition3/ REAL Drain_source_v,Sub_v
490    COM /Condition4/ REAL Pulse_lead(1:200),Pulse_trail(1:200)
500    COM /Condition5/ REAL Weff,Leff,T,Vfb,Vt,Cap_cross
510    COM /Const/ REAL Q,K,Ni,Nuth
520    COM /Meas_data/ REAL Icp_lead(1:200),Icp_trail(1:200)
530    COM /Calc_data/ REAL Dit_lead(1:200),Dit_trail(1:200),Energy_lead(1:200),Energy_trail(1:200)
540   !
550   ! ---------- Input Parameters --------------------------------------------
560   !
570   ! ---------- GPIB Setup -------------------------------------------------
580    INTEGER Hpib_addr,Swm_sc,Swm_addr
590   !
600    Hpib_sc=8           ! 415X GPIB Select Code
610    Hpib_addr=0         ! 415X GPIB Address
620   !
630    ASSIGN @Hp415x TO Hpib_sc*100+Hpib_addr
640    ASSIGN @Form_off TO Hpib_sc*100+Hpib_addr;FORMAT OFF
650   !
660   ! ---------- Pulse Voltage Conditions ------------------------------------
670    Pulse_base=-4       ! Pulse Base Voltage
680    Pulse_peak=4        ! Pulse Peak Voltage
690    Pulse_freq=10000.   ! Pulse frequency : 10 kHz. Pulse period :100 usec
700    Peak_hold=1.E-5     ! Pulse peak hold time 10 usec
710    Fix_trans=8.E-6     ! Fixed transient time (10% to 90%)
720   !
730   ! ---------- No. of Measurement ------------------------------------------
740    No_of_meas=10
750    REDIM Pulse_lead(1:No_of_meas),Pulse_trail(1:No_of_meas)
760    REDIM Icp_lead(1:No_of_meas),Icp_trail(1:No_of_meas)
770    REDIM Dit_lead(2:No_of_meas-1),Dit_trail(2:No_of_meas-1)
780    REDIM Energy_lead(2:No_of_meas-1),Energy_trail(2:No_of_meas-1)
790   !
800 Leading_data: !
810    DATA 1E-6,2E-6,3E-6,4E-6,5E-6,6E-6,7E-6,8E-6,9E-6,10E-6
820 Trailing_data: !
830    DATA 10E-6,9E-6,8E-6,7E-6,6E-6,5E-6,4E-6,3E-6,2E-6,1E-6
840   !
850    RESTORE Leading_data
860    READ Pulse_lead(*)
870   !
880    RESTORE Trailing_data
890    READ Pulse_trail(*)
900   !
910   ! ---------- Bias Conditions ---------------------------------------------
920    Drain_source_v=.5   ! Drain and Source Voltage
930    Sub_v=0             ! Substrate Voltage
940   !
950   ! ---------- Device geometry and temperature -----------------------------
960    Weff=.005           ! Channel width [cm]
970    Leff=.0005          ! Channel length [cm]
980    T=300               ! Temperature [K]
990    Vfb=-1.3            ! Flat band voltage [V]
1000   Vt=.75              ! Threshold voltage [V]
1010   Cap_cross=3.E-16    ! Capture cross section [cm^-2]
1020  !
1030  ! ---------- Constans ----------------------------------------------------
1040   Q=1.60218E-19   ! Electronic charge [C]
1050   K=8.61738E-5    ! Boltzmann's constant [ev/K]
1060   Ni=1.45E+10     ! Intrinsic carrier concentration of Si at 300 K [cm^-3]
1070   Nuth=1.55E+7    ! Thermal verocity of carriers
1080  !
1090  ! ---------- Definition of measurement and stress setup files ------------
1100  !
1110   Setup_file$="SETUP.MES"    ! Charge Pumping Test Setup file
1120  !
1130  ! ---------- File name to save ASCII data --------------------------------
1140   Save_ascii$="CPFD.ASC"    ! Charge Pumping Test Data ASCII file
1150  !
1160  ! ---------- File name to save GRAPHICS data -----------------------------
1170   Save_data$="CPFD.DAT"     ! Charge Pumping Test Data file
1180  !
1190  !///////////////// Main //////////////////////////////////////////////////
1200  !
1210   ON INTR Hpib_sc CALL Err_check  ! Enables GPIB interrupt
1220   ENABLE INTR Hpib_sc;2
1230  !
1240   CALL Input_param                ! Input Parameters
1250   CALL Init_hp415x                ! Initialize 415X
1260   CALL Meas_fix_lead           ! Measure Charge Pumping Current
1270   CALL Meas_fix_trail          ! Measure Charge Pumping Current
1280   CALL Graph                      ! Draw Graph of Icp - Pulse Base Voltage
1290   CALL Save_ascii                 ! Save ASCII file
1300   CALL Save_data                  ! Save DAT file
1310   CALL Test_end                   !
1320   DISP "HCI Degradation Test is Completed!!"
1330  !
1340   END
1350  !
1360  !/////////////// Sub //////////////////////////////////////////////
1370 Input_param:SUB Input_param
1380     COM @Hp415x,@Form_off,INTEGER Hpib_sc
1390     COM /File_name1/ Setup_file$,Save_ascii$,Save_data$
1400     COM /Condition1/ REAL Pulse_base,Pulse_peak,Pulse_freq,Peak_hold,Fix_trans
1410     COM /Condition2/ INTEGER No_of_meas
1420     COM /Condition3/ REAL Drain_source_v,Sub_v
1430     COM /Condition4/ REAL Pulse_lead(*),Pulse_trail(*)
1440     COM /Condition5/ REAL Weff,Leff,T,Vfb,Vt,Cap_cross
1450     COM /Const/ REAL Q,K,Ni,Nuth
1460     COM /Meas_data/ REAL Icp_lead(*),Icp_trail(*)
1470     COM /Calc_data/ REAL Dit_lead(*),Dit_trail(*),Energy_lead(*),Energy_trail(*)
1480    !
1490     CLEAR SCREEN
1500     OUTPUT @Hp415x;":DISP:WIND:ALL BAS"   ! All IBASIC screeen
1510    !
1520     PRINT "Menu to Change Measurement Conditions"
1530    !
1540     PRINT TABXY(2,2);"--------------- File Name -----------------"
1550     PRINT TABXY(2,3);"Setup file name :";Setup_file$
1560     PRINT TABXY(2,4);"ASCII file name to save data :";Save_ascii$
1570     PRINT TABXY(2,5);"DAT file name to save data :";Save_data$
1580     PRINT TABXY(2,6);"----------- Measurement Setup -------------"
1590     PRINT TABXY(2,7);"Pulse base voltage :";Pulse_base;"[V]"
1600     PRINT TABXY(2,8);"Pulse peak voltage :";Pulse_peak;"[V]"
1610     PRINT TABXY(2,9);"Pulse frequency :";Pulse_freq;"[Hz]"
1620     PRINT TABXY(2,10);"Drain and Source bias :";Drain_source_v;"[V]"
1630     PRINT TABXY(2,11);"Substrate bias :";Sub_v;"[V]"
1640     PRINT TABXY(2,12);"No. of measurement points :";No_of_meas
1650     PRINT TABXY(2,13);"Pulse transient time :";Pulse_lead(*);"[sec]"
1660     PRINT TABXY(2,15);"----- Device parameters & Temperature -----"
1670     PRINT TABXY(2,16);"Channel width :";Weff;"[cm]"
1680     PRINT TABXY(2,17);"Channel length :";Leff;"[cm]"
1690     PRINT TABXY(2,18);"Temperature :";T;"[K]"
1700     PRINT TABXY(2,19);"Flat band voltage :";Vfb;"[V]"
1710     PRINT TABXY(2,20);"Threshold voltage :";Vt;"[V]"
1720     PRINT TABXY(2,21);"Capture cross section :";Cap_cross;"[cm^-2]"
1730    !
1740     ON KEY 1 LABEL "File   Name   ",1 CALL Input_file_name
1750     ON KEY 2 LABEL "Meas   Setup  ",1 CALL Input_meas_set
1760     ON KEY 3 LABEL "Device Parameter",1 CALL Device_geometry
1770     ON KEY 4 LABEL "               ",1 CALL Nop
1780     ON KEY 5 LABEL "               ",1 CALL Nop
1790     ON KEY 6 LABEL "               ",1 CALL Nop
1800     ON KEY 7 LABEL "Measure        ",1 GOTO End_of_sub
1810    !
1820     LOOP
1830       DISP "Select softkey to change parameters."
1840       WAIT .5
1850     END LOOP 
1860    !
1870 End_of_sub:!
1880     OFF KEY
1890     DISP 
1900     CLEAR SCREEN
1910     OUTPUT @Hp415x;":DISP:WIND:ALL BST"   ! IBASIC status screeen
1920   SUBEND
1930  !
1940 Input_file_name:SUB Input_file_name
1950     COM /File_name1/ Setup_file$,Save_ascii$,Save_data$
1960    !
1970     ON KEY 1 LABEL "Setup  File  ",2 GOSUB Setup_file
1980     ON KEY 2 LABEL "ASCII  File  ",2 GOSUB Ascii_file
1990     ON KEY 3 LABEL "DAT    File  ",2 GOSUB Dat_file
2000     ON KEY 4 LABEL "              ",2 CALL Nop
2010     ON KEY 5 LABEL "              ",2 CALL Nop
2020     ON KEY 6 LABEL "              ",2 CALL Nop
2030     ON KEY 7 LABEL "RETURN        ",2 GOTO End_of_sub
2040     LOOP
2050       DISP "Select softkey to change parameter."
2060       WAIT .5
2070     END LOOP 
2080    !
2090 Setup_file:!
2100     INPUT "Enter setup file name(XXX.MES)",Setup_file$
2110     PRINT TABXY(1,3);"                                                             "
2120     PRINT TABXY(2,3);"Setup file name :";Setup_file$
2130     RETURN
2140 Ascii_file:!
2150     INPUT "Enter ASCII data file name",Save_ascii$
2160     PRINT TABXY(1,4);"                                                             "
2170     PRINT TABXY(2,4);"ASCII file name to save data :";Save_ascii$
2180     RETURN
2190 Dat_file:!
2200     INPUT "Enter DAT type data file name",Save_data$
2210     PRINT TABXY(1,5);"                                                             "
2220     PRINT TABXY(2,5);"DAT file name to save data :";Save_data$
2230     RETURN
2240 End_of_sub:!
2250     OFF KEY
2260     DISP 
2270   SUBEND
2280  !
2290 Input_meas_set:SUB Input_meas_set
2300  !
2310     ON KEY 1 LABEL "Pulse  Setup",2 CALL Input_pulse_v
2320     ON KEY 2 LABEL "Bias   Setup",2 CALL Input_smu_bias
2330     ON KEY 3 LABEL "Meas   Points",2 CALL Input_meas_pts
2340     ON KEY 4 LABEL "              ",2 CALL Nop
2350     ON KEY 5 LABEL "              ",2 CALL Nop
2360     ON KEY 6 LABEL "              ",2 CALL Nop
2370     ON KEY 7 LABEL "RETURN        ",2 GOTO End_of_sub
2380     LOOP
2390       DISP "Select softkey to change parameter."
2400       WAIT .5
2410     END LOOP 
2420 End_of_sub:!
2430     OFF KEY
2440     DISP 
2450   SUBEND
2460  !
2470 Input_pulse_v:SUB Input_pulse_v
2480     COM /Condition1/ REAL Pulse_base,Pulse_peak,Pulse_freq,Peak_hold,Fix_trans
2490    !
2500     ON KEY 1 LABEL "Pulse  Base   Voltage",3 GOSUB Pulse_base
2510     ON KEY 2 LABEL "Pulse  Peak   Voltage",3 GOSUB Pulse_peak
2520     ON KEY 3 LABEL "Pulse  Freq",3 GOSUB Pulse_freq
2530     ON KEY 4 LABEL "              ",3 CALL Nop
2540     ON KEY 5 LABEL "              ",3 CALL Nop
2550     ON KEY 6 LABEL "              ",3 CALL Nop
2560     ON KEY 7 LABEL "RETURN        ",3 GOTO End_of_sub
2570     LOOP
2580       DISP "Select softkey to change parameter."
2590       WAIT .5
2600     END LOOP 
2610 Pulse_base:!
2620     INPUT "Enter Pulse Base Voltage [V]",Pulse_base
2630     PRINT TABXY(1,7);"                                                             "
2640     PRINT TABXY(2,7);"Pulse base voltage :";Pulse_base;"[V]"
2650     RETURN
2660 Pulse_peak:!
2670     INPUT "Enter Pulse Peak Voltage [V]",Pulse_peak
2680     PRINT TABXY(1,8);"                                                             "
2690     PRINT TABXY(2,8);"Pulse peak voltage :";Pulse_peak;"[V]"
2700     RETURN
2710 Pulse_freq:!
2720     INPUT "Enter Pulse Frequency [Hz]",Pulse_freq
2730     PRINT TABXY(1,9);"                                                             "
2740     PRINT TABXY(2,9);"Pulse frequency :";Pulse_freq;"[Hz]"
2750     RETURN
2760    !
2770 End_of_sub:!
2780     OFF KEY
2790     DISP 
2800   SUBEND
2810  !
2820 Input_meas_pts:SUB Input_meas_pts
2830     COM /Condition2/ INTEGER No_of_meas
2840     COM /Condition4/ REAL Pulse_lead(*),Pulse_trail(*)
2850     COM /Meas_data/ REAL Icp_lead(*),Icp_trail(*)
2860     COM /Calc_data/ REAL Dit_lead(*),Dit_trail(*),Energy_lead(*),Energy_trail(*)
2870    !
2880     FOR I=1 TO 7
2890       ON KEY I LABEL "              ",3 CALL Nop
2900     NEXT I
2910    !
2920     INPUT "Enter No. of Measurement Points",No_of_meas
2930    !
2940     REDIM Pulse_lead(1:No_of_meas),Pulse_trail(1:No_of_meas)
2950     REDIM Icp_lead(1:No_of_meas),Icp_trail(1:No_of_meas)
2960     REDIM Dit_lead(2:No_of_meas-1),Dit_trail(2:No_of_meas-1)
2970     REDIM Energy_lead(2:No_of_meas-1),Energy_trail(2:No_of_meas-1)
2980     FOR I=1 TO No_of_meas
2990       PRINT TABXY(1,23);"Enter transient time. Pulse_lead(";I;")&Pulse_trail(";I;")"
3000       INPUT Pulse_lead(I)
3010       Pulse_trail(No_of_meas-I+1)=Pulse_lead(I)
3020     NEXT I
3030     DISP 
3040     PRINT TABXY(1,23);"                                                           "
3050     PRINT TABXY(1,12);"                                                             "
3060     PRINT TABXY(2,12);"No. of Measurement Points :";No_of_meas
3070     PRINT TABXY(1,13);"                                                             "
3080     PRINT TABXY(1,14);"                                                             "
3090     PRINT TABXY(2,13);"Pulse transient time :";Pulse_lead(*);"[sec]"
3100    !
3110     OFF KEY
3120    !
3130   SUBEND
3140  !
3150 Input_smu_bias:SUB Input_smu_bias
3160     COM /Condition3/ REAL Drain_source_v,Sub_v
3170    !
3180     ON KEY 1 LABEL "Drain  Source Voltage",3 GOSUB D_s_v
3190     ON KEY 2 LABEL "Sub    Voltage",3 GOSUB Sub_v
3200     ON KEY 3 LABEL "              ",3 CALL Nop
3210     ON KEY 4 LABEL "              ",3 CALL Nop
3220     ON KEY 5 LABEL "              ",3 CALL Nop
3230     ON KEY 6 LABEL "              ",3 CALL Nop
3240     ON KEY 7 LABEL "RETURN        ",3 GOTO End_of_sub
3250     LOOP
3260       DISP "Select softkey to change parameter."
3270       WAIT .5
3280     END LOOP 
3290 D_s_v:   !
3300     INPUT "Enter Drain and Source Voltage [V]",Drain_source_v
3310     PRINT TABXY(1,10);"                                                             "
3320     PRINT TABXY(2,10);"Drain and Source bias :";Drain_source_v;"[V]"
3330     RETURN
3340 Sub_v:   !
3350     INPUT "Enter Substrate Voltage [V]",Sub_v
3360     PRINT TABXY(1,11);"                                                             "
3370     PRINT TABXY(2,11);"Substrate bias :";Sub_v;"[V]"
3380     RETURN
3390    !
3400 End_of_sub:   !
3410     OFF KEY
3420     DISP 
3430   SUBEND
3440  !
3450 Device_geometry:SUB Device_geometry
3460     COM /Condition5/ REAL Weff,Leff,T,Vfb,Vt,Cap_cross
3470    !
3480     ON KEY 1 LABEL "Weff          ",2 GOSUB Weff
3490     ON KEY 2 LABEL "Leff          ",2 GOSUB Leff
3500     ON KEY 3 LABEL "Temp          ",2 GOSUB Temp
3510     ON KEY 4 LABEL "Vfb           ",2 GOSUB Vfb
3520     ON KEY 5 LABEL "Vt            ",2 GOSUB Vt
3530     ON KEY 6 LABEL "CaptureCross  Section",2 GOSUB Cap_cross
3540     ON KEY 7 LABEL "RETURN        ",2 GOTO End_of_sub
3550    !
3560     LOOP
3570       DISP "Select softkey to change parameter."
3580       WAIT .5
3590     END LOOP 
3600 Weff:!
3610     INPUT "Enter effective channel width [cm]",Weff
3620     PRINT TABXY(1,16);"                                                             "
3630     PRINT TABXY(2,16);"Channel width :";Weff;"[cm]"
3640     RETURN
3650 Leff:!
3660     INPUT "Enter effective channel length [cm]",Leff
3670     PRINT TABXY(1,17);"                                                             "
3680     PRINT TABXY(2,17);"Channel length :";Leff;"[cm]"
3690     RETURN
3700 Temp:!
3710     INPUT "Enter temperature [K]",T
3720     PRINT TABXY(1,18);"                                                             "
3730     PRINT TABXY(2,18);"Temperature :";T;"[K]"
3740     RETURN
3750 Vfb:!
3760     INPUT "Enter flat band voltage [V]",Vfb
3770     PRINT TABXY(1,19);"                                                             "
3780     PRINT TABXY(2,19);"Flat band voltage :";Vfb;"[V]"
3790     RETURN
3800 Vt:!
3810     INPUT "Enter threshold voltage [V]",Vt
3820     PRINT TABXY(1,20);"                                                             "
3830     PRINT TABXY(2,20);"Threshold voltage :";Vt;"[V]"
3840     RETURN
3850 Cap_cross:!
3860     INPUT "Enter capture cross section [cm^-2]",Cap_cross
3870     PRINT TABXY(1,21);"                                                             "
3880     PRINT TABXY(2,21);"Capture cross section :";Cap_cross;"[cm^-2]"
3890     RETURN
3900    !
3910 End_of_sub:   !
3920     OFF KEY
3930     DISP 
3940   SUBEND
3950   !
3960 Nop:SUB Nop
3970   SUBEND
3980  !
3990 Init_hp415x:SUB Init_hp415x
4000     COM @Hp415x,@Form_off,INTEGER Hpib_sc
4010     COM /File_name1/ Setup_file$,Save_ascii$,Save_data$
4020     COM /Condition1/ REAL Pulse_base,Pulse_peak,Pulse_freq,Peak_hold,Fix_trans
4030     COM /Condition3/ REAL Drain_source_v,Sub_v
4040     DIM Comment$[58]
4050    !
4060     CLEAR SCREEN
4070     CLEAR @Hp415x
4080     OUTPUT @Hp415x;"*RST"                 ! Device reset
4090     OUTPUT @Hp415x;"*CLS"                 ! Clear status data
4100     OUTPUT @Hp415x;":STAT:PRES"           ! Preset event enable mask register
4110     OUTPUT @Hp415x;":DISP:WIND:STAT OFF"  ! Screen update off
4120     OUTPUT @Hp415x;":CAL:AUTO OFF"        ! Auto calibration off
4130     OUTPUT @Hp415x;"*ESE 60;*SRE 32;*OPC?"! Event status/service request enable register setup
4140     ENTER @Hp415x;Complete
4150     OUTPUT @Hp415x;":DISP:WIND:ALL BST"   ! Display IBASIC status screen
4160    !
4170    ! Load setup file, and set bias conditions
4180    !
4190     OUTPUT @Hp415x;":MMEM:LOAD:STAT 0,'"&Setup_file$&"','DISK'"   ! Get setup file
4200     Comment$="Charge Pumping Current Measurement"
4210     OUTPUT @Hp415x;":PAGE:CHAN:COMM '"&Comment$&"'"               ! User omment
4220     CALL Set_pulse_volt                   ! Set pulse voltage
4230     OUTPUT @Hp415x;":PAGE:MEAS:SAMP:CONS:SMU1:SOUR";Drain_source_v! SMU1 const voltage
4240     OUTPUT @Hp415x;":PAGE:MEAS:SAMP:CONS:SMU4:SOUR";Sub_v         ! SMU4 const voltage
4250    !
4260     ON ERROR GOTO Error_disp
4270    !
4280     OFF ERROR
4290     SUBEXIT
4300 Error_disp:   !
4310     DISP "Setup file was not resaved."
4320     WAIT 3
4330     DISP 
4340    !
4350   SUBEND
4360  !
4370 Meas_fix_lead:SUB Meas_fix_lead
4380     COM @Hp415x,@Form_off,INTEGER Hpib_sc
4390     COM /Condition1/ REAL Pulse_base,Pulse_peak,Pulse_freq,Peak_hold,Fix_trans
4400     COM /Condition2/ INTEGER No_of_meas
4410     COM /Condition4/ REAL Pulse_lead(*),Pulse_trail(*)
4420     COM /Condition5/ REAL Weff,Leff,T,Vfb,Vt,Cap_cross
4430     COM /Const/ REAL Q,K,Ni,Nuth
4440     COM /Meas_data/ REAL Icp_lead(*),Icp_trail(*)
4450     COM /Calc_data/ REAL Dit_lead(*),Dit_trail(*),Energy_lead(*),Energy_trail(*)
4460     REAL Pulse_period,Pulse_width,Fix_pulse_lead
4470     DIM Comment$[58]
4480    !
4490     Pulse_period=1/Pulse_freq
4500     Pulse_width=Peak_hold+Fix_trans/.8
4510      !
4520     FOR I=1 TO No_of_meas
4530      !
4540       OUTPUT @Hp415x;":DISP:WIND:STAT OFF"  ! Screen update off
4550       Comment$="Icp measurement. Pulse trailing="&VAL$(Pulse_trail(I))&"[sec]"
4560       OUTPUT @Hp415x;":PAGE:CHAN:COMM '"&Comment$&"'"     ! User comment
4570       CALL Set_pulse_time(Pulse_period,Pulse_width,Fix_trans,Pulse_trail(I))
4580       OUTPUT @Hp415x;":PAGE:GLIS:GRAP:MENU" ! Draw graph
4590      !
4600      ! CALL Pulse_enable
4610      !
4620       OUTPUT @Hp415x;":PAGE:SCON:MEAS:SING" ! Start sampling measurment
4630       OUTPUT @Hp415x;"*OPC?"                ! Check completion
4640       ENTER @Hp415x;Complete
4650       OUTPUT @Hp415x;":DISP:WIND:STAT ON"   ! Screen update on
4660      !
4670      ! CALL Pulse_disable
4680      !
4690       OUTPUT @Hp415x;":DATA:DATA? 'Icp'"    ! Transfer ISB
4700       ENTER @Hp415x;Icp_trail(I)
4710      !
4720     NEXT I
4730    !
4740     FOR I=2 TO No_of_meas-1
4750       Energy_trail(I)=-K*T*LOG(Nuth*Cap_cross*Ni*ABS(Vfb-Vt)*Pulse_trail(I)/.8/ABS(Pulse_peak-Pulse_base))
4760       Dit_trail1=-Pulse_trail(I)/(Q*Weff*Leff*K*T*Pulse_freq)
4770       Dit_trail(I)=Dit_trail1*(Icp_trail(I+1)-Icp_trail(I-1))/((Pulse_trail(I+1)-Pulse_trail(I-1))/.8)
4780     NEXT I
4790    !
4800   SUBEND
4810  !
4820 Meas_fix_trail:SUB Meas_fix_trail
4830     COM @Hp415x,@Form_off,INTEGER Hpib_sc
4840     COM /Condition1/ REAL Pulse_base,Pulse_peak,Pulse_freq,Peak_hold,Fix_trans
4850     COM /Condition2/ INTEGER No_of_meas
4860     COM /Condition4/ REAL Pulse_lead(*),Pulse_trail(*)
4870     COM /Condition5/ REAL Weff,Leff,T,Vfb,Vt,Cap_cross
4880     COM /Const/ REAL Q,K,Ni,Nuth
4890     COM /Meas_data/ REAL Icp_lead(*),Icp_trail(*)
4900     COM /Calc_data/ REAL Dit_lead(*),Dit_trail(*),Energy_lead(*),Energy_trail(*)
4910     REAL Pulse_period,Pulse_width,Fix_pulse_trail
4920     DIM Comment$[58]
4930    !
4940     Pulse_period=1/Pulse_freq
4950      !
4960     FOR I=1 TO No_of_meas
4970    !
4980       Pulse_width=Peak_hold+Pulse_lead(I)/.8
4990      !
5000       OUTPUT @Hp415x;":DISP:WIND:STAT OFF"  ! Screen update off
5010       Comment$="Icp measurement. Pulse leading ="&VAL$(Pulse_lead(I))&"[sec]"
5020       OUTPUT @Hp415x;":PAGE:CHAN:COMM '"&Comment$&"'"     ! User comment
5030       CALL Set_pulse_time(Pulse_period,Pulse_width,Pulse_lead(I),Fix_trans)
5040       OUTPUT @Hp415x;":PAGE:GLIS:GRAP:MENU" ! Draw graph
5050      !
5060      ! CALL Pulse_enable
5070      !
5080       OUTPUT @Hp415x;":PAGE:SCON:MEAS:SING" ! Start sampling measurment
5090       OUTPUT @Hp415x;"*OPC?"                ! Check completion
5100       ENTER @Hp415x;Complete
5110       OUTPUT @Hp415x;":DISP:WIND:STAT ON"   ! Screen update on
5120      !
5130      ! CALL Pulse_disable
5140      !
5150       OUTPUT @Hp415x;":DATA:DATA? 'Icp'"    ! Transfer ISB
5160       ENTER @Hp415x;Icp_lead(I)
5170      !
5180     NEXT I
5190    !
5200     FOR I=2 TO No_of_meas-1
5210       Energy_lead(I)=K*T*LOG(Nuth*Cap_cross*Ni*ABS(Vfb-Vt)*Pulse_lead(I)/.8/ABS(Pulse_peak-Pulse_base))
5220       Dit_lead1=-Pulse_lead(I)/(Q*Weff*Leff*K*T*Pulse_freq)
5230       Dit_lead(I)=Dit_lead1*(Icp_lead(I+1)-Icp_lead(I-1))/((Pulse_lead(I+1)-Pulse_lead(I-1))/.8)
5240     NEXT I
5250    !
5260   SUBEND
5270  !
5280 Graph:SUB Graph
5290     COM @Hp415x,@Form_off,INTEGER Hpib_sc
5300     COM /Condition2/ INTEGER No_of_meas
5310     COM /Condition5/ REAL Weff,Leff,T,Vfb,Vt,Cap_cross
5320     COM /Const/ REAL Q,K,Ni,Nuth
5330     COM /Calc_data/ REAL Dit_lead(*),Dit_trail(*),Energy_lead(*),Energy_trail(*)
5340     DIM Comment$[58]
5350    !
5360     ALLOCATE Energy(1:2*(No_of_meas-2))
5370     ALLOCATE Dit_lead_disp(1:2*(No_of_meas-2))
5380     ALLOCATE Dit_trail_disp(1:2*(No_of_meas-2))
5390    !
5400     FOR I=1 TO No_of_meas-2
5410       Energy(I)=Energy_lead(I+1)
5420       Dit_lead_disp(I)=Dit_lead(I+1)
5430       Dit_trail_disp(I)=-MAXREAL
5440     NEXT I
5450    !
5460     FOR I=No_of_meas-1 TO 2*(No_of_meas-2)
5470       Energy(I)=Energy_trail(I-(No_of_meas-1)+2)
5480       Dit_lead_disp(I)=-MAXREAL
5490       Dit_trail_disp(I)=Dit_trail(I-(No_of_meas-1)+2)
5500     NEXT I
5510    !
5520     OUTPUT @Hp415x;":DISP:WIND:STAT OFF"           ! Screen update off
5530    !
5540     Comment$="Surface states (Dit) vs Energy (E-Ei)"
5550     OUTPUT @Hp415x;":PAGE:CHAN:COMM '"&Comment$&"'"! Set user comment
5560    !
5570     OUTPUT @Hp415x;":TRAC:DEL:ALL"                 ! Delete all user variable names
5580     OUTPUT @Hp415x;":TRAC:DEF 'Energy',";2*(No_of_meas-2)! Define user variable
5590     OUTPUT @Hp415x;":TRAC:UNIT 'Energy','eV'"            ! 'Energy'
5600     OUTPUT @Hp415x;":TRAC:DEF 'Dit1',";2*(No_of_meas-2)  ! Define user variable
5610     OUTPUT @Hp415x;":TRAC:UNIT 'Dit1',' '"               ! 'Dit1' = Dit_lead
5620     OUTPUT @Hp415x;":TRAC:DEF 'Dit2',";2*(No_of_meas-2)  ! Define user variable
5630     OUTPUT @Hp415x;":TRAC:UNIT 'Dit2',' '"               ! 'Dit2' = Dit_trail
5640    !
5650     OUTPUT @Hp415x;":FORM:DATA REAL,64"            ! Binary data transfer
5660     OUTPUT @Hp415x;":FORM:BORD NORM"               ! Transfer in normal mode
5670     OUTPUT @Hp415x;":TRAC 'Energy',#0";            ! Transfer Energy
5680     OUTPUT @Form_off;Energy(*),END
5690     OUTPUT @Hp415x;":TRAC 'Dit1',#0";              ! Transfer Dit_lead
5700     OUTPUT @Form_off;Dit_lead_disp(*),END
5710     OUTPUT @Hp415x;":TRAC 'Dit2',#0";              ! Transfer Dit_trail
5720     OUTPUT @Form_off;Dit_trail_disp(*),END
5730     OUTPUT @Hp415x;":FORM:DATA ASCII"              ! ASCII data transfer
5740    !
5750     OUTPUT @Hp415x;":PAGE:DISP:GRAP:X:NAME 'Energy'"! Set X axis to Energy
5760     OUTPUT @Hp415x;":PAGE:DISP:GRAP:Y1:NAME 'Dit1'"! Set Y1 axis to Dit_lead
5770     OUTPUT @Hp415x;":PAGE:DISP:GRAP:Y2:NAME 'Dit2'"! Set Y2 axis to Qss_trail
5780     OUTPUT @Hp415x;":PAGE:DISP:GRAP:X:SCAL LIN"    ! X axis Linear scale
5790     OUTPUT @Hp415x;":PAGE:DISP:GRAP:Y1:SCAL LIN"   ! Y1 axis Linear scale
5800     OUTPUT @Hp415x;":PAGE:DISP:GRAP:Y2:SCAL LIN"   ! Y2 axis Linear scale
5810     OUTPUT @Hp415x;":PAGE:DISP:SET:GRAP:X:MAX ";1.2*MAX(Energy(*))
5820     OUTPUT @Hp415x;":PAGE:DISP:SET:GRAP:X:MIN ";1.2*MIN(Energy(*))
5830     Max1=MAX(Dit_lead_disp(*))
5840     Max2=MAX(Dit_trail_disp(*))
5850     OUTPUT @Hp415x;":PAGE:DISP:SET:GRAP:Y1:MAX ";MAX(Max1,Max2)
5860     OUTPUT @Hp415x;":PAGE:DISP:SET:GRAP:Y2:MAX ";MAX(Max1,Max2)
5870     OUTPUT @Hp415x;":PAGE:DISP:SET:GRAP:Y1:MIN ";0 ! Y1 Min = 0
5880     OUTPUT @Hp415x;":PAGE:DISP:SET:GRAP:Y2:MIN ";0 ! Y2 Min = 0
5890     OUTPUT @Hp415x;":PAGE:DISP:SET:DVAR:DEL:ALL"
5900     OUTPUT @Hp415x;":PAGE:DISP:ANAL:LINE:MODE DIS"
5910     OUTPUT @Hp415x;":PAGE:GLIS:GRAP:MARK:STAT ON"  ! Marker on
5920    !
5930     OUTPUT @Hp415x;":DISP:WIND:STAT ON"            ! Screen update on
5940     OUTPUT @Hp415x;":DISP:WIND:STAT OFF"           ! Screen update off
5950    !
5960   SUBEND
5970  !
5980 Save_ascii:SUB Save_ascii
5990     COM @Hp415x,@Form_off,INTEGER Hpib_sc
6000     COM /File_name1/ Setup_file$,Save_ascii$,Save_data$
6010     COM /Condition1/ REAL Pulse_base,Pulse_peak,Pulse_freq,Peak_hold,Fix_trans
6020     COM /Condition2/ INTEGER No_of_meas
6030     COM /Condition3/ REAL Drain_source_v,Sub_v
6040     COM /Condition4/ REAL Pulse_lead(*),Pulse_trail(*)
6050     COM /Condition5/ REAL Weff,Leff,T,Vfb,Vt,Cap_cross
6060     COM /Const/ REAL Q,K,Ni,Nuth
6070     COM /Meas_data/ REAL Icp_lead(*),Icp_trail(*)
6080     COM /Calc_data/ REAL Dit_lead(*),Dit_trail(*),Energy_lead(*),Energy_trail(*)
6090    ! ---------- Create charge pumping data to ASCII file ------------------
6100     ON ERROR GOSUB Error
6110     CREATE Save_ascii$,100
6120     OFF ERROR
6130     ASSIGN @File TO Save_ascii$;FORMAT ON
6140     OUTPUT @File;No_of_meas
6150     OUTPUT @File;Pulse_base,Pulse_peak,Pulse_freq,Peak_hold,Fix_trans
6160     OUTPUT @File;Drain_source_v,Sub_v
6170     OUTPUT @File;Weff,Leff,T,Vfb,Vt,Cap_cross
6180     OUTPUT @File;Pulse_lead(*)
6190     OUTPUT @File;Pulse_trail(*)
6200     OUTPUT @File;Icp_lead(*)
6210     OUTPUT @File;Icp_trail(*)
6220     OUTPUT @File;Dit_lead(*)
6230     OUTPUT @File;Dit_trail(*)
6240     OUTPUT @File;Energy_lead(*)
6250     OUTPUT @File;Energy_trail(*)
6260     ASSIGN @File TO *
6270     SUBEXIT
6280    !
6290 Error:   !
6300    !
6310     OUTPUT @Hp415x;":DISP:WIND:STAT ON"   ! Screen update on
6320     OUTPUT @Hp415x;":DISP:WIND:ALL BAS"   ! All IBASIC screen
6330     IF ERRN=56 THEN
6340       PRINT "Old";Save_sacii$;"exists. Rename old file and press [Continue]."
6350     ELSE 
6360       PRINT ERRM$
6370       PRINT "Take measure(s) to prevent the error and press [Continue]."
6380     END IF 
6390     PAUSE
6400    !
6410     CLEAR SCREEN
6420     OUTPUT @Hp415x;":DISP:WIND:ALL BST"   ! Display IBASIC status screen
6430     RETURN
6440    !
6450   SUBEND
6460  !
6470 Save_data:SUB Save_data
6480     COM @Hp415x,@Form_off,INTEGER Hpib_sc
6490     COM /File_name1/ Setup_file$,Save_ascii$,Save_data$
6500    ! ----------- Save charge pumping data to DAT file ---------------------
6510     ON ERROR GOSUB Error
6520     OUTPUT @Hp415x;":MMEM:STOR:TRAC DEF,'"&Save_data$&"','DISK'"
6530     OFF ERROR
6540     SUBEXIT
6550    !
6560 Error:   !
6570    !
6580     OUTPUT @Hp415x;":DISP:WIND:STAT ON"   ! Screen update on
6590     OUTPUT @Hp415x;":DISP:WIND:ALL BAS"   ! All IBASIC screen
6600     IF ERRN=56 THEN
6610       PRINT "Old";Save_file$;"exists. Rename old file and press [Continue]."
6620     ELSE 
6630       PRINT ERRM$
6640       PRINT "Take measure(s) to prevent the error and press [Continue]."
6650     END IF 
6660     PAUSE
6670    !
6680     CLEAR SCREEN
6690     OUTPUT @Hp415x;":DISP:WIND:ALL BST"   ! Display IBASIC status screen
6700     RETURN
6710    !
6720   SUBEND
6730    !
6740 Test_end:SUB Test_end
6750     COM @Hp415x,@Form_off,INTEGER Hpib_sc
6760    !
6770     OUTPUT @Hp415x;"*CLS"                 ! Clear status data
6780     OUTPUT @Hp415x;":DISP:WIND:STAT ON"   ! Screen update on
6790     OUTPUT @Hp415x;":DISP:WIND:ALL INST"  ! All instrument screen
6800    !
6810   SUBEND
6820    !
6830 Err_check:SUB Err_check
6840     COM @Hp415x,@Form_off,INTEGER Hpib_sc
6850    !
6860     INTEGER I,J
6870     DIM Err_message$(10)[100]
6880    !
6890     OUTPUT @Hp415x;":PAGE:SCON:STOP"      ! Stop measurement
6900     I=0
6910     REPEAT
6920       I=I+1
6930       OUTPUT @Hp415x;":SYST:ERR?"         ! Read error
6940       ENTER @Hp415x;Err_num(I),Err_message$(I)
6950     UNTIL Err_num(I)=0
6960     IF I=1 THEN
6970       PRINT "No Error"
6980     ELSE 
6990       PRINT 
7000       PRINT 
7010       PRINT "### ERROR Occurred ###:"
7020       FOR J=1 TO I-1
7030         PRINT Err_num(J);Err_message$(J)
7040       NEXT J
7050       OUTPUT @Hp415x;":DISP:WIND:STAT ON" ! Screen update on
7060       OUTPUT @Hp415x;":DISP:WIND:ALL BAS" ! All IBASIC screen
7070       PRINT 
7080       PRINT "              === Test Aborted ==="
7090       STOP
7100     END IF 
7110   SUBEND
7120  !
7130 Set_pulse_time:SUB Set_pulse_time(Pulse_period,Pulse_width,Pulse_lead,Pulse_trail)
7140     COM @Hp415x,@Form_off,INTEGER Hpib_sc
7150    !
7160     OUTPUT @Hp415x;":PAGE:MEAS:PGUS:PULS:PGU1:PER";Pulse_period
7170     OUTPUT @Hp415x;":PAGE:MEAS:PGUS:PULS:PGU1:WIDT";Pulse_width
7180     OUTPUT @Hp415x;":PAGE:MEAS:PGUS:PULS:PGU1:LEAD";Pulse_lead
7190     OUTPUT @Hp415x;":PAGE:MEAS:PGUS:PULS:PGU1:TRA";Pulse_trail
7200   SUBEND
7210  !
7220 Set_pulse_volt:SUB Set_pulse_volt
7230     COM @Hp415x,@Form_off,INTEGER Hpib_sc
7240     COM /Condition1/ REAL Pulse_base,Pulse_peak,Pulse_freq,Peak_hold,Fix_trans
7250    !
7260     OUTPUT @Hp415x;":PAGE:MEAS:PGUS:PULS:PGU1:PEAK ";Pulse_peak   ! PGU1 pulse peak voltage
7270     OUTPUT @Hp415x;":PAGE:MEAS:PGUS:PULS:PGU1:BASE ";Pulse_base   ! PGU1 pulse base voltage
7280   SUBEND
7290  !
7300 Pulse_enable:SUB Pulse_enable   ! This subprogram is used to enable
7310  ! external pulse generator output
7320  ! OUTPUT Ext_pg;"ENABLE COMMAND"
7330  !
7340   SUBEND
7350 Pulse_disable:SUB Pulse_disable   ! This subprogram is used to disable
7360  ! external pulse generator output
7370  ! OUTPUT Ext_pg;"DISABLE COMMAND"
7380  !
7390   SUBEND
