Forum: Mikrocontroller und Digitale Elektronik UART @ 1MBit -> over-/undershoots beseitigen


von Ralf (Gast)


Lesenswert?

Hallo,

ich hab einen Aufbau mit MCU + FT232. Die beiden liegen etwa 5cm 
auseinander. Die Übertragung mit 115k2 Baud klappt, 921k6 geht in die 
Hose, der Controller empfängt Murks. Das Senden vom Controller zum FT232 
scheint soweit ich es sehen kann fehlerfrei zu sein (oder die Fehlerrate 
ist wesentlich geringer).

Ich hab mir die Signale mit'm Oszi angesehen. Die einzige Auffälligkeit 
waren Over-/Undershoots. Ich frag mich nun wie ich die wegbekomme.
Ich habe 27R in Rx/Tx gesetzt, ohne Wirkung. Ebenfalls wirkungslos blieb 
die Terminierung von Rx/Tx mit jeweils 2k2 nach VCC & GND.

Ein Versuch mit einem FT230X brachte das gleiche zutage :/
Würden Kondensatoren etwas nützen, um die Spikes zu kappen?

Ralf

von Uwe S. (de0508)


Lesenswert?

Hallo,

Wie ist der FT232 mit +5V (Vcc) versorgt -

a) über einen Spannungsregler an dem auch die Schaltung hängt
b) oder über USB ohne Filter etc. ?

In die Vcc würde ich immer je ein C-L-C Glied, als Siebung, einbauen.

Die Masse fächig (Kupferband) anlegen, kein 0,6mm o.ä. Draht.

Jeweils die TX könnten mit R = 27R in Reihe und dann C = ca. 33pF nach 
Masse beschaltet werden.

Dann bitte mit die Oszi die Flanken am Ende des Kabels betrachten !

von holger (Gast)


Lesenswert?

>der Controller empfängt Murks.

Welcher Controller?

von Ralf (Gast)


Lesenswert?

@Uwe:
> Wie ist der FT232 mit +5V (Vcc) versorgt -
> -> b) oder über USB ohne Filter etc. ?
Ein Ferrit ist in der Versorgung, den Wert müsst ich jetzt raussuchen, 
er liegt aber in der Nähe des vorgeschlagenen Wertes aus dem Datenblatt.

> In die Vcc würde ich immer je ein C-L-C Glied, als Siebung, einbauen.
Siehe oben.

> Die Masse fächig (Kupferband) anlegen, kein 0,6mm o.ä. Draht.
Ja, das hab ich befürchtet... Die Controllerplatine hat eine GND-Fläche 
auf Top/Bottom, die FTDI-Platine zwar auch, aber die sitzt auf nem Stück 
Lochraster, verbunden über Stift-/Buchsenleisten mit der 
Controllerplatine.

Die Controllerplatine wird mit den 5V aus USB versorgt, ein LDO knüppelt 
auf 3.3V runter. Der Controller verträgt auch 5V-Pegel am Rx, also habe 
ich VIO vom FTDI in allen drei Varianten probiert:
1) VIO = 5V-USB
2) VIO = 3.3V-LDO
3) VIO = 3.3V-FT232

> Jeweils die TX könnten mit R = 27R in Reihe und dann C = ca. 33pF nach
> Masse beschaltet werden.
Also jeweils so nah wie möglich am Tx-Pin platzieren?

> Dann bitte mit die Oszi die Flanken am Ende des Kabels betrachten !
Okay.

@Holger:
> Welcher Controller?
SiLabs C8051F800. SYSCLK interner Oszillator @ 24.5MHz, Baudrate über 
externen 14.7456MHz Quartz.

Ralf

von holger (Gast)


Lesenswert?

>> Welcher Controller?
>SiLabs C8051F800. SYSCLK interner Oszillator @ 24.5MHz

Und der soll fast 1MBit über UART machen?
Besorg dir mal nen ARM. Bei deiner Hardware liegt das
Problem nicht. Eher in deiner Software. Zu langsam.

von Peter D. (peda)


Lesenswert?

holger schrieb:
> Und der soll fast 1MBit über UART machen?

Das sind 265 CPU-Zyklen je Byte, da langweilt sich der 8051 ja zu Tode.
Für nen Interrupthandler als FIFO reicht das dicke.

Versuch mal ein einfaches Testprogramm, das nur ein Echo sendet:
1
int main()
2
{
3
  // hier init UART einfügen
4
  for(;;){
5
    if( RI ){
6
      RI = 0;
7
      SBUF = SBUF;
8
    }
9
  }
10
}

