PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : serielle schnittstelle (rs232)


chesper
25.03.2002, 18:30
hi, habe ein grosses problem !! :mauer: :

ist es möglich (das ich mit c++) über die serielle schnittstelle zwei eigene stromkreise laufen lasse ? (einen mit 12 V + und einen mit 4.5V + ) und gleichzeitig noch einen stromkreis, der als taster dient ??? (also wenn er geschlossen wird dann geht das programm weiter ?) wenn es geht, dann wie :] :) thx, chesper


Felix Kaiser
25.03.2002, 20:35
Technisch gesehen: Ja, wenn man die Belegung der Pins kennt. Wie es mit 12V ausschaut weiß ich nicht, du bekommst aber auf jeden eine 5V Stromquelle. Die 4.5V könntest du über einen Widerstand mit ausreichender Leistung lösen, dessen Stärke in Ohm müsstest du ausrechnen um von 5V auf 4.5V zu kommen. Ansonsten nimmste nen kleinen Trafo mit externer Stromversorgung.

Wie du die Stromkreise schalten musst kann ich auch schlecht sagen, da ich mich weder mit den elektronischen Notwendigkeiten einer seriellen Schnittstelle auskenne, noch wir uns hier an einem Elektronikbastelboard befinden. Afaik würd ich sagen dass du für deine Problemstellung die falsche Schnittstelle gewählt hast.

Jetzt die Frage nach der Platform: DOS / Windows / Linux? Sonst kann dir wohl auch keiner mit Code helfen.

Dominic Suter
25.03.2002, 21:00
Das stimmt so nicht ganz. Der maximale Spannungsbereich der Seriellen Schnittstelle liegt zwischen -15V und +15V. Sie darf allerdings nicht zwischen +/-3V liegen.
Allerdings verstehe ich nicht, warum man das ueber eine serielle Schnittstelle machen soll, die die Daten SERIELL an den Ausgang legt. Klar, die Daten koennten im Programm multiplext werden und die Elektronik enthaelt einen Demultiplexer. Aber viel einfacher waere die Paralelle Schnittstelle, da dann nicht mit den verschiedenen Spannungen variiert werden muesste.
Um aus dem 5 Volt eine 4.5V Spannung zu erzeugen kannst du einen Vorwiderstand nehmen. Allerdings verstehe ich nicht, warum du 4.5V und nicht 5V verwenden kannst?
Das mit dem Trafo kannst du gleich wieder vergessen, da ein Trafo nur mit Wechselspannungen funktioniert und ganz sicher KEINE externe Stromversorgung benoetigt.
Falls Guru meinte, die Spannungen ueber einen externen Trafo zu generieren, dann sieht das ganze wieder anders aus. Allerdings waere nach dem Trafo auch noch ein Gleichrichter notwendig. Nach den Gleichrichter kommt eine Siebung und anschliessend einen Spannungsregler. Nun wuerde ich die Daten allerdings noch galvanisch vom PC trennen (Optokoppler).
Du siehst, das ganze bringt einen betraechtlichen Aufwand mit sich.

Nun zum programmieren: Warum schreibst du das ganze nicht in Assembler? Dann hast du die Daten gleich so zur Hand wie du sie auch von aussen bekommst, was sehr wahrscheindlich einfacher waere als alles in C++ zu loesen. Man kann Assembler ja auch in C++ integrieren, falls der Rest des Pgm sehr gross wird.

Aber grundsaetzlich: Was willst du genau machen, geht vieleicht viel einfacher...

@Guru
Das hier ist zwar ein Coding Board, aber ich denke, dass solche Probleme auch hier behandelt werden sollten, da die Software auch einmal Peripherie ansprechen soll und nicht nur auf PCs zu laufen kommen soll. Bei solchen Problemen ist es dann einfacher, wenn man auch ein Bild der Elektronik hat.
Man koennte dafuer auch ein extra Topic starten, habe mit -silencer- auch schon darueber gesprochen...

