Forum: Mikrocontroller und Digitale Elektronik Arduino - SPI über lange Leitung


von Benjamin H. (bensch)



Lesenswert?

Hallo liebe Forumsgemeinde,

ich habe mir letztes Jahr einen Elektroroller gekauft und war von Anfang 
an sehr unglücklich mit dem Display zur Geschwindigkeits- und 
Akkuanzeige.

Also dachte ich mir das ist doch ein schönes Projekt über den Winter...

Ich bin Elektroniker und habe etwas Erfahrung mit PICs aber habe mich zu 
diesem Zweck, aufgrund der vielen Libaries, für einen Arduino 
entschieden.

Ich habe mir ein 3,2" TFT mit ILI9341 Controller und einem Touchscreen 
mit XPT2046 Controller zugelegt. Beides wird über SPI angestuert. 
Zusätzlich ein SD Card Reader für die Bilder die ich Anzeigen will.

Der Plan ist/war das Display oben am Lenker anzubringen und den Arduino 
unten unter der Fußauflage wo auch der Motorcontroller sitz. Das Kabel 
vom Dispay zum Arduino ist damit ca. 130cm lang.

Ich habe mir ein Shield Board für den Arduino gemacht. Display und Touch 
laufen mit 3,3V. Also setzte ich den TXB0108 als Pegelwandler ein. Der 
SD-Card Reader kommt direkt aufs Shield und hat bereits einen 
Pegelwandler integriert, läuft also mit 5V. Der TXB0108 sitz auch auf 
dem Shield.
Als Stecker zum Display/Touch habe ich einen 20pol MicroMatch und (fast) 
jede zweite Litze auf GND gelegt. Nach so ca. tausend und einem Problem 
habe ich das ganze dann zum laufen bekommen ABER ...

Schließe ich ein Flachbandkabel mit ca. 15cm an läuft alles.
Mit 30cm langem Kabel ist auch noch alles gut.

Mit einem 90cm langen Kabel allerdings nicht mehr.
Das komische ist, das nur kurz am Anfang was über SPI läuft und dann die 
SCK Leitung auf LOW und MOSI auf HIGH liegt. Dauerhaft.
Wenn ich über das Serielle Interface debugge sehe ich aber das die 
Software läuft und versucht Bilder zu lesen und zu schreiben.
Jetzt frage ich mich was das genau zu bedeuten hat.
Ich habe schon viel über Termininierung und Wellenwiderstand gelesen, 
bin mir aber nicht sicher ob das hier mein Problem ist.
Da nichts mehr gesendet wird, frage ich mich ob da der Ausgangstreiber 
in die Knie geht?

Letzendlich weiß ich nicht so richtig wie ich jetzt weiter vorgehen soll 
bzw. was der nächste Schritt sein sollte um das Problem in den Griff zu 
bekommen.

Angehängt sind ein paar Bilder von meinem Aufbau und der relevante 
Ausschnitt aus dem Schaltplan.

Ich hoffe jemand von euch kann mir weiterhelfen

von Karl M. (Gast)


Lesenswert?

Hallo,

SPI ist nur für schnelle Kommunikation zwischen Geräten mit geringem 
räumlichen Abstand, also auf eine Platine, gedacht.

Was Du vorhast geht nicht!

Leiber zwei µC über z.B. ein serielles Protokoll mit RS232 Pegeln 
verbinden und der Slave bespielt dann nur das Display.

von Wolfgang (Gast)


Lesenswert?

Benjamin H. schrieb:
> Angehängt sind ein paar Bilder von meinem Aufbau und der relevante
> Ausschnitt aus dem Schaltplan.

Ein Oszillogramm von deinen Signalen wäre deutlich aufschlussreicher.

Ich habe jetzt deine graphisch unterstützte Netzliste nicht vollständig 
zusammengesetzt, aber vielleicht leiden deine Signale unter Reflektionen 
auf der Leitung. Du könntest bspw. die I2C Pull-Ups auf beide Enden vom 
Bus verteilen, was die Sache schon mal besser machen dürfte. Bei SPI 
könnte etwas Last auf der Empfängerseite oder Serienwiderstände evtl. 
helfen.

von c-hater (Gast)


Lesenswert?

Benjamin H. schrieb:

> Jetzt frage ich mich was das genau zu bedeuten hat.

Tja, das passiert, wenn man unverstandenen fremden Code benutzt.

Und was hilft dagegen? Nur eins: man lernt, was der Code tun soll und 
findet dann heraus, warum er das nicht tut.

von Wolfgang (Gast)


Lesenswert?

Karl M. schrieb:
> SPI ist nur für schnelle Kommunikation zwischen Geräten mit geringem
> räumlichen Abstand, also auf eine Platine, gedacht.

Die Kommunikation ist genau so schnell, wie der Master den Takt vorgibt.

Und SPI Signale kann man natürlich auch über vernünftige Treiber und 
abgeschlossene Leitungen schicken.

von Falk B. (falk)


Lesenswert?

Benjamin H. schrieb:

> Ich habe mir ein 3,2" TFT mit ILI9341 Controller und einem Touchscreen
> mit XPT2046 Controller zugelegt. Beides wird über SPI angestuert.
> Zusätzlich ein SD Card Reader für die Bilder die ich Anzeigen will.

Nobel geht die Welt zu grunde ;-)

> Der Plan ist/war das Display oben am Lenker anzubringen und den Arduino
> unten unter der Fußauflage wo auch der Motorcontroller sitz.

Warum packst du deine Arduino nicht direkt ans Display?

> Das Kabel
> vom Dispay zum Arduino ist damit ca. 130cm lang.

Wenn man weiß, was man tut, geht das.

> Ich habe mir ein Shield Board für den Arduino gemacht. Display und Touch
> laufen mit 3,3V. Also setzte ich den TXB0108 als Pegelwandler ein.

Datenblatt?

> Der
> SD-Card Reader kommt direkt aufs Shield und hat bereits einen
> Pegelwandler integriert,

Was für einen? Einen gescheiten?

> läuft also mit 5V. Der TXB0108 sitz auch auf
> dem Shield.
> Als Stecker zum Display/Touch habe ich einen 20pol MicroMatch und (fast)
> jede zweite Litze auf GND gelegt.

Schon mal gut.

> Schließe ich ein Flachbandkabel mit ca. 15cm an läuft alles.
> Mit 30cm langem Kabel ist auch noch alles gut.
>
> Mit einem 90cm langen Kabel allerdings nicht mehr.

Tja, da fehlt die passende Terminierung, siehe Wellenwiderstand.

> Ich habe schon viel über Termininierung und Wellenwiderstand gelesen,
> bin mir aber nicht sicher ob das hier mein Problem ist.

Vermutlich schon.

> Da nichts mehr gesendet wird, frage ich mich ob da der Ausgangstreiber
> in die Knie geht?

Eher nicht. Aber wes gibt dämliche Pegelwandler, sie sich unter 
ungünstigen Umständen festklemmen.

> Letzendlich weiß ich nicht so richtig wie ich jetzt weiter vorgehen soll
> bzw. was der nächste Schritt sein sollte um das Problem in den Griff zu
> bekommen.

Mit einer systematischen Fehlersuche.

OK, dein TXB0108 ist ein

"8-Bit Bidirectional Voltage-Level Translator with Auto-Direction 
Sensing and ±15-kV ESD Protection"

Das Ding solltest du wegwerfen! Solche Autosensing, oberschlauen 
Pegelwandler machen regelmäßig Probleme! Außerdem ist das Ding 
RATTENSCHNELL!! Zu schnell, wenn man nicht sehr gute Bedingungen hat! 
Und für SPI, das nur unidirektionale Signale hat, braucht man sie nicht. 
Nimm die Klassiker 74HC4050 für 5V -> 3,3V und 74HCT125 für 3,3V -> 5V.

von Falk B. (falk)


Lesenswert?

Karl M. schrieb:
> Hallo,
>
> SPI ist nur für schnelle Kommunikation zwischen Geräten mit geringem
> räumlichen Abstand, also auf eine Platine, gedacht.
>
> Was Du vorhast geht nicht!

Quark! Nur weil DU es nicht kannst, heißt das noch lange nix.

von Manfred (Gast)


