Forum: Mikrocontroller und Digitale Elektronik Fehlersuche: Anlaufprobleme auf Board mit ATMega328p / W5500 / PoE


von Matthias G. (matthias_g96)


Angehängte Dateien:

Lesenswert?

Hallo miteinander.
Ich habe mir eine Schaltung gebastelt, die einen ATMega328p mit einem 
W5500 und PoE-fähigkeit auf einer Platine vereint.
PoE wird hier über einen TPS2376 realisiert, und die ~55V des PoE 
schicke ich zuerst durch ein LM2596HVS-Modul (der einfachkeithalber ein 
fertiges Modul zum Auflöten gewählt, da ich mir noch nicht ganz zutraue, 
Schaltregler selbst zu designen - vielleicht in der nächsten Iteration, 
um die Linearregler abzulösen) um handliche 12V zu bekommen (die brauche 
ich für weitergehende Funktionen), danach jeweils durch 
AMS1117-Linearregler für 3,3V und 5V.
Der ATMega läuft mit 16MHz (im Schaltplan irrtümlich 8 angegeben), und 
besitzt einen NE555 als Watchdog, der den RESET nach GND zieht, wenn 
nicht regelmäßig ein HIGH von Pin 12 des ATMega kommt.
Zusätzlich lässt das testprogramm auf dem Mega die LED an Pin 13 alle 2 
Sekunden für 100ms blinken.

Das ganze ist auf einer handlichen, 4-lagigen Platine aufgebaut, beim 
layout habe ich mir, so gut es mir mit meinem aktuellen Kenntnisstand 
möglich ist, an "good-practice" gehalten.
Beim Schaltplan habe ich diverse Referenzschaltpläne aus den 
datenblättern zur rate gezogen, und auch, besonders was den TPS2376 
betrifft, andere Schaltungen aus dem Internet...

Die Schaltung funktioniert soweit hervorragend; auch PoE funktioniert 
und die Verbindung mit meinem LAN läuft, ABER:
Wenn ich sie erstmalig einstecke, booten scheinbar ATMega und W5500 
nicht richtig. Beim W5500 blinkt die Duplex-LED (Speed leuchtet), und es 
kommt keine funktionierende Verbindung zustande.
Beim ATMega blinkt die LED an Pin 13 im Sekundentakt, was mit dem Code 
im Flash ja gar nichts zu tun hat. Interessanterweise wird trotzdem der 
NE555 getriggert.
Wenn ich dann aber einmalig einen RESET auslöse, funktioniert alles wie 
es soll.

Der PG-Pin des TPS2376 soll eigentlich den EN-Pin des LM2596HVS füttern 
(dafür müsste wohl noch ein Inverter dazwischen, da der PG lt. 
Datenblatt auf RTN gezogen wird, und der PG einen HIGH-Pegel braucht), 
aber der PG-output blinkt nur komisch, deswegen hab ich den EN erstmal 
stur auf POE+ gehängt.

Ich hab den Schaltplan als PDF angehängt, vielleicht kann jemand mit dem 
Fehlerbild etwas anfangen, oder sieht direkt einen Fehler.
Ich bin dankbar für jeden Lösungsansatz! :)

von Peter D. (peda)


Lesenswert?

Matthias G. schrieb:
> und
> besitzt einen NE555 als Watchdog, der den RESET nach GND zieht, wenn
> nicht regelmäßig ein HIGH von Pin 12 des ATMega kommt.

Nö.
Sobald PB0 auf Ausgang low gesetzt wird, bleibt der 555 auf High und 
somit Reset auch.
Der 555 ist als Watchdog denkbar ungeeignet, da er keine 
Flankentriggerung besitzt, wie ein richtiger Monoflop (4538, 74HC123).
Der 555 ist nur ein RS-FF mit 2 Komparatoren davor.

Was stört Dich an dem internen Watchdog des AVR?
Den kann man sogar per Fusebit als nicht abschaltbar setzen.

von Steve van de Grens (roehrmond)


Lesenswert?

Probiere mal, den Brown-Out Detektor (in den Fuses) zu aktivieren.

Ich hatte mal eine Schaltung, die ebenfalls nicht zuverlässig startete, 
weil das Netzteil zu langsam hoch fährt. Mit dem Brown-Out Detektor 
konnte ich das Problem umgehen.

