Forum: Mikrocontroller und Digitale Elektronik Seltsames Verhalten bei Arbeit mit LevelShifter


von Matthias P. (micro_rookie)


Angehängte Dateien:

Lesenswert?

Hallo,

Ich wollte meinen LevelShifter, den ich vor kurzem gelötet habe, jetzt 
mal ausprobieren.
Als Impulsempfänger habe ich dazu einen Arduino, der die länge von 
HIGH-Impulsen zählt an die HV-Seite des LevelShifter angeschlossen.
An der LV-Seite des LevelShifters hängt ein D1 Wemos Mini, der per 
Knopfdruck 8 HIGH-Impulse zu je 20 ms ausgibt.
Immer, wenn ein Impuls erkannt wird, misst der Arduino die Länge des 
Impulses und gibt die Zeit im seriellen Monitor aus.

Der Schaltplan liegt anbei. Hierbei bitte beachten, dass ich einen 
LevelShifter verwende. Leider habe ich in Fritzing keinen gefunden und 
musste deshalb den TX/RX-Levelshifter verwenden.

Das seltsame ist nun, dass im Seriellen Monitor des Arduino folgendes 
ausgegeben wird :

I received impuls with length in ms : 1
I received impuls with length in ms : 1
I received impuls with length in ms : 1
I received impuls with length in ms : 1
I received impuls with length in ms : 1
I received impuls with length in ms : 1
I received impuls with length in ms : 21
I received impuls with length in ms : 21
I received impuls with length in ms : 20
I received impuls with length in ms : 20
I received impuls with length in ms : 20
I received impuls with length in ms : 21
I received impuls with length in ms : 21
I received impuls with length in ms : 20
I received impuls with length in ms : 1
I received impuls with length in ms : 1

Der Fehler liegt also darin, dass zwar die 8 Impulse zu je ca. 20 ms 
korrekt erkannt werden, aber zwischendrin dennoch irgendwelche 
"Geister"-HIGH-Impulse (anscheinend) ebenfalls erkannt werden.

Im Anhang befinden sich die simplen Codes von Sender und Empfänger, 
sowie der Verkabelungsplan und ein Bild des verwendeten LevelShifters.

Könnt ihr mir bitte sagen (oder eine Vermutung abgeben), woher diese 
"Geister-Impulse" mit 1 ms herkommen ?

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


Lesenswert?

Matthias P. schrieb:
> Der Schaltplan liegt anbei.
Du hast leider vergessen, den Schaltplan anzuhängen. Du hast lediglich 
eine Aufbauskizze gepostet, auf der die Pinbezeichnungen nicht erkennbar 
sind.

> Könnt ihr mir bitte sagen (oder eine Vermutung abgeben), woher diese
> "Geister-Impulse" mit 1 ms herkommen ?
Es sind Störimpulse, die du dir da irgendwie einfängst.

: Bearbeitet durch Moderator
von Thorsten S. (thosch)


Lesenswert?

Wo ist der Schaltplan des Levelshifters?

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


Lesenswert?

Die beiden "Massen" von 3V3 und 5V sind schon auch irgendwo direkt 
miteinander verbunden?

von Helmut -. (dc3yc)


Lesenswert?

Lothar M. schrieb:
> Die beiden "Massen" von 3V3 und 5V sind schon auch irgendwo direkt
> miteinander verbunden?

Ja, wahrscheinlich über die beiden Masseanschlüsse des Levelshifters.
Besser wäre es, die auch noch mal direkt zu verbinden und beim ESP noch 
einen Elko parallel zur Versorgung zu schalten. Aber: der gesamte 
Schaltplan fehlt!

von H. H. (Gast)


Lesenswert?

Wird halt der hier sein, vierfach:

Beitrag "BSS138 Level shifter"

von Frank K. (fchk)


Lesenswert?

Matthias P. schrieb:

> Könnt ihr mir bitte sagen (oder eine Vermutung abgeben), woher diese
> "Geister-Impulse" mit 1 ms herkommen ?

Dein Levelshifter kann nur 0-Bits aktiv ausgeben, er kann keine 1-Bits 
ausgeben. Dafür sind Pullup-Widerstände da.

Diesen Typ von Levelshiftern verwendest Du dann UND WIRKLICH NUR 
DANN(!), wenn Du bidirektionale OpenDrain Signale hast - z.B. I2C.

Für unidirektionale Signale oder bidirektionale Signale, bei denen Du 
ein Richtungssignal hast, gibt es bessere Lösungen. Z.B:

https://www.ti.com/lit/ds/symlink/sn74lvc1t45.pdf

Der hat auf jeder Seite eine eigene Versorgungsspannung, und er kann den 
Ausgang aktiv high und aktiv low treiben. Die Datenrichtung wird durch 
den DIR-Pin (gehört zur Seite A) bestimmt. Diese Bausteine sind in 
vielen Programmern und Debuggern drin. Gibts auch mit 2, 4 oder 8 Bits. 
Die LVC-Serie geht von 1.65V bis 5.5V, die AVC-Serie von 0.8V bis 3.6V, 
und die AXC-Serie von 0.6V bis 3.6V für VCCA und VCCB. LVC kann+-24mA 
treiben, AVC und AXC 8mA.

Also ganz klar: ungeeignetes Bauteil genommen. Selbst schuld.

fchk

von Björn W. (bwieck)


Lesenswert?

Pin D10 ist überhaupt nicht angeschlossen..

von Helmut -. (dc3yc)


Lesenswert?

Frank K. schrieb:
>Diesen Typ von Levelshiftern verwendest Du dann UND WIRKLICH NUR
DANN(!), wenn Du bidirektionale OpenDrain Signale hast - z.B. I2C.
>
> Also ganz klar: ungeeignetes Bauteil genommen. Selbst schuld.

Falsch! Wo ist das Problem, dass er nur nach Masse ziehen kann und der 
High-Pegel durch Pullups erzeugt wird? Die sind ja auf der Platine. Ob 
bi- oder unidirektional ist dem Ding egal!

: Bearbeitet durch User
von Matthias P. (micro_rookie)


Lesenswert?

Ja, die beiden Masse-Anschlüsse sind auf dem Steckbrett auch verbunden, 
hab's nur vergessen einzuzeichnen.

Das Bauteil funktioniert ja auch, denn die 20ms Impulse werden korrekt 
erfasst. Woher allerdings die Störimpulse kommen, ist mir noch 
schleierhaft.
Die Pins sind alle angeschossen. Hab's im der Fritzing-Aufbau nur falsch 
aufgezeichnet. Schaltplan des LevelShifters hab ich nicht.
Ich versuche es morgen mit einer separaten Spannungsversorgung für die 
3,3v und die 5v Seite, den bisher wurde die LV und HV-Seite von den 
Mikrocontrollern gespeist

von Daniel D. (danielduese)


Lesenswert?

Welche FETs und welche Widerstandgrößen weist dein "selbstgebauter" 
Levelshifter auf?

Wenn es der BSS138 ist, reagiert der auf Störimpulse ab 0.5V

Da könnte ein Schmitttrigger helfen.

Ersetze auch mal yield im ESP Script durch {}

: Bearbeitet durch User
von Rainer W. (rawi)


Lesenswert?

Matthias P. schrieb:
> Könnt ihr mir bitte sagen (oder eine Vermutung abgeben), woher diese
> "Geister-Impulse" mit 1 ms herkommen ?

Nimm erstmal ein Oszi und guck nach, ob sie tatsächlich vorhanden sind 
oder der Phantasie deines uC entspringen.

Was passiert, wenn du versuchsweise einen kleinen Kondensator (220p 
o.ä.) parallel zum GPIO schaltest?

von Matthias P. (micro_rookie)


Angehängte Dateien:

Lesenswert?

Rainer W. schrieb:
> Nimm erstmal ein Oszi und guck nach, ob sie tatsächlich vorhanden sind
> oder der Phantasie deines uC entspringen.

Das kann ich leider erst in einer Woche machen, wenn ich wieder zuhause 
bin.

Rainer W. schrieb:
> Was passiert, wenn du versuchsweise einen kleinen Kondensator (220p
> o.ä.) parallel zum GPIO schaltest?

So kleine Kondensatoren hab ich glaube ich gar nicht. Hab mir nur so ein 
Kondensatorsortiment mal gekauft, wo unterschiedliche Größen drin sind, 
aber so klein glaub ich nicht.

Daniel D. schrieb:
> Welche FETs und welche Widerstandgrößen weist dein "selbstgebauter"
> Levelshifter auf?

Naja, der ist ja nicht selbst gebaut, nur selbst die Stiftleisten dran 
gelötet. Die genaue Bezeichnung kenn ich leider nicht mehr, aber ich 
habe zwei Bilder hochgeladen.

Daniel D. schrieb:
> Ersetze auch mal yield im ESP Script durch {}

Dann springt doch der Software-Watchdog ein und resetted das Programm 
immer wieder, wenn er nicht durch yield hingehalten wird, oder ?

von Daniel D. (danielduese)


Lesenswert?

Matthias P. schrieb:

> Daniel D. schrieb:
>> Ersetze auch mal yield im ESP Script durch {}
>
> Dann springt doch der Software-Watchdog ein und resetted das Programm
> immer wieder, wenn er nicht durch yield hingehalten wird, oder ?

Ja das ist richtig, ab idR 1.3 Sekunden. Wird auch vermutlich nichts 
damit zu tun haben. Dann sind wir gespannt auf die Oszi-Messungen.

von Daniel D. (danielduese)


Lesenswert?

Noch eine ganz andere Frage... Wenn du mit einem 3.3V MC einem 5V MC 
Steuerimpulse sendest, wozu brauchst du dazu einen Levelshifter? Erst 
wenns umgekehrt ist käme der in Frage. Wobei auch hier gilt: die meisten 
3.3V MCs sind an den Inputs "5V tolerant". Soweit ich weiß ist das auch 
beim ESP der Fall.

Von diesem Levelshifter bekomme ich allerdings Kopfweh. Viel Ärger 
ersparst du dir künftig wenn du den hier nimmst:
TXS0108E

von Roland M. (Firma: dieFirma) (rolandmo)



Lesenswert?

Warum funktioniert der Levelshifter mit diesen N-CH FETs überhaupt? Ich 
verstehe die Logik nicht. Vielleicht hat jemand die Ausdauer auch mir 
das zu erklären. Der Aufbau den ich im Internet überall gleich finde als 
Bild anbei.

Für mich sieht das aus, als wenn die IOs direkt miteinder verbunden 
sind, außer der Transistor sperrt. Aber dann sind es auf beiden Seiten 
immer noch pull-up HIGH Signale (falls auf input geschaltet)

von Frank K. (fchk)


Lesenswert?

Roland M. schrieb:
> Warum funktioniert der Levelshifter mit diesen N-CH FETs überhaupt? Ich
> verstehe die Logik nicht.

Lies und verstehe das:
https://cdn-shop.adafruit.com/datasheets/AN10441.pdf

fchk

von Sebastian W. (wangnick)


Lesenswert?

Roland M. schrieb:
> Ich verstehe die Logik nicht. Vielleicht hat jemand die Ausdauer auch
> mir das zu erklären.

Kannst du Englisch lesen? Dann hier: 
https://www.mikrocontroller.net/attachment/11546/levelshifter.pdf.

LG, Sebastian

von Roland M. (Firma: dieFirma) (rolandmo)


Lesenswert?

Frank K. schrieb:
> Lies und verstehe das:
> https://cdn-shop.adafruit.com/datasheets/AN10441.pdf

Gelesen. Verstanden. Funktioniert bei i2c
Dann sehe ich allerdings im Schaltungsaufbau vom TO das von mir 
beschriebene Problem: der ESP sendet mittels
digitalWrite(D7, HIGH); 3.3V und beim UNO laufen die ohne Widerstand in 
den als Input definierten Pin.

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


Lesenswert?

Roland M. schrieb:
> der ESP sendet mittels
> digitalWrite(D7, HIGH); 3.3V
Dieser "Pegelwandler" sollte besser "Low-Übertrager" heißen.

Denn ein High-Pegel wird durch ihn einfach gar nicht übertragen, der 
stellt sich allein durch die beidseitigen Pullups ein.

von Manfred P. (pruckelfred)


Angehängte Dateien:

Lesenswert?

Daniel D. schrieb:
> Noch eine ganz andere Frage... Wenn du mit einem 3.3V MC einem 5V MC
> Steuerimpulse sendest, wozu brauchst du dazu einen Levelshifter?

Noch eine ganz andere Frage... Was an Logikpegeln hast Du nicht 
verstanden?

Der Levelshifter sorgt dafür, die Signale zuverlässig im spezifizierten 
Bereich und mit einem vernünftigen Störabstand zu halten. Nur, weil es 
diverse Pfuscher ohne bauen, muß man diese nicht als Vorbild sehen.

> Von diesem Levelshifter bekomme ich allerdings Kopfweh.

Diese Transistormimik wurde vor ganz vielen Jahren von Philips 
vorgestellt und funktioniert!

> Viel Ärger ersparst du dir künftig wenn du den hier nimmst:
> TXS0108E

Diese gibt es als fertige Boards günstig vom Ali und ich setze sie 
selbst ein. Neben I2C spielen die auch am SPI sauber.

von Roland M. (Firma: dieFirma) (rolandmo)


Lesenswert?

Ach Manfred. Schon mal was von TTL Logik gehört?
Der TO setzt dieses Board falsch ein. Der Tipp von Daniel ist korrekt. 
Deine Art hier im Forum dagegen nicht.


Würde dann in diesem Anwendungsfall des TO durch Steuerung mittels

pinMode(D7, INPUT) und
pinMode(D7, OUTPUT)
funktionieren

Vielleicht sind dann auch die Störungen weg.

von Daniel D. (danielduese)


Lesenswert?

Manfred P. schrieb:
> Was an Logikpegeln hast Du nicht
> verstanden?
Geh spielen

von Andreas M. (amesser)


Lesenswert?

Lothar M. schrieb:
> Denn ein High-Pegel wird durch ihn einfach gar nicht übertragen, der
> stellt sich allein durch die beidseitigen Pullups ein.

Jain. Das Prinzip funktioniert an sich schon. Die Idee dahinter ist, das 
der FET nicht erst bei GND leitet sondern bereits viel früher. Das ganze 
gibbets auch etwas ausgeklügelter in Form ganzer ICs - LSF0108 - Dort 
leitet der FET solange die Signalspannung im Bereich der niedrigeren 
Betriebsspannung ist. Bei 3.3 <> 5 Umsetzung reicht das locker, den 3.3V 
werden auch von der 5V Seite sicher als High erkannt.

Die Lösung mit den Einzel FETs ist da schlechter. Kann aber je nach 
Schaltung auch stabil funktionieren. Aber mit einem BSS138, dessen Vgth 
ist viel zu hoch, der wirkt wirklich nur als LOW Übertrager. Mit einem 
EM6K34 sieht das schon ganz anders aus.

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


Lesenswert?

Andreas M. schrieb:
> Das Prinzip funktioniert an sich schon.
Ja klar: Low-Pegel werden von einem der beiden Busteilnehmer aktiv auf 
die Signalleitung gelegt, der High-Pegel stellt sich durch die jeweilige 
Beschaltung ein.

Fazit: der Wechsel von H->L ist steilflankig, die L->H Flanke mogelt 
sich irgendwie hoch...

Andreas M. schrieb:
> Bei 3.3 <> 5 Umsetzung reicht das locker, den 3.3V werden auch von der
> 5V Seite sicher als High erkannt.
Da datf man sich dann aber schon fragen: Wozu dann überhaupt 
Pegelwandler?

Fazit: für unidirektionale Signsle nimmt man richtige aktive 
Pegelwandler passend zur Richtung.

: Bearbeitet durch Moderator
von Andreas M. (amesser)


Lesenswert?

Lothar M. schrieb:
> Ja klar: Low-Pegel werden von einem der beiden Busteilnehmer aktiv auf
> die Signalleitung gelegt, der High-Pegel stellt sich durch die jeweilige
> Beschaltung ein.

Nein, eben nicht. Der Mosfet bleibt ja leitfähig. Beim LSF0108 ist es 
so, das die Gatespannung des Mosfets so geregelt wird, dass dieser erst 
abschaltet, wenn das Signal den Pegel der niedrigeren Betriebsspannung 
erreicht hat. D.h. wenn die die 3.3V Seite den Pegel z.B. per Push/Pull 
auf 3.3V zieht, dann geht der Pegel auf der 5V Seite ebenfalls instantan 
auf ca 3.3V hoch. Erst für den Bereich 3.3V->5V wirkt nur noch der 
Pull-Up. Deswegen braucht man beim LSF0108 auf der 3.3V Seite auch gar 
keinen Pull-Up, es reicht der auf der 5V Seite. Sobald das Signal auf 
einer Seite des Mosfets die Betriebsspannung nur minimal unterschreitet 
wird der Mosfet leitfähig.

Wenn man einzelne Mosfets verwendet klappt das natürlich nicht so gut, 
weil man die Gate-Spannung nicht passenden geregelt bekommt, so das der 
Einschaltvorgang direkt unterhalb der Betriebsspannung einsetzt. (Man 
kann aber Doppel-Mosfets benutzen, wie z.B. den von mir genannten EM6K34 
und den LSF0108 einkanalig nachbauen) Wenn die Vgth des Mosfet aber 
niedrig genug ist, dann funktioniert es auch ohne eine solche Regelung 
für die meisten Fälle sehr gut. (Mit dem BSS138 allerdings eher nicht)

Lothar M. schrieb:
> Fazit: der Wechsel von H->L ist steilflankig, die L->H Flanke mogelt
> sich irgendwie hoch...

Wie oben beschrieben: Nein. Ich ziehe hier wieder den LSF0108 ran. Bei 
Signalrichtung 5V -> 3.3V ist auf der 3.3V Seite das Signal exakt so 
steilflanking wie auf der 5V Seite. In der Richtung 3.3V -> 5V ist das 
5V Signal genauso steilflanking bis 3.3V, aber da setzt dann RC 
Charaktersitik über den Pull-Up ein. Es gibt dazu im Datenblatt ein 
schönes Bild.

Lothar M. schrieb:
> Fazit: für unidirektionale Signsle nimmt man richtige aktive
> Pegelwandler passend zur Richtung.

Das ist klar, der Ansatz mit den Mosfets ist vor allem für 
bidirektionale Signale sinnvoll/notwendig.

von Matthias P. (micro_rookie)


Lesenswert?

Ich habe den Test jetzt mal umgedreht, also so, dass der ESP8266 die 
Impulse zählt und der Arduino die Impulse sendet. Da funktioniert das 
Ganze, d.h. es werden keine "Geister-Impulse" empfangen.

Lothar M. schrieb:
> Fazit: der Wechsel von H->L ist steilflankig, die L->H Flanke mogelt
> sich irgendwie hoch...

Das heißt also, dass bei meinem LevelShifter der Wechsel von HIGH auf 
LOW funktioniert, aber von LOW auf HIGH nur mit quasi Müh und Not, hab 
ich das so richtig verstanden ?

Um es kurz zu sagen : Ich brauche einen Pegelwandler, der 3.3V in 5V 
"korrekt "konvertieren kann, also ohne "Geister-Impulse" und das 
bidirektional, sodass alle HIGH und LOW-Pegel, egal ob se von der 5V 
oder 3.3V-Seite kommen, korrekt von den Mikrocontrollern erkannt werden.
Kurzum : So dass das obige Beispiel korrekt funktioniert, egal, ob die 
3.3V-Seite oder die 5V-Seite Sender/Empfänger ist.

Ist dafür der von euch beschriebene TXS0108E besser geeignet ?

Und falls ja, gibts die eventuell auch schon irgendwo mit fertig 
gelöteten Stiftleisten?

: Bearbeitet durch User
von Andreas M. (amesser)


Lesenswert?

Matthias P. schrieb:
> Ist dafür der von euch beschriebene TXS0108E besser geeignet ?

Solange Du nicht verrätst was Du genau für Signale hast, kann Dir das 
keiner Beantworten. Sowohl dein Pegelwandler(Mosfets)/LSF0108 als auch 
der TXS0108E sind für Bi-Direktionale Signale gedacht. Wenn du aber 
unidirektionale Signale hast, also die eine Seite immer "treibt" und die 
andere nur "empfängt" dann gibt es bessere Lösungen. Es gibt auch 
Pegelwandler mit Richtungsumschaltung per Pin.

Ein paar Ideen dazu gibts hier:

https://www.mikrocontroller.net/articles/Pegelwandler


Du könntest aber Deinen Pegelwandler verbessern indem Du die Widerstände 
mal gegen vernünftige Werte tauschst. 10kOhm für die Pull-Ups ist viel 
zu viel. Ich sehe da höchstens 3,3k, besser 2,2k.

: Bearbeitet durch User
von Andreas M. (amesser)


Lesenswert?

Was mir noch auffällt: Den gelben Jumperwire/Widerstand hast Du 
hoffentlich nicht so gesteckt wie auf dem Bild von Dir. Denn dort ist 
nichts. Der Pin D12 ist eins weiter rechts.

von Sebastian W. (wangnick)


Lesenswert?

Matthias P. schrieb:
> Dann springt doch der Software-Watchdog ein und resetted das Programm
> immer wieder, wenn er nicht durch yield hingehalten wird, oder ?

In deinem Code steht yield, es sollte aber yield() lauten ...

LG, Sebastian

von Daniel D. (danielduese)


Lesenswert?

Matthias P. schrieb:

> Ist dafür der von euch beschriebene TXS0108E besser geeignet ?

Lies mal über push pull versus open drain Schaltungen.
Der TXS kann beides.

Wird auch als Shield eingesetzt um Hardware zu schützen, weil er alle 
Impulse korrekt weiterleitet, vgl. 
https://www.elektor.de/elektor-raspberry-pi-buffer-board


> Und falls ja, gibts die eventuell auch schon irgendwo mit fertig
> gelöteten Stiftleisten?

Stiftleisten anlöten solltest du dir beibringen lassen. In dem 
Makerspace gibts Leute, die dir helfen.

von Matthias P. (micro_rookie)


Lesenswert?

Andreas M. schrieb:
> Du könntest aber Deinen Pegelwandler verbessern indem Du die Widerstände
> mal gegen vernünftige Werte tauschst. 10kOhm für die Pull-Ups ist viel
> zu viel. Ich sehe da höchstens 3,3k, besser 2,2k.

Dazu müsste ich ja die Verbauten SMD-Widerstände rauslöten. Das kann ich 
sicher nicht.

Sebastian W. schrieb:
> In deinem Code steht yield, es sollte aber yield() lauten ...

Dann hab ich versehentlich eine alte Version des Codes verwendet. 
Selbstverständlich muss es, wie du sagst, yield() heißen.

Andreas M. schrieb:
> Solange Du nicht verrätst was Du genau für Signale hast, kann Dir das
> keiner Beantworten. Sowohl dein Pegelwandler(Mosfets)/LSF0108 als auch
> der TXS0108E sind für Bi-Direktionale Signale gedacht. Wenn du aber
> unidirektionale Signale hast, also die eine Seite immer "treibt" und die
> andere nur "empfängt" dann gibt es bessere Lösungen. Es gibt auch
> Pegelwandler mit Richtungsumschaltung per Pin.

Was ich brauche ist ein Pegelwandler, bei dem ein 3,3V und ein 5V 
Mikrocontroller sich über einen Pin durch Setzen von HIGH und LOW-Pegeln 
quasi "unterhalten" können, also kein Schalten von Lasten, sondern mehr 
"Signalebene". Zum Beispiel rechnet der D1 Wemos ein Ergebnis aus und 
setzt dann einen bestimmten Pin auf HIGH. Der Arduino liest und erkennt 
diesen HIGH-Pegel und weiß, dass es jetzt weitergeht. Ebenso andersrum, 
wenn der Arduino ein Ergebnis hat und dann der D1 Wemos das gesetzte 
HIGH-Signal erkennt, also bidirektional, über eine Leitung und am besten 
ohne Setzen der Richtung über einen weiteren Pin. Gut wäre auch noch, 
wenn man das Bauteil auch für SPI-Kommunikation zwischen 3,3V und 5V 
Mikrocontroller verwenden könnte, das ist allerdings mehr ein 
Nice-To-Have, kein Must-Have.

Ich hoffe, es ist jetzt einigermaßen verständlich, nach was ich suche.

: Bearbeitet durch User
von Andreas M. (amesser)


Lesenswert?

Matthias P. schrieb:
> Ich hoffe, es ist jetzt einigermaßen verständlich, nach was ich suche.

Also SPI ist Unidirektional. Dein Protokoll hört sich für mich recht 
umständlich an, hast du nicht die Möglichkeit zwei getrennte Pins, je 
einen pro Richtung zu benutzen? Das würde vieles vereinfachen, auch 
Deine Software. Wenn nicht, dann nimm den TXS0108E. Der hatte insgesamt 
8 Kanäle, sollte reichen.

Nachtrag: Ich Denke aber, das für Deine Anwendung UART besser wäre, 
Full-Duplex, zwei Leitungen, beide Unidirektional, und Nutzdaten kannste 
auch gleich übertragen.

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


Lesenswert?

Matthias P. schrieb:
> Zum Beispiel rechnet der D1 Wemos ein Ergebnis aus und setzt dann einen
> bestimmten Pin auf HIGH. Der Arduino liest und erkennt diesen HIGH-Pegel
> und weiß, dass es jetzt weitergeht.
Ein Handshake der alten Schule. Da fehlt aber noch die Quittierung, dass 
der Arduino den High-Pegel erkannt hat.

Deshalb sind für ein richtiges Handhake 2 Leitungen nötig: ein hin und 
eine zurück, nennen wir sie H und Z.
 Und dann läuft ein Handshake so ab:
1. A hat was für B und siganlisiert das mit '1' über H
2. B bestätigt Empfang mit '1' über Z
3. A setzt Signalleitung inaktiv und safggt ciao mit '0' über H
4. B bestätiget, dass es die Quittierung von A erkannt hat und sagt 
tschüss mit '0' über Z

Jeder Schritt dazwischen kann beliebig lange dauern, weil jeder 
Teilnehmer immer auf den anderen wartet. Es kann keine Signaländerung 
verloren gehen.

Im Timingdiagramm sieht es also so aus:
1
                       hab was            erkannt        ciao    tschüss  
2
A -> H -> B    ________------------------------------------______________
3
B -> Z -> A    ____________________________-----------------------_______
Und vor nicht beide ciao und tschüss gesagt haben, darf A auch nicht 
einfach wieder anfangen.

: Bearbeitet durch Moderator
von Joachim B. (jar)


Lesenswert?

Matthias P. schrieb:
> Dazu müsste ich ja die Verbauten SMD-Widerstände rauslöten. Das kann ich
> sicher nicht.

du musst doch eh löten und rauslöten musst du nichts, zu den 10k pullups 
einfach einen R parallel

schau dir doch das Bild an
Beitrag "Re: Seltsames Verhalten bei Arbeit mit LevelShifter"

Wenn dir dort ein Signal zu schwach hochgeht, einfach noch mal ein R 
parallel

Rechnen kann man das auch was man sich wünscht 10k vorhanden R gewünscht
https://www.eggersdorf.com/parallelschaltung/

mit 3,3k kommst du schon mal auf 2,4k

: Bearbeitet durch User
von Matthias P. (micro_rookie)


Angehängte Dateien:

Lesenswert?

Joachim B. schrieb:
> Wenn dir dort ein Signal zu schwach hochgeht, einfach noch mal ein R
> parallel

Also wie in meinem neuen Fritzing-Bild dargestellt, oder (bei Verwendung 
von HV4 und LV4) ?

Bei dem Kauf von dem Teil stand dran, dass es sich um einen 
bidirektionalen Pegelwandler von 3,3V auf 5V und umgekehrt handelt. Da 
gehe ich, als Anfänger davon aus, dass das Teil seinen Dienst erfüllt 
und nicht bei 3,3V auf 5V "Geister"-Impulse generiert.