chesper
25.03.2002, 21:06
klar habe ich völlig vergessen , sorry ....

benutze w2k professional

zur pinblegegung :

pinbelegung (http://home.t-online.de/home/th-steinhauer/serielle.htm#Abschn1_2)

bin für jede hilfe dankbar,

thx im voraus,

Chesper

Felix Kaiser
25.03.2002, 21:11
Unter Windows gehts mit der API auch ganz einfach was serielle Schnittstellengeräte betrifft, egal ob C/C++/Delphi oder VB.

Aber .. an der seriellen Schnittstelle eines AT kompatiblen Rechner sind 5V dran oder halt noch andere Standardspannungen eines AT kompatiblen Netzteils, wär mir neu dass die Spannung plötzlich irgendwo mittendrin liegen kann, woher sollte die entsprechende Schalteinheit wissen, welche Spannung benötigt wird?

Ach und Stoenggi, man sollte deinen Ausspruch noch bearbeiten:

Orginal von Stoenggi:
aber ich denke, dass solche Probleme auch hier behandelt werden sollten, da die Software auch einmal Peripherie ansprechen soll und nicht nur auf PCs zu laufen kommen soll.


Peripherie ansprechen -> Ja, für mich auch nicht schwer! Aber das hier ist jetzt Peripherie ´Erstellung´. Bis zur Schnittstelle komm ich noch, aber alles was außerhalb des Rechners liegt, null Plan. Ist für mich auch irrelevant, wie z.B. meine Maus arbeitet, hauptsache ich kann den Port öffnen und ein UART FIFO betreiben.

Deine elektrotechnischen Hinweise sind gut! Bei www.conrad.com kann man sich jedes dumme Bauteil (auch Bastelsätze für serielle/parallele Peripherie) bestellen und somit sollte man unter Vorraussetzung der notwendigen Kenntnisse (oder der Verfügbarkeit eines fertigen Bauplans) das Teil bauen können.

Von der Realisierung technisch wäre der Parallelport eventuell ganz reizend, ist aber direkt nicht ansprechbar in Windows, nur mit Treibern -> Doof :rolleyes:

Dominic Suter
25.03.2002, 21:13
Die Dokumentation sieht nicht schlecht aus, aber das kenne ich...

Bitte schreibe doch einmal, was du ansteuern willst (Gesamtschaltung, Bauteil-Idee etc.) und warum es die serielle Schnittstelle sein muss. Muss das ganze auch vom PC gesteuert werden koennen, bzw. das Pgm auf dem PC laufen?

Ich wuerde dir sehr gerne helfen, aber die obigen Angaben benoetige ich leider schon...

chesper
25.03.2002, 21:17
@ Stoenggi

Möchte eine laserschranke bauen. Der laser (laserpointer) benötigt eine spannung von 4.5 V (sollte auch keine probleme mit 5v geben denke ich), dann eine fotozelle mit elektronik (alte baulampe) läuft mit 12 V original (lief auch mit 6 Vgetestet, ob auch weniger ausreicht weiss ich nicht) dann ist der stromkreis geschlossen, sobald der laser unterbrochen wird.

Dann ein programm das über die api schnittstelle 5 min bilder der webcam aufzeichnet und die startzeit logt.

Klingt doch einfach oder ?? :]

Dominic Suter
25.03.2002, 21:17
@ Guru