von Ralf (Gast)


Lesenswert?

@Holger:
>>SiLabs C8051F800. SYSCLK interner Oszillator @ 24.5MHz
> Und der soll fast 1MBit über UART machen? Besorg dir mal nen ARM. Bei
> deiner Hardware liegt das Problem nicht. Eher in deiner Software. Zu
> langsam.
Wieso? Das ist ein Single-Cycle-Core.

@Peda:
>> Und der soll fast 1MBit über UART machen?
> Das sind 265 CPU-Zyklen je Byte, da langweilt sich der 8051 ja zu Tode.
> Für nen Interrupthandler als FIFO reicht das dicke.
Sehe ich auch so, selbst wenn meine Interrupt-Implementierung vielleicht 
oversized sein mag.
Ausserdem würde ich bei einem schlechten FIFO-Handling eher auf 
verschluckte als auf fehlerhaft empfangene Daten tippen.

> Versuch mal ein einfaches Testprogramm, das nur ein Echo sendet:
Ich habe momentan eine interruptgesteuerte Implementierung, mit der ich 
das so schon probiert habe. Aber du hast recht, mit Polling hab ich den 
Echo-Test noch nicht gemacht.
Werd ich gleich mal probieren.

Ralf

von Fritz (Gast)


Lesenswert?

Ralf schrieb:
>>>SiLabs C8051F800. SYSCLK interner Oszillator @ 24.5MHz

Hast du auch überprüft mit welchen Fehler der UART-Baudrategenerator die 
921k6-Baud generieren kann? Bei höheren Baudraten hat man da 
normalerweise einen größeren Fehler und man muß entweder die 
Taktfrequenz oder die gewählte Baudrate ändern.

von Ralf (Gast)


Lesenswert?

@Fritz:
> Hast du auch überprüft mit welchen Fehler der UART-Baudrategenerator die
> 921k6-Baud generieren kann? Bei höheren Baudraten hat man da
> normalerweise einen größeren Fehler und man muß entweder die
> Taktfrequenz oder die gewählte Baudrate ändern.
Deswegen:
>> SYSCLK interner Oszillator @ 24.5MHz, Baudrate über externen 14.7456MHz
>> Quartz.

Ralf

von Ralf (Gast)


Lesenswert?

@Uwe:
>> Jeweils die TX könnten mit R = 27R in Reihe und dann C = ca. 33pF nach
>> Masse beschaltet werden.
Hat nichts gebracht, der Empfang ist genauso besch...eiden wie zuvor. 
Allerdings kann ich den Signalverlauf hier nicht messen, das muss ich 
nächste Woche tun.
Mehr Kapazität?

Ralf

von Gustl B. (-gb-)


Lesenswert?

Hallo,
ich nutze zwar nicht deinen Aufbau, aber auch ich will irgendwie Daten 
auf USB und in den Rechner bekommen.

Die Daten kommen von einem FPGA, auch 921600 8N1. An den Tx Pin habe ich 
direkt den Rx Pin vom UART Controller gelötet und umgekehrt. Und es 
klappt hervorragend.
Ich verwende statt FTDI einen CP2102, gibt es extrem günstig, 3€ incl. 
Versand bei Ebay. 
http://www.ebay.de/itm/CP2102-Module-Modul-USB-to-TTL-Converter-Konverter-Red-RS232-neu-/251159450468?pt=Elektromechanische_Bauelemente&hash=item3a7a451364

Ich habe nur Rx und Tx verbunden, Treiber ist im Linux Kernel und für 
Windows zum nachinstallieren, total super.

von Ralf (Gast)


Lesenswert?

Du meinst der FTDI kommt nicht richtig mit? Hmmm...

> Ich habe nur Rx und Tx verbunden
Na, den GND hast du sicherlich auch genommen, oder? ;)

Ralf

von Gustl B. (-gb-)


Lesenswert?

Kann sein, muss aber nicht. Ich hatte auch noch einen PL2303 probiert 
und der hat nicht richtig funktioniert, da kam dauernd UART overrun. 
FTDI habe ich nicht getestet.

GND habe ich nicht verbunden weil FPGA Board und PC Mainboard die 
gleiche Masse haben, also quasi verbunden.

von Gustl B. (-gb-)


Lesenswert?

