pythonparallel-port

Python set Parallel Port data pins high/low


I am wondering how to set the data pins on a parallel port high and low. I believe I could use PyParallel for this, but I am unsure how to set a specific pin.

Thanks!


Solution

  • You're talking about a software-hardware interface here. They are usually set low and high by assigning a 1-byte value to a register. A parallel port has 8 pins for data to travel across. In a low level language like C, C++, there would be a register, lets call it 'A', somewhere holding 8 bits corresponding to the 8 pins of data. So for example:

    Assuming resgister A is setup like pins: [7,6,5,4,3,2,1,0]

    C-like pseudocode

    A=0x00 // all pins are set low
    A=0xFF // all pins are high
    A=0xF0 // Pins 0:3 are low, Pins 4:7 are high
    

    This idea follows through with PyParallel

    import parallel
    p = parallel.Parallel() # open LPT1
    p.setData(0x55) #<--- this is your bread and butter here  
    

    p.setData is the function you're interested in. 0x55 converted to binary is

    0b01010101

    -or-

    [L H L H L H L H]

    So now you can set the data to a certain byte, but how would I sent a bunch of data... lets say 3 bytes 0x00, 0x01, 0x02? Well you need to watch the ack line for when the receiving machine has confirmed receipt of whatever was just sent.

    A naive implementation:

    data=[0x00, 0x01, 0x02]
    while data:
        onebyte=data.pop()
        p.setDataStrobe('low') #signal that we're sending data
        p.setData(onebyte)
        while p.getInAcknowledge() == 'high': #wait for this line to go 'low'
                                              # to indicate an ACK
            pass                              #we're waiting for it to acknowledge...
        p.setDataStrobe('high')#Ok, we're done sending that byte.
    

    Ok, that doesn't directly answer your question. Lets say i ONLY want to set pin 5 high or low. Maybe I have an LED on that pin. Then you just need a bit of binary operations.

    portState = 0b01100000 #Somehow the parallel port has this currently set
    newportState = portState | 0b00010000#<-- this is called a bitmask
    print newportState 
    >>> 0b011*1*0000
    

    Now lets clear that bit...

    newportState = 0b01110000
    clearedPin5 = newportState & 11101111
    print clearedPin5
    >>> 0b011*0*0000
    

    If these binary operations are foreign, I recommend this excellent tutorial over on avrfreaks. I would become intimate with them before progressing further. Embedded software concepts like these are full of bitmasks and bitshifting.