Hallo!
(Kurzfassung steht am Ende)
Grundsätzlich besteht die ganze Schaltung aus:
- Arduino (Eigenbau meiner Uni mit integriertem NRF24L01 über SPI)
- 2xADNS9500 (ebenfalls SPI)
Damit will ich die Bewegungswerte der ADNS Sensoren auslesen und mit dem
NRF24L01 übertragen.
Auf der Platine befinden sich noch ein haufen Kondensatoren (wie im
Datenblatt des ADNS 9500 beschrieben) und 2 Levelshifter weil das
Arduino für das SPI eine andere Spannung verwendet wie die ADNS 9500 (5V
vs max 3.3V). (Ahja 2 mosfets für die Laser gibts auch noch)
Das ganze sieht so aus:
20150511_120726_k.jpg
Das heißt am SPI hängen 3 verschiedene Devices. Einmal der NRF24L01 und
2 mal ein ADNS 9500. Ich habe also insgesamt 6 SPI Leitungen (3x ncs
,mosi, miso, sclk). Das hat auch gut funktioniert - bis zum letzten
"redesign". Ich wollte das ganze kompakter bauen und dabei die
Steckverbindungen reduzieren. Außerdem habe ich eien groben Fehler
behoben, bei dem ich die ADNS mit der falschen Spannung versorgt habe
(3.3V VDDIO und 5V VDD vertauscht...). Es wundert mich eh, dass die
Chips das überlebt haben...
Nach diesem Redesign haben aber die Funkprobleme begonnen. Und zwar
braucht der NRF jetzt zum senden viel länger als vorher: 150-800 ms. Das
ist definitiv viel zu lange. Das Problem besteht aber nur wenn die SPI
Kabel zu den ADNS 9500 Chips angesteckt sind.
Im ersten Moment war ich richtig verwirrt, da ich von der Schaltung her
nichts geändert habe, außer die Spannungen für die ADNS 9500 richtig zu
tauschen.
Dann ist mir aufgefallen, dass der Funk funktioniert wenn sich etwas
Leitendes in der Nähe einer bestimmen Stelle der Schaltung befindet -
nämlich über dem Low to High Levelshifter für die MISO Leitung der ADNS
9500 Chips. Zu erst habe ich es mit einem großen Stück Anti Statik Folie
versucht. Der Funk hat zwar funktioniert, aber nur wenn gleichzeitig der
USB Stecker zum debuggen angesteckt war. Außerdem musste das Folienstück
ziemlich groß sein.
Nach etwas ausprobieren ist mir aufgefallen, dass das Funkproblem
behoben ist, wenn ich entweder den A oder den OE Pin des Low to High
Levelshifters mit einem Kabel berühre das ich in der Hand halte
(allerdings an der Isolierung). Das hilft auch ohne USB Verbindung.
An den markierten Stellen:
20150511_120641_m_k.jpg
Hier das Datenblatt für den Levelshifter:
http://www.alldatasheet.com/datasheet-pdf/pdf/467614/TI1/SN74AHCT1G125-Q1.html
Den OE Pin des Levelshifters habe ich bis jetzt mit nichts verbunden da
ich mir nicht sicher war wofür der gut ist. Im Datenblatt steht dazu
folgendes:
"The SN74AHCT1G125 is a single bus buffer gate/line driver with 3-state
output. The output is disabled when
the output-enable (OE) input is high. When OE is low, true data is
passed from the A input to the Y output.
To ensure the high-impedance state during power up or power down, OE
should be tied to VCC through a pullup
resistor; the minimum value of the resistor is determined by the
current-sinking capability of the driver."
Kann das etwas mit dem Funkproblem zu tun haben? Wenn ja warum?
Wenn OE nicht angeschlossen ist müsste es ja standardmäßig LOW sein und
funktionieren. Abgesehen davon haben ja nicht die ADNS, für die der
levelshifter eigentlich da ist, das Problem sondern der NRF Funkchip der
leider am gleichen SPI Bus hängt.
Meine alte Version vor dem Redesign hat so ausgesehen:
20150511_120659_k.jpg
Da sitzen die Levelshifter zu Testzwecken noch auf einer eigenen
Platine. Da mit der Konstruktion trotz der falschen Spannung für die
Chips selber (die Spannung für die Levelshifter hat schon gestimmt),
alles funktioniert hat, habe ich dem OE Pin auch keine weitere
Aufmerksamkeit geschenkt.
Kurzfassung:
Warum sendet der NRF24L01 nur dann brauchbar schnell, wenn ich den OE
oder A Pin des MISO Levelshifters für die ADNS 9500 mit einem Kabel
berühre? Was würde passieren wenn ich den OE Pin einfach an GND anlöte.
Und wofür brauche ich den überhaupt?
Einen Schaltplan habe ich auch noch:
adns9500schaltplan_levelshifter.png
Ahja: Ich bin eigentlich kein Elektrotechniker. Also entschuldige ich
mich schon im Vorraus wenn das eine sehr simple Frage ist ;)
@ Dont K. (dont_k)
>(Kurzfassung steht am Ende)
Die Schaltung kommt mir bekannt vor ;-)
Uuups. Was sehe ich da. Im "Schaltplan" ist das OE Pin am Pegelwandler
offen (es fehlen die Namen der ICs!)
Das darf nicht sein! Das MUSS auf GND liegen!
>ist definitiv viel zu lange. Das Problem besteht aber nur wenn die SPI>Kabel zu den ADNS 9500 Chips angesteckt sind.
Du hast mal wieder Kontakt- und Pegelprobleme ;-)
>Leitendes in der Nähe einer bestimmen Stelle der Schaltung befindet ->nämlich über dem Low to High Levelshifter für die MISO Leitung der ADNS>9500 Chips.
Klares Zeichen für einen offenen Eingang!
>behoben ist, wenn ich entweder den A oder den OE Pin des Low to High>Levelshifters mit einem Kabel berühre das ich in der Hand halte
OFFENER EINGANG!
-> gehe direkt ins Gefängnis und ziehe keine 4000 Euro ein!
Gefängnis haha XD
Ja danke euch beiden. Hab sowas befürchtet. Aber etwas wundert mich
doch:
Im Datenblatt steht, dass der OE Pin mit einem passenden (wären 30k ok?)
pull up Widerstand an VCC gehört. In Meinem Fall wäre das der VCC Pin
(also 5V VDD) vom Levelshifter oder? Warum soll ich dann den OE Pin an
GND legen? Oder macht das in dem Fall keinen Unterschied?
> es fehlen die Namen der ICs!
Inwiefern? Die Typbezeichnung steht dabei. Oder meinst du sowas wie
"Miso LevelShifter"
@ Dont K. (dont_k)
>Ja danke euch beiden. Hab sowas befürchtet. Aber etwas wundert mich>doch:>Im Datenblatt steht, dass der OE Pin mit einem passenden (wären 30k ok?)>pull up Widerstand an VCC gehört.
Genauer. Er gehört an dein Chip Select deines SPI-Slaves. Denn dieser
soll eigentlich nur aktiv werden, wenn dieser angesprochen wird.
In deinem SPEZIELLEN Fall hast du aber 3 SPI-Slaves, müsstest streng
genommen einen UND-Verknüpfung der drei Chip Select machen.
Lange Rede, kurzer Sinn. Leg den Pin fest auf GND! Dann ist der Treiber
dauerhaft aktiv. Wenn keine weiteren SPI-ICs auf der 5V Seite
dranhängen, ist das OK.
> In Meinem Fall wäre das der VCC Pin>(also 5V VDD) vom Levelshifter oder? Warum soll ich dann den OE Pin an>GND legen? Oder macht das in dem Fall keinen Unterschied?
Datenblatt gelesen?
OE = HIGH = Treiberausgang inaktiv (tristate)
OE = LOW = Treiberausgang aktiv (Push Pull)
Ausgangsstufen Logik-ICs>> es fehlen die Namen der ICs!>Inwiefern? Die Typbezeichnung steht dabei.
Das ist der WERT! Es fehlen die Namen (R1, R2, R3, U1, U2, U3 etc.)
> Oder meinst du sowas wie "Miso LevelShifter"
Wir sind hier nicht bei den Germanisten sondern im technischen Bereich.
Da will man lieber kurze, einfache Namen und keinen Majestätstitel für
Bauteile.
@ miller:
in meinem ersten posting steht ein zitat aus dem datenblatt und ein link
darunter.
der hier geht auch:
http://www.ti.com[PUNKT]cn/cn/lit/ds/symlink/sn74ahct1g125-q1.pdf
der will meinen link so nicht... einfach [PUNKT] durch einen punkt
ersetzen.
@ Falk:
Thx. Derzeit gibts nur die 3 SPI Devices und ich werde OE einfach an GND
löten.
Ich hab das Datenblatt schon gelesen. Aber da steht eben auch drinnen,
dass OE mit einem Widerstand an VCC gehört (und nicht an NCS wovon man
ja generell nicht ausgehen kann, dass es den pin überhaupt gibt). Das
der Low sein sollte steht im Satz drüber. Allerdings habe ich
fälschlicherweise angenommen, dass ein nicht angeschlossener Pin Low
ist. Das stimmt aber nicht ^^
'Just because you have nothing at all connected to an input pin doesn't
mean it is a logical zero.'
http://playground.arduino.cc/CommonTopics/PullUpDownResistor
Dont K. schrieb:> der will meinen link so nicht...
Die Forensoftware mag keine Links nach China (=Spam). Das ist hier im
Fall auch nicht nötig.
Dont K. schrieb:> Allerdings habe ich fälschlicherweise angenommen, dass ein nicht> angeschlossener Pin Low ist. Das stimmt aber nicht ^^
Wenn schon TTL-Relikt, dann wäre ein nicht angeschlossener Pin "high".
Aber TTL ist schon lange von CMOS abgelöst worden...
Dont K. schrieb:> Ich hab das Datenblatt schon gelesen. Aber da steht eben auch drinnen,> dass OE mit einem Widerstand an VCC gehört
Du interpretierst das Datenblatt aber sehr frei. Gleich auf Seite 1
steht da in dem von dir verlinkten DB:
1
When OE is low, true data is passed from the A input to the Y output.
2
3
To ensure the high-impedance state during power up or power down,
4
OE should be tied to VCC through a pullup resistor
Und auch die "function table" auf dieser Seite spricht klare Worte...
So jetzt habe ich den OE Pin and GND gelegt.
Es passiert etwas ganz absurdes:
Das Senden wird schneller wenn ich die Hand auf das Ding zubewege und
wenn ich zu nahe komme/den Levelshifter berühre sendet es garnicht mehr.
Was aber noch eigenartiger ist: Ich hab im Code die SPI Kommunikation
mit den Sensoren komplett gekillt (Bis auf das Setup). Also sende jetzt
nur noch fixe Werte. Was passiert? Es wird GARNICHTS mehr gesendet. (Nur
einmal am Anfang kurz nach dem Setup). Das Senden funktioniert also nur
wenn SPI Kommunikation mit den Sensoren stattfindet (Oder die Sensoren
vom SPI komplett getrennt sind). Irgendwas hats da...
Nein ich habe gemeint, dass das Miso Signal kein normales Rechteck
Signal ist sondern irgendwie überlagert aussieht. Jetzt habe ich das
getestet. Und Der Miso Pin ist immer High auf der Arduino Seite. NICHT
aber auf der ADNS Seite. Das heißt der Levelshifter zieht den MISO Pin
auf Arduino Seite (Y) konstant auf 5V obwohl der auf ADNS Seite (A)
eigentlich Low ist.
EDIT: Das Problem scheint wirklich der Levelshifter zu sein.
Wenn ich Miso direkt vom Chip nehme und nicht erst vom Levelshifter
scheint es bis jetzt zu funktionieren. Ist halt etwas blöd weil die
Spannung eigentlich zu niedrig sein sollte.
@ Dont K. (dont_k)
>Nein ich habe gemeint, dass das Miso Signal kein normales Rechteck>Signal ist sondern irgendwie überlagert aussieht.
Screenshot?
>Jetzt habe ich das>getestet. Und Der Miso Pin ist immer High auf der Arduino Seite.
Hast du OE vielleicht aus Versehen auf HIGH gelegt anstatt auf LOW?
Kurzschluss?
Hab leider keinen Screenshot, weil ich nicht in der Nähe vom Oszi bin.
Aber es sieht so aus als wäre die Spannung durchschnittlich bei ~5V und
dort gibts leichte Rechteckvariationen im Bereich von +/- ~0,3V. Aber
komplett unregelmäßig und überlagert. Deswegen siehts am Oszi ziemlich
seltsam aus und ist auch schwer zu erkennen.
Dürfte wie gesagt davon kommen, dass der Y Pin durchgehende High ist
obwohl A Low ist. Nein ich habe OE nicht in irgendeiner Form an High
sondern an GND angeschlossen. (Irgendwelche Pullup Widerstände habe ich
nicht verwendet.) Ich kann mir echt nicht erklären warum der
Levelshifter sich so verhält.
Als russische Lösung habe ich den Arduino Miso Pin direkt mit A/dem ADNS
miso Pin verbunden. Fürs Erste scheint es trotz der theoretisch zu
niedrigen Spannung zu funktionieren. Aber wer weiß was für weitere
Probleme später dadurch auftauchen...
@ Dont K. (dont_k)
>miso Pin verbunden. Fürs Erste scheint es trotz der theoretisch zu>niedrigen Spannung zu funktionieren. Aber wer weiß was für weitere>Probleme später dadurch auftauchen...
Mensch, gerade WEIL du diese Probleme hattest, hast du die
Pegelwandler ergänzt? Schon vergessen?
Beitrag "Re: SPI Problem aufgrund von Spannungsversorgung (Arduino Uno & opt. Sensor))"
Mach es RICHIG! Suche, finde und behebe den Fehler!