Hallo zusammen,
ich würde gerne 2 Shilds auf einem Arduino Uno R3 betrieben.
Einmal das Ethernetshield DFRobot DFR0850 und dann das LCDShield DFRobot LCD12864.
Laut den jeweiligen Beispielprogrammen werden folgende Pins genutzt:
Mir ist jetzt nicht ganz klar ob man überhaupt 2 Shields aufeinander stapeln kann, da ja zumindest 3 Anschlüsse (13, 11, 10) von beiden Shields verwendet werden?
Mir ist jetzt nicht ganz klar ob man überhaupt 2 Shields aufeinander
stapeln kann, da ja zumindest 3 Anschlüsse (13, 11, 10) von beiden
Shields verwendet werden?
Eigentlich ist das möglich, da SPI mehr als einen Slave am Bus unterstützt.
11, 12 und 13 (MOSI, MISO, SCLK) dürfen also doppelt verwendet werden. Nur jedes Shield bzw. jeder SPI-Slave braucht mindestens seinen eigenen CS-Anschluss (Chip Select), damit der Arduino wählen kann, mit welchem Slave er spricht.
Da leider beide Shields D10 als Chip Select nutzen, ist ohne eine Modifikation der Hardware ein direkter paralleler Betrieb nicht möglich.
Du müsstest bei einem der Shields die Leiterbahn zu D10 auftrennen und zu einem anderen, freien Pin verdrahten.
Ethernet wird sinnvoller Weise Interrupts verwenden. Da das SPI nicht reentrant ist, braucht man also 2 SPI.
Beim ATmega328 kann man die UART als 2. SPI-Master benutzen. Die ist dann auch einen Zacken schneller, da mit Sendepuffer.
Oder einen ATmega328PB mit 2 SPI und 2 UARTS.
Ja was gibt es dann noch zu reden? Man kann die beiden "Shields" vermutlich parallel benutzen. Es bleib die Frage, ob die Software da mitmacht, wenn zwei Komponenten auf das SPI zugreifen wollen. Kann sein, muss nicht. Probieren geht über studieren.
Danke für die vielen Antworten.
Ich werde mal schauen das ich den CS auf einen anderen freien Pin lege.
ggf. könnte man ja zeitlich dafür Sorgen dass nicht gleichzeitig auf Ethernet und das Display zugegriffen wird.
Vielleicht genügt da einfach ein Delay(1000) ;-)
Nö.
Wenn das Ethernet SPI und Interrupts benutzt, muß man dafür sorgen, daß dieser Interrupt immer gesperrt ist bei allen anderen Zugriffen auf das selbe SPI.
Hallo zusammen,
ich würde gerne 2 Shilds auf einem Arduino Uno R3 betrieben.
Einmal das Ethernetshield DFRobot DFR0850 und dann das LCDShield DFRobot
LCD12864.
Laut den jeweiligen Beispielprogrammen werden folgende Pins genutzt:
Mir ist jetzt nicht ganz klar ob man überhaupt 2 Shields aufeinander
stapeln kann, da ja zumindest 3 Anschlüsse (13, 11, 10) von beiden
Shields verwendet werden?
Naja, wenn man bedenkt das die Arduino Plattform genau dafür gedacht war, einen einfachen Einstieg in das Thema Mikrocontroller/Programmierung zu ermöglichen...
(Auszug aus dem Wiki-Artikel: "Die Entwicklungsumgebung basiert auf Processing und soll auch technisch weniger Versierten den Zugang zur Programmierung und zu Mikrocontrollern erleichtern")
ist es doch schon "ärgerlich" das man nicht mehrere Shields (mit unterschiedlicher Funktionalität) vom gleichen Hersteller miteinander kombinieren kann ohne sie modifizieren zu müssen.
Der W5500 hat zwar Puffer und Protokollschrunz schon intern. Trotzdem wäre es schön, wenn man alles per Interrupt im Hintergrund abhandeln könnte und nicht in der Mainloop pollen müßte. Daher sollte er getrennt auf ein 2. SPI geroutet werden können. Vorzugsweise auf eine UART mit Puffer, d.h. 16 Bit je Interrupt.
reentrant
Gabs früher schon:
In simpelster Form: Monoflop SN74122 zum Bleistift.
Bevor Aktion durch- und zu Ende geführt wurde, kann Vorgang erneut gestartet werden.
wäre es schön, wenn man alles per Interrupt im Hintergrund abhandeln
könnte und nicht in der Mainloop pollen müßte.
Das wäre nicht nur schön sondern das ist schön, und wie
auf diversen Bildern unschwer zu erkennen ist gibt es am
Anschlusstecker einen INT-Pin der genau für Interrupts
vorgesehen ist.
wie
auf diversen Bildern unschwer zu erkennen ist gibt es am
Anschlusstecker einen INT-Pin der genau für Interrupts
vorgesehen ist.
Nur ist das erst 1/4 der Miete. Wenn das selbe SPI auch von anderen Shields oder der SD-Karte benutzt wird, wird das schnell recht kompliziert.
Man darf ja nicht nur den einzelnen Byte SPI-Zugriff atomar kapseln, sondern muß es für das komplette Paket von /CS=0 bis /CS=1 des jeweiligen Slaves.
Und der Ethernet-Interrupt rechnet nicht damit, daß ihm jemand dazwischen grätscht. Er will was gutes tun und gibt die Rechenzeit bis zum nächsten SPI-Byte frei und schwupps ist das SPI vom Main geklaut. Er muß also in seinem Interrupt hocken bleiben und das SPI-Ready pollen.
wäre es schön, wenn man alles per Interrupt im Hintergrund abhandeln
könnte und nicht in der Mainloop pollen müßte.
Das wäre nicht nur schön sondern das ist schön, und wie
auf diversen Bildern unschwer zu erkennen ist gibt es am
Anschlusstecker einen INT-Pin der genau für Interrupts
vorgesehen ist.
Jain. Ich habe auch schon Software gesehen, die den Interrupt per Software abfragt.
Nur ist das erst 1/4 der Miete. Wenn das selbe SPI auch von anderen
Shields oder der SD-Karte benutzt wird, wird das schnell recht
kompliziert.
Man darf ja nicht nur den einzelnen Byte SPI-Zugriff atomar kapseln,
sondern muß es für das komplette Paket von /CS=0 bis /CS=1 des
jeweiligen Slaves.
Anstatt ewig und drei Tage zu schwadronieren KÖNNTE man ja mal die Software anschauen, oder?
Und wenn man sich das alles anschaut, sieht man, daß dort KEINERLEI Interrupts benutzt werden! Alles läuft über die Standardmethoden der SPI-Klasse. Damit gibt es keine Probleme bei der parallelen Nutzung von Ethernet, SD-Karte und LCD! Schoking!
Peter, du solltest im Bundestag arbeiten, dort suchen sie Leute wie dich, die viel über eingebildete Probleme reden und sich selten mit der Realität beschäftigen.
Ich bin kein Arduino Experte und weiß daher nicht, wo zu jedem Shield die dazu passende Lib steht. Ich weiß nichtmal, ob es zu jedem IC nur eine Shieldvariante gibt oder mehrere.
Peter, du solltest im Bundestag arbeiten, dort suchen sie Leute wie
dich, die viel über eingebildete Probleme reden
Entschuldige bitte, daß ich Probleme so betrachte, wie ich sie lösen würde. Natürlich muß niemand Interrupts benutzen.
Ich benutze sehr gerne Interrupts für Interfaces, dann können die im Hintergrund arbeiten, ohne die Mainloop lange blockieren zu müssen.
Ich benutze sehr gerne Interrupts für Interfaces, dann können die im
Hintergrund arbeiten, ohne die Ich benutze sehr gerne Interrupts für Interfaces, dann können die im Hintergrund arbeiten, ohne die Mainloop lange blockieren zu müssen. zu müssen.
Und was machen die 'im Hintergrund' außer die Mainloop blockieren?
Und was machen die 'im Hintergrund' außer die Mainloop blockieren?
Guter Hinweis, ich meinte natürlich das Gegenteil. Der Interrupt kann Pakete schnellst möglichst absenden, bzw. verliert keine Daten (Überlauf).
Nichts ist unangenehmer, als der Verlust der Synchronisation.
Wenn das Ethernet SPI und Interrupts benutzt, muß man dafür sorgen, daß
dieser Interrupt immer gesperrt ist bei allen anderen Zugriffen auf
das selbe SPI.
Wenn man in Arduino die Interrupts sperrt, laufen diverse Dinge nicht mehr.
Naja, wenn man bedenkt das die Arduino Plattform genau dafür gedacht
war, einen einfachen Einstieg in das Thema
Mikrocontroller/Programmierung zu ermöglichen...
.. ist die Umgebung trotzdem an elektrotechnische Grundlagen gebunden.
Peter, du solltest im Bundestag arbeiten, dort suchen sie Leute wie
dich, die viel über eingebildete Probleme reden und sich selten mit der
Realität beschäftigen.
Dann unterlasse doch einfach Deine klugen 'Ratschläge'.
Tut mir leid, ich wußte nicht, daß Libs unter Arduino als von Gott gegeben und unantastbar zu gelten haben. Ich habe jedenfalls keine Angst, Interrupts zu benutzen.
Ich bin kein Arduino Experte und weiß daher nicht, wo zu jedem Shield
die dazu passende Lib steht. Ich weiß nichtmal, ob es zu jedem IC nur
eine Shieldvariante gibt oder mehrere.
Hmmm...
Etwas nicht zu wissen, ist nicht schlimm.
Übrigens:
Das könntest du ändern.