Das mit dem Ansprechen der seriellen Schnittstelle wusste ich gar nicht. Aber wenn die einen Treiber benoetigt, ist das ganze schon eher doof :(

Wegen der Peripherie-Erstellung, da muss ich dir (leider) recht geben. Aber so ein paar kurze Fragen koennen ja nicht allzu schlecht sein. Desswegen fragte ich auch nach dem Sinn des ganzen, ist evtl einfacher im einem uP zu realisieren.

Felix Kaiser
25.03.2002, 21:22
Interessant ist sowas auf jeden, hätt ehrlich gesagt nicht im geringsten gedacht, dass der serielle Port so einfach aufgebaut ist.

Das mit Windows und der API hat folgenden Grund: Windows lädt auf jeden gefundenen seriellen Port seinen Standard-Treiber. Dieser sorgt u.a. dafür, dass man den Port als ´Block-Device´ verwenden kann, aka File ´COM1´, ´COM2´. Nun verfügt die Windows API noch über zusätzliche spezielle Kommunikationsroutinen, die es erlauben, ein DOS gleiches FIFO unter Windows zu betreiben. Meines Achtens nach liefert die Windows API somit einen fast 100%igen Ersatz für direkte Portbefehle.

Also wenn ihr dann den Teil benötigt, fragt mich :)
Ansonsten macht mal, viel Glück und Erfolg! Ich werde die Sache verfolgen.

Dominic Suter
25.03.2002, 21:40
Wenn dein Laser (warum nicht IR??) 4.5V benoetigt, dann will er auch nur 4.5V. Gerade Laser koennen sehr heikel sein! Verwende einen Vorwiderstand R der die Groesse hat: R=U/I U=5V-4.5V=0.5V. I musst du aus dem Datenblatt der Laserdiode entnehmen. (Nimm nie den max. Wert sondern gehe etwas darunter).
R ist also R=0.5V / I
Die Photozelle ist also dein Empfaenger. Achte darauf, dass sie auch die Wellenlaenge der Laserdiode "sehen" kann und nicht auf das Umgebungslicht. Die Photozelle ist (so wie du das Verhalten beschreibst) ziemlich sicher ein Transistor, dessen Basis schlicht auf Licht empfindlich ist, daher kannst du auch verschiedene Spannungen verwenden.
Ganz grundsaetzlich solltest du fuer den Print eigene Speisungen verwenden. Lediglich das 5V Signal sollte in die Serielle Schnittstelle fliessen. Falls du 12V hast, versuche die 5V mittels eines Spannungsteilers zu erzeugen, damit ersparst du dir einen groesseren Bauteilaufwand.
Aber ich wuerde dir empfehlen, das ganze als Bausatz bei Conrad zu kaufen, macht einiges einfacher.

chesper
26.03.2002, 08:08
gut ... also meine schaltung läuft soweit (reagiert nur auf laser, etc.) ich brauche also nur die auswertung der seriellen schnittstelle. das programm soll die schleife überspringen, sobald der stromkreis geschlossen ist. also praktisch wie ein schalter.
und an welchen pins nehme ich die spannung von 5v ab und wie (welcher befehl) öffne ich rs232 ?

thx chesper

chesper
26.03.2002, 08:11
achso und ir nicht, weil ich den laser mittels spiegel umleiten kann, und so eine grössere fläche und um ecken "absichern" kann ,,,, :]

Patrik Graf
26.03.2002, 13:12
Mach auf deine Schaltung noch einen MAX 232 IC drauf. Dieser Baustein wandelt TTL-Impulse (0V - 5V) in ein Serielles Schnittstellensignal um. So kannst du dann später einfach den "Schalter" an den TTL-Eingang für TxD machen und auf der anderen Seite die Serielle Schnittstelle anschließen. Geht am besten so würd ich sagen :D

chesper
26.03.2002, 13:27
hmm ,,,, thx. kann ich nicht einfach mit software die rs232 steuern ? kann doch eigentlich nicht so schwer sein oder ? (eine maustaste drücken an einer seriellen maus ist doch auch nichts anderes oder ??) :rolleyes:

chesper

Felix Kaiser
26.03.2002, 13:58
Wenn du als Beispiel die Maus willst, bitte: Alle Mausereignisse lösen 4 (bei älteren 3) Bytes aus. Die flattern am IRQ ein und werden vom FIFO verarbeitet.

Zur Hardware: Du musst wissen, mit welchen Parametern dein Gerät arbeitet! Wieviel Baud, Datenbits, Stopbits und die Parität. Ansonsten kommste nicht weiter. Wenn du die Daten weißt, kann ich dir ohne Probleme ein Winprog machen, was den Port mit den gewünschten Parametern öffnet und auf Ereignisse wartet.

Beispiel: Dein Gerät arbeitet mit 600baud, 7 Datenbits, 1 Stopbit und keiner Parität. Sobald die Brücke geschlossen wird kannst du dem Host das Byte ´1´ schicken. Wird die Brücke geöffnet das Byte ´0´. Wenn du dann noch dieses Byte 0 oder 1 schickst, beim Öffnen des Anschlusses durch den Host, so könnte man problemlos einen Handler machen, der immer weiß, ob die Brücke geöffnet oder geschlossen ist.

Dominic Suter
26.03.2002, 17:11
Ich habe mir den MAX232 auch eimal angeschaut. Sieht noch interessant aus, das Ding, das koennte ich sicher auch noch verwenden :]
Fuer solche Applikationen, wie sie chesper vor hat, sind sie sicher geeignet.

chesper
26.03.2002, 17:12
das hört sich doch gut an .... :]

doch ne newbe frage: was bedeuted baud? (und wie finde ich raus wieviel?)

wie gesagt ich brauche "nur" 5 volt stromversorgugn (1 Stromkreis) und dann eben nen prog das mir meldet, wann der stromkreis geschlossen ist ... sonst nichts ... :D

Felix Kaiser
26.03.2002, 17:20
´baud´ ist eine Einheit, die angibt, wieviele Bit in der Sekunde die Schnittstelle übertragen kann.

chesper
26.03.2002, 17:28
aha ... thx :D könnte man dann nicht einfach die maus simulieren (benutze ein normales serielles kabel, verbinde zwei pole mit meinem "schlater" und zwei andere pole benutze ich zur stromversorgung ?? ? weiss nicht in wiefern das geht ... ?? 8o

Dominic Suter
26.03.2002, 17:43
Im Prinzip machst du das. Aber stell dir vor, wie schnell sich eine Maus ueber das Mosepad bewegt. Da kommen eine gnaze Menge Daten in einer kurzen Zeit an den COM Port. Diese Daten musst du einstellen. Mit dem MAX232 kannst dann die Daten vom Schalter an den Comport uebergeben. Solange du den Schalter nicht betaetigst, bisst du nicht tri-stated sondern einfach logisch 0. Die genauen Spezifikationen des MAX232 kannst du unter http://pdfserv.maxim-ic.com/arpdf/MAX220-MAX249.pdf finden.
Damit du in deiner Software nun nicht immer alle Daten auslesen und mit einer if-Bedingung kontrollieren musst, programmierst du am besten einen Interrupt, der das Programm ausfuehrt, sobald ein Event eingetreten ist.

Patrik Graf
26.03.2002, 18:20
@Guru:

Original von Guru
´baud´ ist eine Einheit, die angibt, wieviele Bit in der Sekunde die Schnittstelle übertragen kann.

Das ist nicht richtig. Baud ist eine Einheit die angibt, wieviele "Zustandsänderungen pro Sekunde" an der Schnittstelle sein können. Im Fall einer Binären Übertragung, ist es das selbe wie "Bits pro Sekunde". Das ist ein vesentlicher Unterschied. Denn sobald man Signal-Modulation anwended, sind die Baud z.B. um einiges weniger als die Bits/s :]

@Stoenggi:

Genau so läuft´s :D Aber ich hab mir das nochmal überlegt mit dem MAX232... Es ist so, das man den IC nicht einfach auf die Schaltung knallen kann! Man muß vorher noch den Datenrahmen für die Übertragung festlegen. Man bräuchte auf jeden Fall sowas wie einen Baudgenerator, aber ich hab keine Ahnung ob´s da was fertiges gibt. Wenn nicht, dann findet man unter dem Stichwort Baudgenerator bestimmt was bei Metager oda so :D