von Wastl (hartundweichware)


Lesenswert?

Matthias G. schrieb:
> Ich bin dankbar für jeden Lösungsansatz!

Dinge die mir in deinem Schaltplan negativ aufstossen:

U5 und U7 haben an ihrem Eingang keine Abblock-Kondensatoren.
Das kann je nach Topologie (Aufbau) problematisch sein. Die
Spannungsregler brauchen auch am Eingang einen Kondensator
damit sie sauber arbeiten. Nur wenn U4 sehr nahe an U5 und
U7 platziert sind könnte man evtl. darauf verzichten.

U7 muss 9 V verbraten. Da der W5500 sehr viel Strom braucht
wird das für den U7 "ungemütlich". Auch der U5 muss jede
Menge Spannung sinnlos verbraten. Sinnvoller wäre einen
Schaltregler von 12V auf 5V zu verwenden und daraus die
3.3V daraus zu erzeugen. Ich vermute die AMS1117 werden gut
warm ....

Deine Abblock-Kondensatoren sind im Block angeordnet, damit
lässt sich nicht beurteilen ob diese auf der Platine an den
jeweiligen Pins angeordnet sind oder nicht. Der Mega328
braucht mindestens drei davon an seinen Pins!

von Wastl (hartundweichware)


Lesenswert?

Wastl schrieb:
> Ich vermute die AMS1117 werden gut warm ....

Ob die Regler auch vernünftig funktionieren (Regelschwingung
oder sehr schlechte Regelung) lässt sich aus der Entfernung
naturgemäss nicht beurteilen. Eine statische Spannungsmessung
dürfte jedenfalls zu wenig Aussagekraft haben.

von Matthias G. (matthias_g96)


Angehängte Dateien:

Lesenswert?

Peter D. schrieb:
> Nö.
> Sobald PB0 auf Ausgang low gesetzt wird, bleibt der 555 auf High und
> somit Reset auch.
> Der 555 ist als Watchdog denkbar ungeeignet, da er keine
> Flankentriggerung besitzt, wie ein richtiger Monoflop (4538, 74HC123).
> Der 555 ist nur ein RS-FF mit 2 Komparatoren davor.
>
> Was stört Dich an dem internen Watchdog des AVR?
> Den kann man sogar per Fusebit als nicht abschaltbar setzen.

Das hatte ich falsch angegeben. ich ziehe den Pin für das Signal 
natürlich auf GND, und den rest der Zeit schalte ich den Pin hochohmig.
Das system funktioniert bei mehreren Projekten einwandfrei, teilweise 
schon jahrelang.
Allerdings geht es darum nicht ;)

@Steve van de Grens:
Tatsächlich hatte ich mir über Fuses nicht großartig den Kopf zerbrochen 
;) Ich mache es mir einfach und programmiere das Ding über die 
Arduino-IDE (schande auf mein Haupt) und nehme die so, wie sie der 
Arduino-Bootloader (den ich dann wieder überschreibe) mitbringt...
Aber ich werde jetzt mal sehen wie ich die Fusebits ordentlich gesetzt 
bekomme...

@Wastl:
Danke für die ausführlichen Hinweise!
Ich habe mir mal den Spaß gemacht, und mein billig-oszi an die 
5V-Spannung zu hängen, sofern man bei dem Ding von Oszi sprechen kann, 
aber es hat mir schön öfter gute Dienste geleistet. Das Ergebnis hänge 
ich mal an.
Die Spannung steigt innerhalb 40ms auf 5V an und sieht da auch recht 
stabil aus, die Schwankungen dürften irgendwo bei wenigen mV liegen.
Im Datenblatt des AMS1117 steht:
"The circuit design used in the AMS1117 series requires the use of
an output capacitor as part of the device frequency compensation.
The addition of 22µF solid tantalum on the output will ensure
stability for all operating conditions."
Auch im Referenzschaltbild steht ist kein Kondensator am Eingang 
eingezeichnet.
Und ja, U4, U5 und U7 liegen praktisch direkt in einer Reihe auf der 
Platine.

Ansonsten bin ich 100% bei dir was die Regler angeht, das werde ich bei 
der nächsten Iteration auch definitiv so berücksichtigen - aber an 
Schaltreglerdesigns hatte ich mich einfach noch nicht ran getraut, und 
wollte meine Platine auch nicht mit lauter fertigen Modulen pflastern ;)
Allerdings sind die Regler mit den Werten innerhalb der Specs, sollten 
also bzgl Last keine Probleme machen. Sie werden angenehm handwarm ^^

