> 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 ------------------------------------------------------------------------------ Download Intel® Parallel Studio Eval Try the new software tools for yourself. Speed compiling, find bugs proactively, and fine-tune applications for parallel performance. See why Intel Parallel Studio got high marks during beta. http://p.sf.net/sfu/intel-sw-dev _______________________________________________ Gambas-user mailing list Gambas-user@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/gambas-user