Hab glaub ich schon was gefunden :))

http://home.t-online.de/home/mstiermann/pc16550d.htm

chesper
26.03.2002, 19:42
also brauche ich unbedingt den MAX232 ?? mhh ,,, hätte nicht gedacht das das so schwer ist ... ! bin davon ausgegangen, das ich einfache eine if function schreibe (@Stoenggi) und eben wenn der stromkreis geschlossen ist then ... also ganz so einfach scheint es dann ja wohl nicht zu sein ,,, :mauer: schade schade schade .... (oder kennt noch einer eine andere möglichkeit ?? hatte eigentlich nicht vor nochmehr auszugeben!)

Dominic Suter
26.03.2002, 22:33
@Grafitty

Falls der Max232 noch einen Baudgenerator benoetigt, dann wuerde ich auch davon absehen und eine UART verwenden, der fuer die RS232 zugeschnitten ist. So oder so wird aber auch diesen einen Clock benoetigen, mit dem die Signale eingelesen werden. Das bedeuted wiederum, dass noch ein NE555 benoetigt wird. Da frage ich mich, ob ein PIC nicht fast einfacher ist, da der einen Oszillator intern hat (benoetigt lediglich ein R&C). Der Takt entspricht der Baudrate, die Schalterzustaende werden eingelesen, in das Protokoll verarbeitet und anschliessend an die serielle Schnittstelle gesendet. Diese Loesung benoetigt weniger Bauteile, ist aber aufwendiger in der Realisation als der UART und dem Oszillator.

@Chesper
Natuerlich kannst du das ganze Programm in eine while-Schleife packen, in dieser Schleife eine If Abfrage. Aber dann ist dein Programm stehts aktiv am ablaufen. Vor allem kannst du dann nicht genau vorhersagen, wie viel Jitter du mit der Schaltung auflesen wirst, da ein Event ja eintrefen kann, gleich bevor die If Bedingung kommt oder gleich nachdem die If Bedingung passiert wurde.
Wenn du einen Interrupt verwendest, dann laeuft das Pgm zwar auch, aber es muss nicht immer Programmcode ausfuehren, was den Prozessor entlastet. Sobald nun ein Interrupt eintrifft, wird die ISR abgearbeitet. Die ISR sollte eigentlich so kurz wie moeglich sein, da du hier aber nur einen Interrupt hast und diesen immer ganz abarbeiten willst, brauchst du dir um die Prioritaet und Dauer des Interruptes keine Gedanken zu machen. Die einzige Einschraenkung ist, dass der naechste Interrupt erst abgearbeitet wird, wenn der anstehende beendet ist, aber das Problem besteht mit der while if Konstruktion erst recht.
Sobald die ISR beendet ist, wartet das Programm wieder auf einen Befehl oder eine ISR, die jeden anderen Befehl unterbricht (sofern die Prioritaet nicht hoeher ist).
Ich hoffe, dass das einigermassen verstaendlich war :)
Was du nun konkret machen kannst, ist das ganze aufbauen oder bei Conrad bestellen, was sehr wahrscheindlich einfacher sein wird.

chesper
27.03.2002, 01:17
:D :D :D wollte das ganze möglichst ohne zusätzliche kosten managen ,,,, :D

chesper
27.03.2002, 14:06
ich stelle mir das ganze in etwa so vor:

programm gestartet,

wenn stromkreis geschlossen, dann soll das programm die zeit loggen (in einer txt), dann entweder über die api oder ähnliches die software der webcam steuern (5 min aufnehmen). nach diesen 5 min soll das prog. von "vorne" anfangen ,,, 8)

kann mir da einer sagen wie ich die serielle schnittstelle einbinde (den rest des progs. bekomme ich selber hin ... hoffe ich :)) )

thx chesper