Lesenswert?

Benjamin H. schrieb:
> SD-Card Reader kommt direkt aufs Shield und hat bereits einen
> Pegelwandler integriert,

Aber vermutlich nur in einer Richtung, zurück zum Arduino kannst Du ihm 
einen Kanal Deines Wandlers spendieren.

> jede zweite Litze auf GND gelegt.

Damit sich die maximal mögliche Kapazität ergibt, die Signale zu 
versauen?

Karl M. schrieb:
> SPI ist nur für schnelle Kommunikation zwischen Geräten mit geringem
> räumlichen Abstand, also auf eine Platine, gedacht.

Es kommt auf Treiberleistung und Timing an, wie lang machbar ist.

Falk B. schrieb:
> OK, dein TXB0108 ist ein
> "8-Bit Bidirectional Voltage-Level Translator with Auto-Direction
> Sensing and ±15-kV ESD Protection"
>
> Das Ding solltest du wegwerfen! Solche Autosensing, oberschlauen
> Pegelwandler machen regelmäßig Probleme!

Wegwerfen, weil Texas den aus Langeweile entwickelt hat? Mit TXS0108 
laufen hier sowohl I2C-Basteleien als auch eine SD-Karte, wo das Modul 
keinen Wandler drauf hat.

von Falk B. (falk)


Lesenswert?

Manfred schrieb:

>> jede zweite Litze auf GND gelegt.
>
> Damit sich die maximal mögliche Kapazität ergibt, die Signale zu
> versauen?

So ein Käse!!!

von qwerzuiopü+ (Gast)


Lesenswert?

Manfred schrieb:
> Damit sich die maximal mögliche Kapazität ergibt, die Signale zu
> versauen?

Wohl eher, um Übersprechen zu meiden und den Wellenwiderstand sauberer 
zu definieren. Außerdem ist der Wellenwiderstand geringer, Kapazitäten 
am Ende des Kabels werden also mit geringerer Impedanz geladen.

Manfred schrieb:
> Es kommt auf Treiberleistung und Timing an, wie lang machbar ist.

Aua... Es kommt zu sehr großem Teil auf die Terminierung an. Die 
Leistung muss für den Wellenwiderstand ausreichen, mehr nicht.

von holger (Gast)


Lesenswert?

>Das komische ist, das nur kurz am Anfang was über SPI läuft und dann die
>SCK Leitung auf LOW und MOSI auf HIGH liegt. Dauerhaft.

Also hat SPI aufgehört zu arbeiten. Nix Reflexionen oder sonst was.
Hast du den SS Pin auf Ausgang gesetzt? Wenn nicht wird dein SPI
Master ganz schnell wieder zum Slave und sendet nix mehr.

von Frank K. (fchk)


Lesenswert?

Diese bidirektionalen Levelshifter mit automatischer 
Richtungsumschaltung sind wirklich mit Vorsicht zu genießen. Benutze sie 
nur, wenn Du wirklich einen guten Grund dafür hast. Andernfalls sind 
74LVC*T(2)45 mit manueller Richtungsumschaltung die bessere Wahl.

Für längere Distanzen kannst Du auch RS422-Treiber und Empfänger 
einsetzen, z.B. 26C31/32 für 5V oder 26LV31/32 für 3.3V. Damit werden 
Signale differentiell übertragen, d.h. der Empfänger arbeitet nicht mit 
absoluten Spannungswerten, sondern mit Spannungsunterschieden innerhalb 
des Signalpaares. Das geht natürlich nur innerhalb gewisser Grenzen, und 
deswegen ist ein gemeinsames Bezugspotential (GND) weiterhin notwendig. 
Die Signalpaare sollten verdrillt werden oder zumindest in 
Flachbandkabeln direkt nebeneinander geführt werden. 
Terminierungswiderstand am Ende nicht vergessen. Als Kabel für Dein 
Remote Display kannst Du dann HDMI oder Displayport oder DVI nehmen - da 
sind ausreichend Adernpaare drin, und die Kabel sind genau für 
differentielle Signale gedacht.

fchk

PS: 26C31/32 und 26LV31/32 sind bezüglich der differnetiellen Signale 
kompatibel, d.h. Du kannst ein so ein 5V-System (mit 26C*) mit einem 
3.3V-System (mit 26LV*) verbinden, ohne zusätzlich Pegelwandler zu 
benötigen.

von Benjamin H. (bensch)


Lesenswert?

Wolfgang schrieb:
> Ein Oszillogramm von deinen Signalen wäre deutlich aufschlussreicher.
>
> Ich habe jetzt deine graphisch unterstützte Netzliste nicht vollständig
> zusammengesetzt, aber vielleicht leiden deine Signale unter Reflektionen
> auf der Leitung. Du könntest bspw. die I2C Pull-Ups auf beide Enden vom
> Bus verteilen, was die Sache schon mal besser machen dürfte. Bei SPI
> könnte etwas Last auf der Empfängerseite oder Serienwiderstände evtl.
> helfen.

Die Signale sehen soweit ganz gut aus. Bei 40cm Kabel kann ich keine 
Reflektionen sehen und beim langen passiert ja nix...
Wo würdest du denn den Serienwiderstand platzieren. Auf der Displayseite 
oder am Pegelwandler?
Im Datenblatt vom Pegelwandler steht das Pull-Ups nicht benötigt werden 
und wenn >50k aber bei SPI ja eigentlich eh  nicht.

Ich werde aber sehen, dass ich morgen oder am Samstag ein paar Bilder 
nachliefern kann.


 c-hater schrieb:
> Tja, das passiert, wenn man unverstandenen fremden Code benutzt.
>
> Und was hilft dagegen? Nur eins: man lernt, was der Code tun soll und
> findet dann heraus, warum er das nicht tut.

Das ist ja mal hilfreich. Ich dachte Libraries haben denn Sinn das ich 
eben nicht den ganzen Code selbst schreiben muss.
Wenn es keine Libraries für die SD-Karte und das Display geben würde, 
wäre ich ja nie auf die Idee gekommen das selbst zu schreiben.
Das schöne daran ist ja gerade das man es einsetzten kann ohne sich bis 
ins Detail damit zu beschäftigen.
Und dafür bin ich den Menschen, die ihre Zeit opfern, Libraries 
schreiben und diese  öffentlich zur Verfügung stellen sehr dankbar.
Klar kann ich mir jetzt den ganze Code ansehen bis ich ihn verstanden 
habe aber wenn du doch weißt was das Problem ist, dann wäre es schön und 
eine nette Geste von dir wenn du es mit mir/uns teilst damit ich/wir uns 
nicht die ganze arbeit selber machen müssen.
Danke.


Falk B. schrieb:
> Warum packst du deine Arduino nicht direkt ans Display?

Das hatte ich anfangs sogar geplant aber da ich auch den Motorstrom und 
die Akkuspannung messen möchte, dort die Spannugsversorung sitzt und 
auch Platz vorhanden ist dachte ich unten ist die bessere Wahl.
Wenn ich mir durch eine geschickte Terminierung oder anderes die 
Umstrukturierung ersparen könnte, würde ich das bevorzugen.


Falk B. schrieb:
>> Ich habe schon viel über Termininierung und Wellenwiderstand gelesen,
>> bin mir aber nicht sicher ob das hier mein Problem ist.
>
> Vermutlich schon.

Wie müsste in meinem Fall denn eine Terminierung aussehen?
Muss ich sowohl die 5V Seite als auch die 3,3V Seite terminieren?
Es laufen aber nur die 3,3V Signale über die "lange" Leitung.
Und wo termiere ich und wie da ich ja mehrere Teilnehmer am Bus hängen 
habe.
Kommt da Serientermierung überhaupt in Frage?

Falk B. schrieb:
>> Letzendlich weiß ich nicht so richtig wie ich jetzt weiter vorgehen soll
>> bzw. was der nächste Schritt sein sollte um das Problem in den Griff zu
>> bekommen.
>
> Mit einer systematischen Fehlersuche.

Ich hatte gehofft einen Wink in die Richtige Richtung zu bekommen da der 
Frühling naht und ich bald wieder fahren will :)