Die Abblockkondensatoren habe ich im Layout so dicht wie nur irgendwie 
möglich an die Versorgungspins gesetzt, so wie es sich gehört.
Dass der ATMega mindestens 3 braucht war mir nicht bewusst... Ich hatte 
das glaub ich einfach aus einem Arduino-Schaltplan übernommen.
Ich werde einfach mal ein oder zwei mit dranlöten, und sehen was 
passiert.
Macht es sinn, ein Bild vom Layout oder der Platine zu posten?

von Matthias G. (matthias_g96)


Lesenswert?

Wastl schrieb:
> Der Mega328
> braucht mindestens drei davon an seinen Pins!

Hab nun 4 dran. Leider keine Veränderung im Verhalten...

von Steve van de Grens (roehrmond)


Lesenswert?

Matthias G. schrieb:
> IMG_20240108_150644731.jpg

Die Anstiegszeit sieht gut aus, daran wird es nicht liegen.

von Matthias G. (matthias_g96)


Lesenswert?

Steve van de Grens schrieb:
> Die Anstiegszeit sieht gut aus, daran wird es nicht liegen.


Denke ich eben auch.

Habe jetzt mit den Fuses rumgespielt.
Habe CKSEL3 eingeschaltet (waren alle aus)
EESAVE hab ich auch eingeschaltet (weil es immer nervt, wenn beim 
flashen der eeprom gelöscht wird)
und BOD habe ich auf 4,5v gestellt (war auf 2,7v).
Fuses sind jetzt dementsprechend 0xF7, 0xD2 und 0xF9.
Leider keinerlei Verhaltensänderung.

Ich werd mich jetzt mal informieren, wie der interne watchdog 
funktioniert, vielleicht kann ich den bei einem fehlstart erstmal 
auslösen lassen, obwohl das ja eigentlich nur ein workaround ist...

von Achim H. (pluto25)


Lesenswert?

Sicher das der W5500 schon wach ist wenn er sein Init bekommt? Nicht das 
der nur die Hälfe verstanden hat und der Avr auf eine Antwort wartet die 
nie kommt. Da war was mit 300ms?

von Steve van de Grens (roehrmond)


Lesenswert?

Matthias G. schrieb:
> Ich werd mich jetzt mal informieren, wie der interne watchdog
> funktioniert,

Stelle vorher sicher, dass der neue Bootloader (der mit 115200 Baud) 
installiert ist. Wenn der Watchdog erst mal aktiviert ist, versagt 
danach der alte Bootloader.

von Matthias G. (matthias_g96)


Lesenswert?

Steve van de Grens schrieb:
> Stelle vorher sicher, dass der neue Bootloader (der mit 115200 Baud)
> installiert ist. Wenn der Watchdog erst mal aktiviert ist, versagt
> danach der alte Bootloader.

Wie würde sich das auswirken?
Ich meine ja eh, dass ich den Arduino-Bootloader überschreibe, wenn ich 
per ISP flashe.
Was mich noch etwas irritiert ist, dass in den Fuses auch ein 
Reset-Vector und Boot-Size angegeben wird, das übersteigt mein 
Vedrständnis aktuell noch etwas ;)

Allerdings nutzt mir der interne Watchdog hier sowieso nichts. Ich habe 
inzwischen ein bisschen damit herumgespielt, aber der resettet leider 
nur den ATMega selbst, die externe RESET-Leitung bleibt davon 
unbeeindruckt, so dass der W5500, der ja von der selben Leitung 
zurückgesetzt wird, fröhlich weiterspinnt. Mein NE555-Watchdog dagegen 
macht einen Systemweiten Reset :)

Achim H. schrieb:
> Sicher das der W5500 schon wach ist wenn er sein Init bekommt? Nicht das
> der nur die Hälfe verstanden hat und der Avr auf eine Antwort wartet die
> nie kommt. Da war was mit 300ms?

Das ist eine interessante These. Allerdings wüsste ich nicht warum der 
AVR warten sollte. Ich habe auch schon testweise delays von 1000ms an 
verschiedenen Stellen eingebaut, ohne Erfolg.

