10   !*************************************************
20   !*
30   !* FILE       :  CPV
40   !* DESCRIPTION:  Program for Charge Pumping Test
50   !* PRODUCT    :  4155,4156
60   !* REVISION   :  Rev.A.01.01
70   !*
80   !*   (c) Copyright Agilent Technologies 1998
90   !*              All rights 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_amp,Base_start,Base_stop,Base_step,No_of_step
470    COM /Condition2/ REAL Pulse_period,Pulse_width,Pulse_lead,Pulse_trail
480    COM /Condition3/ REAL Drain_source_v,Sub_v
490    COM /Condition5/ REAL Weff,Leff
500    COM /Meas_data/ V_base(1:200),Isb(1:200)
510   !
520   ! ---------- Input Parameters --------------------------------------------
530   !
540   ! ---------- GPIB Setup -------------------------------------------------
550    INTEGER Hpib_addr,Swm_sc,Swm_addr
560   !
570    Hpib_sc=8           ! 415X GPIB Select Code
580    Hpib_addr=0         ! 415X GPIB Address
590   !
600    ASSIGN @Hp415x TO Hpib_sc*100+Hpib_addr
610    ASSIGN @Form_off TO Hpib_sc*100+Hpib_addr;FORMAT OFF
620   !
630   ! ---------- Pulse Voltage Conditions ------------------------------------
640    Pulse_amp=6         ! Pulse Amplitude Voltage
650    Base_start=-9       ! Start Pulse Base Voltage
660    Base_stop=2         ! Stop Pulse Base Voltage
670    Base_step=1         ! Step Pulse Base Voltage
680   !
690    No_of_step=INT((Base_stop-Base_start)/Base_step)+1  ! No. of steps
700    REDIM V_base(1:No_of_step)
710    REDIM Isb(1:No_of_step)
720   !
730   ! ---------- Pulse Timing Conditions -------------------------------------
740    Pulse_period=2.E-6  ! Pulse Period
750    Pulse_width=1.E-6   ! Pulse Width
760    Pulse_lead=1.E-7    ! Pulse Leading Time
770    Pulse_trail=1.E-7   ! Pulse Trailing Time
780   !
790   ! ---------- Bias Conditions ---------------------------------------------
800    Drain_source_v=.5   ! Drain and Source Voltage
810    Sub_v=0             ! Substrate Voltage
820   !
830   ! ---------- Device geometry ---------------------------------------------
840    Weff=.005           ! Channel width [cm]
850    Leff=.0005          ! Channel length [cm]
860   !
870   ! ---------- Definition of measurement and stress setup files ------------
880   !
890    Setup_file$="CHP.MES"    ! Charge Pumping Test Setup file
900   !
910   ! ---------- File name to save ASCII data --------------------------------
920    Save_ascii$="CHP.ASC"    ! Charge Pumping Test Data ASCII file
930   !
940   ! ---------- File name to save GRAPHICS data -----------------------------
950    Save_data$="CHP.DAT"     ! Charge Pumping Test Data file
960   !
970   !///////////////// Main //////////////////////////////////////////////////
980   !
990    ON INTR Hpib_sc CALL Err_check  ! Enables HP-IB interrupt
1000   ENABLE INTR Hpib_sc;2
1010  !
1020   CALL Input_param                ! Input Parameters
1030   CALL Init_hp415x                ! Initialize 415X
1040   CALL Measure                    ! Measure Charge Pumping Current
1050   CALL Graph                      ! Draw Graph of Icp - Pulse Base Voltage
1060   CALL Save_ascii                 ! Save ASCII file
1070   CALL Save_data                  ! Save DAT file
1080   CALL Test_end                   !
1090   DISP "HCI Degradation Test is Completed!!"
1100  !
1110   END
1120  !
1130  !/////////////// Sub //////////////////////////////////////////////
1140 Input_param:SUB Input_param
1150     COM @Hp415x,@Form_off,INTEGER Hpib_sc
1160     COM /File_name1/ Setup_file$,Save_ascii$,Save_data$
1170     COM /Condition1/ REAL Pulse_amp,Base_start,Base_stop,Base_step,No_of_step
1180     COM /Condition2/ REAL Pulse_period,Pulse_width,Pulse_lead,Pulse_trail
1190     COM /Condition3/ REAL Drain_source_v,Sub_v
1200     COM /Condition5/ REAL Weff,Leff
1210     COM /Meas_data/ V_base(*),Isb(*)
1220    !
1230     CLEAR SCREEN
1240     OUTPUT @Hp415x;":DISP:WIND:ALL BAS"   ! All IBASIC screeen
1250    !
1260     PRINT "Menu to Change Measurement Conditions"
1270    !
1280     PRINT TABXY(2,2);"--------------- File Name -----------------"
1290     PRINT TABXY(2,3);"Setup file name :";Setup_file$
1300     PRINT TABXY(2,4);"ASCII file name to save data :";Save_ascii$
1310     PRINT TABXY(2,5);"DAT file name to save data :";Save_data$
1320     PRINT TABXY(2,6);"--------------- Pulse Voltage -------------"
1330     PRINT TABXY(2,7);"Pulse Amplitude :";Pulse_amp;"[V]"
1340     PRINT TABXY(2,8);"Start pulse base voltage :";Base_start;"[V]"
1350     PRINT TABXY(2,9);"Stop pulse base voltage :";Base_stop;"[V]"
1360     PRINT TABXY(2,10);"Step pulse base voltage :";Base_step;"[V]"
1370     PRINT TABXY(2,11);"--------------- Pulse Time ----------------"
1380     PRINT TABXY(2,12);"Pulse period :";Pulse_period;"[sec]"
1390     PRINT TABXY(2,13);"Pulse width :";Pulse_width;"[sec]"
1400     PRINT TABXY(2,14);"Pulse leading time :";Pulse_lead;"[sec]"
1410     PRINT TABXY(2,15);"Pulse trailing time :";Pulse_trail;"[sec]"
1420     PRINT TABXY(2,16);"--------------- SMU Bias ------------------"
1430     PRINT TABXY(2,17);"Drain and Source bias :";Drain_source_v;"[V]"
1440     PRINT TABXY(2,18);"Substrate bias :";Sub_v;"[V]"
1450     PRINT TABXY(2,19);"----------- Device parameters -------------"
1460     PRINT TABXY(2,20);"Channel width :";Weff;"[cm]"
1470     PRINT TABXY(2,21);"Channel length :";Leff;"[cm]"
1480    !
1490     ON KEY 1 LABEL "File   Name   ",1 CALL Input_file_name
1500     ON KEY 2 LABEL "Pulse  Voltage",1 CALL Input_pulse_v
1510     ON KEY 3 LABEL "Pulse  Time   ",1 CALL Input_pulse_t
1520     ON KEY 4 LABEL "SMU    BIAS   ",1 CALL Input_smu_bias
1530     ON KEY 5 LABEL "Device Parameter",1 CALL Device_geometry
1540     ON KEY 6 LABEL "              ",1 CALL Nop
1550     ON KEY 7 LABEL "Measure       ",1 GOTO End_of_sub
1560    !
1570     LOOP
1580       DISP "Select softkey to change parameters."
1590       WAIT .5
1600     END LOOP 
1610    !
1620 End_of_sub:!
1630     OFF KEY
1640     DISP 
1650     CLEAR SCREEN
1660     OUTPUT @Hp415x;":DISP:WIND:ALL BST"   ! IBASIC status screeen
1670   SUBEND
1680  !
1690 Input_file_name:SUB Input_file_name
1700     COM /File_name1/ Setup_file$,Save_ascii$,Save_data$
1710    !
1720     ON KEY 1 LABEL "Setup   File  ",2 GOSUB Setup_file
1730     ON KEY 2 LABEL "ASCII   File  ",2 GOSUB Ascii_file
1740     ON KEY 3 LABEL "DAT     File  ",2 GOSUB Dat_file
1750     ON KEY 4 LABEL "              ",2 CALL Nop
1760     ON KEY 5 LABEL "              ",2 CALL Nop
1770     ON KEY 6 LABEL "              ",2 CALL Nop
1780     ON KEY 7 LABEL "RETURN        ",2 GOTO End_of_sub
1790     LOOP
1800       DISP "Select softkey to change parameter."
1810       WAIT .5
1820     END LOOP 
1830    !
1840 Setup_file:!
1850     INPUT "Enter setup file name(XXX.MES)",Setup_file$
1860     PRINT TABXY(2,3);"                                                          "
1870     PRINT TABXY(2,3);"Setup file name :";Setup_file$
1880     RETURN
1890 Ascii_file:!
1900     INPUT "Enter ASCII data file name",Save_ascii$
1910     PRINT TABXY(2,4);"                                                          "
1920     PRINT TABXY(2,4);"ASCII file name to save data :";Save_ascii$
1930     RETURN
1940 Dat_file:!
1950     INPUT "Enter DAT type data file name",Save_data$
1960     PRINT TABXY(2,5);"                                                          "
1970     PRINT TABXY(2,5);"DAT file name to save data :";Save_data$
1980     RETURN
1990 End_of_sub:!
2000     OFF KEY
2010     DISP 
2020   SUBEND
2030  !
2040 Input_pulse_v:SUB Input_pulse_v
2050     COM /Condition1/ REAL Pulse_amp,Base_start,Base_stop,Base_step,No_of_step
2060     COM /Meas_data/ V_base(*),Isb(*)
2070    !
2080     ON KEY 1 LABEL "Pulse  Amp",2 GOSUB Pulse_amp
2090     ON KEY 2 LABEL "Pulse  Base   Start",2 GOSUB Base_start
2100     ON KEY 3 LABEL "Pulse  Base   Stop ",2 GOSUB Base_stop
2110     ON KEY 4 LABEL "Pulse  Base   Step ",2 GOSUB Base_step
2120     ON KEY 5 LABEL "              ",2 CALL Nop
2130     ON KEY 6 LABEL "              ",2 CALL Nop
2140     ON KEY 7 LABEL "RETURN        ",2 GOTO End_of_sub
2150     LOOP
2160       DISP "Select softkey to change parameter."
2170       WAIT .5
2180     END LOOP 
2190 Pulse_amp:!
2200     INPUT "Enter Pulse Amplitude [V]",Pulse_amp
2210     PRINT TABXY(2,7);"                                                          "
2220     PRINT TABXY(2,7);"Pulse Amplitude :";Pulse_amp;"[V]"
2230     RETURN
2240 Base_start:!
2250     INPUT "Enter Start Pulse Base Voltage [V]",Base_start
2260     PRINT TABXY(2,8);"                                                          "
2270     PRINT TABXY(2,8);"Start pulse base voltage :";Base_start;"[V]"
2280     RETURN
2290 Base_stop:!
2300     INPUT "Enter Stop Pulse Base Voltage [V]",Base_stop
2310     PRINT TABXY(2,9);"                                                          "
2320     PRINT TABXY(2,9);"Stop pulse base voltage :";Base_stop;"[V]"
2330     RETURN
2340 Base_step:!
2350     INPUT "Enter Step Pulse Base Voltage [V]",Base_step
2360     PRINT TABXY(2,10);"                                                          "
2370     PRINT TABXY(2,10);"Step pulse base voltage :";Base_step;"[V]"
2380     RETURN
2390    !
2400 End_of_sub:!
2410     OFF KEY
2420     DISP 
2430     No_of_step=INT((Base_stop-Base_start)/Base_step)+1  ! No. of steps
2440     REDIM V_base(1:No_of_step)
2450     REDIM Isb(1:No_of_step)
2460   SUBEND
2470  !
2480 Input_pulse_t:SUB Input_pulse_t
2490     COM /Condition2/ REAL Pulse_period,Pulse_width,Pulse_lead,Pulse_trail
2500    !
2510     ON KEY 1 LABEL "Pulse  Period",2 GOSUB Pulse_period
2520     ON KEY 2 LABEL "Pulse  Width ",2 GOSUB Pulse_width
2530     ON KEY 3 LABEL "Pulse  LeadingTime  ",2 GOSUB Pulse_lead
2540     ON KEY 4 LABEL "Pulse  Trail  Time  ",2 GOSUB Pulse_trail
2550     ON KEY 5 LABEL "              ",2 CALL Nop
2560     ON KEY 6 LABEL "              ",2 CALL Nop
2570     ON KEY 7 LABEL "RETURN        ",2 GOTO End_of_sub
2580     LOOP
2590       DISP "Select softkey to change parameter."
2600       WAIT .5
2610     END LOOP 
2620 Pulse_period:!
2630     INPUT "Enter Pulse Period [sec]",Pulse_period
2640     PRINT TABXY(2,12);"                                                          "
2650     PRINT TABXY(2,12);"Pulse period :";Pulse_period;"[sec]"
2660     RETURN
2670 Pulse_width:!
2680     INPUT "Enter Pulse Width [sec]",Pulse_width
2690     PRINT TABXY(2,13);"                                                          "
2700     PRINT TABXY(2,13);"Pulse width :";Pulse_width;"[sec]"
2710     RETURN
2720 Pulse_lead:!
2730     INPUT "Enter Pulse Leading Time [sec]",Pulse_lead
2740     PRINT TABXY(2,14);"                                                          "
2750     PRINT TABXY(2,14);"Pulse leading time :";Pulse_lead;"[sec]"
2760     RETURN
2770 Pulse_trail:!
2780     INPUT "Enter Pulse Trailing Time [sec]",Pulse_trail
2790     PRINT TABXY(2,15);"                                                          "
2800     PRINT TABXY(2,15);"Pulse trailing time :";Pulse_trail;"[sec]"
2810     RETURN
2820 End_of_sub:!
2830     OFF KEY
2840     DISP 
2850    !
2860   SUBEND
2870  !
2880 Input_smu_bias:SUB Input_smu_bias
2890     COM /Condition3/ REAL Drain_source_v,Sub_v
2900    !
2910     ON KEY 1 LABEL "Drain  Source Voltage",2 GOSUB D_s_v
2920     ON KEY 2 LABEL "Sub    Voltage",2 GOSUB Sub_v
2930     ON KEY 3 LABEL "              ",2 CALL Nop
2940     ON KEY 4 LABEL "              ",2 CALL Nop
2950     ON KEY 5 LABEL "              ",2 CALL Nop
2960     ON KEY 6 LABEL "              ",2 CALL Nop
2970     ON KEY 7 LABEL "RETURN        ",2 GOTO End_of_sub
2980     LOOP
2990       DISP "Select softkey to change parameter."
3000       WAIT .5
3010     END LOOP 
3020 D_s_v:   !
3030     INPUT "Enter Drain and Source Voltage [V]",Drain_source_v
3040     PRINT TABXY(2,17);"                                                          "
3050     PRINT TABXY(2,17);"Drain and Source bias :";Drain_source_v;"[V]"
3060     RETURN
3070 Sub_v:   !
3080     INPUT "Enter Substrate Voltage [V]",Sub_v
3090     PRINT TABXY(2,18);"                                                          "
3100     PRINT TABXY(2,18);"Substrate bias :";Sub_v;"[V]"
3110     RETURN
3120    !
3130 End_of_sub:   !
3140     OFF KEY
3150     DISP 
3160   SUBEND
3170  !
3180 Device_geometry:SUB Device_geometry
3190     COM /Condition5/ REAL Weff,Leff
3200    !
3210     ON KEY 1 LABEL "Weff          ",2 GOSUB Weff
3220     ON KEY 2 LABEL "Leff          ",2 GOSUB Leff
3230     ON KEY 3 LABEL "              ",2 CALL Nop
3240     ON KEY 4 LABEL "              ",2 CALL Nop
3250     ON KEY 5 LABEL "              ",2 CALL Nop
3260     ON KEY 6 LABEL "              ",2 CALL Nop
3270     ON KEY 7 LABEL "RETURN        ",2 GOTO End_of_sub
3280    !
3290     LOOP
3300       DISP "Select softkey to change parameter."
3310       WAIT .5
3320     END LOOP 
3330 Weff:!
3340     INPUT "Enter effective channel width [cm]",Weff
3350     PRINT TABXY(2,20);"                                                          "
3360     PRINT TABXY(2,20);"Channel width :";Weff;"[cm]"
3370     RETURN
3380 Leff:!
3390     INPUT "Enter effective channel length [cm]",Leff
3400     PRINT TABXY(2,21);"                                                          "
3410     PRINT TABXY(2,21);"Channel length :";Leff;"[cm]"
3420     RETURN
3430    !
3440 End_of_sub:   !
3450     OFF KEY
3460     DISP 
3470   SUBEND
3480   !
3490 Nop:SUB Nop
3500   SUBEND
3510  !
3520 Init_hp415x:SUB Init_hp415x
3530     COM @Hp415x,@Form_off,INTEGER Hpib_sc
3540     COM /File_name1/ Setup_file$,Save_ascii$,Save_data$
3550     COM /Condition1/ REAL Pulse_amp,Base_start,Base_stop,Base_step,No_of_step
3560     COM /Condition2/ REAL Pulse_period,Pulse_width,Pulse_lead,Pulse_trail
3570     COM /Condition3/ REAL Drain_source_v,Sub_v
3580     COM /Meas_data/ V_base(*),Isb(*)
3590     DIM Comment$[58]
3600    !
3610     CLEAR SCREEN
3620     CLEAR @Hp415x
3630     OUTPUT @Hp415x;"*RST"                 ! Device reset
3640     OUTPUT @Hp415x;"*CLS"                 ! Clear status data
3650     OUTPUT @Hp415x;":STAT:PRES"           ! Preset event enable mask register
3660     OUTPUT @Hp415x;":DISP:WIND:STAT OFF"  ! Screen update off
3670     OUTPUT @Hp415x;":CAL:AUTO OFF"        ! Auto calibration off
3680     OUTPUT @Hp415x;"*ESE 60;*SRE 32;*OPC?"! Event status/service request enable register setup
3690     ENTER @Hp415x;Complete
3700     OUTPUT @Hp415x;":DISP:WIND:ALL BST"   ! Display IBASIC status screen
3710    !
3720    ! Load setup file, and set bias conditions
3730    !
3740     OUTPUT @Hp415x;":MMEM:LOAD:STAT 0,'"&Setup_file$&"','DISK'"   ! Get setup file
3750     Comment$="Charge Pumping Current Measurement"
3760     OUTPUT @Hp415x;":PAGE:CHAN:COMM '"&Comment$&"'"               ! User omment
3770     OUTPUT @Hp415x;":PAGE:MEAS:SAMP:CONS:SMU1:SOUR ";Drain_source_v! SMU1 const voltage
3780     OUTPUT @Hp415x;":PAGE:MEAS:SAMP:CONS:SMU4:SOUR ";Sub_v        ! SMU4 const voltage
3790     CALL Set_pulse_time
3800    !
3810     ON ERROR GOTO Error_disp
3820    !
3830     OFF ERROR
3840     SUBEXIT
3850 Error_disp:   !
3860     DISP "Setup file was not resaved."
3870     WAIT 3
3880     DISP 
3890    !
3900   SUBEND
3910  !
3920 Measure:SUB Measure
3930     COM @Hp415x,@Form_off,INTEGER Hpib_sc
3940     COM /Condition1/ REAL Pulse_amp,Base_start,Base_stop,Base_step,No_of_step
3950     COM /Meas_data/ V_base(*),Isb(*)
3960    !
3970     INTEGER Number
3980     DIM Comment$[58]
3990     Number=0
4000    !
4010     FOR Pulse_base=Base_start TO Base_stop STEP Base_step
4020       Number=Number+1
4030       V_base(Number)=Pulse_base
4040      !
4050       OUTPUT @Hp415x;":DISP:WIND:STAT OFF"  ! Screen update off
4060       Comment$="Icp measurement. Pulse base Voltage ="&VAL$(Pulse_base)&"[ V ]"
4070       OUTPUT @Hp415x;":PAGE:CHAN:COMM '"&Comment$&"'"                      ! User comment
4080       CALL Set_pulse_volt(Pulse_base,Pulse_base+Pulse_amp)
4090      !
4100       OUTPUT @Hp415x;":PAGE:GLIS:GRAP:MENU" ! Draw graph
4110       OUTPUT @Hp415x;":DISP:WIND:STAT ON"   ! Screen update on
4120      !
4130      !CALL Pulse_enable
4140      !
4150       OUTPUT @Hp415x;":PAGE:SCON:MEAS:SING" ! Start sampling measurment
4160       OUTPUT @Hp415x;"*OPC?"                ! Check completion
4170       ENTER @Hp415x;Complete
4180      !
4190      !CALL Pulse_disable
4200      !
4210       OUTPUT @Hp415x;":DATA:DATA? 'ISB'"    ! Transfer ISB
4220       ENTER @Hp415x;Isb(Number)
4230       PRINT Pulse_base,Isb(Number)
4240      !
4250     NEXT Pulse_base
4260    !
4270   SUBEND
4280  !
4290 Graph:SUB Graph
4300     COM @Hp415x,@Form_off,INTEGER Hpib_sc
4310     COM /Condition1/ REAL Pulse_amp,Base_start,Base_stop,Base_step,No_of_step
4320     COM /Condition2/ REAL Pulse_period,Pulse_width,Pulse_lead,Pulse_trail
4330     COM /Meas_data/ V_base(*),Isb(*)
4340     COM /Condition5/ REAL Weff,Leff
4350     DIM Comment$[58]
4360    !
4370     OUTPUT @Hp415x;":DISP:WIND:STAT OFF"           ! Screen update off
4380    !
4390     Comment$="Charge Pumping Current vs Pulse Base Volatge"
4400     OUTPUT @Hp415x;":PAGE:CHAN:COMM '"&Comment$&"'"! Set user comment
4410    !
4420     OUTPUT @Hp415x;":TRAC:DEL:ALL"                 ! Delete all user variable names
4430     OUTPUT @Hp415x;":TRAC:DEF 'BaseV',";No_of_step ! Define user variable
4440     OUTPUT @Hp415x;":TRAC:UNIT 'BaseV','V'"        ! 'BaseV'
4450     OUTPUT @Hp415x;":TRAC:DEF 'Icp',";No_of_step   ! Define user variable
4460     OUTPUT @Hp415x;":TRAC:UNIT 'Icp','A'"          ! 'Icp'
4470    !
4480     OUTPUT @Hp415x;":FORM:DATA REAL,64"            ! Binary data transfer
4490     OUTPUT @Hp415x;":FORM:BORD NORM"               ! Transfer in normal mode
4500     OUTPUT @Hp415x;":TRAC 'BaseV',#0";             ! Transfer BaseV
4510     OUTPUT @Form_off;V_base(*),END
4520     OUTPUT @Hp415x;":TRAC 'Icp',#0";               ! Transfer Icp
4530     OUTPUT @Form_off;Isb(*),END
4540     OUTPUT @Hp415x;":FORM:DATA ASCII"              ! ASCII data transfer
4550    !
4560     OUTPUT @Hp415x;":PAGE:CHAN:UFUN:DEL:ALL"
4570     OUTPUT @Hp415x;":PAGE:CHAN:UFUN:DEF 'MAXICP','A','MAX(Icp)'" ! Set user function
4580     Freq=1/Pulse_period
4590     OUTPUT @Hp415x;":PAGE:CHAN:UFUN:DEF 'f','Hz','";Freq;"'"     ! Set user function
4600     OUTPUT @Hp415x;":PAGE:CHAN:UFUN:DEF 'Ag','cm2','";Leff*Weff;"'"! Set user function
4610     OUTPUT @Hp415x;":PAGE:CHAN:UFUN:DEF 'Dit',' ','MAXICP/q/f/Ag'" ! Set user function
4620     OUTPUT @Hp415x;":PAGE:DISP:GRAP:X:NAME 'BaseV'"! Set X axis to BaseV
4630     OUTPUT @Hp415x;":PAGE:DISP:GRAP:Y1:NAME 'Icp'" ! Set Y1 axis to Icp
4640     OUTPUT @Hp415x;":PAGE:DISP:GRAP:Y2:DEL"        ! Delete Y2 axis
4650     OUTPUT @Hp415x;":PAGE:DISP:SET:DVAR:DEL:ALL"
4660     OUTPUT @Hp415x;":PAGE:DISP:DVAR 'MAXICP'"      ! Set data variable
4670     OUTPUT @Hp415x;":PAGE:DISP:DVAR 'Dit'"         ! Set data variable
4680     OUTPUT @Hp415x;":PAGE:GLIS:GRAP:SCAL:AUTO ONCE"! Auto scale
4690     OUTPUT @Hp415x;":PAGE:GLIS:GRAP:MARK:STAT ON"  ! Marker on
4700     OUTPUT @Hp415x;":PAGE:GLIS:GRAP:MARK:DIR:Y1 MAX"! Move marker to Y1 max
4710    !
4720     OUTPUT @Hp415x;":DISP:WIND:STAT ON"            ! Screen update on
4730     OUTPUT @Hp415x;":DISP:WIND:STAT OFF"           ! Screen update off
4740    !
4750   SUBEND
4760  !
4770 Save_ascii:SUB Save_ascii
4780     COM @Hp415x,@Form_off,INTEGER Hpib_sc
4790     COM /File_name1/ Setup_file$,Save_ascii$,Save_data$
4800     COM /Condition1/ REAL Pulse_amp,Base_start,Base_stop,Base_step,No_of_step
4810     COM /Condition2/ REAL Pulse_period,Pulse_width,Pulse_lead,Pulse_trail
4820     COM /Condition3/ REAL Drain_source_v,Sub_v
4830     COM /Meas_data/ V_base(*),Isb(*)
4840    ! ---------- Create charge pumping data to ASCII file ------------------
4850     ON ERROR GOSUB Error
4860     CREATE Save_ascii$,100
4870     OFF ERROR
4880     ASSIGN @File TO Save_ascii$;FORMAT ON
4890     OUTPUT @File;Pulse_amp,Base_start,Base_stop,Base_step,No_of_step
4900     OUTPUT @File;Pulse_period,Pulse_width,Pulse_lead,Pulse_trail
4910     OUTPUT @File;V_base(*)
4920     OUTPUT @File;Isb(*)
4930     ASSIGN @File TO *
4940     SUBEXIT
4950    !
4960 Error:   !
4970    !
4980     OUTPUT @Hp415x;":DISP:WIND:STAT ON"   ! Screen update on
4990     OUTPUT @Hp415x;":DISP:WIND:ALL BAS"   ! All IBASIC screen
5000     IF ERRN=56 THEN
5010       PRINT "Old";Save_sacii$;"exists. Rename old file and press [Continue]."
5020     ELSE 
5030       PRINT ERRM$
5040       PRINT "Take measure(s) to prevent the error and press [Continue]."
5050     END IF 
5060     PAUSE
5070    !
5080     CLEAR SCREEN
5090     OUTPUT @Hp415x;":DISP:WIND:ALL BST"   ! Display IBASIC status screen
5100     RETURN
5110    !
5120   SUBEND
5130  !
5140 Save_data:SUB Save_data
5150     COM @Hp415x,@Form_off,INTEGER Hpib_sc
5160     COM /File_name1/ Setup_file$,Save_ascii$,Save_data$
5170    ! ----------- Save charge pumping data to DAT file ---------------------
5180     ON ERROR GOSUB Error
5190     OUTPUT @Hp415x;":MMEM:STOR:TRAC DEF,'"&Save_data$&"','DISK'"
5200     OFF ERROR
5210     SUBEXIT
5220    !
5230 Error:   !
5240    !
5250     OUTPUT @Hp415x;":DISP:WIND:STAT ON"   ! Screen update on
5260     OUTPUT @Hp415x;":DISP:WIND:ALL BAS"   ! All IBASIC screen
5270     IF ERRN=56 THEN
5280       PRINT "Old";Save_file$;"exists. Rename old file and press [Continue]."
5290     ELSE 
5300       PRINT ERRM$
5310       PRINT "Take measure(s) to prevent the error and press [Continue]."
5320     END IF 
5330     PAUSE
5340    !
5350     CLEAR SCREEN
5360     OUTPUT @Hp415x;":DISP:WIND:ALL BST"   ! Display IBASIC status screen
5370     RETURN
5380    !
5390   SUBEND
5400    !
5410 Test_end:SUB Test_end
5420     COM @Hp415x,@Form_off,INTEGER Hpib_sc
5430    !
5440     OUTPUT @Hp415x;"*CLS"                 ! Clear status data
5450     OUTPUT @Hp415x;":DISP:WIND:STAT ON"   ! Screen update on
5460     OUTPUT @Hp415x;":DISP:WIND:ALL INST"  ! All instrument screen
5470    !
5480   SUBEND
5490    !
5500 Err_check:SUB Err_check
5510     COM @Hp415x,@Form_off,INTEGER Hpib_sc
5520    !
5530     INTEGER I,J
5540    !
5550     OUTPUT @Hp415x;":PAGE:SCON:STOP"      ! Stop measurement
5560     I=0
5570     REPEAT
5580       I=I+1
5590       OUTPUT @Hp415x;":SYST:ERR?"         ! Read error
5600       ENTER @Hp415x;Err_num(I),Err_message$(I)
5610     UNTIL Err_num(I)=0
5620     IF I=1 THEN
5630       PRINT "No Error"
5640     ELSE 
5650       PRINT 
5660       PRINT 
5670       PRINT "### ERROR Occurred ###:"
5680       FOR J=1 TO I-1
5690         PRINT Err_num(J);Err_message$(J)
5700       NEXT J
5710       OUTPUT @Hp415x;":DISP:WIND:STAT ON" ! Screen update on
5720       OUTPUT @Hp415x;":DISP:WIND:ALL BAS" ! All IBASIC screen
5730       PRINT 
5740       PRINT "              === Test Aborted ==="
5750       STOP
5760     END IF 
5770   SUBEND
5780  !
5790 Set_pulse_time:SUB Set_pulse_time
5800     COM @Hp415x,@Form_off,INTEGER Hpib_sc
5810     COM /Condition2/ REAL Pulse_period,Pulse_width,Pulse_lead,Pulse_trail
5820    !
5830     OUTPUT @Hp415x;":PAGE:MEAS:PGUS:PULS:PGU1:PER ";Pulse_period  ! PGU1 pulse period
5840     OUTPUT @Hp415x;":PAGE:MEAS:PGUS:PULS:PGU1:WIDT ";Pulse_width  ! PGU1 pulse width
5850     OUTPUT @Hp415x;":PAGE:MEAS:PGUS:PULS:PGU1:LEAD ";Pulse_lead   ! PGU1 pulse leading time
5860     OUTPUT @Hp415x;":PAGE:MEAS:PGUS:PULS:PGU1:TRA ";Pulse_trail ! PGU1 pulse trailing time
5870   SUBEND
5880   !
5890 Set_pulse_volt:SUB Set_pulse_volt(Pulse_base,Pulse_peak)
5900     COM @Hp415x,@Form_off,INTEGER Hpib_sc
5910   !
5920     OUTPUT @Hp415x;":PAGE:MEAS:PGUS:PULS:PGU1:BASE ";Pulse_base   ! PGU1 pulse base voltage
5930     OUTPUT @Hp415x;":PAGE:MEAS:PGUS:PULS:PGU1:PEAK ";Pulse_peak   ! PGU1 pulse peak voltage
5940   SUBEND
5950   !
5960 Pulse_enable:SUB Pulse_enable   ! This subprogram is used to enable
5970   ! external pulse generator output
5980   ! OUTPUT Ext_pg;"ENABLE COMMAND"
5990   !
6000   SUBEND
6010 Pulse_disable:SUB Pulse_disable   ! This subprogram is used to disable
6020   ! external pulse generator output
6030   ! OUTPUT Ext_pg;"DISABLE COMMAND"
6040   !
6050   SUBEND