> OK, dein TXB0108 ist ein
>
> "8-Bit Bidirectional Voltage-Level Translator with Auto-Direction
> Sensing and ±15-kV ESD Protection"
>
> Das Ding solltest du wegwerfen! Solche Autosensing, oberschlauen
> Pegelwandler machen regelmäßig Probleme! Außerdem ist das Ding
> RATTENSCHNELL!! Zu schnell, wenn man nicht sehr gute Bedingungen hat!
> Und für SPI, das nur unidirektionale Signale hat, braucht man sie nicht.
> Nimm die Klassiker 74HC4050 für 5V -> 3,3V und 74HCT125 für 3,3V -> 5V.

Ist das nicht etwas hart?
Kann ich die Flankensteilheit nicht auch durch einen RC-Filter 
reduzieren?
Aber im Zweifel hatte ich daran auch schon gedacht...


holger schrieb:
>>Das komische ist, das nur kurz am Anfang was über SPI läuft und dann die
>>SCK Leitung auf LOW und MOSI auf HIGH liegt. Dauerhaft.
>
> Also hat SPI aufgehört zu arbeiten. Nix Reflexionen oder sonst was.
> Hast du den SS Pin auf Ausgang gesetzt? Wenn nicht wird dein SPI
> Master ganz schnell wieder zum Slave und sendet nix mehr.

Ja SPI arbeitet vielleicht eine Sekunde und dann passiert nichts mehr.
Wenn die Software aber stoppt wenn sie nur "bullshit" empfängt, wäre das 
die Erklärung.


Frank K. schrieb:
> Für längere Distanzen kannst Du auch RS422-Treiber und Empfänger
> einsetzen, z.B. 26C31/32 für 5V oder 26LV31/32 für 3.3V...

Das wäre in der Tat von Anfang an das Richtige gewesen aber ich hatte 
nun gehofft eine Lösung für meine bestehende Schaltung zu finden damit 
ich nicht den halben Schaltplan und das ganze Layout neu machen muss.
Ich würde prinzipiell gerne etwas mit der Terminierung spielen aber mir 
ist nicht so ganz klar welche Art, mit welchen Werten und an welcher 
Stelle.

Was noch auffällig ist, ist das auch bei kurzem Kabel die 
Versorgungsspannung am Dispay ca. 3,2V beträgt aber die Signalamplitude 
der SCK Leitung nur knapp über 2V ist.
MOSI und MISO liegen normal bei VCC.

von spess53 (Gast)


Lesenswert?

Hi

>Ja SPI arbeitet vielleicht eine Sekunde und dann passiert nichts mehr.

Wenn /SS falsch gesetzt ist bricht SPI nach dem ersten Byte ab, nicht 
erst nach einer Sekunde.

MfG Spess

von Falk B. (falk)


Lesenswert?

Benjamin H. schrieb:

> Die Signale sehen soweit ganz gut aus.

Wirklich? Wie hast du GENAU gemessen?

https://www.mikrocontroller.net/articles/Oszilloskop#Tastk.C3.B6pfe_richtig_benutzen

> Wo würdest du denn den Serienwiderstand platzieren. Auf der Displayseite
> oder am Pegelwandler?

Beim Sender, siehe Wellenwiderstand.

> Wie müsste in meinem Fall denn eine Terminierung aussehen?
> Muss ich sowohl die 5V Seite als auch die 3,3V Seite terminieren?

Nein. Du mußt die lange Leitung terminieren.

> Es laufen aber nur die 3,3V Signale über die "lange" Leitung.

Warum das? Das kann man zar machen, ist aber gerade in deinem Umfeld 
(E-Mobil) eher ungünstig. Pack den Pegelwandler lieber auf dein Display 
und betreibe die lange Leitung mit 5V, das ergibt mehr Störabstand.

> Und wo termiere ich und wie da ich ja mehrere Teilnehmer am Bus hängen
> habe.

Ich dachte, du hast schon viel über Terminierung gelesen?

> Kommt da Serientermierung überhaupt in Frage?

Ja, denn du hast nur einen Empfänger, deinen SPI-IC des Displeay.

>> Mit einer systematischen Fehlersuche.
>
> Ich hatte gehofft einen Wink in die Richtige Richtung zu bekommen da der
> Frühling naht und ich bald wieder fahren will :)

Schon mal den Link gelesen? Siehe Fehlersuche.

>> Das Ding solltest du wegwerfen! Solche Autosensing, oberschlauen
>> Pegelwandler machen regelmäßig Probleme! Außerdem ist das Ding
>> RATTENSCHNELL!! Zu schnell, wenn man nicht sehr gute Bedingungen hat!
>> Und für SPI, das nur unidirektionale Signale hat, braucht man sie nicht.
>> Nimm die Klassiker 74HC4050 für 5V -> 3,3V und 74HCT125 für 3,3V -> 5V.
>
> Ist das nicht etwas hart?

Nein.

> Kann ich die Flankensteilheit nicht auch durch einen RC-Filter
> reduzieren?

Kann man, aber dann braucht man ggf. einen Schmitt-Trigger am 
Empfänger. Aber einen Versuch ist es wert. Nimm 100 Ohm + 1nF für den 
Takt, das macht 100ns Zeitkonstante, das reicht für 1,3m Kabel. Für Chip 
Select das Gleiche. Die Datensignale sind deutlich unkritischer, das 
sollte auch ohne gehen.

> Was noch auffällig ist, ist das auch bei kurzem Kabel die
> Versorgungsspannung am Dispay ca. 3,2V beträgt aber die Signalamplitude
> der SCK Leitung nur knapp über 2V ist.

Da ist was faul. Liegt wahrscheinlich an deinem exotischen Pegelwandler.
Oder du hast einen Kurzschluß auf ein anderes Pin, das gegen deinen Takt 
arbeittet.

von Stefan F. (Gast)


Lesenswert?

Karl M. schrieb:
> Leiber zwei µC über z.B. ein serielles Protokoll mit RS232 Pegeln
> verbinden und der Slave bespielt dann nur das Display.

Oder gleich ein "Intelligentes" Display mit eigenem Controller (z.B. von 
Nextion) benutzen, und für die serielle Steuerleitung Leitung dann RS485 
Treiber.

von Frank K. (fchk)


Lesenswert?

Benjamin H. schrieb:
> Frank K. schrieb:
>> Für längere Distanzen kannst Du auch RS422-Treiber und Empfänger
>> einsetzen, z.B. 26C31/32 für 5V oder 26LV31/32 für 3.3V...
>
> Das wäre in der Tat von Anfang an das Richtige gewesen aber ich hatte
> nun gehofft eine Lösung für meine bestehende Schaltung zu finden damit
> ich nicht den halben Schaltplan und das ganze Layout neu machen muss.
> Ich würde prinzipiell gerne etwas mit der Terminierung spielen aber mir
> ist nicht so ganz klar welche Art, mit welchen Werten und an welcher
> Stelle.

Das wird nichts bringen, weil Dir da Dein bescheuerter Levelshifter 
einen Strich durch die Rechnung macht. Der kommt nämlich damit nicht 
klar.

Aus dem Datenblatt:
"The TXB0108 is designed to drive capacitive loads of up to 70 pF."

Da bist Du sicher drüber.

"The output drivers of the TXB0108 have low dc drive strength. If pullup 
or pulldown resistors are connected externally to the data I/Os, their 
values must be kept higher than 50 kΩ to ensure that they do not contend 
with the output drivers of the TXB0108."

Auch schon mal schlecht.

Und:

"TI recommends careful PCB layout practices with short PCB trace lengths 
to avoid excessive capacitive loading and to ensure that proper O.S. 
triggering takes place."

Merke: Datenblätter sollten nicht nur gelesen, sondern auch verstanden 
werden.

Also auf zum nächsten Versuch.

fchk

: Bearbeitet durch User
von Benjamin H. (bensch)


Lesenswert?

Erst mal danke für die vielen Antworten.

> Merke: Datenblätter sollten nicht nur gelesen, sondern auch verstanden
> werden.
>
> Also auf zum nächsten Versuch.
>
> fchk

In der Tat. Da war ich wohl nicht sorgfältig genug.
Also zurück ans Zeichenbrett.

Was würdet ihr mir denn jetzt empfehlen?

Macht es Sinn SPI noch eine Chance zu geben?

