![]() |
|||
| 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