[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