D.h.

- ordentlicher Pegelwandler (Empfehlung? SPI läuft mit 8MHz)
- die Pegelwandlung auf die Display Seite zu verlegen damit das 5V 
Signal über das "lange" Kabel geht und nicht das 3,3V Signal.
- Leitungen terminieren

oder sind die Chancen zu gering und lieber auf RS422?

Allerdings läuft der SPI Bus mit 8MHz.
Ist RS422 dafür noch geeignet?

von Stefan F. (Gast)


Lesenswert?

Benjamin H. schrieb:
> Allerdings läuft der SPI Bus mit 8MHz.
> Ist RS422 dafür noch geeignet?

Eher nicht.

von Wolfgang (Gast)


Lesenswert?

Benjamin H. schrieb:
> Allerdings läuft der SPI Bus mit 8MHz.

Der SPI Bus läuft nicht schneller, als es der Clock vor gibt.
Warum also so schnell?

von Claus M. (energy)


Lesenswert?

Wolfgang schrieb:
> Karl M. schrieb:
>> SPI ist nur für schnelle Kommunikation zwischen Geräten mit geringem
>> räumlichen Abstand, also auf eine Platine, gedacht.
>
> Die Kommunikation ist genau so schnell, wie der Master den Takt vorgibt

Karl hat Recht. Das Problem ist nicht die Kommunikation vom Master zum 
slave, sondern die vom slave zum Master. Der Master erwartet nämlich mit 
seinem takt gültige Daten auf der miso Leitung, die aber durch 
signallaufzeiten eben nicht gegeben sind. Damit sind lange Leitungen bei 
hohem takt nicht möglich.

von Frank K. (fchk)


Lesenswert?

Benjamin H. schrieb:
> In der Tat. Da war ich wohl nicht sorgfältig genug.
> Also zurück ans Zeichenbrett.
>
> Was würdet ihr mir denn jetzt empfehlen?

Konzept über den Haufen werfen.

SPI und I2C sind eigentlich nicht dafür gedacht, über längere Strecken 
zu gehen. Hänge dem Prozessor direkt vor Ort ans Display. Verwende einen 
3.3V Prozessor, dann brauchst Du keine Pegelwandler. Da Du ja mit PICs 
Erfahrungen hast, wäre ein kleiner PIC32MX170F256B mit 50 MHz und 128k 
Flash/64k RAM genau das richtige dafür. Dann brauchst Du zwischen 
Display, Touch, SD und Prozessor auch keine Pegelwandler, und über die 
kurze Strecke kannst Du den SPI mit voller Geschwindigkeit laufen 
lassen. Damit hast Du schon mal 90% der möglichen Probleme erledigt. Und 
mit 256k Flash kannst Du auch einiges an Bitmaps im Prozessor selber 
unterbringen und brauchst damit gar keine Karte mehr.

fchk

von Stefan F. (Gast)


Lesenswert?

Frank K. schrieb:
> Verwende einen 3.3V Prozessor, dann brauchst Du keine Pegelwandler

AVR mit 5V Versorgungsspannung funktionieren auch ohne Pegelwandler 
tadellos an einem I²C Bus, der 3,3V Pegel hat.

Immer schön dran denken, dass die I²C Pins Open-Drain Modus arbeiten. 
Dadurch wird es möglich.

von Wolfgang (Gast)


Lesenswert?

Claus M. schrieb:
> Der Master erwartet nämlich mit
> seinem takt gültige Daten auf der miso Leitung, die aber durch
> signallaufzeiten eben nicht gegeben sind. Damit sind lange Leitungen bei
> hohem takt nicht möglich.

Bei dem TO geht es um eine Leitungslänge von vielleicht 2m. Dafür 
braucht das Signal (Clock hin, Signal zurück) etwa 20ns. Jetzt rechne 
mal noch mal ganz genau nach, wie sich das im Timing selbst bei 8MHz 
Clock auswirkt.

Ob für die Anzeige von Geschwindigkeit und Ladestand des Akkus eine 8MHz 
Übertragung erforderlich ist, nur um vielleicht alle 100ms mal einen 
Wert zu aktualisieren, steht noch auf einem ganz anderen Blatt.

von Stefan F. (Gast)


Lesenswert?

Auf jeden Fall muss man sich bei dieser Leitungslänge mit den Themen 
"Wellenwiderstand", "Abschlusswiederstand" und "Ausgangs-Widerstand" 
beschäftigen. Eventuell auch mit "Symmetrischer Leitung".

Darauf zielte der Hinweis mit den RS-422 Treibern letztendlich ab. Nur 
sind die nicht für 8MHz vorgesehen - eher 1MHz oder weniger.

von Nils P. (torus)


Lesenswert?

Stefanus F. schrieb:
> Darauf zielte der Hinweis mit den RS-422 Treibern letztendlich ab. Nur
> sind die nicht für 8MHz vorgesehen - eher 1MHz oder weniger.

Och, der Max3094 macht 10Mhz. Und ein recht robustes Kerlchen ist es 
auch.

von Falk B. (falk)


Lesenswert?

Mein Gott, in der Zeit hätte man den Kram locker schon 3x mit 5V CMOS 
und passender Terminierung aufgebaut. Aber scheinbar wollen heute alle 
nur noch Flughäfen bauen . . .

von Jan L. (ranzcopter)


Lesenswert?

Hier sind Problem und möglicher Lösungsansatz sehr kompakt und 
übersichtlich beschrieben, wie ich finde:
http://www.ti.com/lit/an/slyt441/slyt441.pdf

Ansonsten kann man auch einfach sowas zwischenklemmen, soll für 
1MHz/100m gut sein:
https://www.analog.com/media/en/technical-documentation/data-sheets/6820fb.pdf

Für I2C über 10m habe ich P82B715 benutzt, waren Plug&Play...

von Frank K. (fchk)


Lesenswert?

Stefanus F. schrieb:
> Auf jeden Fall muss man sich bei dieser Leitungslänge mit den Themen
> "Wellenwiderstand", "Abschlusswiederstand" und "Ausgangs-Widerstand"
> beschäftigen. Eventuell auch mit "Symmetrischer Leitung".
>
> Darauf zielte der Hinweis mit den RS-422 Treibern letztendlich ab. Nur
> sind die nicht für 8MHz vorgesehen - eher 1MHz oder weniger.

Du hast nicht die Datenblatter gelesen. Die von mir vorgeschlagenen 
AM26LV31/32 geht bis 32 MHZ hoch. Profibus mit 10 MHz ist auch keine 
Seltenheit.

Wenn man will, geht das schon alles. Die Frage ist, ob das überhaupt 
sinnvoll ist. Und meine Meinung dazu ist: nein. Wenn man geistig nur 
etwas flexibel ist und auch Lösungen abseits AVR zulässt (daran manelt 
es hier ja vielen), dann kommt man auf einmal mit viel weniger Bauteilen 
aus.

fchk

von Schlumpf (Gast)


Lesenswert?

Abgesehen von eventuellen Problemen schlechter Terminierung würde ich 
noch gerne in den Raum werfen, dass ich mir vorstellen könnte, dass die 
Leistungselektronik des Rollers nicht unerheblich abstrahlt.
Und je länger die Leitung, desto größer die 'Empfangsantenne'.
Störungen auf der Masse, die über räumliche Distanzen zu 
Pegelverschiebungen der Massepunkte führen können, könnten auch ein 
Problem sein.

Ohne detaillierte Oszillogramme kann man einfach nur raten, was das 
Problem ist.

von Benjamin H. (bensch)


Lesenswert?

Wolfgang schrieb:
> Der SPI Bus läuft nicht schneller, als es der Clock vor gibt.
> Warum also so schnell?

Hintergrund ist hier das Display.
Ein Bild mit 320x240 Pixeln benötigt ca. 600ms bis es vollständig 
geladen ist.
Das würde ich ungern verlangsamen.

