![]() |
rs232 schnell ansprechen
Hey,
folgendes Problem: Ich habe mit nem Kumpel nen Interface für den seriellen Port am Pc zusammengelötet. Darauf werden über Schieberegister Relais geschaltet und Eingänge eingelesen. Es muss so angesprochen werden: Eingänge in die Schiregs holen (dtr einmal auf high und sofort wieder auf low) dann mit txt den takt angeben und jeweils dem rts die ausgänge der schiberegister setzen. auf dcd werden die eingänge entgegengenommen Es werden 16 einsen und nullen durchgeschoben. Eine 1 steht für geschaltet 0 für nicht geschaltet. Bei den Eingängen werden ebenfals einsen und Nullen an den dcd gesendet und ausgelesen Bis jetzt habe ich zur Steuerung der Schnitstelle die Port.dll verwendet. Nur jetzt sind wir dabei komplexere Programme zu schreibne udn da stöst die dll langsam an die Grenzen, sprich die Rutine wird zu langsam. Das ist der Code mit dem wir das Interface ansteuern:
Delphi-Quellcode:
dtr(1); //strobe on //Eingänge ins Schireg holen dtr(0); //strobe off for n:=1 to 16 do begin rts(booltoint(aOUT[n])); //ausgang setzen if dcd = 1 then begin aIN[n] := true; //eingang lesen end else begin aIN[n] := false; end; txd(1); //taktgeben txd(0); end; dtr(1); //strobe //Ausgänge setzten dtr(0); Also haben wir uns gedacht: Könnten wir nicht eigene Rutinen schreiben die auf die Pins des Ports zugreifen. Da war der erste Gedanke das Ganze in Assembler zu schreibne in Delphi.... Soweit so gut allerdings macht uns da ja Windows einen Strich durch die Rechnung das er uns nicht direkt auf die Hardware zugreifen läst... Daher meine Frage: Wie kann ich eine möglichst schnelle Ansteuerung schreiben die genau das oben beschriebene Protokoll einhält? Schonmal danke für die Antwort KnobY PS: Ähnliche Themen gab es schon weiß ich aber keins davon brachte mich wirklich weiter |
Re: rs232 schnell ansprechen
Zitat:
das wird nicht ohne spezielle Hardware gehen, die im PC ist nicht geeignet. Begründung: 1. Ist die Routine unterbrechbar durch andere Interrupts, so können die Unterbrechungen BELIEBIG lang sein, ein definiertes Zeitraster lässt sich so nicht einhalten, auch keine Maximalzeit. 2. Ist die Routine nicht unterbrechbar (ich glaube, das geht unter WIN32 garnicht), so ist der Ablauf viel zu schnell - Clockimpulse wären nur nsec lang und vom angeschlossenen System nicht mehr erfassbar. Schliesslich läuft ein externer Prozessor mit 20 MHz oder so, der interne mit 2 GHz oder mehr. 3. Eine zeitliche Anpassung an den Prozessor mit Warteschleifen ist sowieso Quatsch, und Timerfunktionen mit µsec würden zumindest für die Dauer der Routine den PC weitgehend lahmlegen. 4. Wenn die serielle Schnittstelle virtuell ist, z.B. über USB, ist die ganze Diskussion eh sinnlos, weil da garkeine Reaktionszeiten definierbar sind. Jedenfalls nicht im gewünschten Zeitbereich. Daher meine Meinung: so ein Protokoll muss von einem eigenen Prozessorchen erzeugt werden. Ein serielles Interface mit USB-Anschluss ist ja auch nichts anderes. Mit dem entsprechneden Knowhow könnte man so einem Interface das Gewünschte beibringen. Gruss Reinhard |
Re: rs232 schnell ansprechen
Hi,
ein definiertes Zeitraster ist ja gar nicht erforderlich - es wird der Takt ja vom PC vorgegeben. Das kann durchaus funktionieren. Die Problematik ist ausschliesslich: Wie kann man das schneller machen. Die Port.dll ist daher die eigentliche Bremse. Es wäre also nötig, diese Funktion so in eine dll zu verpacken, die unter den gleichen Sicherheitsaspekten wie die Port.dll ausgeführt werden kann, dass man dann diese direkt benutzen kann. Einfach ist das sicher nicht. Ich glaube aber zur Port.dll gibt es irgendwo Quellcode. Musst mal googeln. Gruss |
Re: rs232 schnell ansprechen
eben
den tackt gibt der PC an da ist es Egal ob der nun mit 1 Hz Taktet oder schneller oder die Taktfrequenz kann auch variable sein einzig und allein begrenzt is se durch die reaktionszeit der platine und die ist so klein das ich da keine probleme bekomme.. Und wie thkerkmann schon sagte ist die Bremse halt die Port.dll. Bis jetzt habe ich aber noch keine weg gefunden die zum umgehen. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:44 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz