Extension for LPT access on Windows 98/NT/XP/2k/XP, by '''ZP Engineering srl''' [http://www.zpeng.com]. The official page for their Tcl products is [http://www.zpeng.com/Articles/Section1/tcl.html]. This is a reference page for lpttcl; see also [Parallel port] for a more general introduction. Download version '''3.0''' from [http://www.zpeng.com/files/lpttcl_v3.zip]. Download version '''1.0''' from [http://www.zpeng.com/files/lpttcl.zip]. ---- '''Commands summary''' .... both versions.... lpt_getba returns base address of selected LPT lpt_setba selects LPT at base address lpt_rddata returns LPT data register value lpt_rdstat returns LPT status register value lpt_rdctrl returns LPT control register value lpt_wrdata writes to LPT data register lpt_wrstat writes to LPT status register lpt_wrctrl writes to LPT control register ... only in version 3.0 .... lpt_rdreg generic register read at (base_address + offset) lpt_wrreg generic register write at (base_address + offset) lpt_setport selects LPT, where = 1,2,3,...; lpt_getport returns 1,2,.... (lpt_getba returns -1 if lpt_setport points to a non-existing LPT) (lpt_setba now accepts a 32-bit value) ---- '''Basic startup code''' console show wm withdraw . load lpttcl set ver [package require lpttcl] puts [format "LPTTCL, version %s" $ver] puts "---------------------" puts [format "Current port: LPT%d" [lpt_getport]] puts [format "Base address: 0x%08X" [lpt_getba]] puts " " puts [format "Data register: 0x%02X" [lpt_rdreg 0]] puts [format "Status register: 0x%02X" [lpt_rdreg 1]] puts [format "Control register: 0x%02X" [lpt_rdreg 2]] puts [format "Extended control register: 0x%02X" [lpt_rdreg 0x402]] and its output on a console: LPTTCL, version 3.0 --------------------- Current port: LPT1 Base address: 0x00000378 Data register: 0xAA Status register: 0x78 Control register: 0x0C Extended control register: 0x15 '''Utilities''' Note that in ver. 3.0 you can now perform a quick autoscan of available LPT ports: proc LPTscan {{nmax 8}} { for {set i 1} {$i < $nmax} {incr i} { lpt_setport $i if {[lpt_getba] == -1} { puts "LPT$i absent" } else { puts "LPT$i present" } } } We made some profiling of access speed (when you insert real code in the loop, it goes slower); note that the test is compatible with both versions. proc toggle {num} { for {set i 0} {$i < $num} {incr i} { lpt_wrdata 0x55 lpt_wrdata 0xAA } } proc getmaxfreq {{ntimes 10000}} { set tt [time {toggle $ntimes}] scan $tt %i tt set mf [expr (2000 * $ntimes / $tt)] ;# 2 writes, expressed in kHz puts "Max frequency is $mf kHz" } Some results (using freewrap 5.4, based on Tcl/tk 8.3.5) using '''getmaxfreq''': * laptop, P4 M 1.6 GHz, XP prof.: around 130 kHz * desktop, P4 2.4 GHz, XP prof.: around 210 kHz The old version runs faster (around 2,5 times faster on some PCs!!); furthermore, newer tcl versions are slower. As an example, we measured that 8.3.5 (freewrap) is about 20% faster than 8.4.7 (activestate). ---- meh: Are there any plans for a Linux version of LPTTCL? If not, can anybody refer me to a page showing how to use applicable LPT pins as 'bits' (on/off state, on sends a small voltage, off sends none) ---- distatica: meh, if you are referring to individual pin access under Linux, check out the Parapin library located here: http://parapin.sourceforge.net/ If not, please delete this. ---- [Category Printing] | [Category Windows]