Hallo Wolfgang,
anbei erstmal 4 Bilder.
Im ersten Bild oben ist das Interface zwischen PC und AVR gezeigt. Im wesentlichen verwende ich hie eine Technik, die für den Anschluß bestimmter Digitalmultimeter an einen PC via RS232 üblich ist (Literatur kannst du auch im Internet finden).
Der Trick dabei ist, dass als externe (galvanisch entkoppelte) Spannungsversorgungen auf der PC-Seite die Leitungen DTR und RTS verwendet werden. DTR wird dabei auf +12V (bei meinem USB/Seriell Wandler +9V) und RTS auf -12 Volt (bei meinem USB/Seriell Wandler -9V) gelegt werden.
Wie man das macht, dazu hab' ich dir den entsprechenden Delphi-Code aus meiner Routine herauskopiert. Die Zeile unten ist rot unterlegt.
Function TRS232.Opened(PData:TPCOMData):Boolean;
Const CCOMName = 'COM';
CRW = Generic_Read or Generic_Write;
var DCB : TDCB;
s : string[43];
BEGIN
CloseCOM; // falls bereits geöffnet, dann schließen
if not Assigned(PData)
then PData := @Data
else CopyMemory(@Data,PData,SizeOf(Data));
//................................................................................
with PData^ do begin
s := CCOMName + IntToStr(PortNr) + #0;
Handle := CreateFile(@s[1],CRW,0,nil,Open_Existing,0,0);
Enabled := Handle <> INVALID_HANDLE_VALUE;
if Enabled then begin
//.............................................................................
GetCommState(Handle,DCB); // COMState Variable einlesen
DCB.BaudRate := PData^.Baud;
DCB.ByteSize := PData^.Bits;
case PData^.StopBits of
2 : DCB.StopBits := 2; // 2 Stopbits
1 : DCB.StopBits := 0; // 1 Stopbit
else DCB.StopBits := 1; // 1.5 Stopbits
end;
case PData^.Parity of // 0-4=no,odd,even,mark,space
'o','O': DCB.Parity := 1;
'e','E': DCB.Parity := 2;
else DCB.Parity := 0; // 'n'
end;
DCB.Flags := 17;//17; // DTR = High, RTS = LOW
if SetCommState(Handle,DCB)
then SetTimeOut(TimeOut,INBuffSize,OUTBuffSize);
end;
end;
//................................................................................
Result := Enabled;
END;
In den nächsten 3 Bildern habe ich 2 verschiedene Optokoppler mal mit einem Rechtecksignal angesteuert.
Das Rechtecksignal habe ich natürlich -wie es sich gehört- mit einem AVR Timer(2) im CTC-Modus generiert
.
Die Angaben in den Bildern sind wie folgt:
1.) Optokopplertyp (CNY17-1 oder PC817)
2.) Signalfrequenz (2 bzw. 10 KHz)
3.) Skalierung in X-Richtung (µs/div)
4.) Skalierung in Y-Richtung (V/div)
5.) Widerstand in der Steuerleitung (ansteuernde LED)
6.) Widerstand im Kollektorkreis des Phototransistors (statt 4k3 waren es 3k9 - sorry)
Du kannst sehen, dass du bei diesen lahmen Optokopplern schon recht große Steuerströme brauchst, um eine einigermassen hohe Übertragungsrate zu realisieren. Im letzten Bild (mit dem CNY17) sind's schon ca. 10 mA, um ein halbwegs sauberes Rechteck von 10KHz hinzubekommen. Das CTR-Verhältnis liegt bei etwa 470/2000, also ca. 20%.
Die Bitlänge bei der Übertragung (bei 8N1) liegt bei einer Baudrate von 19200 bei etwa 52 µs (siehe Tabelle in Wikipedia). Das müßte also mit der Beschaltung des CNY17 noch hinzubekommen sein (
EDIT: sind natürlich 50µs/div im Bild).
Für schnellere Übertragungsraten werd' ich mir die 6N135 o.ä zulegen.
Ach so, noch ein kleiner Hinweis. Auf AVR-Seite benutze ich ein normales Steckernetzteil (mit zusätzlicher invertertierender Strompumpe für eine ± Spannungsversorgung). Somit sind die Steuerspannung im Interfaceteil und die AVR- bzw. Spannungsversorgung im Analogteil voneinander entkoppelt.
Viele Grüße
Werner