Hallo Zusammen,
ich habe eine kleine Schaltung mit einem AT Tiny 13 gebaut, die LEDs
steuert. Dummerweise startet das Programm nicht jedes mal wenn die
Schaltung mit Spannung versorgt wird. Manchmal muss ich die
Versorgungsspannung 1 - 20 Mal an und abklemmen bis das Programm dann
endlich losläuft. Meine Vermutung geht in Richtung Reset-Pin, bin mir
aber nicht sicher.
Da das Problem ja eventuell auch mit der Spannungsversorgung zusammen
hängen könnte.... hier mal der Aufbau:
Der Atmel wird mit einem 7805 Festspannungsregler versorgt. Geglättet
mit einem 100µF Elko + 100nF KerKo. Der Reset Pin wird zusätzlich zu dem
internen Pull-Up mit einem 4,7K Widerstand auf Vcc gezogen plus einem
100nF KerKo gegen GND. Der Rest der Schaltung läuft nicht über den 7805.
Das Starten des Programmes läuft manchmal beim ersten Mal, manchmal aber
auch erst nach vielen Versuchen. Geschrieben ist das Programm in
Assembler.
Theoretisch könnte ja auch das Programm fehlerhaft sein, aber warum
läuft es dann überhaupt an?
Bei offenem Reset-Pin sieht das ganze nicht anders aus.
Gibt es andere Beschaltungsvarianten für den Rest-Pin, die vielleicht
besser funktionieren?
Besten Dank im Voraus, Björn
Ob es der Reset ist, kannst du testen.
Wenn der Tiny wieder mal nicht anläuft, dann leg den Reset-Pin mit einem
Stückchen Draht auf Masse (kurz antippen genügt). Ist der Pin dann
wieder frei und läuft der Tiny los, dann musst du an deiner
Reset-Beschaltung arbeiten. Wenn nicht, dann würde ich auch das Programm
ins Auge fassen.
> Der Atmel wird mit einem 7805 Festspannungsregler versorgt.> Geglättet mit einem 100µF Elko + 100nF KerKo.
Auf welcher Seite vom 7805 sind die Kondis?
Du hast dem 7805 jeweils 100nF von Eingang bzw. Ausgang nach Masse
spendiert?
Lässt du den Programmer jedes mal stecken? Könnte ein Problem sein.
Hängt dein Programm ziemlich direkt nach dem Start von extern
eingelesenen Werten ab? Dann auch mal dort einen Fehler suchen.
Schon mal mit einem Oszi die Betriebsspannung, die du dem Tiny
anbietest, angesehen? Zuviel "Schmutz" und/oder Spannnungseinbrüche =>
Läuft nicht oder undefiniert.
Stell mal die Fuses auf irgendwas mit "slowly rising power", heißt in
den Prog-Tools meist "irgendwas + 64ms". Vielleicht steigt die Spannung
zu langsam beim Start, sodass ein bisschen Warten vor Beginn des
Proramms gar nicht so verkehrt sein dürfte. Vorsicht: Nicht einen
externen Takt auswählen, sonst brauchst du irgendwoher eben einen
externen Takt um den Tiny wieder zu ent-ver-fusen(was für ein Wort!).
mfg mf
Björn schrieb:> Theoretisch könnte ja auch das Programm fehlerhaft sein, aber warum> läuft es dann überhaupt an?
Ist zu 99% ein SW-Fehler.
Dein Programm liest Pins ein, die nicht den erwarteten Zustand haben
(z.B. floaten).
Dein Programm benutzt SRAM/Register, die nicht den erwarteten Zusand
haben.
Irgendwann haben sie doch zufällig den erwarteten Zustand und dann
läufts.
Abhilfe:
- SRAM/Register immer definiert vorladen
- nichtbenutzte Pins bei Abfragen maskieren
Peter
die 100µF sind hoffentlich am EINGANG des 7805 angeschlossen, denn bei
Kapazitäten größer 10µF am Ausgang neigen diese Festspannungsregler zum
schwingen!
Vergrößere den Widerstand zwischen Plus und Resetpin auf 100K und achte
auf eine möglichst nahe Platzierung der 10µF und 100nF am Controller.
Es schadet auch nicht, hier Schaltplan und/oder Code zu posten.
Stefan K.
Hi,
vielen Dank schon mal für die vielen Antworten in so kurzer Zeit.
Auf die Idee, dass es am Code liegen könnte bin ich noch nicht gekommen
weil es ja manchmal funktioniert. Da ich programmiertechnisch eher noch
ein Anfänger bin könnte das durchaus sein.
Den Code habe ich gerade nicht zur Hand... der ist auf einem anderen
Rechner zu Hause...
Ich werde die angesprochenen Punkte zum Code aber zu Hause mal checken.
Was die Fuses betrifft hab ich zur Zeit noch wenig einfluss drauf. Ich
hab das Programm mit einem Franzis Entwicklungskit
(http://www.conrad.de/ce/de/product/904157/LERNPAKET-MIKROCONTROLLER/0418046&ref=list)
auf den Atmel überspielt und da werden die Fuses und der Bootloader
vordefiniert aufgespielt.
Wenn ich das manuell selber machem möchte muss ich schnell viel mehr
Zeit mit dem Programmieren verbringen, mein STK500 zum Laufen bringen
und dann über den programmieren. Ich war schon froh, dass das Programm
überhaut so einigermaßen macht was es soll. ;-)) Dann würde ich aber
auch gleich versuchen in C zu programmieren und dann hab ich noch mehr
Baustellen offen.
Zur Hardware nochmal: Der 100µF Elko ist auf der Ausgangsseite
angebracht. Am Eingang hab ich 220µF verbaut. Zur Stabilisierung hab ich
ja noch 2x 100nF KerKos dicht am Festspannungsregler (Ein- und Ausgang).
Das mach ich schon seid vielen Jahren so und hab noch nie ein Schwingen
beobachtet. Der 7805 wird aus einem stabilisierten Netzteil versorgt.
Das mit dem "zu langsamen Steigen der Spannung beim Einschalten könnte
eventuell auch sein. Ist ja mit 100µF ne ordentliche Kapazität verbaut.
Muss ich mal checken wenn ich heut Abend basteln kann.
Und das mit den Registern kann ich leider auch erst dann checken. Wüsste
allerdings nicht worauf ich da genau achten muss. Es werden nur Register
von ??? R14 bis R29 verwendet und angäblich kann bis R31 für Variablen
verwendet werden.
Nochmals Danke für die Anregungen und ich werde heut Abend mal die Ideen
überprüfen.
Björn
Björn schrieb:> ja noch 2x 100nF KerKos dicht am Festspannungsregler (Ein- und Ausgang).> Das mach ich schon seid vielen Jahren so und hab noch nie ein Schwingen> beobachtet.
Ist auch meine Erfahrung. Abblockkondensatoren können nie zu groß sein.
Im LM7805 Datenblatt steht auch keine obere Grenze.
Spannungsregler sind auch keine HF-Schaltungen, wenn ein Transient
reinkommt, kann der schnell mal auf den Ausgang durchschlagen. Und wenn
dann dort kein dicker Pufferelko ihn abfängt, dann ist der MC hin.
Peter
Was ist denn nun, wenn Du den Reset-Eingang manuell bedienst? Startet
der Controller dann richtig?
Eventueller Schaltungsfehler: Liegt an irgendeinem Eingang Spannung an,
BEVOR die 5V Versorgung anliegt? Berücksichtige, dass die 5V Versorgung
verzögert ansteigt, wegen des 100µF Kondensators am Ausgang des
Spannungsreglers.
Je nach Netzteil könnte es auch sein, dass die Versorgungsspannung
langsamer ansteigt, als die Länge ds Reset-Impulses. Eventuell hilft ein
größerer Reset Kondensator, oder eben der bereits empfohlene manuelle
Reset.
Es wurde auch bereits nach dem Brown-Out Detektor gefragt. Nutzt Du ihn,
und wenn nicht, warum nicht?
@ Stefan:
ich gehe davon aus dass Du mich gefragt hast und nicht den
ursprünglichen Verfasser des ersten Beitrages (Björn).
Schaltung: Versorgung 12 V Netzteil, stabilisiert. Es wird herunter
geregelt auf 5V mit 78L05. Mit oder ohne Kondensatoren am Eingang und
Ausgang , (0.1µ + 100µ) -> keine Änderung.
Einstellungen für µC: oscillator intern 9.6MHz, am Anfang DIV 8 Flag
aktiviert was ich später im Code nach Initialisierung ändere. Mit oder
ohne DIV 8: kein Unterschied. Start up Time delay auf 14CK + 64ms
eingestellt. Brown out detektor ist deaktiviert, Watchdog auch nicht
verwendet.
Habe auch folgendes versucht: Spannung anlegen, Reset dabei manuel auf
LOW halten, danach losgelassen -> keine Änderung. Der Reset Pin
funktioniert nur wenn der µC einmal startet, dann lässt sich immer
wieder resetten, sonst nicht. Wenn das Programm einmal gestartet, läuft
ohne Unterbrechung die ganze Nacht lang.
Habe auch mit 4,8MHz versucht, keine Änderung.
Es ist aber interessant wie die Schaltung startet: ich muss über
Versorgung Störungen hineinbringen, d.h. die Plus Leitung mehrmals
hinter einander kurzfristig unterbrechen, dann startet irgendwann.
Es ist völlig normal, daß ein Controller, der mit einem Bootloader
bestückt ist, nicht sofort sein Anwendungsprogramm startet. Zuerst wird
gecheckt, ob über die serielle Schnittstelle ein neues
Anwendungsprogramm geladen werden soll. Erst wenn das nicht der Fall
ist, wird das bereits geladene Programm ausgeführt. Das heißt aber, das
eine gewisse Zeit gewartet wird. Wenn ein Reset ausgeführt, während der
Controller noch wartet, wird der Bootloader nicht durchlaufen und das
Anwenderprogramm startet sofort.
Das ist in der hoffentlich ausführlichen Dokumentation von Franzis bzw.
Conrad sicher auch so beschrieben.
...es ist auch im PDF Dokument beschrieben, herunter geladen von Atmel
Webseite. Der Bootloader ist aber defaultmäßig abgeschaltet (SELFPRGEN
Fuse) und blieb auch abgeschaltet. Aber über wie viel Zeit sprechen wir
beim Warten von Bootloader?
Da es nicht hilft, den Reset Pin während des Starts zuerst auf Low zu
halten und dann loszulassen, schätze ich, dass Du einen Fehler im
Programm hast.
Ich würde das Programm durch einen simplen LED Blinker austauschen.
Tritt der Fehler dann immer noch auf, ist es ein Schaltungsfehler.
Warscheinlich wird der LED Blinker funktionieren.
FYI:
es war tatsächlich ein Fehler im Programm. Habe einen Register nicht
initialisiert. Jetzt funktioniert die Schaltung wie ich es mir
vorgestellt habe :-)