Frank K. schrieb:
> Konzept über den Haufen werfen.
>
> SPI und I2C sind eigentlich nicht dafür gedacht, über längere Strecken
> zu gehen. Hänge dem Prozessor direkt vor Ort ans Display. Verwende einen
> 3.3V Prozessor, dann brauchst Du keine Pegelwandler. Da Du ja mit PICs
> Erfahrungen hast, wäre ein kleiner PIC32MX170F256B mit 50 MHz und 128k
> Flash/64k RAM genau das richtige dafür. Dann brauchst Du zwischen
> Display, Touch, SD und Prozessor auch keine Pegelwandler, und über die
> kurze Strecke kannst Du den SPI mit voller Geschwindigkeit laufen
> lassen. Damit hast Du schon mal 90% der möglichen Probleme erledigt. Und
> mit 256k Flash kannst Du auch einiges an Bitmaps im Prozessor selber
> unterbringen und brauchst damit gar keine Karte mehr.

Der Grund warum ich mich für einen Arduino entschieden haben sind die 
verfügbaren Libraries. Wenn ich auf einen PIC umsteige mus ich ja alles 
neu schreiben bzw. anpassen. Da bin ich sicher ewig beschäftigt bis dann 
alles läuft.

Stefanus F. schrieb:
> AVR mit 5V Versorgungsspannung funktionieren auch ohne Pegelwandler
> tadellos an einem I²C Bus, der 3,3V Pegel hat.
>
> Immer schön dran denken, dass die I²C Pins Open-Drain Modus arbeiten.
> Dadurch wird es möglich.

Ja aber da der Arduino der Master ist und das Display keine 5V verträgt 
nützt mir das in diesem Fall nichts. Ich nutze auch SPI und nicht I²C.

Wolfgang schrieb:
> Ob für die Anzeige von Geschwindigkeit und Ladestand des Akkus eine 8MHz
> Übertragung erforderlich ist, nur um vielleicht alle 100ms mal einen
> Wert zu aktualisieren, steht noch auf einem ganz anderen Blatt.

Prinzipiell eigentlich nicht aber es sieht einfach nicht gut aus, wenn 
man sehen kann wie sich das Bild langsam aufbaut. Es kommt zwar nicht 
oft vor, dass ich den kompletten Bildschirm aktualisiere aber da es 
mehrere "Seiten" gibt doch ab und an.

Nils P. schrieb:
> Och, der Max3094 macht 10Mhz. Und ein recht robustes Kerlchen ist es
> auch.

Im Datenblatt steht 10Mbps. Ist das mit 10MHz gleichzusetzen?
Was wäre denn der passende Transceiver?


Falk B. schrieb:
> Mein Gott, in der Zeit hätte man den Kram locker schon 3x mit 5V CMOS
> und passender Terminierung aufgebaut. Aber scheinbar wollen heute alle
> nur noch Flughäfen bauen . . .

Ich geb dir recht aber ich will den Flughafen auch nicht 5mal bauen 
müssen und die nächste Version ist schon Nr 3.

Frank K. schrieb:
> Du hast nicht die Datenblatter gelesen. Die von mir vorgeschlagenen
> AM26LV31/32 geht bis 32 MHZ hoch. Profibus mit 10 MHz ist auch keine
> Seltenheit.
>
> Wenn man will, geht das schon alles. Die Frage ist, ob das überhaupt
> sinnvoll ist. Und meine Meinung dazu ist: nein. Wenn man geistig nur
> etwas flexibel ist und auch Lösungen abseits AVR zulässt (daran manelt
> es hier ja vielen), dann kommt man auf einmal mit viel weniger Bauteilen
> aus.

Ja deine Lösung gefällt mir gut aber ich gehe unten noch darauf ein.
Bei den Lösungen abseits von Arduino habe ich wieder das Problem mit der 
Software.
Die verfügbare Libraries ersparen mir unmengen Zeit.

Schlumpf schrieb:
> Abgesehen von eventuellen Problemen schlechter Terminierung würde ich
> noch gerne in den Raum werfen, dass ich mir vorstellen könnte, dass die
> Leistungselektronik des Rollers nicht unerheblich abstrahlt.
> Und je länger die Leitung, desto größer die 'Empfangsantenne'.
> Störungen auf der Masse, die über räumliche Distanzen zu
> Pegelverschiebungen der Massepunkte führen können, könnten auch ein
> Problem sein.
>
> Ohne detaillierte Oszillogramme kann man einfach nur raten, was das
> Problem ist.

Ja, das könnte ich mir auch gut vorstellen. Ich habe jedenfalls vor, ein 
geschirmtes Kabel zu verwenden.
Das aktuelle Problem ist ja der Pegelwandler wie fchk herausgefunden 
hat.
Bis jetzt bereibe ich das ganze noch über ein Netzteil und nicht über 
den Akku des Rollers.
Richtig messen am Roller macht für mich erst Sinn wenn das ganze mit dem 
Langen Kabel zuverlässig über ein Netzteil funktioniert.


Für mich haben sich jetzt 2 mögliche Lösungen aufgezeigt.

Lösung 1:
Ich nehme wie von Falk vorgeschlagen den
74HC4050 für CLK, MOSI, SS usw. und den
74HC125 für MISO
Was mir nicht so gut gefällt ist, dass ich 8 Kanäle von 5V -> 3,3V 
brauche und Einen Kanal von 3,3V -> 5V.
Der 74HC4050 hat 6 Kanäle und der 74HC125 hat 4.
Gibt es die gleichen ICs auch mit anderer Anzahl Kanäle, so dass ich 
nicht so viele "verschwenden" muss?

Lösung 2:
Ich nehme wie von fchk vorgeschlagen den
26C31 für die 5V Signale -> Differentiell und den 26LV31 für MISO -> 
Differentiell.
Den 26C32 für Differentiell -> 5V und den 26LV32 für Differentiell -> 
3,3V.
Hier "verschende" ich auch wieder 3 Kanäle auf der 3,3V -> 5V Seite.
Wäre der MAX3295 als Transmitter und der MAX3281 als Receiver geeignet 
für MISO?
Oder sollte man lieber in der gleichen IC Familie bleiben?

Lösung 2 gefällt mir besser und ich schätze die Chancen auf Erfolg hier 
größer ein.
Seht ihr das auch so?

Ich würde dann in den nächsten Tagen den Schaltplan aktualisieren und 
ihn dann mal zur Durchsicht hier einstellen.

Ich möchte mich an dieser Stelle auch mal bei allen bedanken die sich 
hier die Zeit nehmen.

von Falk B. (falk)


Lesenswert?

Benjamin H. schrieb:

> Hintergrund ist hier das Display.
> Ein Bild mit 320x240 Pixeln benötigt ca. 600ms bis es vollständig
> geladen ist.
> Das würde ich ungern verlangsamen.

Aber man aktualisert nicht immer das gesamte Display sondern nur die 
Felder, die sich ändern. Das spart massiv Übertragungszeit.

> Ich geb dir recht aber ich will den Flughafen auch nicht 5mal bauen
> müssen und die nächste Version ist schon Nr 3.

Das nennt man Entwicklung. Da sitzt der 1. Schuß meistens nicht. Schon 
gar nicht, wenn es Bastler machen! Agile Development!


> Lösung 1:
> Ich nehme wie von Falk vorgeschlagen den
> 74HC4050 für CLK, MOSI, SS usw. und den
> 74HC125 für MISO
> Was mir nicht so gut gefällt ist, dass ich 8 Kanäle von 5V -> 3,3V
> brauche und Einen Kanal von 3,3V -> 5V.
> Der 74HC4050 hat 6 Kanäle und der 74HC125 hat 4.

> Gibt es die gleichen ICs auch mit anderer Anzahl Kanäle, so dass ich
> nicht so viele "verschwenden" muss?

Gibt es. z.B. ein 74LVC541, das ist ein 8-Kanal Treiber.
Es gibt noch den (A)HCT125, das ist ein 1-Kanal 125er im SOT23-5 
Gehäuse.
Es MUSS ein AHCT oder HCT sein, KEIN HC!

> Lösung 2 gefällt mir besser und ich schätze die Chancen auf Erfolg hier
> größer ein.

Naja, prinzipiell ja, praktisch ist der Unterschied aber nicht so groß.

von Frank K. (fchk)


Lesenswert?

Benjamin H. schrieb:

> Frank K. schrieb:
>> Konzept über den Haufen werfen.
>>
>> SPI und I2C sind eigentlich nicht dafür gedacht, über längere Strecken
>> zu gehen. Hänge dem Prozessor direkt vor Ort ans Display. Verwende einen
>> 3.3V Prozessor, dann brauchst Du keine Pegelwandler. Da Du ja mit PICs
>> Erfahrungen hast, wäre ein kleiner PIC32MX170F256B mit 50 MHz und 128k
>> Flash/64k RAM genau das richtige dafür. Dann brauchst Du zwischen
>> Display, Touch, SD und Prozessor auch keine Pegelwandler, und über die
>> kurze Strecke kannst Du den SPI mit voller Geschwindigkeit laufen
>> lassen. Damit hast Du schon mal 90% der möglichen Probleme erledigt. Und
>> mit 256k Flash kannst Du auch einiges an Bitmaps im Prozessor selber
>> unterbringen und brauchst damit gar keine Karte mehr.
>
> Der Grund warum ich mich für einen Arduino entschieden haben sind die
> verfügbaren Libraries. Wenn ich auf einen PIC umsteige mus ich ja alles
> neu schreiben bzw. anpassen. Da bin ich sicher ewig beschäftigt bis dann
> alles läuft.

Auch für PICs gibts genug Support. Muss man nur finden.

Und: Arduino ist inzwischen nicht mehr auf AVR beschränkt. Es gibt von 
Arduino selber auch ARM-Boards mit SAM3X und LPC11irgendwas, von 
Digilent gibts PIC32-Boards mit Arduino-IDE, Teensy hat Freescale ARM im 
Programm... das wäre doch was für Dich - die sind nämlich schön kompakt, 
und die kannst Du neben oder unter das Display packen. 180 MHz, 3.3V, 
aber trotzdem mit der Arduino-IDE programmierbar.

https://www.pjrc.com/store/teensy36.html

Damit löst Du Dein primäres Problem, nämlich schnelle Signale über 
längere Strecken zu schicken.


> Für mich haben sich jetzt 2 mögliche Lösungen aufgezeigt.
>
> Lösung 1:
> Ich nehme wie von Falk vorgeschlagen den
> 74HC4050 für CLK, MOSI, SS usw. und den
> 74HC125 für MISO
> Was mir nicht so gut gefällt ist, dass ich 8 Kanäle von 5V -> 3,3V
> brauche und Einen Kanal von 3,3V -> 5V.
> Der 74HC4050 hat 6 Kanäle und der 74HC125 hat 4.
> Gibt es die gleichen ICs auch mit anderer Anzahl Kanäle, so dass ich
> nicht so viele "verschwenden" muss?

Ja, gibt es. Ich hätte Dir jetzt 74LVC1T45, 74LVC2T45 und 74LVC8T245 
vorgeschlagen, wenn Du eine Single-Ended Lösung haben willst. Die darfst 
Du auch als Leitungstreiber verwenden.

> Lösung 2:
> Ich nehme wie von fchk vorgeschlagen den
> 26C31 für die 5V Signale -> Differentiell und den 26LV31 für MISO ->
> Differentiell.
> Den 26C32 für Differentiell -> 5V und den 26LV32 für Differentiell ->
> 3,3V.
> Hier "verschende" ich auch wieder 3 Kanäle auf der 3,3V -> 5V Seite.
> Wäre der MAX3295 als Transmitter und der MAX3281 als Receiver geeignet
> für MISO?
> Oder sollte man lieber in der gleichen IC Familie bleiben?

Das ist egal.

>
> Lösung 2 gefällt mir besser und ich schätze die Chancen auf Erfolg hier
> größer ein.
> Seht ihr das auch so?

Wenn man es richtig macht, kommt man sowohl differentiell als auch 
single-ended zum Ziel. Geschickt geht aber anders.

fchk

von Wolfgang (Gast)


Lesenswert?

Jan L. schrieb:
> Für I2C über 10m habe ich P82B715 benutzt, waren Plug&Play...

Den Geschwindigkeitsunterschied zwischen 8MHz SPI und I2C kennst du?
Das dürfte mindestens ein Faktor 10 sein.

von Benjamin H. (bensch)


Lesenswert?

Falk B. schrieb:
> Aber man aktualisert nicht immer das gesamte Display sondern nur die
> Felder, die sich ändern. Das spart massiv Übertragungszeit.

Ja, mach ich wie gesagt auch nur wenn ich die "Seite" wechsle.

Falk B. schrieb:
> Gibt es. z.B. ein 74LVC541, das ist ein 8-Kanal Treiber.
> Es gibt noch den (A)HCT125, das ist ein 1-Kanal 125er im SOT23-5
> Gehäuse.
> Es MUSS ein AHCT oder HCT sein, KEIN HC!

Der 74LVC541 sieht gut aus.
Aber mit HCT125 kann ich keine Einkanaligen Wandler finden.

Falk B. schrieb:
> Naja, prinzipiell ja, praktisch ist der Unterschied aber nicht so groß.

D.h. prinzpiell würdest du mir auch zu Lösung 2 raten?

von Ib (Gast)


Angehängte Dateien:

Lesenswert?

so vielleicht

von Benjamin H. (bensch)


Lesenswert?

Frank K. schrieb:
> Auch für PICs gibts genug Support. Muss man nur finden.
>
> Und: Arduino ist inzwischen nicht mehr auf AVR beschränkt. Es gibt von
> Arduino selber auch ARM-Boards mit SAM3X und LPC11irgendwas, von
> Digilent gibts PIC32-Boards mit Arduino-IDE, Teensy hat Freescale ARM im
> Programm... das wäre doch was für Dich - die sind nämlich schön kompakt,
> und die kannst Du neben oder unter das Display packen. 180 MHz, 3.3V,
> aber trotzdem mit der Arduino-IDE programmierbar.
>
> https://www.pjrc.com/store/teensy36.html
>
> Damit löst Du Dein primäres Problem, nämlich schnelle Signale über
> längere Strecken zu schicken.

Ich habe mich schon etwas damit beschäftigt und habe auch ein STM32 
Board da.
Ich habe etwas damit rumgespielt und mich dann aber Entschieden dieses 
Projekt mit dem Arudino Mega durchzuführen und danach in die Welt der 
32bit Controller einzutauchen. Unter anderem wegen der Zeit und weil die 
Software auf dem Mega bereits gelaufen ist.

Frank K. schrieb:
> Ja, gibt es. Ich hätte Dir jetzt 74LVC1T45, 74LVC2T45 und 74LVC8T245
> vorgeschlagen, wenn Du eine Single-Ended Lösung haben willst. Die darfst
> Du auch als Leitungstreiber verwenden.

Ich würde der Einfachheit halber prinzpiell die Single-Ended Lösung 
vorziehen.
Hängt aber alles von der Chance auf Erfolg ab...

Frank K. schrieb:
> Wenn man es richtig macht, kommt man sowohl differentiell als auch
> single-ended zum Ziel. Geschickt geht aber anders.

Was meinst du mit Geschickt geht anders?
Das ich den Controller zum Display packen sollte?

Jedenfalls sehen die Pegelwanlder auf den ersten Blick sehr gut aus.
Wenn ihr beide (fchk & falk) meint das es keinen so großen Unterschied 
macht ob Single-Ended oder Differentiell dann Versuche ich es jetzt mit 
dem 74LVC8T245 und 74LVC1T45 für MISO. Dann kann ich die Direction fix 
einstellen.


Ib schrieb:
> so vielleicht
Toller IC. Leider in meinem Fall zu langsam.

von Frank K. (fchk)


Lesenswert?

Benjamin H. schrieb:

> Frank K. schrieb:
>> Ja, gibt es. Ich hätte Dir jetzt 74LVC1T45, 74LVC2T45 und 74LVC8T245
>> vorgeschlagen, wenn Du eine Single-Ended Lösung haben willst. Die darfst
>> Du auch als Leitungstreiber verwenden.
>
> Ich würde der Einfachheit halber prinzpiell die Single-Ended Lösung
> vorziehen.
> Hängt aber alles von der Chance auf Erfolg ab...
>
> Frank K. schrieb:
>> Wenn man es richtig macht, kommt man sowohl differentiell als auch
>> single-ended zum Ziel. Geschickt geht aber anders.
>
> Was meinst du mit Geschickt geht anders?
> Das ich den Controller zum Display packen sollte?

Genau. Das ist doch die Wurzel der ganzen Probleme. Ohne das wären wir 
nicht hier. Und das alles nur weil DU es nicht hinbekommst, eine 
kompakte Einheit zu produzieren, sondern Fertigmodule einsetzt, die eben 
größer als notwendig sind.

> Jedenfalls sehen die Pegelwanlder auf den ersten Blick sehr gut aus.
> Wenn ihr beide (fchk & falk) meint das es keinen so großen Unterschied
> macht ob Single-Ended oder Differentiell dann Versuche ich es jetzt mit
> dem 74LVC8T245 und 74LVC1T45 für MISO. Dann kann ich die Direction fix
> einstellen.

Zum "wenn man es richtig macht" gehört auch:
- abwechselnd Signal-GND-Signal-GND im Flachbandkabel
- In jeder Signalleitung einen Serienwiderstand vorsehen
- auf der Empfängerseite für jedes Signal einen 0603 Footprint für einen 
Widerstand und/oder Kondensator nach GND vorsehen.
- Schmitt-Trigger sind auf der Empfängerseite sinnvoll

- Oszilloskop bereithalten

fchk

von Stefan F. (Gast)


Lesenswert?

Stefanus F. schrieb:
> AVR mit 5V Versorgungsspannung funktionieren auch ohne Pegelwandler
> tadellos an einem I²C Bus, der 3,3V Pegel hat.
> Immer schön dran denken, dass die I²C Pins Open-Drain Modus arbeiten.
> Dadurch wird es möglich.

Benjamin H. schrieb:
> Ja aber da der Arduino der Master ist und das Display keine 5V verträgt
> nützt mir das in diesem Fall nichts.

Du hast keine Ahnung, was Open-Drain ist. Informiere Dich darüber, bevor 
du mit überflüssigen Teilen die Ausfallrate unnöitg in die Höhe treibst.

> Ich nutze auch SPI und nicht I²C.

Ok, dann vergiss I²C für dieses Projekt aber denke an meine Worte, wenn 
du das nächste mal in die Versuchung kommst, Pegelwandler einzufügen.

von Benjamin H. (bensch)


Lesenswert?

Frank K. schrieb:
> Genau. Das ist doch die Wurzel der ganzen Probleme. Ohne das wären wir
> nicht hier. Und das alles nur weil DU es nicht hinbekommst, eine
> kompakte Einheit zu produzieren, sondern Fertigmodule einsetzt, die eben
> größer als notwendig sind.

Es gibt noch ein paar andere Gründe die mich dazu bewegen den Controller 
"unten" einzbauen, anstatt direkt hinterm Display. Auf die möchte ich 
jetzt aber nicht alle eingehen.
Ich habe im vorhinein gelesen das mit SPI und solchen Übertragungsraten, 
2-3 Meter Kabellänge möglich sind und bin ja nur auf der Suche nach dem 
WIE.
Aber ihr habt mir ja Wege aufgezeigt und ich werde es jetzt mit dem 
74LVC8T245 versuchen.
Ich bin kein Profi und deshalb auch dankbar das es solche Fertigmodule 
gibt.

Frank K. schrieb:
> Zum "wenn man es richtig macht" gehört auch:
> - abwechselnd Signal-GND-Signal-GND im Flachbandkabel
> - In jeder Signalleitung einen Serienwiderstand vorsehen
> - auf der Empfängerseite für jedes Signal einen 0603 Footprint für einen
> Widerstand und/oder Kondensator nach GND vorsehen.
> - Schmitt-Trigger sind auf der Empfängerseite sinnvoll
>
> - Oszilloskop bereithalten

Das werde ich bei meinem neuen Layout berücksichtigen.

Würdest du mir empfehlen den SD Reader (mit integriertem Pegelwandler) 
auf der 5V Seite nahe dem Arduino zu platzieren oder lieber einen 
SD-Reader ohne Pegelwanlder auf der Displayseite nahe dem 74LVC*?

Stefanus F. schrieb:
> Du hast keine Ahnung, was Open-Drain ist. Informiere Dich darüber, bevor
> du mit überflüssigen Teilen die Ausfallrate unnöitg in die Höhe treibst.

Doch schon aber bei SPI werden ja keine Pull-Ups benötigt. Trotzdem habe 
ich ein 5V Signal. Ich denke der Master hat integrierte Pull-Ups. Wenn 
ich jetzt draußen einfach einen Pull-Up auf 3,3V häge, weiß ich nicht 
was passiert.
Oder du hast was anderes gemeint und ich habe dein Kommentar falsch 
verstanden.

von Stefan F. (Gast)


Lesenswert?

SPI ist nicht open-drain.Das gilt nur für I2C.

von Frank K. (fchk)


Lesenswert?

Benjamin H. schrieb:
> Frank K. schrieb:
>> Genau. Das ist doch die Wurzel der ganzen Probleme. Ohne das wären wir
>> nicht hier. Und das alles nur weil DU es nicht hinbekommst, eine
>> kompakte Einheit zu produzieren, sondern Fertigmodule einsetzt, die eben
>> größer als notwendig sind.
>
> Es gibt noch ein paar andere Gründe die mich dazu bewegen den Controller
> "unten" einzbauen, anstatt direkt hinterm Display. Auf die möchte ich
> jetzt aber nicht alle eingehen.

Dann nimm halt noch einen zweiten und lass die per UART kommunizieren. 
In einem richtigen Projekt würde man das ohnehin immer so machen, schon 
allein aus EMV-Gründen. Und in richtigen Projekten würde man auch CAN 
verwenden (und damit auch Prozessoren, die gleich CAN eingebaut haben).

> Ich habe im vorhinein gelesen das mit SPI und solchen Übertragungsraten,
> 2-3 Meter Kabellänge möglich sind und bin ja nur auf der Suche nach dem
> WIE.

Wir haben aber nicht gesagt, dass es einfach wird.

> Aber ihr habt mir ja Wege aufgezeigt und ich werde es jetzt mit dem
> 74LVC8T245 versuchen.
> Ich bin kein Profi und deshalb auch dankbar das es solche Fertigmodule
> gibt.

Ja, das merkt man. Sorry.

> Würdest du mir empfehlen den SD Reader (mit integriertem Pegelwandler)
> auf der 5V Seite nahe dem Arduino zu platzieren oder lieber einen
> SD-Reader ohne Pegelwanlder auf der Displayseite nahe dem 74LVC*?

1. extra SPI-Bus, komplett getrennt, auf jeden Fall.
2. Leitungslänge minimieren, also direkt an den steuernden Controller
3. Wenn Pegelwandler erforderlich sein, dann nimm sie halt.

fchk

von Falk B. (falk)


Lesenswert?

Benjamin H. schrieb:
>> Es MUSS ein AHCT oder HCT sein, KEIN HC!
>
> Der 74LVC541 sieht gut aus.
> Aber mit HCT125 kann ich keine Einkanaligen Wandler finden.

Conrad 1114947

von Falk B. (falk)


Lesenswert?

Stefanus F. schrieb:
> Du hast keine Ahnung, was Open-Drain ist. Informiere Dich darüber, bevor
> du mit überflüssigen Teilen die Ausfallrate unnöitg in die Höhe treibst.

Und du hast mal wieder KEINE Ahnung von solider Hardware! Geh mal zum 
Arzt und lass dir Pillen gegen dein pathologisches Helfersyndorm 
verschreiben!

von Stefan F. (Gast)


Lesenswert?

Falk B. schrieb:
> lass dir Pillen gegen

Wie höflich, erwartest du danach eine vernünftige Erklärung? Wohl kaum, 
falls doch, kannst du lange warten.

Nur soviel: Meine Hardware ist grundsolide.

von Falk B. (falk)


Lesenswert?

Stefanus F. schrieb:

> AVR mit 5V Versorgungsspannung funktionieren auch ohne Pegelwandler
> tadellos an einem I²C Bus, der 3,3V Pegel hat.

FALSCH!!! Denn ein AVR will offiziell 0,7*VCC = 0,7*5V = 3,5V als HIGH 
sehen!
Also nimmt man einen SOLIDEN Pegelwandler für I2C und fertig. Dann hat 
man auch deutlich mehr Störabstand! Nur weil es auf deinem Labortisch 
bei Sonnenschein funktioniert, ist es noch LANGE nicht solide!