Um einen Konflikt im SPI-Interface werde ich die Tage mal die Schaltung 
testen, wenn ich den den AVR-Teil weglasse und nur den W5500 verbaue. 
Und evtl. umgekehrt. Mal sehen was dann passiert!

von Achim H. (pluto25)


Lesenswert?

Matthias G. schrieb:
> Allerdings wüsste ich nicht warum der AVR warten sollte.
Ich auch nicht.
Im Datenblatt steht was von 10µs/1ms aber
dennoch reagierte er falsch wenn da keine 500ms (300ms ertestet, 800ms 
von anderer Seite empfohlen) zwischen seinem Reset und dem ersten 
Ansprechen waren.
Das Spi lief mit "gemütlichen" 2Mhz. (nichts anderes getestet)

Matthias G. schrieb:
> Wie würde sich das auswirken?
> Ich meine ja eh, dass ich den Arduino-Bootloader überschreibe, wenn ich
> per ISP flashe.
> Was mich noch etwas irritiert ist, dass in den Fuses auch ein
> Reset-Vector und Boot-Size angegeben wird, das übersteigt mein
> Vedrständnis aktuell noch etwas ;)

Der Watchdog würde den Bootloader unterbrechen da der kein 
WDR(Watchdogreset) enthält.
Ist es per ISP möglich nicht den ganzen Flash zu löschen? Quasi nur 
Blockweise wie der Bootloader das macht?
Er springt dann zu dem Reset Vector findet dort nur FF. Dann arbeitet er 
die solange (ohne Wirkung) ab bis er bei Adresse 0 ankommt wo der Code 
beginnt.
Das kann dann Probleme machen wenn der Code so lang wird das da keine FF 
mehr stehen ;-)

: Bearbeitet durch User
von Steve van de Grens (roehrmond)


Lesenswert?

Matthias G. schrieb:
> Ich meine ja eh, dass ich den Arduino-Bootloader überschreibe, wenn ich
> per ISP flashe.

Ja

> Was mich noch etwas irritiert ist, dass in den Fuses auch ein
> Reset-Vector und Boot-Size angegeben wird, das übersteigt mein
> Vedrständnis aktuell noch etwas ;)

Damit reservierst du einen Bereich am Ende des Flash für den Bootloader. 
Nach einem Reset beginnt der Programmzähler dann nicht an Adresse 
0x0000, sondern dort wo der Bootloader steht.

: Bearbeitet durch User
von Peter D. (peda)


Lesenswert?

Matthias G. schrieb:
> Wenn ich sie erstmalig einstecke, booten scheinbar ATMega und W5500
> nicht richtig.

Man kann doch einfach die Statusregister des W5500 abfragen, wo es 
klemmt.
Man kann auf jeden Fall dem W5500 einen Resetbefehl (Bit RST im Mode 
Register) schicken.
Daß es nach dem Einstecken des Ethernetkabel elend lange dauern kann, 
bis er am Host angemeldet wurde, ist doch normal.

von Peter D. (peda)


Lesenswert?

Matthias G. schrieb:
> Wenn ich sie erstmalig einstecke, booten scheinbar ATMega und W5500
> nicht richtig.

Dann mußt Du eben debuggen. Planlos rumprobieren hilft da nicht weiter.
In den Debugmodus zu kommen, ist beim ATMega328p allerdings etwas tricky 
(DebugWIRE).
Ich würde daher einen kleinen Monitor einbauen, der über die UART 
Register oder RAM auslesen kann. Dann kann man sich den Zustand 
anschauen, ohne daß der MC stehen bleibt, d.h. er kann nebenbei immer 
noch die W5500 Interrupts behandeln.
Dein 555 Watchdog läßt sich ja ganz einfach über Low-Pegel totlegen, ist 
also ein ziemlich müder Watchdog.

von Matthias G. (matthias_g96)


Lesenswert?

Peter D. schrieb:
> Dann mußt Du eben debuggen. Planlos rumprobieren hilft da nicht weiter.
> In den Debugmodus zu kommen, ist beim ATMega328p allerdings etwas tricky
> (DebugWIRE).
> Ich würde daher einen kleinen Monitor einbauen, der über die UART
> Register oder RAM auslesen kann. Dann kann man sich den Zustand
> anschauen, ohne daß der MC stehen bleibt, d.h. er kann nebenbei immer
> noch die W5500 Interrupts behandeln.
> Dein 555 Watchdog läßt sich ja ganz einfach über Low-Pegel totlegen, ist
> also ein ziemlich müder Watchdog.

