[Gambas-user] Parallel Port - Illegal Seek -

Benoît Minisini gambas at ...1...
Thu Apr 8 11:21:14 CEST 2010


> Hi All,
> 
> I am writing a parallel port interface, however I am struggling with how to
> write to the parallel port.  Below I have included the code that I have
> used.  Following that I have included the BASIC code that I am
> bastardizing.
> 
> My Gambas version is Gambas2.13
> I am running Linux Mint 8
> I do have a parallel port on my PC. It is '0378' - '037a' and '0778' -
> '077a'
> The error code I am getting is "System error. illegal seek"
> 
> Thanks in advance for any help anyone can give.
> ---------------------------------------------------------------------GAMBAS
> 2 CODE FOLLOWS------------------------------------------------------ '
> Gambas module file
> PUBLIC SUB Main()
> 
> DIM N AS Integer
> DIM pin AS Integer
> DIM pinout AS Integer[] = [0, 0, 0, 0, 0, 0, 0, 0]
> DIM pump AS Integer
> DIM Ptime AS Integer
> DIM Clock AS Integer
> DIM UClock AS Integer
> DIM DClock AS Integer
> DIM commit AS Integer
> DIM poweron AS Integer
> DIM switch AS Integer
> DIM gate AS File
> DIM base0, base1, base2 AS Integer
> 
> base0 = 0
> base1 = 1
> base2 = 2
> poweron = 64
> commit = 144
> switch = 17
> UClock = 130
> DClock = 128
>   gate = OPEN "/dev/parport0" FOR READ WRITE
>   SEEK #gate, base0
>   WRITE #gate, poweron
>   FOR Ptime = 1 TO 2000 STEP 1
>   NEXT
> 
>   SEEK #gate, base2
>   WRITE #gate, switch
> 
>   GOTO START
> CommitChanges:
>   FOR N = 0 TO 7 STEP 1
>     pump = CInt(1000000 & pinout[Fix(N)])
>     Clock = CInt(1000001 & pinout[Fix(N)])
>     SEEK #gate, base0
>     WRITE #gate, pump
>     FOR Ptime = 1 TO 2000 STEP 1
>     NEXT
>     SEEK #gate, base0
>     WRITE #gate, Clock
>     FOR Ptime = 1 TO 2000 STEP 1
>     NEXT
>     SEEK #gate, base0
>     WRITE #gate, pump
>   NEXT
>     FOR Ptime = 1 TO 2000 STEP 1
>     NEXT
> 
>   FOR N = 1 TO 16 STEP 1
>     SEEK #gate, base0
>     WRITE #gate, UClock
>     FOR Ptime = 1 TO 2000 STEP 1
>     NEXT
>     SEEK #gate, base0
>     WRITE #gate, DClock
>   NEXT
>     FOR Ptime = 1 TO 2000 STEP 1
>     NEXT
>   SEEK #gate, base0
>   WRITE #gate, commit
>     FOR Ptime = 1 TO 2000 STEP 1
>     NEXT
>   SEEK #gate, base0
>   WRITE #gate, poweron
>   GOTO PrintPinout
> 
> PrintPinout:
>   FOR N = 0 TO 7 STEP 1
>     PRINT pinout[Fix(N)]
>   NEXT
>   GOTO START
> 
> PinSelectFail:
>   PRINT "You have selected a pin that does not exist, careful as this may
> cause a divide by 0 and end the universe,  Select between pin 0 and pin 7"
>   GOTO START
> 
> START:
>   PRINT "What input do you want to toggle? (pins 0 -> 7 are outputs, Pin 8
> is the activation sequence)"
>   INPUT pin
>   IF pin < 0 OR pin > 8 THEN
>     GOTO PinSelectFail
>   ELSE IF pin = 8 THEN
>     GOTO CommitChanges
>   ELSE IF pinout[Fix(pin)] = 0 THEN
>     pinout[Fix(pin)] = 1
>   ELSE IF pinout[Fix(pin)] = 1 THEN
>     pinout[Fix(pin)] = 0
>   ENDIF
> GOTO PrintPinout
> END
> ---------------------------------------------------------------------Gambas
> 2
> END-----------------------------------------------------------------------
> -
> 
> 
> 
> 
> ---------------------------------------------------------------------BASIC
> CODE FOLLOWS------------------------------------------------------
> 
> BASE0=&H378
> 
> 'SWITCH POWER AND OUTPUTS ON
> OUT BASE0, &H80
> OUT BASE0 + 2, 11
> 
> 'DEFINE ALL DIGITAL OUTPUTS [OUT(N)] AS BEING OFF (0)
> FOR N = 0 TO 7
>     DOUT(N) = 0
> NEXT N
> DOUT=0
> 
> START:
>     INPUT "WHICH DIGITAL OUTPUT DO YOU WANT TO TOGGLE (0 TO 7)...."; N
>     IF N < 0 OR N > 7 THEN GOTO START
>     N = FIX(N)
>     DOUT9N0=ABS(NOT (-DOUT(N))) ' THIS LINE TOGGLES THE OUTPUT
> 
> 
> 'CREATE COMPLETE BYTE FOR IC3 CALLED DOUT
>     FOR N = 0 TO 7
>         IF DOUT(N) = 0 THEN
>             DOUT = DOUT AND NOT (2^N)
>         ELSE
>             DOUT = DOUT OR 2^N
>         ENDIF
>     NEXT N
> 
> 'SEND 8 CLOCK PULSES AND DIGITAL OUT DATA (ALL ZERO'S)
>     FOR BIT = 1 TO 8
>         B = 8 - BIT
>         BYTE = ((DOUT AND 2^B) / 2^B) OR &H80
>         OUT BASE0, BYTE
>         OUT BASE0, BYTE OR 2
>        OUT BASE0 BYTE
>     NEXT BIT
> 
> 'SEND ANOTHER 16 CLOCK PULSES TO SHIFT THE DATA INTO IC3
> FOR BIT = 9 TO 24
>     OUT BASE0, &H82
>     OUT BASE0, &H80
> NEXT BIT
> 
> 'LOAD IC3
> OUT BASE0, &H90
> OUT BASE0, &h80]
> 
> ---------------------------------------------------------------------BASIC
> END------------------------------------------------------------------------
> 
> 
> Bjorn Macintosh

Have you read http://gambasdoc.org/help/howto/parport?

Your program should work as expected if you open "/dev/port", not 
"/dev/parport0", if you seek at the true port address, and if you write bytes.

DIM poweron AS Byte ' <-- note that

gate = OPEN "/dev/parport0" FOR READ WRITE
SEEK #gate, &H378
poweron = 1
WRITE #gate, poweron

And if you need to wait a little, use the SLEEP or WAIT instruction. See the 
documentation for details on these instructions.

I imagine that if you write Integer instead of Byte, then you will actually 
write the four bytes of the integer to four successive ports.

Regards,

-- 
Benoît Minisini




More information about the User mailing list