|  | |||
| HSG | 
 | 
Erstes kleines Testprogramm: ft3.py

Die Fischertechnik- Dokumentation müsste geändert werden, denn sie suggeriert, dass der 'Ruhezustand' von loadout=1 sei. Das ist aber nicht so, der Ruhezustand ist loadout=0. Einzig nach dem Einlesen der 8 Ausgangsbits ist ein kurzer loadout- bzw. Strobe-Impuls nötig.
Die folgende Ansteuerung funktioniert unter Windows und unter Linux. Unter Linux muss man darauf achten, dass die Module parport, partport-pc und ppdev (eventuell mit 'modprobe ppdev' laden) geladen sind. Um den Parallelport nutzen zu können, muss man in der Gruppe lp sein. Mit 'lsof|grep /dev/parport0' kann man schauen, welche Prozesse auf den Parallelport zugreifen und sie gegebenenfalls killen.
from parallel import *
from time import *
p = Parallel()
def wait(dt):
    t1 = clock()
    t2 = t1
    while t2-t1 < dt:
        sleep(0.0005)
        t2 = clock()
    # sleep allein ist sehr ungenau
def watchdog():
    """
    triggert den watchdog-Timer indem clock auf 0 geht
    bit0 LOAD-OUT  1
                   0 --------------------------------
    bit1 LOAD-IN   1
                   0 --------------------------------
    bit2 DATA-OUT  1
                   0 --------------------------------
    bit3 CLOCK     1 --+ +---------------------------
                   0   +-+
    bit4 TRIGGER-X 1 --------------------------------
                   0
    bit5 TRIGGER-Y 1 --------------------------------
                   0
    """
    p.setData(0x30)
    #wait(0.001)
    p.setData(0x38)
def DEingabe():
    """
    liest die digitalen Eingaben des Interface ein
    bit0 LOAD-OUT  1                                  1
                   0 --------------------------------
    bit1 LOAD-IN   1  +---+                           2
    4014: PE       0 -+   +--------------------------
    bit2 DATA-OUT  1                                  4
                   0 --------------------------------
    bit3 CLOCK     1   +--+        +-+                8
    4014: CP       0 --+  +--- .. -+ +- *8 ..
    bit4 TRIGGER-X 1 -------------------------------- 16
                   0
    bit5 TRIGGER-Y 1 -------------------------------- 32
                   0
    BUSY           1              +++ *8
                   0              +++
    """
    b = 0
    w = 128
    p.setData(0x32)         # 4014: PE=1, CP=0
    p.setData(0x3A)         # 4014: PE=1, CP=1 (steigende Flanke an CP)
    p.setData(0x30)         # 4014: PE=0, CP=0
    for i in range(8):
        if not p.getInBusy():
            b = b+w
        p.setData(0x38)     # 4014: PE=0, CP=1, steigende Flanke an CP
        w = w/2
        p.setData(0x30)     # 4014: PE=0, CP=0
    return b
def Ausgabe(b):
    """
    gibt das Byte b an die Motorausgaenge aus
    bit0 LOAD-OUT  1                            +-+   1
    4094: Strobe   0 ---------------------------+ +--
    bit1 LOAD-IN   1                                  2
                   0 --------------------------------
    bit2 DATA-OUT  1    +++++ *8                      4
    4094: Data     0   -+++++--
    bit3 CLOCK     1   --+ +- *8                      8
    4094:          0     +-+
    bit4 TRIGGER-X 1 -------------------------------- 16
                   0
    bit5 TRIGGER-Y 1 -------------------------------- 32
                   0
    """
    for i in range(8):
        if b >= 128:
            p.setData(0x34) # 4094: Strobe=0, Data=1, CL=0
            p.setData(0x3C) # 4094: Strobe=0, Data=1, CL=1
        else:
            p.setData(0x30) # 4094: Strobe=0, Data=0, CL=0
            p.setData(0x38) # 4094: Strobe=0, Data=0, CL=1
        p.setData(0x30)     # 4094: Strobe=0, Data=0, CL=0
        b = (b*2)%255
    p.setData(0x31)         # 4094: Strobe=1
    p.setData(0x30)         # 4094: Strobe=0
def AEingabe(k):
    """
    liest die analogen Eingaben/Zeiten des Interface ein (0=x,1=y)
    bit0 LOAD-OUT  1                                  1
                   0 --------------------------------
    bit1 LOAD-IN   1                                  2
                   0 --------------------------------
    bit2 DATA-OUT  1                                  4
                   0 --------------------------------
    bit3 CLOCK     1 -------------------------------- 8
                   0
    bit4 TRIGGER-X 1 -+  +--------------------------- 16  k=0
                   0  +--+
    bit5 TRIGGER-Y 1 -------------------------------- 32  k=1
                   0
    BUSY           1 -+ <-------- dt ---------> +----
                   0  +-------------------------+
    """
    t1 = clock()
    if k==0:
        p.setData(0x20)     # TriggerX=0, clock=0
    else:
        p.setData(0x10)     # TriggerY=0, clock=0
    p.setData(0x38)         # TriggerX=TriggerY=1, clock=1
    t2 = clock()
    while p.getInBusy()==0:
        sleep(0.0005)
        t2 = clock()
    return t2-t1
t1 = clock()
ein = DEingabe()
#watchdog()
Ausgabe(0x69)
#t=AEingabe(0)
t2 = clock()
for i in range(1000):
    wait(0.01)
    watchdog()
print t2-t1,ein