Naja, DebugWire klingt toll, aber die benötigte Hardware dafür würde 
momentan mein Budget sprengen ;)

Allerdings habe ich jetzt trotzdem Fortschritte gemacht:
Der LM2596HVS Schaltregler scheint die Schwierigkeiten zu verursachen.
Ich habe probeweise, um die PoE-Sache ausschließen zu können, den Regler 
von der PoE-Spannung getrennt und dafür sauber geregelte 23V (mehr hatte 
das kleine Netzteil, das ich gerade zur hand hatte, nicht zu bieten) 
eingespeist, und hatte das gleiche Fehlerbild.
Darauf habe ich den LM2596 komplett ausgelötet und dafür einfach 12V 
eingespeist und siehe da, die ganze Sache läuft wunderbar.

Das ist natürlich nicht im Sinne des Erfinders, und jetzt sollte ich 
eine Möglichkeit finden, entweder die Spannung des Schaltreglers zu 
filtern, oder einen Ersatz dafür zu finden, der mit den 50V klar 
kommt...

Genau aus dem Grund habe ich auf einen gekauften Schaltregler 
zurückgegriffen, anstatt selbst einen zu designen. Das ärgert mich jetzt 
doppelt 😥



Edit: ich muss mich korrigieren. Bei dem fraglichen Schaltregler handelt 
es sich NICHT um einen LM2596HVS, den hatte ich wohl nur als Platzhalter 
im Schaltplan angegeben - den Footprint des tatsächlichen Reglers hatte 
ich selbst gezeichnet.
Beim tatsächlichen Regler handelt es sich um eine "V100 EY9" von ali, 
die Bezeichnung auf dem verbauten IC ist abgefräst...
Ich werde mal testweise einen "echten" LM2596HVS auflöten und schauen 
was passiert. Der ist zwar nur mit 50V angegeben, und mein PoE liegt 
knapp drüber, aber wird schon halten ;)
Ich werde weiter berichten...

: Bearbeitet durch User
Beitrag #7590343 wurde vom Autor gelöscht.
von Tim S. (Firma: tsx89) (freak_ts) Benutzerseite


Lesenswert?

> Der ist zwar nur mit 50V angegeben, und mein PoE liegt
> knapp drüber, aber wird schon halten ;)

Wenn der Schaltregler wegen der Überspannung irgendwie hängen bleibt und 
dabei "einfach Durchschaltet", hast du Vin = Vout, und grillst neben dem 
Schaltregler auch alles weitere dahinter...

: Bearbeitet durch User
von Matthias G. (matthias_g96)


Lesenswert?

Tim S. schrieb:
> Wenn der Schaltregler wegen der Überspannung irgendwie hängen bleibt und
> dabei "einfach Durchschaltet", hast du Vin = Vout, und grillst neben dem
> Schaltregler auch alles weitere dahinter...

Das wäre fatal...
Aber ich hab beim rumprobieren das Problem gefunden, es liegt nicht an 
der Stromversorgung!
Schuld ist der 1m-Widerstand am Qarz vom W5500. Den hatte ich im 
ursprünglichen Platinenlayout nicht drin und hatte ihn nachgerüstet, 
weil ich dachte der muss da hin. Ich hab mehrere Testmodule am laufen, 
und mich gewundert, warum ich bei einem den Fehler nicht mehr 
reproduzieren konnte... Bei dem hatte ich den Widerstand vergessen.
Hab ihn dann bei zwei anderen Boards entfernt und ZACK, beide laufen auf 
Anhieb wie vorgesehen!
Es kann so einfach sein, damit wäre das dann wohl gelöst.

Bleibt mir nur noch, etwas an der Linearreglersituation zu ändern, der 
3,3V regler wird halt schon ordentlich warm. Und wenn ich dessen eingang 
an den ausgang vom 5v regler hänge, wird halt der dafür heiß.
Vielleicht bastle ich noch einen kleinen schaltregler dazwischen, mal 
sehen 😉

von Peter S. (cbscpe)


Lesenswert?

Nimm doch einen MPM3610 statt den Linearregler.

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.