1000 !*************************************************
1010 !*
1020 !* FILE       :  CPV
1030 !* DESCRIPTION:  Program for Charge Pumping Test
1040 !* AUTHOR     :  Mamoru Aruga,     YHP
1050 !* CREATED    :  Mar. 27, 1995
1060 !* PRODUCT    :  HP4155A,HP4156A
1070 !* REVISION   :  Rev.A.01.00
1080 !*
1090 !*   (c) Copyright 1995, Hewlett-Packard Co,
1100 !*              All rights reserved.
1110 !*
1120 !*
1130 !*  Customer shall have the personal, non-
1140 !* transferable rights to use, copy or modify
1150 !* this SAMPLE PROGRAM for Customer's internal
1160 !* operations.  Customer shall use the SAMPLE
1170 !* PROGRAM solely and exclusively for its own
1180 !* purpose and shall not license, lease, market
1190 !* or distribute the SAMPLE PROGRAM or modification
1200 !* or any part thereof.
1210 !*
1220 !*  HP shall not be liable for the quality,
1230 !* performance or behavior of the SAMPLE PROGRAM.
1240 !* HP especially disclaims that the operation of
1250 !* the SAMPLE PROGRAM shall be uninterrupted or
1260 !* error free.  This SAMPLE PROGRAM is provided
1270 !* AS IS.
1280 !*
1290 !*  HP DISCLAIMS THE IMPLIED WARRANTIES OF
1300 !* MERCHANTABILITY AND FITNESS FOR A PARTICULAR
1310 !* PURPOSE.
1320 !*
1330 !*  HP shall not be liable for any infringement
1340 !* of any patent, trademark, copyright or other
1350 !* proprietary rights by the SAMPLE PROGRAM or
1360 !* its use.  HP does not warrant that the SAMPLE
1370 !* PROGRAM is free from infringements or such
1380 !* rights of third parties.  However, HP will not
1390 !* knowingly infringe or deliver a software that
1400 !* infringes the patent, trademark, copyright or
1410 !* other proprietary right of a third party.
1420 !*
1430 !*************************************************
1440 !
1450  COM @Hp415x,@Form_off,INTEGER Hpib_sc
1460  COM /File_name1/ Setup_file$[12],Save_ascii$[12],Save_data$[12]
1470  COM /Condition1/ REAL Pulse_amp,Base_start,Base_stop,Base_step,No_of_step
1480  COM /Condition2/ REAL Pulse_period,Pulse_width,Pulse_lead,Pulse_trail
1490  COM /Condition3/ REAL Drain_source_v,Sub_v
1500  COM /Condition5/ REAL Weff,Leff
1510  COM /Meas_data/ V_base(1:200),Isb(1:200)
1520  !
1530  ! ---------- Input Parameters --------------------------------------------
1540  !
1550  ! ---------- HP-IB Setup -------------------------------------------------
1560  INTEGER Hpib_addr,Swm_sc,Swm_addr
1570  !
1580  Hpib_sc=8            ! HP 415X HP-IB Select Code
1590  Hpib_addr=0          ! HP 415X HP-IB Address
1600  !
1610  ASSIGN @Hp415x TO Hpib_sc*100+Hpib_addr
1620  ASSIGN @Form_off TO Hpib_sc*100+Hpib_addr;FORMAT OFF
1630  !
1640  ! ---------- Pulse Voltage Conditions ------------------------------------
1650  Pulse_amp=6          ! Pulse Amplitude Voltage
1660  Base_start=-9        ! Start Pulse Base Voltage
1670  Base_stop=2          ! Stop Pulse Base Voltage
1680  Base_step=1          ! Step Pulse Base Voltage
1690  !
1700  No_of_step=INT((Base_stop-Base_start)/Base_step)+1   ! No. of steps
1710  REDIM V_base(1:No_of_step)
1720  REDIM Isb(1:No_of_step)
1730  !
1740  ! ---------- Pulse Timing Conditions -------------------------------------
1750  Pulse_period=2.E-6   ! Pulse Period
1760  Pulse_width=1.E-6    ! Pulse Width
1770  Pulse_lead=1.E-7     ! Pulse Leading Time
1780  Pulse_trail=1.E-7    ! Pulse Trailing Time
1790  !
1800  ! ---------- Bais Conditions ---------------------------------------------
1810  Drain_source_v=.5    ! Drain and Source Voltage
1820  Sub_v=0              ! Substrait Voltage
1830  !
1840  ! ---------- Device geometry ---------------------------------------------
1850  Weff=.005            ! Channel width [cm]
1860  Leff=.0005           ! Channel length [cm]
1870  !
1880  ! ---------- Definition of measurement and stress setup files ------------
1890  !
1900  Setup_file$="CHP.MES"     ! Charge Pumping Test Setup file
1910  !
1920  ! ---------- File name to save ASCII data --------------------------------
1930  Save_ascii$="CHP.ASC"     ! Charge Pumping Test Data ASCII file
1940  !
1950  ! ---------- File name to save GRAPHICS data -----------------------------
1960  Save_data$="CHP.DAT"      ! Charge Pumping Test Data file
1970  !
1980  !///////////////// Main //////////////////////////////////////////////////
1990  !
2000  ON INTR Hpib_sc CALL Err_check   ! Enables HP-IB interrupt
2010  ENABLE INTR Hpib_sc;2
2020  !
2030  CALL Input_param                 ! Input Parameters
2040  CALL Init_hp415x                 ! Initialize HP 415X
2050  CALL Measure                     ! Measure Charge Pumping Current
2060  CALL Graph                       ! Draw Graph of Icp - Pulse Base Voltage
2070  CALL Save_ascii                  ! Save ASCII file
2080  CALL Save_data                   ! Save DAT file
2090  CALL Test_end                    !
2100  DISP "HCI Degradation Test is Completed!!"
2110  !
2120  END
2130  !
2140  !/////////////// Sub //////////////////////////////////////////////
2150 Input_param:SUB Input_param
2160    COM @Hp415x,@Form_off,INTEGER Hpib_sc
2170    COM /File_name1/ Setup_file$,Save_ascii$,Save_data$
2180    COM /Condition1/ REAL Pulse_amp,Base_start,Base_stop,Base_step,No_of_step
2190    COM /Condition2/ REAL Pulse_period,Pulse_width,Pulse_lead,Pulse_trail
2200    COM /Condition3/ REAL Drain_source_v,Sub_v
2210    COM /Condition5/ REAL Weff,Leff
2220    COM /Meas_data/ V_base(*),Isb(*)
2230    !
2240    CLEAR SCREEN
2250    OUTPUT @Hp415x;":DISP:WIND:ALL BAS"    ! All IBASIC screeen
2260    !
2270    PRINT "Menu to Change Measurement Conditions"
2280    !
2290    PRINT TABXY(2,2);"--------------- File Name -----------------"
2300    PRINT TABXY(2,3);"Setup file name :";Setup_file$
2310    PRINT TABXY(2,4);"ASCII file name to save data :";Save_ascii$
2320    PRINT TABXY(2,5);"DAT file name to save data :";Save_data$
2330    PRINT TABXY(2,6);"--------------- Pulse Voltage -------------"
2340    PRINT TABXY(2,7);"Pulse Amplitude :";Pulse_amp;"[V]"
2350    PRINT TABXY(2,8);"Start pulse base voltage :";Base_start;"[V]"
2360    PRINT TABXY(2,9);"Stop pulse base voltage :";Base_stop;"[V]"
2370    PRINT TABXY(2,10);"Step pulse base voltage :";Base_step;"[V]"
2380    PRINT TABXY(2,11);"--------------- Pulse Time ----------------"
2390    PRINT TABXY(2,12);"Pulse period :";Pulse_period;"[sec]"
2400    PRINT TABXY(2,13);"Pulse width :";Pulse_width;"[sec]"
2410    PRINT TABXY(2,14);"Pulse leading time :";Pulse_lead;"[sec]"
2420    PRINT TABXY(2,15);"Pulse trailing time :";Pulse_trail;"[sec]"
2430    PRINT TABXY(2,16);"--------------- SMU Bias ------------------"
2440    PRINT TABXY(2,17);"Drain and Source bais :";Drain_source_v;"[V]"
2450    PRINT TABXY(2,18);"Substrait bais :";Sub_v;"[V]"
2460    PRINT TABXY(2,19);"------ Device parameters & Temperature ------"
2470    PRINT TABXY(2,20);"Channel width :";Weff;"[cm]"
2480    PRINT TABXY(2,21);"Channel length :";Leff;"[cm]"
2490    !
2500    ON KEY 1 LABEL "File   Name   ",1 CALL Input_file_name
2510    ON KEY 2 LABEL "Pulse  Voltage",1 CALL Input_pulse_v
2520    ON KEY 3 LABEL "Pulse  Time   ",1 CALL Input_pulse_t
2530    ON KEY 4 LABEL "SMU    BIAS   ",1 CALL Input_smu_bias
2540    ON KEY 5 LABEL "Device Parameter",1 CALL Device_geometry
2550    ON KEY 6 LABEL "              ",1 CALL Nop
2560    ON KEY 7 LABEL "Measure       ",1 GOTO End_of_sub
2570    !
2580    LOOP
2590      DISP "Select softkey to change parameters."
2600    END LOOP
2610    !
2620 End_of_sub:!
2630    OFF KEY 
2640    DISP 
2650    CLEAR SCREEN
2660    OUTPUT @Hp415x;":DISP:WIND:ALL BST"    ! IBASIC status screeen
2670  SUBEND
2680  !
2690 Input_file_name:SUB Input_file_name
2700    COM /File_name1/ Setup_file$,Save_ascii$,Save_data$
2710    !
2720    ON KEY 1 LABEL "Setup   File  ",2 GOSUB Setup_file
2730    ON KEY 2 LABEL "ASCII   File  ",2 GOSUB Ascii_file
2740    ON KEY 3 LABEL "DAT     File  ",2 GOSUB Dat_file
2750    ON KEY 4 LABEL "              ",2 CALL Nop
2760    ON KEY 5 LABEL "              ",2 CALL Nop
2770    ON KEY 6 LABEL "              ",2 CALL Nop
2780    ON KEY 7 LABEL "RETURN        ",2 GOTO End_of_sub
2790    LOOP
2800      DISP "Select softkey to change parameter."
2810    END LOOP
2820    !
2830 Setup_file:!
2840    INPUT "Enter setup file name(XXX.MES)",Setup_file$
2850    PRINT TABXY(2,3);"Setup file name :";Setup_file$
2860    RETURN 
2870 Ascii_file:!
2880    INPUT "Enter ASCII data file name",Save_ascii$
2890    PRINT TABXY(2,4);"ASCII file name to save data :";Save_ascii$
2900    RETURN 
2910 Dat_file:!
2920    INPUT "Enter DAT type data file name",Save_data$
2930    PRINT TABXY(2,5);"DAT file name to save data :";Save_data$
2940    RETURN 
2950 End_of_sub:!
2960    OFF KEY 
2970    DISP 
2980  SUBEND
2990  !
3000 Input_pulse_v:SUB Input_pulse_v
3010    COM /Condition1/ REAL Pulse_amp,Base_start,Base_stop,Base_step,No_of_step
3020    COM /Meas_data/ V_base(*),Isb(*)
3030    !
3040    ON KEY 1 LABEL "Pulse   Amplitude",2 GOSUB Pulse_amp
3050    ON KEY 2 LABEL "Pulse   Base   Start",2 GOSUB Base_start
3060    ON KEY 3 LABEL "Pulse   Base   Stop ",2 GOSUB Base_stop
3070    ON KEY 4 LABEL "Pulse   Base   Step ",2 GOSUB Base_step
3080    ON KEY 5 LABEL "              ",2 CALL Nop
3090    ON KEY 6 LABEL "              ",2 CALL Nop
3100    ON KEY 7 LABEL "RETURN        ",2 GOTO End_of_sub
3110    LOOP
3120      DISP "Select softkey to change parameter."
3130    END LOOP
3140 Pulse_amp:!
3150    INPUT "Enter Pulse Amplitude [V]",Pulse_amp
3160    PRINT TABXY(2,7);"Pulse Amplitude :";Pulse_amp;"[V]"
3170    RETURN 
3180 Base_start:!
3190    INPUT "Enter Start Pulse Base Voltage [V]",Base_start
3200    PRINT TABXY(2,8);"Start pulse base voltage :";Base_start;"[V]"
3210    RETURN 
3220 Base_stop:!
3230    INPUT "Enter Stop Pulse Base Voltage [V]",Base_stop
3240    PRINT TABXY(2,9);"Stop pulse base voltage :";Base_stop;"[V]"
3250    RETURN 
3260 Base_step:!
3270    INPUT "Enter Step Pulse Base Voltage [V]",Base_step
3280    PRINT TABXY(2,10);"Step pulse base voltage :";Base_step;"[V]"
3290    RETURN 
3300    !
3310 End_of_sub:!
3320    OFF KEY 
3330    DISP 
3340    No_of_step=INT((Base_stop-Base_start)/Base_step)+1   ! No. of steps
3350    REDIM V_base(1:No_of_step)
3360    REDIM Isb(1:No_of_step)
3370  SUBEND
3380  !
3390 Input_pulse_t:SUB Input_pulse_t
3400    COM /Condition2/ REAL Pulse_period,Pulse_width,Pulse_lead,Pulse_trail
3410    !
3420    ON KEY 1 LABEL "Pulse   Period",2 GOSUB Pulse_period
3430    ON KEY 2 LABEL "Pulse   Width ",2 GOSUB Pulse_width
3440    ON KEY 3 LABEL "Pulse   LeadingTime  ",2 GOSUB Pulse_lead
3450    ON KEY 4 LABEL "Pulse   Trail  Time  ",2 GOSUB Pulse_trail
3460    ON KEY 5 LABEL "              ",2 CALL Nop
3470    ON KEY 6 LABEL "              ",2 CALL Nop
3480    ON KEY 7 LABEL "RETURN        ",2 GOTO End_of_sub
3490    LOOP
3500      DISP "Select softkey to change parameter."
3510    END LOOP
3520 Pulse_period:!
3530    INPUT "Enter Pulse Period [sec]",Pulse_period
3540    PRINT TABXY(2,12);"Pulse period :";Pulse_period;"[sec]"
3550    RETURN 
3560 Pulse_width:!
3570    INPUT "Enter Pulse Width [sec]",Pulse_width
3580    PRINT TABXY(2,13);"Pulse width :";Pulse_width;"[sec]"
3590    RETURN 
3600 Pulse_lead:!
3610    INPUT "Enter Pulse Leading Time [sec]",Pulse_lead
3620    PRINT TABXY(2,14);"Pulse leading time :";Pulse_lead;"[sec]"
3630    RETURN 
3640 Pulse_trail:!
3650    INPUT "Enter Pulse Trailing Time [sec]",Pulse_trail
3660    PRINT TABXY(2,15);"Pulse trailing time :";Pulse_trail;"[sec]"
3670    RETURN 
3680 End_of_sub:!
3690    OFF KEY 
3700    DISP 
3710    !
3720  SUBEND
3730  !
3740 Input_smu_bias:SUB Input_smu_bias
3750    COM /Condition3/ REAL Drain_source_v,Sub_v
3760    !
3770    ON KEY 1 LABEL "Drain   Source Voltage",2 GOSUB D_s_v
3780    ON KEY 2 LABEL "Sub     Voltage",2 GOSUB Sub_v
3790    ON KEY 3 LABEL "              ",2 CALL Nop
3800    ON KEY 4 LABEL "              ",2 CALL Nop
3810    ON KEY 5 LABEL "              ",2 CALL Nop
3820    ON KEY 6 LABEL "              ",2 CALL Nop
3830    ON KEY 7 LABEL "RETURN        ",2 GOTO End_of_sub
3840    LOOP
3850      DISP "Select softkey to change parameter."
3860    END LOOP
3870 D_s_v:   !
3880    INPUT "Enter Drain and Source Voltage [V]",Drain_source_v
3890    PRINT TABXY(2,17);"Drain and Source bais :";Drain_source_v;"[V]"
3900    RETURN 
3910 Sub_v:   !
3920    INPUT "Enter Substrate Voltage [V]",Sub_v
3930    PRINT TABXY(2,18);"Substrait bais :";Sub_v;"[V]"
3940    RETURN 
3950    !
3960 End_of_sub:   !
3970    OFF KEY 
3980    DISP 
3990  SUBEND
4000  !
4010 Device_geometry:SUB Device_geometry
4020    COM /Condition5/ REAL Weff,Leff
4030    !
4040    ON KEY 1 LABEL "Weff          ",2 GOSUB Weff
4050    ON KEY 2 LABEL "Leff          ",2 GOSUB Leff
4060    ON KEY 3 LABEL "              ",2 CALL Nop
4070    ON KEY 4 LABEL "              ",2 CALL Nop
4080    ON KEY 5 LABEL "              ",2 CALL Nop
4090    ON KEY 6 LABEL "              ",2 CALL Nop
4100    ON KEY 7 LABEL "RETURN        ",2 GOTO End_of_sub
4110    !
4120    LOOP
4130      DISP "Select softkey to change parameter."
4140    END LOOP
4150 Weff:!
4160    INPUT "Enter effective channel width [cm]",Weff
4170    PRINT TABXY(2,20);"Channel width :";Weff;"[cm]"
4180    RETURN 
4190 Leff:!
4200    INPUT "Enter effective channel length [cm]",Leff
4210    PRINT TABXY(2,21);"Channel length :";Leff;"[cm]"
4220    RETURN 
4230    !
4240 End_of_sub:   !
4250    OFF KEY 
4260    DISP 
4270  SUBEND
4280   !
4290 Nop:SUB Nop
4300  SUBEND
4310  !
4320 Init_hp415x:SUB Init_hp415x
4330    COM @Hp415x,@Form_off,INTEGER Hpib_sc
4340    COM /File_name1/ Setup_file$,Save_ascii$,Save_data$
4350    COM /Condition1/ REAL Pulse_amp,Base_start,Base_stop,Base_step,No_of_step
4360    COM /Condition2/ REAL Pulse_period,Pulse_width,Pulse_lead,Pulse_trail
4370    COM /Condition3/ REAL Drain_source_v,Sub_v
4380    COM /Meas_data/ V_base(*),Isb(*)
4390    DIM Comment$[58]
4400    !
4410    CLEAR SCREEN
4420    CLEAR @Hp415x
4430    OUTPUT @Hp415x;"*RST"                  ! Device reset
4440    OUTPUT @Hp415x;"*CLS"                  ! Clear status data
4450    OUTPUT @Hp415x;":STAT:PRES"            ! Preset event enable mask register
4460    OUTPUT @Hp415x;":DISP:WIND:STAT OFF"   ! Screen update off
4470    OUTPUT @Hp415x;":CAL:AUTO OFF"         ! Auto calibration off
4480    OUTPUT @Hp415x;"*ESE 60;*SRE 32;*OPC?" ! Event status/service request enable register setup
4490    ENTER @Hp415x;Complete
4500    OUTPUT @Hp415x;":DISP:WIND:ALL BST"    ! Display IBASIC status screen
4510    !
4520    ! Load setup file, set basi conditions and re-save setup file
4530    !
4540    OUTPUT @Hp415x;":MMEM:LOAD:STAT 0,'"&Setup_file$&"','DISK'"    ! Get setup file
4550    Comment$="Charge Pumping Current Measurement"
4560    OUTPUT @Hp415x;":PAGE:CHAN:COMM '"&Comment$&"'"                ! User omment
4570    OUTPUT @Hp415x;":PAGE:MEAS:SAMP:CONS:SMU1:SOUR ";Drain_source_v ! SMU1 const voltage
4580    OUTPUT @Hp415x;":PAGE:MEAS:SAMP:CONS:SMU4:SOUR ";Sub_v         ! SMU4 const voltage
4590    CALL Set_pulse_time
4600    !OUTPUT @Hp415x;":MMEM:DEL '"&Setup_file$&"','DISK',"           ! Purge old setup file
4610    ON ERROR GOTO Error_disp
4620    !OUTPUT @Hp415x;":MMEM:STOR:STAT 0,'"&Setup_file$&"','DISK'"    ! Save new setup file
4630    OFF ERROR 
4640    SUBEXIT
4650 Error_disp:   !
4660    DISP "Setup file was not resaved."
4670    WAIT 3
4680    DISP 
4690    !
4700  SUBEND
4710  !
4720 Measure:SUB Measure
4730    COM @Hp415x,@Form_off,INTEGER Hpib_sc
4740    COM /Condition1/ REAL Pulse_amp,Base_start,Base_stop,Base_step,No_of_step
4750    COM /Meas_data/ V_base(*),Isb(*)
4760    !
4770    INTEGER Number
4780    DIM Comment$[58]
4790    Number=0
4800    !
4810    FOR Pulse_base=Base_start TO Base_stop STEP Base_step
4820      Number=Number+1
4830      V_base(Number)=Pulse_base
4840      !
4850      OUTPUT @Hp415x;":DISP:WIND:STAT OFF"   ! Screen update off
4860      Comment$="Icp measurement. Pulse base Voltage ="&VAL$(Pulse_base)&"[ V ]"
4870      OUTPUT @Hp415x;":PAGE:CHAN:COMM '"&Comment$&"'"                       ! User comment
4880      CALL Set_pulse_volt(Pulse_base,Pulse_base+Pulse_amp)
4890      !
4900      OUTPUT @Hp415x;":PAGE:GLIS:GRAP:MENU"  ! Draw graph
4910      OUTPUT @Hp415x;":DISP:WIND:STAT ON"    ! Screen update on
4920      !
4930      !CALL Pulse_enable
4940      !
4950      OUTPUT @Hp415x;":PAGE:SCON:MEAS:SING"  ! Start sampling measurment
4960      OUTPUT @Hp415x;"*OPC?"                 ! Check completion
4970      ENTER @Hp415x;Complete
4980      !
4990      !CALL Pulse_disable
5000      !
5010      OUTPUT @Hp415x;":DATA:DATA? 'ISB'"     ! Transfer ISB
5020      ENTER @Hp415x;Isb(Number)
5030      PRINT Pulse_base,Isb(Number)
5040      !
5050    NEXT Pulse_base
5060    !
5070  SUBEND
5080  !
5090 Graph:SUB Graph
5100    COM @Hp415x,@Form_off,INTEGER Hpib_sc
5110    COM /Condition1/ REAL Pulse_amp,Base_start,Base_stop,Base_step,No_of_step
5120    COM /Condition2/ REAL Pulse_period,Pulse_width,Pulse_lead,Pulse_trail
5130    COM /Meas_data/ V_base(*),Isb(*)
5140    COM /Condition5/ REAL Weff,Leff
5150    DIM Comment$[58]
5160    !
5170    OUTPUT @Hp415x;":DISP:WIND:STAT OFF"            ! Screen update off
5180    !
5190    Comment$="Charge Pumping Current vs Pulse Base Volatge"
5200    OUTPUT @Hp415x;":PAGE:CHAN:COMM '"&Comment$&"'" ! Set user comment
5210    !
5220    OUTPUT @Hp415x;":TRAC:DEL:ALL"                  ! Delete all user variable names
5230    OUTPUT @Hp415x;":TRAC:DEF 'BaseV',";No_of_step  ! Define user variable
5240    OUTPUT @Hp415x;":TRAC:UNIT 'BaseV','V'"         ! 'BaseV'
5250    OUTPUT @Hp415x;":TRAC:DEF 'Icp',";No_of_step    ! Define user variable
5260    OUTPUT @Hp415x;":TRAC:UNIT 'Icp','A'"           ! 'Icp'
5270    !
5280    OUTPUT @Hp415x;":FORM:DATA REAL,64"             ! Binary data transfer
5290    OUTPUT @Hp415x;":FORM:BORD NORM"                ! Transfer in normal mode
5300    OUTPUT @Hp415x;":TRAC 'BaseV',#0";              ! Transfer BaseV
5310    OUTPUT @Form_off;V_base(*),END
5320    OUTPUT @Hp415x;":TRAC 'Icp',#0";                ! Transfer Icp
5330    OUTPUT @Form_off;Isb(*),END
5340    OUTPUT @Hp415x;":FORM:DATA ASCII"               ! ASCII data transfer
5350    !
5360    OUTPUT @Hp415x;":PAGE:CHAN:UFUN:DEL:ALL"
5370    OUTPUT @Hp415x;":PAGE:CHAN:UFUN:DEF 'MAXICP','A','MAX(Icp)'"  ! Set user function
5380    Freq=1/Pulse_period
5390    OUTPUT @Hp415x;":PAGE:CHAN:UFUN:DEF 'f','Hz','";Freq;"'"      ! Set user function
5400    OUTPUT @Hp415x;":PAGE:CHAN:UFUN:DEF 'Ag','cm2','";Leff*Weff;"'" ! Set user function
5410    OUTPUT @Hp415x;":PAGE:CHAN:UFUN:DEF 'Dit',' ','MAXICP/q/f/Ag'"  ! Set user function
5420    OUTPUT @Hp415x;":PAGE:DISP:GRAP:X:NAME 'BaseV'" ! Set X axis to BaseV
5430    OUTPUT @Hp415x;":PAGE:DISP:GRAP:Y1:NAME 'Icp'"  ! Set Y1 axis to Icp
5440    OUTPUT @Hp415x;":PAGE:DISP:GRAP:Y2:DEL"         ! Delete Y2 axis
5450    OUTPUT @Hp415x;":PAGE:DISP:SET:DVAR:DEL:ALL"
5460    OUTPUT @Hp415x;":PAGE:DISP:DVAR 'MAXICP'"       ! Set data variable
5470    OUTPUT @Hp415x;":PAGE:DISP:DVAR 'Dit'"          ! Set data variable
5480    OUTPUT @Hp415x;":PAGE:GLIS:GRAP:SCAL:AUTO ONCE" ! Auto scale
5490    OUTPUT @Hp415x;":PAGE:GLIS:GRAP:MARK:STAT ON"   ! Marker on
5500    OUTPUT @Hp415x;":PAGE:GLIS:GRAP:MARK:DIR:Y1 MAX" ! Move marker to Y1 max
5510    !
5520    OUTPUT @Hp415x;":DISP:WIND:STAT ON"             ! Screen update on
5530    OUTPUT @Hp415x;":DISP:WIND:STAT OFF"            ! Screen update off
5540    !
5550  SUBEND
5560  !
5570 Save_ascii:SUB Save_ascii
5580    COM @Hp415x,@Form_off,INTEGER Hpib_sc
5590    COM /File_name1/ Setup_file$,Save_ascii$,Save_data$
5600    COM /Condition1/ REAL Pulse_amp,Base_start,Base_stop,Base_step,No_of_step
5610    COM /Condition2/ REAL Pulse_period,Pulse_width,Pulse_lead,Pulse_trail
5620    COM /Condition3/ REAL Drain_source_v,Sub_v
5630    COM /Meas_data/ V_base(*),Isb(*)
5640    ! ---------- Create charge pumping data to ASCII file ------------------
5650    ON ERROR GOSUB Error
5660    CREATE Save_ascii$,100
5670    OFF ERROR 
5680    ASSIGN @File TO Save_ascii$;FORMAT ON
5690    OUTPUT @File;Pulse_amp,Base_start,Base_stop,Base_step,No_of_step
5700    OUTPUT @File;Pulse_period,Pulse_width,Pulse_lead,Pulse_trail
5710    OUTPUT @File;V_base(*)
5720    OUTPUT @File;Isb(*)
5730    ASSIGN @File TO *
5740    SUBEXIT
5750    !
5760 Error:   !
5770    !
5780    OUTPUT @Hp415x;":DISP:WIND:STAT ON"    ! Screen update on
5790    OUTPUT @Hp415x;":DISP:WIND:ALL BAS"    ! All IBASIC screen
5800    IF ERRN=56 THEN 
5810      PRINT "Old";Save_sacii$;"exists. Rename old file and press [Continue]."
5820    ELSE
5830      PRINT ERRM$
5840      PRINT "Take measure(s) to prevent the error and press [Continue]."
5850    END IF
5860    PAUSE
5870    !
5880    CLEAR SCREEN
5890    OUTPUT @Hp415x;":DISP:WIND:ALL BST"    ! Display IBASIC status screen
5900    RETURN 
5910    !
5920  SUBEND
5930  !
5940 Save_data:SUB Save_data
5950    COM @Hp415x,@Form_off,INTEGER Hpib_sc
5960    COM /File_name1/ Setup_file$,Save_ascii$,Save_data$
5970    ! ----------- Save charge pumping data to DAT file ---------------------
5980    ON ERROR GOSUB Error
5990    OUTPUT @Hp415x;":MMEM:STOR:TRAC DEF,'"&Save_data$&"','DISK'"
6000    OFF ERROR 
6010    SUBEXIT
6020    !
6030 Error:   !
6040    !
6050    OUTPUT @Hp415x;":DISP:WIND:STAT ON"    ! Screen update on
6060    OUTPUT @Hp415x;":DISP:WIND:ALL BAS"    ! All IBASIC screen
6070    IF ERRN=56 THEN 
6080      PRINT "Old";Save_file$;"exists. Rename old file and press [Continue]."
6090    ELSE
6100      PRINT ERRM$
6110      PRINT "Take measure(s) to prevent the error and press [Continue]."
6120    END IF
6130    PAUSE
6140    !
6150    CLEAR SCREEN
6160    OUTPUT @Hp415x;":DISP:WIND:ALL BST"    ! Display IBASIC status screen
6170    RETURN 
6180    !
6190  SUBEND
6200    !
6210 Test_end:SUB Test_end
6220    COM @Hp415x,@Form_off,INTEGER Hpib_sc
6230    !
6240    OUTPUT @Hp415x;"*CLS"                  ! Clear status data
6250    OUTPUT @Hp415x;":DISP:WIND:STAT ON"    ! Screen update on
6260    OUTPUT @Hp415x;":DISP:WIND:ALL INST"   ! All instrument screen
6270    !
6280  SUBEND
6290    !
6300 Err_check:SUB Err_check
6310    COM @Hp415x,@Form_off,INTEGER Hpib_sc
6320    !
6330    INTEGER I,J
6340    !
6350    OUTPUT @Hp415x;":PAGE:SCON:STOP"       ! Stop measurement
6360    I=0
6370    REPEAT
6380      I=I+1
6390      OUTPUT @Hp415x;":SYST:ERR?"          ! Read error
6400      ENTER @Hp415x;Err_num(I),Err_message$(I)
6410    UNTIL Err_num(I)=0
6420    IF I=1 THEN 
6430      PRINT "No Error"
6440    ELSE
6450      PRINT 
6460      PRINT 
6470      PRINT "### ERROR Occurred ###:"
6480      FOR J=1 TO I-1
6490        PRINT Err_num(J);Err_message$(J)
6500      NEXT J
6510      OUTPUT @Hp415x;":DISP:WIND:STAT ON"  ! Screen update on
6520      OUTPUT @Hp415x;":DISP:WIND:ALL BAS"  ! All IBASIC screen
6530      PRINT 
6540      PRINT "              === Test Aborted ==="
6550      STOP
6560    END IF
6570  SUBEND
6580  !
6590 Set_pulse_time:SUB Set_pulse_time
6600    COM @Hp415x,@Form_off,INTEGER Hpib_sc
6610    COM /Condition2/ REAL Pulse_period,Pulse_width,Pulse_lead,Pulse_trail
6620    !
6630    OUTPUT @Hp415x;":PAGE:MEAS:PGUS:PULS:PGU:PER";Pulse_period   ! PGU1 pulse period
6640    OUTPUT @Hp415x;":PAGE:MEAS:PGUS:PULS:PGU:WIDT";Pulse_width   ! PGU1 pulse width
6650    OUTPUT @Hp415x;":PAGE:MEAS:PGUS:PULS:PGU:LEAD";Pulse_lead    ! PGU1 pulse leading time
6660    OUTPUT @Hp415x;":PAGE:MEAS:PGUS:PULS:PGU1:TRA ";Pulse_trail  ! PGU1 pulse trailing time
6670  SUBEND
6680   !
6690 Set_pulse_volt:SUB Set_pulse_volt(Pulse_base,Pulse_peak)
6700    COM @Hp415x,@Form_off,INTEGER Hpib_sc
6710   !
6720    OUTPUT @Hp415x;":PAGE:MEAS:PGUS:PULS:PGU1:BASE ";Pulse_base    ! PGU1 pulse base voltage
6730    OUTPUT @Hp415x;":PAGE:MEAS:PGUS:PULS:PGU1:PEAK ";Pulse_peak    ! PGU1 pulse peak voltage
6740  SUBEND
6750   !
6760 Pulse_enable:SUB Pulse_enable   ! This subprogram is used to enable
6770   ! external pulse generator output
6780   ! OUTPUT Ext_pg;"ENABLE COMMAND"
6790   !
6800  SUBEND
6810 Pulse_disable:SUB Pulse_disable   ! This subprogram is used to disable
6820   ! external pulse generator output
6830   ! OUTPUT Ext_pg;"DISABLE COMMAND"
6840   !
6850  SUBEND
