Beliebt bei jung und alt sind schwimmende Reset-Leitungen (die durch den Programmierstecker hingegen definierte Zustände bekommen)
Hast du diesen Pin mit Pull-up versehen ?
Moin zusammen,
ich arbeite gerade an einer Schaltung mit einem Atmega88 die einen Stromsensor mit 1khZ ausliest (interruptgetriggert) und danach in der Mainschleife bei vorliegen eines neuen Wertes das Maximum der letzten 25ms ermittelt um eine Abweichung zu erkennen. Wenn die Abweichung über oder unter dem Schwellwert liegt, wird eine LED als Ausgabe 500ms lang geschaltet.
Mein Problem: Ich programmiere die Schaltung mit einem AVR ISP MKII und es läuft perfekt. Schalte ich einen ausreichend großen Verbraucher an oder aus, erkennt er eine Abweichung und schaltet.
Nun ziehe ich das Programmierkabel ab (MOSI, MISO, SCK, RESET sind exklusiv fürs Programmieren, keine andere Beschaltung) und stecke die Schaltung, die über einen eigenen Trafo versorgt wird, kurz aus und dann wieder in die Steckdose ein. Nun zeigt sich folgendes:
Egal ob ein Verbraucher angeschlossen ist oder nicht, und egal wie groß der Schwellwert ist (2 ADC Stufen, 12 oder 120 ADC Stufen...), es wird permanent die Triggerbedingung ausgelöst und die LED blinkt die ganze Zeit (kaum aus, gehts wieder los).
Kann der Programmieradapter da irgendwas im Code verpfuschen oder sich anders auswirken? Stecke ich danach den Programmieradapter wieder an, bleibt der Fehler bis zum nächsten Programmieren. Daher führe ich es auf einen Softwarefehler zurück der damit in Verbindung steht
Beliebt bei jung und alt sind schwimmende Reset-Leitungen (die durch den Programmierstecker hingegen definierte Zustände bekommen)
Hast du diesen Pin mit Pull-up versehen ?
mfg robert
Wer glaubt zu wissen, muß wissen, er glaubt.
Das war auch meine erste Vermutung. Der Resetpin hat einen 15kOhm Pullup. Ich könnte versuchen ihn nochmal auf 10k zu reduzieren. Was ich jedoch getestet habe: Die Resetroutine schaltet eine LED an und geht vor der Hauptschleife noch 0,5s in eine Warteroutine. Die Hauptschleife schaltet die LED ab. Ich könnte jedoch nur einmal nach dem Einschalten diese LED leuchten sehen, nichtmehr während des Programmablaufs. Brownout Reset ist auch deaktiviert.
Du sagst oben, dass das Programm weiterspinnt, auch wenn du den Stecker wieder ansteckst ? Erst wenn du neu programmierst, is wieder alles ok ?
strange.
An sich kann der Code nur verändert werden, wenn der µC irgendwie in den Programmiermodus kommt. schwer vorstellbar. aber wenn, ist alles drin.
Ich würde, wenn geht,
1) µC mal tauschen
2) bei offline-betrieb ALLE programmier-stecker Pins (ausser Reset natürlich) mal auf GND legen.
Wenn du absteckst, ist dann auch gleichzeitig eine andere Stromversorgung da ? Dass die vielleicht flattert ?
mfg robert
Wer glaubt zu wissen, muß wissen, er glaubt.
Genau, das Fehlverhalten tritt nach jedem einschalten aus, ausser wenn der Controller frisch geflasht wurde und der Reset kommt, während er noch am Programmer hängt.
Der Programmer selber liefert keine Betriebsspannung, er prüft nur ob sie vorhanden ist. Die Platine hat einen 1W Trafo (6V AC) + Gleichrichter+ 1000µF Elko+ 5V Spannungsregler LP2950 CT5 (Lowdrop).
Ich werd gleich mal mein Oszi auspacken und mir die Versorgungsleitung ansehen.
µC tauschen ist leider keine Option, da TQFP Gehäuse und kein Ersatz parat.
Die low Dorp Spannungsregler sind empfindlich auf die Kapazität am Ausgang. Wenn da nicht genug dran hängt kann er schwingen. Es könnte sein, dass die kapazität auf dem Programmer gebraucht wird, damit der Regler stabil arbeitet. Der LP2950 braucht nach Datenbaltt mindestens 1 µF, als low ESR Kondensator, oder ggf. einen Kombination aus Elko und 100 nF Keramik dicht am Regler.
Wenn man sicher sein will, das bei den ISP Pins nichts passiert, sollte man bei denen im Programm die Pullups aktivieren, dann zappelt da nichts. Schon um keinen extra Stromverbrauch durch undefinierte PEgel zu bekommen ist das sinnvoll.
Eine andere Möglchkeit ist, dass über den Programmer eine Verbindung zur Erde hergestellt wird, und so weniger 50 Hz Störungen eingefangen werden.
So, ich habe gerade mal mit meinem Oszi gemessen:
hinterm Gleichrichter kommt noch leichter Ripple bei ca 8V raus. Hinterm Spannungsregler kommen wunderbar glatte 5V raus. Auch die Analogspannung für den ADC, die ich als Referenz nutze ist stabil und schwingt oder rippelt für mich nicht erkennbar.
Eingebaut ist ein Pullup Widerstand von 15kOhm, gemessen hab ich 10,6kOhm. Wohl durch ne Parallelschaltung intern im Controller.
Wenn ich meinen Analogeingang messe, den ich sample, dann kommt auch bei einem abgeschalteten Gerät (500W dimmbarer Deckenfluter) ein schwacher, verformter Sinus durch, sobald ich anmache, ist ne klare Sinusform mit Phasenanschnitt erkennbar, also alles so, wie es sollte.
Achja und vor und hinter dem LP2950 CT5 sitz ein 100nF Kerko, dahinter noch ein 4,7uF Tantal
Ich habe noch etwas getestet: Ich habe den Programmierstecker mit einem Widerstand gebrückt, um einen Reset auszulösen. Wieder das gleiche Spiel, es klappt solange, auch nach Resets, bis ich den Netzstecker ziehe und wieder einschalte. Ich habe extra eine 500ms Warteroutine eingefügt, noch bevor IRGENDWAS anderes passiert. Der PowerUp Timer steht auf maximaler Einschwingzeit. Kann es an was anderem als nem unsauberen Ansteigen der Spannung liegen? Sodass er nicht richtig in den Reset kommt?
Ah falsch. Auch das klappt nicht. Wenn er im falschen zustand ist, nach nem einschalten und ich dann einen manuellen Reset mache (Widerstand und überbrücken), steht die Versorgungsspannung immernoch sauber, aber er bootet wieder in den "falschen Zustand"... wie kann das denn bitte sein?!
Wo ist der Unterschied zwischen dem Zustand nach dem Programmieren und einem Reset, und dem Zustand nach dem Neustart über einen PowerUp?
Daran muss irgendwo ein Softwarezustand sein, der einen unabhängigen Dauererkennungszustander erzeugt, den ich auch nichtmehr weg bekomme
Fortschritt!
Ich habe den Code durchgesehen und ALLE Variablen von Hand initialisiert. Es gab ein Array von Integerwerten, in dem ich die letzten 100 Messwerte speicher. Ich habe dieses nun mit dem Wert für "kein Gerät an" vorinitialisiert. Zuvor wurde das Array nicht explizit initialisiert.
Ich versteh nicht woher das Problem kommt. Spätestens nach 100 Perioden, dh 1sek müsste das Array mit den neuen Werten angefüllt worden sein und die Erkennung richtig weiterlaufen.
Lesezeichen