具体实施方式
现在转到附图。图1是示出本发明的一般概念的***1的高层***图。如图所示,根据本发明,配备有外部通信接口3(例如并行输出端口、有线网络接口、无线互联网协议接口)的计算机2被配置为通过通信通道4a、4b、...、4n分别与一个或多个***9a、9b、...、9n通信,其中每个***都配备有与计算机2的通信接口3兼容的通信接口5a、5b、...、5n。一个或多个***9a、9b、...、9n中的每一个还包括被测设备(DUT)6a、6b、...、6n(例如ASIC),该被测设备配备有测试访问机制(TAM)7a、7b、...、7n,例如根据IEEE 1149.1实现的测试访问端口(TAP)。每个TAM 7a、7b、...、7n被连接到或可连接到一个或多个测试设计(DFT)结构8a、8b、...、8n,这些DFT结构被配置为向各个DUT 6a、6b、...、6n内的各种功能块的节点(未示出)施加数据和/或从各个DUT 6a、6b、...、6n内的各种功能块的节点接收数据。在优选实施例中,DUT 6a、6b、...、6n优选地是诸如专用集成电路(ASIC)之类的集成电路,但是DUT也可以是集成电路晶片、经封装的集成芯片、印制电路板等,只要它们包括经由测试访问机制7a、7b、...、7n接收数字测试数据和输出数字输出数据的某种形式的DFT功能即可。
在操作中,测试站2通过通信通道4a、4b、...、4n向***9a、9b、...、9n发送控制信号和/或测试向量,这些控制信号和/或测试向量将被施加到这些***9a、9b、...、9n的DUT 6a、6b、...、6n的测试访问机制7a、7b、...、7n。接收到的控制信号和/或测试向量被施加到测试访问机制7a、7b、...、7n,这些测试访问机制7a、7b、...、7n控制DFT8a、8b、...、8n将数据施加到DUT 6a、6b、...、6n的预定节点。由DFT8a、8b、...、8n接收到的输出数据在由测试站2生成的信号的控制下,经由测试访问机制7a、7b、...、7n被发送出去,并通过通信通道4a、4b、...、4n而到达测试站2。
如果用于实现通信接口3和通信通道4a、4b、...、4n的通信接口/协议支持到多个设备的数据的同时传输(例如支持到多个IP地址的数据传输的无线IP协议),则可以并行测试/控制多个DUT 6a、6b、...、6n。
图2是根据本发明实现的***100的优选实施例的示意性框图。如图所示,***100被配置为具有远程计算机110,该远程计算机110经由并行电缆115与***120(在下文中称为“被测***”120)通信。远程计算机110被配置为具有处理器111、存储器112、并行端口114和以接口连接监视器102和键盘104的输入/输出(I/O)控制113。处理器111执行驻留在存储器112中的程序指令,在该优选实施例中,存储器112采取图形用户界面(GUI)I/O模块150和被测设备(DUT)模块160的形式。
被测***120包括可以如下文所述被远程计算机110测试和/或控制的被测集成电路设备(DUT)130。除了DUT 130之外,被测***120还至少包括并行端口124,并且还可以包括其他***组件,例如***处理器122。
图3是根据本发明实现的示例DUT 130的示意性框图。如图所示,DUT 130包括一个或多个数字块134a、134b,其中每个数字块都具有相关的DFT硬件136a、136b(例如扫描包装器(scan wrapper),其示例如图4所示,在下文中将论述),该DFT硬件用于辅助数字块134a、134b的测试。在优选实施例中,DFT硬件136a、136b包括一组扫描包装器,该组扫描包装器包括多个连接到各个数字块的节点的数据单元。在测试模式中,包含在扫描包装器单元中的数据被施加到数字块的节点,而不是经由正常数据路径输入。
芯片130还包括用于将测试数据发送到DFT结构的测试访问机制(TAM)140。TAM 140经由一组输入和/或输出信号端口141a、141b、141c、141d、141e与外部世界通信。TAM信号端口141a、141b、141c、141d、141e经由线路132a、132b、132c、132d、132e被连接到相应的DUT输入/输出焊盘131a、131b、131c、131d、131e以接收测试向量121,从而允许外部世界(即DUT 130外部)访问TAM 140。如下文将更详细描述的,TAM 140实现符合IEEE 1149.1协议的TAP,并且DUT焊盘131a、131b、131c、131d、131e,TAM信号端口141a、141b、141c、141d、141e和连接线路132a、132b、132c、132d、132e分别传送测试向量121中分别对应于测试模式选择(TMS)信号、测试数据输入(TDI)信号、测试数据输出(TDO)信号、测试时钟(TCK)信号和测试复位(TRST)信号的位。
在DUT 130外部,DUT焊盘131a、131b、131c、131d、131e例如经由印制电路板(PCB)导电线125a、125b、125c、125d、125e连接到被测***120的并行端口124的预定引脚124a、124b、124c、124d、124e。因此,在并行端口124的引脚124a、124b、124c、124d、124e上接收到的测试向量121被施加到DUT 130的DUT焊盘131a、131b、131c、131d、131e,并且因此被施加到TAM 140的TAM信号端口141a、141b、141c、141d、141e。相反,来自TAM 140的输出向量被从输出TAM信号端口分别传输到并行端口124的各个相应引脚。
远程计算机110执行如下的GUI I/O模块150,该GUI I/O模块150获得用户输入,并基于用户输入激活DUT控制模块160中的控制功能。远程计算机110执行如下的DUT控制模块160,该DUT控制模块160在经由并行电缆115连接到被测***120的并行端口124的相应预定引脚124a、124b、124c、124d、124e的并行端口114的预定引脚114a、114b、114c、114d、114e上写入测试向量121。远程计算机110还执行如下的DUT控制模块160,该DUT控制模块160在经由并行电缆115连接到被测***120的并行端口124的相应预定输出引脚124a、124b、124c、124d、124e的并行端口114的预定输入引脚114a、114b、114c、114d、114e上接收测试向量121。
现在参考图4,该图示出了可以实现图3的DUT 130的DUT 250的更详细实现方式图。如图所示,DUT 250包括根据标准的IEEE 1149.1JTAG标准实现的TAP 210,其具有一个TDI端口201和一个TDO端口202。
测试指令和测试数据经由TDI端口201被串行输入到DUT 200。测试结果和状态信息经由TDO端口202从DUT 200返回。TAP 210包括测试访问端口(TAP)控制器228,其接收测试时钟(TCK)203信号(由TAM TCK信号端口处的测试向量施加)和测试模式选择(TMS)204信号(由TAM TMS信号端口处的测试向量施加)。TAP控制器228控制在TDI端口201上接收到的数据的翻译。TAP控制器228是由TCK信号203计时的同步有限状态机,并且处理TMS信号204以确定通过指令寄存器224、旁路寄存器226、混杂寄存器222和扫描包装器232、234、236中的一个或多个的数据流的操作。TMS信号204确定TAP 210的操作。某些0和1的序列将TAP 210置于各种模式中,例如正常模式(即芯片的正常操作模式,在该模式中,DFT电路对集成电路的应用逻辑来说是透明的)、扫描模式(在该模式中,一个或多个扫描链的输入端被连接到TDI端口201,并且一个或多个扫描链232、234、236的输出端被连接到TDO端口202)、捕获模式(在该模式中,数据被串行加载到指令寄存器224、旁路寄存器226、混杂寄存器222或者一个或多个扫描链232、234、236中的一个或多个中)和更新模式(在该模式中,存储在扫描链232、234、236的扫描存储单元中的数据被从各个扫描存储单元输出端输出)。
DUT 200包括并行端口216,该端口216通过并行电缆270接收测试向量。并行端口216的接收来自测试站的TAP信号的引脚被连接到TAP信号端口。TCK信号203和TMS信号204被输入到TAP控制器228。TCK信号203使在控制器228中实现的TAP状态机步进,并且TMS信号204(与当前状态相结合)确定状态机的下一状态。测试数据分析器214还提取出被并行传递到复用器240的测试数据字节、字或块,所述复用器240的输出端被连接到扫描输入寄存器212、指令寄存器224、混杂寄存器222和旁路寄存器226中的每一个。TAP控制器228控制复用器240的输出。寄存器212的输出端被连接到1到N解复用器的输入端,该1到N解复用器在TAP控制器228的控制下,将寄存器的内容传递到扫描包装器232、234、236的扫描输入端口中的一个选中的扫描输入端口上。指令、旁路数据或混杂数据被发送到TAM混杂寄存器222、指令寄存器224、旁路寄存器226之一。在此实施例中,根据标准边界扫描规范,测试数据被串行移位到所选中的寄存器或扫描包装器中。但是,如果扫描包装器232、234、236支持并行加载,则可以从寄存器212并行加载所选中的寄存器或扫描包装器。
TAP控制器228控制从各个扫描包装器232、234、236的扫描存储单元到各个功能块(图4中未示出)的数据施加。
测试数据结果与测试时钟信号TCK 203同步地从扫描包装器232、234、236串行移出到TAP 210的TDO信号端口上,并因此被移出到被测***200的并行端口216的指定引脚上。
在测试站处,DUT控制模块160从DUT 250接收测试结果,提取出测试结果数据,并优选地将其传递到测试结果分析仪以用于分析。在替换实施例中,测试结果数据被存储以用于随后的分析,或被传输到另一设备以用于分析。
图5A是根据本发明的优选实施例实现的GUI显示300的示例。如图所示,GUI 300显示出多个按钮,包括Run_TAP_Script 302、Get_ID_Code 304、Get_Values 306、TAP_Reset 308和TAP_Reset_High310按钮。为了用户的便利和为了适应具有不同引脚定义的并行端口,GUI显示300还可以显示被测***的并行端口的引脚输出映射326,并且提供各个下拉式可选引脚列表314、316、318、320、322,以允许用户配置并行端口中分别在其上写入相应信号TMS、TDI、TCK、TDO和TRST中的每一个信号的引脚。GUI 300还可以提供框体324,其用于指定应该在其上写入测试向量的并行端口地址。
图5B的软件布局图示出了可以生成GUI显示300的GUI I/O模块350。如图所示,GUI I/O模块350包括多个生成显示的子例程,包括用于生成窗口300的Display_Window例程351、用于生成Run_TAP_Script按钮302的display_Run_Tap_Script_button 352、用于生成Get_ID_Code按钮304的display_Get_ID_Code_button 353、用于生成Get_Values按钮306的display_Get_Values_button 354、用于生成TAP_Reset按钮308的display_TAP_Reset_button 355和用于生成TAP_Reset_High按钮310的display_TAP_Reset_High_button 356。GUI I/O模块350还包括get_Run_Tap_Script_button_click例程357、get_Tap_Script_content例程358、get_Get_ID_Code_button_click例程359、get_Get_Values_button_click例程360、get_TAP_Reset_button_click例程361和get_TAP_Reset_High_button_click例程362。这些例程357、358、359、360、361和362监控用户对按钮的激活,并且将控制传输到DUT控制模块370(图5C)中的相应子例程。GUI显示和输入例程是使用GUI设计领域的技术人员公知的标准GUI技术实现的。附加例程(未示出)实现引脚和端口的配置功能。
图5C示出了以接口连接GUI I/O模块350的DUT控制模块370。DUT控制模块370包括多个子例程,这些子例程一般由GUI I/O控制模块350中的相应get_”x”_button_click例程(其中“x”是由用户点击的按钮的名称)激活。这些子例程包括由GUI I/O软件模块350的get_Run_Tap_Script_button_click例程357激活(或者根据实现方式,由get_Tap_Script_content例程358激活)的Run_Tap_Script_Click例程371、由get_Get_ID_Code_button_click例程359激活的Get_ID_Code_Click例程372、由get_Get_Values_button_click例程360激活的Get_Values_Click例程373、由get_TAP_Reset_button_click例程361激活的TAP_Reset_Click例程374以及由get_TAP_Reset_High_button_click例程362激活的TAP_Reset_High_Click例程375。
示例性代码在附录A中列出,该附录A示出了DUT控制模块的一个示例性实现方式的Visual Basic源代码。
在操作中,当例如经由鼠标点击而激活按钮时,相应的GUI I/O功能被执行。具体而言,当用户激活GUI显示300上的Run_Tap_Script按钮302时,如图6所示的对话框330(在GUI I/O模块350的get_Tap_Script_content例程358的控制下)弹出,以请求用户选择要执行的测试/控制向量文件。对话框33包括TAP脚本名称框331、目录名称框332、浏览按钮333和运行脚本按钮334。用户可以在TAP脚本名称框331和目录名称框332中分别输入TAP脚本文件的文件名以及TAP脚本文件所在目录。可替换地,用户可以例如经由鼠标点击来激活浏览按钮333以查看另外的对话框,该对话框用于在计算机文件***中定位所需TAP脚本文件。当所需脚本文件和目录被分别输入到TAP脚本名称框331和目录名称框332中时,用户随后例如经由鼠标点击来激活运行脚本按钮334,以激活下层GUI I/O和DUT控制软件。
运行脚本按钮334的激活将进程控制转移到DUT控制模块370的Run_Tap_Script_Click例程371。用于该例程的代码在附录A中示出,如子例程“sub Run_TAP_Script_Portl_Click()”所示。如该处所示,测试向量以多行文本的形式从所选测试向量文件中被读出。这些行具有4或5位的形式,其中每一位对应于TAP的TCK、TMS、TDI、TDO和TRST(如果存在的话)位。测试向量如GUI 300的所选引脚和端口配置框314、316、318、320、322和324所配置的那样被逐个处理并被写入到引脚上的并行端口。时钟信号TCK在向并行端口的每次写入之间翻转。
该脚本的结果(如果存在)将被存储在GUI显示300的结果窗口312中。这些向量文件优选地由集成电路制造商生成,并且可以包括被用于在制造测试期间检验集成电路的适当操作的同样的功能性测试。鉴于此,IC测试器可以被配置为:除了测试器测试向量之外,还生成TAM测试向量,所述测试器测试向量通常包含在被测集成电路被安放到测试器中时被施加到该集成电路的节点的大量测试器接口引脚(也被称为“针床(bed-of-nails)”)中的每一个的值。例如由Palo Alto,CA的Agilent技术公司制造的Agilent F330或98000系列测试器提供了用于以文件格式生成将在PTAP程序中运行的测试向量的功能。这允许测试向量生成组发送客户测试,该客户测试也可以由Agilent测试器的制造商执行。
当GUI显示300上的Get_ID_Code按钮304被用户激活时,GUI I/O模块350的get_Get_ID_Code_button_click例程359检测到该点击,并将进程控制转移到DUT控制模块370的Get_ID_Code_Click例程372。用于该例程的代码在附录A中示出,如子例程“sub ID_Code_Portl_Click()”所示。在该例程中,TAP控制信号被生成,以指示TAP获得被硬编码在集成电路中的标识代码,并向用户显示该标识代码。鉴于此,常见做法是在集成电路中实现硬编码的标识代码(例如,根据工业标准JEDEC 32位标识代码)。在GUI显示300的窗口312中显示感兴趣的特定集成电路的ID代码使用户能够检验以下各项:(1)所考虑的IC被适当地加电;(2)被测***的并行端口正常工作;以及(3)将计算机连接到被测***的电缆正常工作。
当GUI显示300上的Get_Values按钮306被用户激活时,GUI I/O模块350的get_Get_Values_button_click例程360检测到该点击,并将进程控制转移到DUT控制模块370的Get_Values_Click例程373。用于该例程的代码在附录A中示出,如子例程“sub get_Values_click()”所示。在该例程中,DUT控制模块370返回表示并行端口的引脚的当前状态的整数,这可能有助于调试目的。该结果被显示在GUI显示300的结果窗口312中。
当GUI显示300上的TAP_Reset按钮308被用户激活时,GUI I/O模块350的get_TAP_Reset_button_click例程361检测到该点击,并将进程控制转移到DUT控制模块370的TAP_Reset_Click例程374。用于该例程的代码在附录A中示出,如子例程“sub Tap_reset_click()”所示。在该例程中,DUT控制模块370写入向量以将TAM复位到预定的初始状态。
当GUI显示300上的TAP_Reset_High按钮310被用户激活时,GUII/O模块350的get_TAP_Reset_High_button_click例程362检测到该点击,并将进程控制转移到DUT控制模块370的TAP_Reset_High_Click例程375。用于该例程的代码在附录A中示出,如子例程“subTap_reset_high_click()”所示。在该例程中,DUT控制模块370写入向量以使先前设置的TSRT端口的低值翻转,从而使TAM脱离复位模式。
从以上详细描述中显而易见的是,本发明提供了很多优于现有技术的优点。通过在集成电路内实现TAM和DFT结构,并将TAM端口连接到安装了此集成电路的***的并行端口,本发明允许在不从***中移除该集成电路的情况下,将测试/控制数据下载到该集成电路,并从该集成电路返回测试结果。然后,由制造商开发的功能测试可以被应用到感兴趣的IC,并且无需昂贵的测试器就可以获得测试结果,从而将测试站的要求降低到配备有并行端口或其他通信(例如无线)接口的简单计算机(例如常用的个人计算机或笔记本电脑)。
虽然已经出于举例说明的目的而公开了本发明的优选实施例,但是本领域技术人员将意识到,在不脱离所附权利要求书中公开的本发明的范围和精神的情况下,可以执行各种修改、添加和替换。例如,应该理解,在说明书和权利要求书中使用的术语“通信接口”包括在测试站计算机和被测***之间传递测试向量以使TAM测试向量被施加到TAM的信号端口和/或从TAM的信号端口接收TAM测试向量的任何接口。当前公开的发明的其他益处或用途也可能随着时间的流逝而变得显而易见。
附录A
Option Explicit
Dim starttime As Variant
Dim endtime As Variant
Dim elapsedtime As Variant
Dim Result As Boolean
Private Declare Sub Sleep Lib″kernel32″(ByVal dwMilliseconds AsLong)
Private Sub ExitClick()
Unload Me
End Sub
Private Sub Id_code_portl_Click()
Dim filename As String
Dim lineoftext As String
Dim Result As Boolean
Dim PortVall As Long
Dim bit_count As Long
Dim idcode_all1 As String
Dim I As Integer
Dim len_line As Long
Open″read_idcode.ascii_data″For Input As#1
tck=″0″
tms=″0″
tdi=″0″
trst=″1″′trst=1
write_val tck,tdi,trst,tins
tck=″1″
write_val tck,tdi,trst,tms
tck=″0″
write_val tck,tdi,trst,tms
bit count=1
Do Until EOF(1)
Line Input#1,lineoftext
len_line=Len(lineoftext)
If Len(lineoftext)>3And Len(lineoftext)<6Then
tck=Mid(lineoftext,1,1)
tms=Mid(lineoftext,2,1)
tdi=Mid(lineoftext,3,1)
tdo=Mid(lineoftext,4,1)
If Len(lineoftext)=5 Then
trst=Mid(lineoftext,5,1)
End If
Iftck=″1″Then′toggle tck
tck=″0″
write_val tck,tdi,trst,tins
tck=″1″
End If ′toggle tck
write_val tck,tdi,trst,tms
If tdo=″L″Or tdo=″r′Or tdo=″H″Or tdo=″h″Then ′H,h,L,I signalstdo data
idcode1(bit_count)=read_val()
bit_count=bit_count+1
End If
End If
Loop
idcode all1=″″
For I=1 To 32
idcode_all1=idcode_all1+idcode1(I)
Next I
′List1.Addltem idcode all1
′List1.Listlndex=List1.ListCount-1
Text1=Text1+″IDCODE:″+idcode all1+vbNewLine
Text1.SelStart=Len(Text1.Text)
Close #1
Open″c:\ptap.txt″For Append As 2
Print #2,idcode_all1
Close #2
End Sub
Private Sub Delay(DelaySeconds As Single)
Do While DelaySeconds>1
Sleep(1000)
DelaySeconds=DelaySeconds-1
Loop
End Sub
Private Sub run_tap_script_portl_Click()
Dim filename As String
Dim lineoftext As String
Dim Result As Boolean
Dim PortVal1,PortVal As Long
Dim len_line As Long
Dim bit_count As Long
Dim idcode_all1,idcode As String
Dim I As Integer
bit_count=1
CommonDialog1.Filter=″ASCII Files(*.ascii_data)|*.ascii_data″
CommonDialog1.ShowOpen
If CommonDialog1.filename<>″″Then
′Open filename$ For Input As #1
Open CommonDialog1.filename For Input As #1
′format of ascii data
′tck,tms,tdi,tdo,trst_1 or
′tck,tms,tdi,tdo
len line=0
tck=″0″
tms=″0″
tdi=″0″
trst=″1″′trst=1
write_val tck,tdi,trst,tms
tck=″1″
write_val tck,tdi,trst,tms
tck=″0″
write_val tck,tdi,trst,tms
Do Until EOF(1)
Screen.MousePointer=vbHourglass
lineoftext=″″
Line Input #1,lineoftext
len_line=Len(lineoftext)
If Len(lineoftext)>3 And Len(lineoftext)<6 Then
tck=Mid(lineoftext,1,1)
tms=Mid(lineoftext,2,1)
tdi=Mid(lineoftext,3,1)
tdo=Mid(lineoftext,4,1)
If Len(lineoftext)=5 Then
trst=Mid(lineoftext,5,1)
′Text1=Text1+″TRST:″+trst+vbNewLine
′Text1.SelStart=Len(Text1.Text)
End If
If tck=″1″Then′toggle tck
tck=″0″
write_val tck,tdi,trst,tins
tck=″1″
End If ′toggle tck
write_val tck,tdi,trst,tms
If tdo=″L″Or tdo=′T′Or tdo=″H″Or tdo=″h″Then′H,h,L,Isignals tdo data
idcode=idcode+read_val()
End If
End If
Loop
Close #1
′List1.Addltem idcode
′List1.Listlndex=List1.ListCount-1
Text1=Text1+CommonDialog1.FileTitle+″:″+idcode+vbNewLine
Text1.SelStart=Len(Text1.Text)
Screen.MousePointer=vbDefault
Debug.Print″finished reading″
Open″c:\ptap.txt″For Append As 2
Print #2,idcode
Close #2
End If
End Sub
Private Sub Form_Load()
Dim s1 As String
tms_address.Listlndex=0
trst_address.Listlndex=1
tdi_address.Listlndex=2
tck__address.Listlndex=3
tdo_address.Listlndex=0
parailel_address.Listlndex=0
If InitializeWinlo=False Then
MsgBox″There is a problem with InitializeWinlo.″,vbOKOnly+vbCritical,″ptap_tdo″
Unload Main
Else
′Call BtnGet_Click
End If
End Sub
Private Sub Form_Unload(Cancel As Integer)
Call ShutdownWinlo
End Sub
Private Sub BtnQuit_Click()
Unload Main
End Sub
Private Sub BtnSet_Click()
Dim Result As Boolean
Result=SetPortVal(Val(″&H378″),Val(″&H″+TxtPortByte),1)
If(Result=False)Then
MsgBox′Whoops!There is a problem with SetPortByte.″,vbOKOnly+vbCritical,′VBDumpPort32″
Unload Main
End If
End Sub
Private Sub Tap_reset_Click()
Dim Result As Boolean
tms=″0″
trst=″0″
tdi=″0″
tck=″0″
tdo=″0″
′Debug.Print Val((tck*8)+(tdi*4)+(trst*2)+(tms))
write_val tck,tdi,trst,tms
Text1=Text1+″The TAP is now held in reset(TRST_L=0).TRST_Lwill go high when another test is run.″+vbNewLine
Text1.SelStart=Len(Text1.Text)
End Sub
Private Sub tap_reset_high_Click()
tms=″0″
trst=″1″
tdi=″0″
tck=″0″
tdo=″0″
′Debug.Print Val((tck*8)+(tdi*4)+(trst*2)+(tms))
write_val tck,tdi,trst,tins
Dim idcode As Long
Text1=Text1+″The TAP is out of reset(TSRT_L=I).″+vbNewLine
Text1.SelStart=Len(Text1.Text)
End Sub
Private Sub write_val(tck,tdi,trst,tms)
Dim tck_a As Integer
Dim tdi_a As Integer
Dim trst_a As Integer
Dim tms_a As Integer
Dim address As String
tck_a=2^tck_address.Listlndex
tdi_a=2^tdLaddress.Listlndex
trst_a=2^trst_address.Listlndex
tms_a=2^tms_address.Listlndex
address=″&H″+parallel_address
Result=SetPortVal(Val(address),Val((tck*tck_a)+(tdi*tdi_a)+(trst*trst_a)+(tins*tins_a)),1)
End Sub
Private Function read_val() As String
Dim PortVal1 As Long
Dim address As String
address=″&H″+Str(Int(parallel_address)+1)
Result=GetPortVal(Val(address),PortVal1,1)
″RxPortByte1=Hex$(PortVal1 And &H20)′bit 5 Paper out status bit
If tdo_address.Listlndex=0 Then RxPortByte1=Hex$(PortVal1 And&H20)′bit 5
If tdo_address.Listlndex=1 Then RxPortByte1=Hex$(PortVal1 And&H40)′bit 6
If RxPortByte1>0 Then
read val=1
Else
read val=0
End If
End Function
Private Sub get_values_Click()
Dim Result As String
Dim PortVal1 As Long
Dim address As String
Dim address_int As Integer
address=″&H″+Str(Int(parallel_address)+1)
Result=GetPortVal(Val(address),PortVal1,1)
′List1.Addltem PortVal1
′List1.Listlndex=List1.ListCount-1
Text1=Text1+″Parallel Port Value:″+Str(PortVal1)+vbNewLine
Text1.SelStart=Len(Text1.Text)
End Sub