>Nur soviel: Meine Hardware ist grundsolide.

Und ich bin der Kaiser von China!

von Stefan F. (Gast)


Lesenswert?

Falk B. schrieb:
> Denn ein AVR will offiziell 0,7*VCC = 0,7*5V = 3,5V als HIGH sehen!

In meinen Datenblättern werden 0,6 x VCC garantiert, das sind 3V.

von Purzel H. (hacky)


Lesenswert?

>Darauf zielte der Hinweis mit den RS-422 Treibern letztendlich ab. Nur
sind die nicht für 8MHz vorgesehen - eher 1MHz oder weniger.


Nee. Es muessen ja nicht die Uralt 75176 sein.
Da gibt es 2 5MBit treiber. siehe zB SN65HVD23D, 25M fuer 160m

von Karl K. (karl2go)


Lesenswert?

Frank K. schrieb:
> Diese bidirektionalen Levelshifter mit automatischer
> Richtungsumschaltung sind wirklich mit Vorsicht zu genießen.

Vor allem: Wozu?

Bei SPI sind doch die Datenrichtungen eindeutig vorgegeben, da braucht 
man keine bidi Wandler.

Abgesehen davon völliger Overhead, da mit einem 20poligen Kabel 
hochzugehen. Das geht über 4 Leitungen, entweder RS485 und dann sehr 
störsicher, oder I2C und dann halt etwas langsam, oder Uart. Muss nur 
noch ein kleiner Controller oben ans Display.

Naja, der Arduino Mega ist wahrscheinlich auch Overhead, genauso wie das 
Display. Also passt das wieder...

von Purzel H. (hacky)


Lesenswert?

Es ist aber schon klar, dass man fuer einen fluessigen Bildaufbau auf 
einem grafischen TFT einen 32bit Controller benoetigt ?

: Bearbeitet durch User
von Stefan F. (Gast)


Lesenswert?

Name H. schrieb:
> Es ist aber schon klar, dass man fuer einen fluessigen Bildaufbau
> auf einem grafischen TFT einen 32bit Controller benoetigt ?

Ich weiß nicht, inwiefern mir da 32bit helfen würden. Aber 
Taktfrequenzen oberhalb von 32MHz und DMA würde ich mir auf jeden Fall 
wünschen. Mir fällt spontan kein 8bit Controller ein, der das bietet. 
Aber ich kenne auch nur relativ wenige.

von Falk B. (falk)


Lesenswert?

Mein Gott, der OP hat seine Gründe genannt und die sind auch plausibel 
und OK! Man KANN es so machen, auch wenn es nicht optimal ist!

von Stefan F. (Gast)


Lesenswert?

Falk B. schrieb:
> Man KANN es so machen, auch wenn es nicht optimal ist!

Darin sind wir und schon längst einig. Warum regst du dich auf?

von Falk B. (falk)


Lesenswert?

Die wesentlichen Fragen sind schon längst geklärt, es wird nur noch 
geplappert. Aber wir wissen, vom wem es kommt.

von Fabian (Gast)


Lesenswert?

Hallo Benjamin,

ich bin über das gleiche Problem wie du gestoßen und daher auch auf 
diesen Forumseintrag. Ich steuere per SPI ein Matrix Display an - per 
Flachbandkabel. Wenn das Kabel ca. 50cm lang war hat das alles gut 
funktioniert. Ich musste die Leitung aber auf 1m verlängern und da ging 
dann gar nichts mehr.
Ich habe dann begonnen im WWW zu forschen. Da ich eine zusätzliche 
Elektronik zum Verlängern der Leitung vermeiden musste, habe ich anhand 
des Recherchierten herumexperimentiert.

Ich konnte das Problem lösen, indem ich kein Flachbandkabel genutzt 
habe:
1.  Habe ich den Leitungsquerschnitt erhöht (auf AWG22/0,32mm²)
2.  Habe ich dann Clock und Data Leitung leicht miteinander verdrillt 
(ca. alle 5cm eine Drehung).
3.  Interessanterweise darf CS nicht mitverdrillt bzw. dann verseilt 
werden, dann funkts wieder nicht mehr

Ich denke bei der Leitungslänge die Du benötigst wird das evtl. auch 
funktionieren. Schreib mal wie dein Projekt gelaufen ist, es gab ja 
schon zwischenzeitlich einige Winter.

LG., Fabian

von Stefan F. (Gast)


Lesenswert?

Fabian, befasse dich mal mit den Begriffen "Serienterminierung" und dem 
damit verbundenen "Wellenwiderstand". Ich denke dann wird dir klar, wo 
das Problem ist und wie du es richtig lösen kannst.

von Falk B. (falk)


Lesenswert?

Fabian schrieb:
> Ich konnte das Problem lösen, indem ich kein Flachbandkabel genutzt
> habe:
> 1.  Habe ich den Leitungsquerschnitt erhöht (auf AWG22/0,32mm²)

Bedeutungslos

> 2.  Habe ich dann Clock und Data Leitung leicht miteinander verdrillt
> (ca. alle 5cm eine Drehung).

Schon mal gut.

> 3.  Interessanterweise darf CS nicht mitverdrillt bzw. dann verseilt
> werden, dann funkts wieder nicht mehr

Was mal zeigt, daß deine "Lösung" nicht wirklich  stabil funktioniert, 
nur mit Glück in einem SEHR schmalen Bereich.

Lies den Artikel Wellenwiderstand und versuche die Tips dort 
umzusetzen. Dann geht es auch mit Flachbandkabel.

von J. S. (jojos)


Lesenswert?

da würde ich eher das Konzept überdenken. Der Controller und das Display 
mit den hochfrequenten Signalen gehören eng zusammengebaut, dafür gibt 
es ja extra Display Shields die auf die Controllerboards passen. Und 
dann die langsame Peripherie absetzen. Im Originalposting ging es ja um 
Speed und Akkuanzeige, das sind gemütlich langsame Informationen.
SPI kann ja sehr schnell sein, schnelle Controller schaffen über 100 MHz 
clock. Mit langen Strippen sind das dann ordentliche Störsender.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Fabian schrieb:
> Habe ich dann Clock und Data Leitung leicht miteinander verdrillt
Ich würde eine anständige Serienterminierung machen und jeweils ein 
Signal mit GND verseilen.

J. S. schrieb:
> Mit langen Strippen sind das dann ordentliche Störsender.
Ich würde da einfach knackig schnelle differentielle Treiber nehmen...

von Rudolph R. (rudolph)


Lesenswert?

Auch wenn er alt ist, was ich in dem Thread gerade nicht gefunden habe 
ist wie der SD-Karten Adapter beschaltet ist.
Gerade die mit Pegel-Wandler sind mit Vorsicht einzusetzen, weil viele 
davon MISO nicht Hochohmig schalten wenn deren Chip-Select High ist.

Und ich würde das Problem auch komplett anders lösen, alleine schon um 
nicht so viele Strippen zu haben.
Ein eigener Controller an das Display und schon reicht eine serielle 
Verbindung für Kommandos und Messwerte.
Im Auto sind Klimabedienteile auch mal mit LIN angebunden.

Wenn man das Display abtrennt kann man dann auch gleich was 
intelligentes wie ein EVE3-43G oder RVT43HLBNWC00 nehmen, die haben 
nicht nur einen kapazitiv Touchscreen und ein Deckglas mit dem man das 
vernünftig einbauen kann, die haben auch einen FLASH Chip mit drauf mit 
dem man sich die SD-Karte sparen kann.

Als Pegelwandler zwischen den EVE Displays und diversen Eval-Boards 
benutze ich gerade so eine Platine: 
https://github.com/RudolphRiedel/EVE_display-adapter/tree/master/L-D5019-08
Die 74LVC2G17 vertragen 5V am Eingang bei 3,3V Versorgung, damit kann 
ich da praktisch alles vom Uno bis zum Teensy 4 dran anschliessen.
Die Versorgung mache ich meistens getrennt vom Eval-Board mit einem 
Netzteil, daher auch die zwei GND Anschlüsse.

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.