Edit:
Wenn du mir deine Anschrift gibst schicke ich dir gerne die PL2303HX 
(schaffen offiziell 6M Baud 
http://www.adafruit.com/datasheets/PL2303HX.pdf ) die ich nicht 
verwende. Ich glaube das sind 3 Stück oder so ...
Einen oder zwei CP2102 hab ich auch noch die ich nicht brauche, aber da 
habe ich schon jeweils den USB-Stecker weggelötet weil ich die auf den 
Pfostenstecker auf dem PC Mainboard stecken wollte.

Eigentlich sollte das aber auch gut mit dem FTDI laufen. Guck mal ob ein 
Logicanalyzer der RS232 kann dir die richtigen Daten anzeigt.

von F. H. (Gast)


Lesenswert?

> Ich hab mir die Signale mit'm Oszi angesehen. Die einzige Auffälligkeit
> waren Over-/Undershoots

da Du Deine eingeleiteten Dämpfungsmaßnahmen als

> ohne Wirkung
> Ebenfalls wirkungslos

beschreibst, liegt die Ursache für Deine Over-/ Undershoots IMHO bei 
einem schlecht angepassten Tastkopf und dürften somit nicht Ursache für 
die schlechte Datenübertragung sein.

Wie greifts Du das Signal ab?

Das könnte hilfreich sein:
http://www.mikrocontroller.net/attachment/112028/WB_Oszi-Tastkopf_004.jpg

Viel Erfolg!

von Robert (Gast)


Lesenswert?

Ich hatte ein ähnliches Problem, und zwar das mein Platine ein Jumper 
für VCCIO (3V3,  5V) hat.
Bei Jumper offen und 115K alles ging.
Erste bei höher Baudrate ging es nicht mehr.
Also Jumper geschlossen und es ging.

von Ralf (Gast)


Lesenswert?

@Uwe:
Die R-C Kombination in der Tx-Leitung vom FT232R zum Controller hat bei 
22R/33pF keine Verbesserung gebracht und bei 220pF logischerweise die 
Sache verschlimmert ;)

@Gustl:
> Die Daten kommen von einem FPGA, auch 921600 8N1. An den Tx Pin habe ich
> direkt den Rx Pin vom UART Controller gelötet und umgekehrt. Und es
> klappt hervorragend. Ich verwende statt FTDI einen CP2102
So hab ich's im Prinzip auch, bis auf FT232R anstatt CP2102.

> Ich hatte auch noch einen PL2303 probiert und der hat nicht richtig
> funktioniert, da kam dauernd UART overrun.
Wundert mich nicht, ProLific ist bekannt dafür nicht zu funktionieren...

> GND habe ich nicht verbunden weil FPGA Board und PC Mainboard die
> gleiche Masse haben, also quasi verbunden.
oO Glückstreffer, behaupte ich mal.

> Guck mal ob ein Logicanalyzer der RS232 kann dir die richtigen Daten
> anzeigt.
Jepp, das werd ich mal tun.

@F.H.:
> liegt die Ursache für Deine Over-/ Undershoots IMHO bei einem schlecht
> angepassten Tastkopf und dürften somit nicht Ursache für die schlechte
> Datenübertragung sein.
Sehe ich mittlerweile auch so. Ich habe den GND-Bezug auch nicht direkt 
in der Nähe der Tx-Leitung abgegriffen, was sicherlich auch noch den 
Eindruck von Over-/Undershoots verstärkt hat.

@PeDa:
Ich hab den vorgeschlagenen Echotest gemacht, sowohl per Interrupt als 
auch per Polling - beides fehlerbehaftet. Der Controller empfängt die 
Daten falsch (geprüft mit Debugging/Breakpoint). Also tippe ich entweder 
auf GND-Bouncing oder klingelnde Leitungen (wobei das ja bei dem Versuch 
mit der Terminierung hätte besser werden müssen, denke ich).
Soweit ich sehen kann, hat der originale 80x2-Kern eine 2-aus-3 
Entscheidung beim Empfang getroffen, um den Bitwert zu bestimmen. Der 
SiLabs-Kern nimmt wohl nur ein Sample - schade.

@Robert:
Wie ich weiter oben geschrieben hatte, bin ich diesen Weg ebenfalls 
schon gegangen.


So, als nächstes werde ich die Controllerschaltung jetzt mal mit einem 
separaten Netzteil versorgen anstatt über USB.
Ist zwar ein 5V/4A Schaltnetzteil, aber mal schauen, ob sich was 
ändert...

Ralf

von Ralf (Gast)


Lesenswert?

Update: Der Test mit einem Logic-Analyzer steht noch aus, mich würde 
aber gerade interessieren, ob jemand einen FT232R, FT230 oder einen 
CP2103 mit 921600 Baud erfolgreich betrieben hat.

Ralf

von Fritz (Gast)


Lesenswert?

