| |
|
|
GDL | Hi,
weiss von euch jemand, wie man mit Profan auf die Handshake Leitungen(CTS würde langen) zugreifen bzw. den Wert setzen kann ?
Servus Georg |
|
|
| |
|
|
|
Ragnar Rehbein | ja: KompilierenMarkierenSeparierendef createfile(7) !"kernel32.dll","CreateFileA"
def getlasterror(0) !"kernel32.dll","GetLastError"
def FormatMessage(7) !"Kernel32.dll","FormatMessageA"
def EscapeCommFunction(2) !"kernel32.dll","EscapeCommFunction"
def GetCommModemStatus(2) !"kernel32.dll","GetCommModemStatus"
def &clrbreak 0
def &clrdtr 6
def &clrrts 4
def &setbreak 8
def &setdtr 5
def &setrts 3
def &setxoff 1
def &setxon 2
def &cts_on $10
def &dsr_on $20
def &ring_on $40
def &rlsd_on $80
declare hport& porthandle
declare modemstatus& Modemstatus
declare ret&, message#
Proc lasterrorstring nur um den Text des letzten Fehlers von GetLastError zu bekommen
dim message#,1029
declare buffer&, flags&,source&,language&,arguments&, errorstring$
buffer& = 1024
flags& = $1000
language& = 0 ~lang_neutral
clear message#
FormatMessage((flags&),addr(source&),GetLastError(),(language&),message#,addr(buffer&),addr(arguments&))
errorstring$ = trim$(string$(message#,0))
dispose message#
return errorstring$
endproc
hport& = createfile("COM1",0,0,0,3,0,0)opencom("COM1",1024,1024)
print "Porthandle :",hport&
print
ret& = EscapeCommFunction(hport&,&setdtr)
print "DTR setzen"
case ret& = 0 : print "Fehler"
print lasterrorstring()
-----am besten einen Schalter zwischen DTR und z.B. CTS setzen
ret& = GetCommModemStatus(hport&,addr(modemstatus&))
print
print "Status der Eingänge ermitteln"
case ret& = 0 : print "Fehler"
print lasterrorstring()
-----Maskierung um an die einzelnen Bits zu kommen
if ret&
casenot modemstatus& & $FF : print "alles auf LOW"
case modemstatus& & &cts_on : print "CTS ON"
case modemstatus& & &dsr_on : print "DSR ON"
case modemstatus& & &ring_on : print "Ring ON"
case modemstatus& & &rlsd_on : print "RLSD ON"
endif
waitinput
print "Start"
declare zeit&,stop&,count&
zeit& = &gettickcount
whilenot stop&
whileloop 10
ret& = GetCommModemStatus(hport&,addr(modemstatus&))
print modemstatus&,"";
inc count&
endwhile
sleep 1
case &gettickcount - zeit& > 50 : stop& = 1
endwhile
print ""
print &gettickcount - zeit&
print "durchläufe :",count&
closecom(hport&)
waitinput
war nur mal so ein testprogramm um insgesamt 4 schalter seriell abzufragen. bitte nicht so kritisch sein
r.r. |
|
|
| |
|
|
|
GDL | Hallo Ragnar (hoffe)
vielen Dank.So paradox dies klingen mag, aber ich muss die CTS Leitung als Sendeleitung missbrauchen, da bei DCCNMRA nur nullen übertragen werden.
0 Bit dauert 58 ms 1 Bit dauert 109 ms Trennbit dauert 230 ms.
Der Grund: Damit man die Lokomotiven auf dem Gleis drehen kann ist keine Highbit Auswertung möglich. Damit man auch ohne I/O Karte fahren kann, dieser Trick.
Servus Georg |
|
|
| |
|
|
|
Ragnar Rehbein | hallo georg !
ich verstehe nicht ganz wie man CTS als sendeleitung benutzen kann. CTS ist doch nur ein eingang und läßt sich meines wissens nicht umprogrammieren.
aber unabhängig davon .. haben dir meine zeilen helfen können ? oder hattest du das auch schon ?
ragnar |
|
|
| |
|
|
|
GDL | Hallo Ragnar,
dein Code hilft auf alle Fälle weiter.
CTS hat auch die RS232 als ausgang um einem Modem mitteilen zu können,ob die Schnittstelle empafangsbereit ist.
Wie vorher beschrieben, werden nur Low Zustände ausgewertet.
Das heist. CTS wird auf standardmäßig auf High gesetzt. Bei einem Null Bit wird die Leitung für 58 ms auf Low gesetzt. Bei einem Highbit für 109 ms usw. Startbit ist eine Präambel aus 10 null Bits hintereinander.
Die eigentlichen RS232 Leitungen und irgendeine Baudrate werden NICHT benutzt.Es wird lediglich die eine Leitung benötigt.
Warum: Das Ausgangssignal und Computermasse werden einem Booster zugeführt.Der macht daraus +18 und -18 Volt Rechteck. Jetzt habe ich auf dem Gleis auf dem einen Anschluss die Rechteckspannung und auf dem Anderen die Masse.
Bei normalen RS 232 und Minimodem in der Lok könnte die Lok nur in einer Richtung auf das Gleis gesetzt werden, da andernfalls ja die Empfangsleitung der Lok(abgenommen über die Räder) auf Masse läge. Somit scheidet der normale RS232 Weg aus. Lösung: In der Lok arbeitet ein Microcontroler der die abfallende und steigende Flanke in der Spannungversorgung erkennt und die Zeit zwischen beiden misst.
Normalerweise gibt man die Signale mittels 8255 I/O Karte aus.Da die meisten normalen Rechner(keine Industrierechner) keine ISA Slots mehr haben und PCI Karten extrem teuer sind,mache ich diesen Weg über die RS232,Centronics und USB Schnittstelle.Wobei nur mehr Die RS232 abging.
Servus Georg |
|
|
| |
|
|
|
GDL | Hallo Ragnar,
habe deinen Code angepasst. Muss aber noch nach einer settimer Anpassung suchen,da settimer 1 nicht auf unterschiedlichen Taktfrequenzen exakt 1 ms ist.
Bekomme dies aber bestimmt hin.
Servus und nochmals danke Georg |
|
|
| |
|
|
|
Ragnar Rehbein | minimale timerzyklen liegen zwischen 10 - 20 ms, je nach betriebssystem. settimer 1 wird immer zyklen > 1 ms erzeugen. KompilierenMarkierenSeparieren damit lassen sich auch kleinere zeitabstände messen. wird aber von älteren boards nicht unterstützt.
r.r. |
|
|
| |
|
|
|
GDL | Hallo Ragnar,
habe jetzt damit herumexperimentiert, bekomme aber meine Frequenzperioden von 0.056 ms 0,128 ms und 0,230 ms +/- max. 3% Schwankung nicht hin.
Nutze momentan die RS232 normal mit nem Atmel Microcontroler in der Verbindungs- leitung.(Soll aber nur Notlösung sein).
Servus Georg |
|
|
| |
|
|
|
Ragnar Rehbein | diese genauigkeit wird mit xprofan wohl nicht möglich sein. durch dem interpretermodus (auch ein kompiliertes prg wird interpretiert) ist die abarbeitung in profan zu langsam. evtl. wäre es möglich Profan2C++ zu nutzen. sonst bleibt nur assambler.
r.r. |
|
|
| |
|
|