Ich weiß schon, wie ein Handshake funktioniert und mit 2 Kanälen ist das 
kein Problem. Da hätte ich auch, statt das Teil zu kaufen, das Ganze mit 
einem Transistor (LV auf HV) und einem Spannungsteiler (HV auf LV) 
realisieren können. Aber ich möchte eine Lösung, die beides kann und nur 
einen Kanal (bzw. Pin) benötigt. Darum habe ich das obige Teil gekauft 
(und mir nichts weiter dabei gedacht :-( ).

UART ist mir bekannt, aber ich möchte das mit meiner Methode 
realisieren, ohne UART.

Wenn ich mir den TXS0108E zulege, dann kann der aber das, was ich möchte 
(also ein Kanal für beides), oder ?

: Bearbeitet durch User
von Andreas M. (amesser)


Lesenswert?

Matthias P. schrieb:
> Wenn ich mir den TXS0108E zulege, dann kann der aber das, was ich möchte
> (also ein Kanal für beides), oder ?

Ja, der kann das.

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


Lesenswert?

Matthias P. schrieb:
> Ich weiß schon, wie ein Handshake funktioniert und mit 2 Kanälen ist das
> kein Problem.
Dann dürfte dir auch klar sein, warum das mit nur 1 Kanal, an dem beide 
Teilnehmer links und rechts "herumzerren" nicht zuverlässig 
funktionieren wird.

> Bei dem Kauf von dem Teil stand dran, dass es sich um einen
> bidirektionalen Pegelwandler von 3,3V auf 5V und umgekehrt handelt.
Mir ist immer noch nicht klar, ob du einen bidirektionalen 
Pegelwandler brauchst. Wo du doch auf jeder einzelnen Leitung nur von 
A(3V) nach B(5V) übertragen willst. Und eben nicht auch auf der selben 
Leitung Informationen von B nach A zurück schicken willst.

Noch ein Wort zum Ende des Tages: ich habe hunderte Geräte entwickelt 
und zighunderttausende Geräte im Feld und verdiene mein Geld mit 
Hardwareentwicklung. Und wenn ich unidirektionale Signale habe, dann 
nehme ich unidirektionale Pegelwandler. Was will ich noch mehr sagen. 
Man  kanns auch anders machen, weil die Arduinobastelecke grad nichts 
besseres hergibt. Aber bitte, wenn ihr mal älter seid und Steuerungen 
fürs echte Leben entwickelt, dann nehmt nicht einfach nur deshalb die 
selben Bauteile, weil das ja "damals" im Arduinosteckkasten schon immer 
gut funktioniert hat.

: Bearbeitet durch Moderator
von Frank K. (fchk)


Lesenswert?

Matthias P. schrieb:

> Ich weiß schon, wie ein Handshake funktioniert und mit 2 Kanälen ist das
> kein Problem. Da hätte ich auch, statt das Teil zu kaufen, das Ganze mit
> einem Transistor (LV auf HV) und einem Spannungsteiler (HV auf LV)
> realisieren können. Aber ich möchte eine Lösung, die beides kann und nur
> einen Kanal (bzw. Pin) benötigt. Darum habe ich das obige Teil gekauft
> (und mir nichts weiter dabei gedacht :-( ).
>
> UART ist mir bekannt, aber ich möchte das mit meiner Methode
> realisieren, ohne UART.

Sicher möchtest Du das. Haben wir verstanden. Ist aber dennoch eine 
ausgesprochen dumme Idee. Aber hey, Du bist ja Anfänger, und als 
Anfänger darfst Du auch Fehler machen. Ist wie mit einem Kleinkind und 
der heißen Herdplatte. Die Erkenntnis kommt immer erst nach der ersten 
Brandblase.

fchk

von Matthias P. (micro_rookie)


Lesenswert?

Lothar M. schrieb:
> Mir ist immer noch nicht klar, ob du einen bidirektionalen
> Pegelwandler brauchst. Wo du doch auf jeder einzelnen Leitung nur von
> A(3V) nach B(5V) übertragen willst. Und eben nicht auch auf der selben
> Leitung Informationen von B nach A zurück schicken willst.

Doch, genau, darum geht es mir. Dass der Sender der Nachricht, z.B. A, 
vom Empfänger der Nachricht, z.B. B das Feedback bekommt, ob z.B. die 
Nachricht korrekt empfangen wurde. Also A soll nach B und B soll nach A 
übertragen können, auf derselben Leitung. Natürlich nicht gleichzeitig, 
sondern schön der Reihe nach. Um bei meinem Beispiel mit den 8 Impulsen 
zu je 20 ms zu bleiben, könnte in diesem Fall der Arduino, nach dem 
Senden der Impulse seinen Pin auf Eingang umschalten und auf ein 
HIGH-Signal vom D1 Wemos warten.

Also müsste für soetwas der TXS0108E passen, oder ?

Joachim B. schrieb:
> Wenn dir dort ein Signal zu schwach hochgeht, einfach noch mal ein R
> parallel

Könntet ihr mir noch sagen, ob ich das mit dem parallelen Schaltung zwei 
weiterer Widerstände wie in "Korrektur" dargestellt, richtig verstanden 
habe ?

: Bearbeitet durch User
von Andreas M. (amesser)


Lesenswert?

Matthias P. schrieb:
> Könntet ihr mir noch sagen, ob ich das mit dem parallelen Schaltung zwei
> weiterer Widerstände wie in "Korrektur" dargestellt, richtig verstanden
> habe ?

Ja. so sollte es gehen.

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.