Deutsch
Forum

RS 232 Handshake Leitungen

 

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
 
Windows7 Xprofan 8,9,10 [...]  [...] 
07.05.2006  
 




Ragnar
Rehbein
ja:
KompilierenMarkierenSeparieren
def 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.
 
11.05.2006  
 




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
 
Windows7 Xprofan 8,9,10 [...]  [...] 
11.05.2006  
 




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
 
11.05.2006  
 




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
 
Windows7 Xprofan 8,9,10 [...]  [...] 
11.05.2006  
 




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
 
Windows7 Xprofan 8,9,10 [...]  [...] 
22.05.2006  
 




Ragnar
Rehbein
minimale timerzyklen liegen zwischen 10 - 20 ms, je nach betriebssystem.
settimer 1 wird immer zyklen > 1 ms erzeugen.
KompilierenMarkierenSeparieren
decimals 0
Def QPF(1 )!"KERNEL32","QueryPerformanceFrequency"   rückgabe als LARGE_INTEGER
Def QPC(1 )!"KERNEL32","QueryPerformanceCounter"     rückgabe als LARGE_INTEGER
Declare time#
dim time#,8
declare cpu!

proc laint2float   wandelt einen longintiger in einen fload um / leider recht zeitintensiv

    parameters t&
    declare t#,ta&
    dim t#,8
    declare z!
    ta& = t#   adresse speichern
    t# = t&

    whileloop 8

        z! = z! + byte(t#,&loop-1)*(Pow(256,&loop-1))

    endwhile

    t# = ta&   wieder die alte adresse zuweisen
    dispose t#
    return z!

endproc

if qpf(time#)

    print "es gibt einen QueryPerformanceCounter"
    cpu! = laint2float(time#)

else

    print "es gibt keinen QueryPerformanceCounter !"
    waitinput
    end

endif

print "HiPerfFreq.: ",cpu!
settimer 1

WhileLoop 20

    qpc(time#)
    AddString str$(laint2float(time#))+"  wert in ms: "+str$(laint2float(time#)/cpu!*1000)
    waitinput  bedarfsweise auskommentieren dann dauert ein schleifendurchlauf 1-2 ms

Wend

ListBox$("QueryPerformanceCounter",2)

damit lassen sich auch kleinere zeitabstände messen.
wird aber von älteren boards nicht unterstützt.

r.r.
 
22.05.2006  
 




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
 
Windows7 Xprofan 8,9,10 [...]  [...] 
24.05.2006  
 




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.
 
29.05.2006  
 



Antworten


Thementitel, max. 100 Zeichen.
 

Systemprofile:

Kein Systemprofil angelegt. [anlegen]

XProfan:

 Beitrag  Schrift  Smilies  ▼ 

Bitte anmelden um einen Beitrag zu verfassen.
 

Themenoptionen

1.956 Betrachtungen

Unbenanntvor 0 min.
Langer06.04.2018
dr.dirk17.09.2013

Themeninformationen

Dieses Thema hat 2 Teilnehmer:

GDL (5x)
Ragnar Rehbein (4x)


Admins  |  AGB  |  Anwendungen  |  Autoren  |  Chat  |  Datenschutz  |  Download  |  Eingangshalle  |  Hilfe  |  Händlerportal  |  Impressum  |  Mart  |  Schnittstellen  |  SDK  |  Services  |  Spiele  |  Suche  |  Support

Ein Projekt aller XProfaner, die es gibt!


Mein XProfan
Private Nachrichten
Eigenes Ablageforum
Themen-Merkliste
Eigene Beiträge
Eigene Themen
Zwischenablage
Abmelden
 Deutsch English Français Español Italia
Übersetzungen

Datenschutz


Wir verwenden Cookies nur als Session-Cookies wegen der technischen Notwendigkeit und bei uns gibt es keine Cookies von Drittanbietern.

Wenn du hier auf unsere Webseite klickst oder navigierst, stimmst du unserer Erfassung von Informationen in unseren Cookies auf XProfan.Net zu.

Weitere Informationen zu unseren Cookies und dazu, wie du die Kontrolle darüber behältst, findest du in unserer nachfolgenden Datenschutzerklärung.


einverstandenDatenschutzerklärung
Ich möchte keinen Cookie