Forum: FPGA, VHDL & Co. OneWire Seriele Verbindung mit Open-Drain-Schaltung


von Samuel S. (Firma: Student) (snowyrain)


Lesenswert?

Hallo,

ich habe einen FPGA (Spartan 3E EVO-Board) an dem ein Servo hängt. Die 
Übertragung  erfolgt mittels einem RS232 ähnlichen Signals nur "One 
Wire" (nur 3,3V). Der Servo tut was er soll, nur nicht antworten.
Für die Antwort des Servos muss der FPGA 0x00 und 0x00 senden. Der Servo 
zieht dieses Signal dann auf LOW. Dafür setze ich den Ausgang auf 
"hochohmig" z und arbeite mit einer "Open-Drain" Schaltung mit einem 
Pullup-Widerstand von 3,3kOhm (habe ich irgendwo in ner 
Xilinxs-Anleitung gefunden). Leider schafft der Servo es nicht das 
Signal auf Low zuziehen (Aufm Oszi sieht man es gut, er zieht nur auf 
ca. 2,5V runter). Ich habe versucht den Pullup Widerstand zu vergrößern, 
ohne Erfolg. Irgendwann wird die Spannung so gering, dass das Empfangen 
auch nicht klappt.

Ich komme nicht weiter, vielleicht sehe ich auch den Wald vor lauter 
Bäumen nicht. Wie kann ich so was realisieren?

Gruß

Snowyrain

von Klaus F. (kfalser)


Lesenswert?

Höchst wahrscheinlich setzt Du das Signal nicht auf hochohmig.
Zeige einmal wie dein Kode aussieht und ev. wie die Schaltung.

von Samuel S. (Firma: Student) (snowyrain)


Lesenswert?

Hallo,

vielen Dank für Antwort. Hier die Zeilen:

RX_B_intern<= '0' when TXRX_B ='1' else '1';
TXRX_B <= '0' when TX_B_intern ='1' else 'Z';

Ich habe intern ein Modul mit einer Seriellen-Schnittstelle hier sind:
RX_B_intern : Eingang
TX_B_intern : Ausgang
Das Signal TXRX_B (INOUT) ist der Ein/Ausgang zum Servo.

Die Invertierung ist drin, da ich erst alles mit einem MAX232 getestet 
habe. Da tat alles wie es sollte. Nur jetzt mit nur einem Pin klappt es 
nicht. Er empfängt nur immer das was er sendet. Auf dem Oszi sieht man 
das der Servo das Signal versucht runter zuziehen aber es nicht schafft.

Vielen Dank für Mühe!

Gruß

Snowyrain

von Falk B. (falk)


Lesenswert?

@ Samuel Schmidt (Firma Student) (snowyrain)

>RX_B_intern<= '0' when TXRX_B ='1' else '1';
>TXRX_B <= '0' when TX_B_intern ='1' else 'Z';

Passt soweit.

>nicht. Er empfängt nur immer das was er sendet. Auf dem Oszi sieht man
>das der Servo das Signal versucht runter zuziehen aber es nicht schafft.

Pull-Up zu klein? Falschen Widerstand erwischt?

MFG
Falk

von Klaus F. (kfalser)


Lesenswert?

Bleibt TX_B_intern auch brav auf '0' während des Empfangs?

von Falk B. (falk)


Lesenswert?

@ Klaus Falser (kfalser)

>Bleibt TX_B_intern auch brav auf '0' während des Empfangs?

Ist egal, dann würde es ja auf jeden Fall auf LOW gezogen, aber nicht 
auf HIGH hängen bleiben.

MFG
Falk

von Klaus F. (kfalser)


Lesenswert?

Stimmt.

von Samuel S. (Firma: Student) (snowyrain)


Lesenswert?

Hallo,

mir ist ein echt blöder Fehler passiert. Die Schaltung hatte einen 
Masse-Fehler. Vielen Dank für die Hilfe. Habe die Servos mit einer 
fliegenden Verdrahtung angeklemmt und es geht. Sogar mit dem Internen 
PullUp-Winderstand.

Gruß

Snowyrain

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.