Ich habe einen FTDI232H mit 3MBaud getestet, den CP2103 mit 1MBaud und 
gerade auch mit 921600, kein Problem. Als uC habe ich aber einen Cortex 
M4 STM32F4.. der läuft mit 168 MHz und hat UARTs mit eigenem flexiblem 
Baudrategenerator und man brauch keine speziellen Quarzfrequenzen um 
krumme Baudraten zu erreichen. Verwendet habe ich Billigmodule von ebay 
mit ca. 15cm Leitungen zwischen Pfostensteckern.
Habe einen kurzen Blick auf das Datenblatt des C8051F800 geworfen, dabei 
ist mir aufgefallen, dass die Baudratebeispiele bei externen Quarz nur 
bis ca. 230000 Baud angeführt waren. Gibt es da vielleicht eine 
Beschränkung irgendwo in den Specs? Könnte mir vorstellen, dass bei 
getrenntem Sysclock und Baudrateclock Synchronisationscyclen notwendig 
sind um von einer Frequenzdomain zur anderen zu gelangen, das könnte die 
nutzbare Baudrate beim Empfang limitieren.

Deine Frage sollte mMn daher lauten: Hat schon jemand den C8051F800 mit 
921600 Baud betrieben?

PS: Solltest dir mal überlegen ob du nicht doch auf eine modernere 
Plattform (z.B. ARM) umsteigen solltest.

von Ralf (Gast)


Lesenswert?

> Habe einen kurzen Blick auf das Datenblatt des C8051F800 geworfen, dabei
> ist mir aufgefallen, dass die Baudratebeispiele bei externen Quarz nur
> bis ca. 230000 Baud angeführt waren. Gibt es da vielleicht eine
> Beschränkung irgendwo in den Specs? Könnte mir vorstellen, dass bei
> getrenntem Sysclock und Baudrateclock Synchronisationscyclen notwendig
> sind um von einer Frequenzdomain zur anderen zu gelangen, das könnte die
> nutzbare Baudrate beim Empfang limitieren.
Eine Beschränkung habe ich nicht gefunden, daher sollte das m.E. 
eigentlich klappen.
Ich werde jetzt mal eine Testapplikation aufsetzen, die auch für SYSCLK 
den externen Quarz verwendet und schauen ob es dann funktioniert.

> Deine Frage sollte mMn daher lauten: Hat schon jemand den C8051F800 mit
> 921600 Baud betrieben?
Jepp, die Frage werde ich jetzt auch mal dem SiLabs Support um die Ohren 
hauen :D

> PS: Solltest dir mal überlegen ob du nicht doch auf eine modernere
> Plattform (z.B. ARM) umsteigen solltest.
Ich bin bereits am Umsteigen, für die dicken Brocken habe ich bereits 
Cortex-M3 im Einsatz. Nur ist dieses Projekt so weit fortgeschritten, 
dass eine Migration keinen Sinn gemacht hätte - durch das Problem mit 
der Baudrate wird's aber wieder sinnig. Außerdem waren die LPC800 bei 
Projektstart noch nicht verfügbar, diese liegen aber preislich gleich 
mit den F800ern.

Ralf

von Ralf (Gast)


Lesenswert?

Kurzes Update: der Test mit dem LogicAnalyzer erübrigt sich. Nach 
aktuellem Stand funktioniert es, wenn ich den externen Oszillator als 
SYSCLK verwende. Das heisst SiLabs muss mal das Datenblatt überarbeiten 
;)

Jetzt muss ich nur noch schauen, wie ich die restlichen Timings gehalten 
bekomme...

Ralf

von holger (Gast)


Lesenswert?

>Nach aktuellem Stand funktioniert es, wenn ich den externen Oszillator als
>SYSCLK verwende. Das heisst SiLabs muss mal das Datenblatt überarbeiten
>;)

Das heisst du hast versucht einen internen RC Oscillator
für eine UART Verbindung zu benutzen? Kein Wunder das das
nicht funktioniert. Da muss kein Datenblatt neu geschrieben werden.

von Ralf (Gast)


Lesenswert?

@Holger:
> Das heisst du hast versucht einen internen RC Oscillator
> für eine UART Verbindung zu benutzen? Kein Wunder das das
> nicht funktioniert. Da muss kein Datenblatt neu geschrieben werden.
Richtig lesen bitte: für 115k2 -> ja, interner Oszillator, reicht mit 
24.5MHz, 2% Toleranz und single-cycle-core locker aus. Für alles drüber 
externer Quarz.
Ergo: Doch Datenblatt überarbeiten.

Ralf

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.