Hallo,
Ich habe eine Schaltung für einen RFID Transponder, aufdem ein ATMega48
verbaut ist. Eigentlich macht die Schaltung+Software dass was sie soll,
nur beim letzten Batteriewechsel ist mir aufgefallen dass sich der
Controller beim Einlegen der Batterie aufgehängt bzw. die Ports am
Controller für einen kurzen Moment undefiniert waren. Das ganze kann ich
reproduzieren, indem ich die Batterie ganz langsam einlege.
Zuerst habe ich an ein prellen gedacht. Aber auch ein
dazwischengeschalteter, weitgehend prellfreier Taster behebt das Problem
nicht sondert verbessert es nur ein wenig. Kondensatorprobleme an der
Eingangsspannung kann ich auch so gut wie ausschließen.
Was für ein Problem kann das noch sein?
Steven schrieb:> die Ports am> Controller für einen kurzen Moment undefiniert waren.
Die Ports gehen beim (Poweron-)Reset in tristate, das ist so und kann
man nicht ändern.
Wenn Dich das stört, dann mußt Du durch externe Pullups/-downs den
gewünschten Pegel erzwingen.
Der Grund ist, daß der MC-Hersteller ja nicht wissen kann, welche Pins
bei Dir Ausgang sein sollen.
Und daher ist per default erstmal alles Eingang, damit nichts
kaputtgeht.
Peter
Danke für die schnellen Antworten!
> BOD aktiviert?
Hatte ich ich vermutet und ausgeschaltet, hilft leider nicht
> Die Ports gehen beim (Poweron-)Reset in tristate, das ist so und kann> man nicht ändern.
Ok, verstehe. Den störenbden PORT noch mal Extern zu beschalten ist kein
Problem. Aber Aufhängern dürfte der Controller sich doch aber eigentlich
nicht, oder?
Steven schrieb:> Aber Aufhängern dürfte der Controller sich doch aber eigentlich> nicht, oder?
Mit BOD nicht.
Ist daher zu 99% ein SW-Fehler.
Z.B. gerne gemacht wird falsche Reihenfolge beim SPI-Init (/SS Pin zu
spät als Ausgang).
Peter
Steven schrieb:> Aber Aufhängern dürfte der Controller sich doch aber eigentlich> nicht, oder?
Was meinst Du mit "Aufhängen"? Oben schreibst Du, dass
> die Ports am> Controller für einen kurzen Moment undefiniert waren
Daraus schloss ich, dass es nur um die paar µs vom Anlegen der Spannung
bis zur Port-Initialisierung durch Dein Programm ging - wie ist das
jetzt zu verstehen?
Steven schrieb:> Danke für die schnellen Antworten!>>> BOD aktiviert?>> Hatte ich ich vermutet und ausgeschaltet, hilft leider nicht
Sollte es nicht eher aktiviert sein, um undefiniertes Verhalten zu
vermeiden? ;)
> Ist daher zu 99% ein SW-Fehler.> Z.B. gerne gemacht wird falsche Reihenfolge beim SPI-Init (/SS Pin zu> spät als Ausgang).
Da suche ich gerade. Der SPI ist es nicht. Was gibt es noch für typische
Fehler? Wie gehe ich am besten vor?
Wenn ich das Programm über den Debugger starte. Funktioniert es immer.
Ohne Debugger tritt es auf, aber ich kann nicht sehen wo es hängt?
So,
ich hab zum testen nun mal folgenden Code verwendet:
1
#include<avr/io.h>
2
3
main()
4
{
5
6
PORTD=0x00;
7
DDRD=0x03;
8
9
PORTD|=(1<<PD0);
10
PORTD|=(1<<PD1);
11
12
13
while(1)
14
{
15
;
16
}
17
}
Wenn ich die Batterie nun ganz langsam einlege, hängt sich der
Controller auf, d.h. PD0 und PD1 haben keinerzeit einen High Pegel,
obwohl die Versorgungsspannung am Controller anliegt.
Martin Wende schrieb:> BOD wieder aktiv?> Takt fuses auf slow rising power eingestellt?
BOD ist wieder aktiv und wenn du mit Takt fuses das Power On Reset mit
65ms meinst, das auch.
Ansonsten überlege ich gerade ob die LED's auf dem Board nicht zu viel
Strom ziehen??? Könnte das so einen Fehler verursachen?
Steven schrieb:> Wenn ich die Batterie nun ganz langsam einlege
Vielleicht bin ich auf dem Holzweg. Aber 'langsam' einlegen bedeutet ja
nicht, dass die Spannung langsam steigt. Die Spannung ist entweder da
oder sie ist nicht da. Mit der Einlegegeschwindigkeit hat das aber
nichts zu tun. In dem Moment, in dem der Kontakt hergestellt ist, ist
die Spannung da und Strom fliesst. Das ganze wird nur dadurch verzögert,
dass da immer irgendwelche Kapazitäten sind, die sich erst mal aufladen
müssen.
Was aber sein kann:
Da elektrische Kontakte nicht 100% plan, eben und poliert sind,
präsentiert sich dein langsames einlegen für die Schaltung so:
Spannung da
Spannung weg
Spannung da
Spannung weg
da
weg
daaaaaaaaaa
und dementsprechend lädt sich dann auch zb dein Siebkondensator, so
einer vorhanden ist, langsamer auf und verzögert den Spannungsanstieg.
D.h. die Themenkreise sind
* Brown Out Fuse, bzw. ab welcher Spannungslage darf der µC anfangen
mit arbeiten
* was in eine ähnlich Kerbe schlägt
wie ist die Verzögerung beim Neustart durch die Fuses eingestellt
* was macht der Resetpin
Im Grunde sind alles nur Variationen desselben Gedankens: Den µC solange
sicher im Reset zu halten, bis die Spannung soweit gestiegen ist, dass
eine sichere Funktion gewährleistet ist.
Karl Heinz Buchegger schrieb:> D.h. die Themenkreise sind> * Brown Out Fuse, bzw. ab welcher Spannungslage darf der µC anfangen> mit arbeiten> * was in eine ähnlich Kerbe schlägt> wie ist die Verzögerung beim Neustart durch die Fuses eingestellt> * was macht der Resetpin
Genau die Punkte scheinen aber in Ordnung zu sein.
Was mich gerade noch stutzig macht ist dass der Programmer/Debugger sich
manchmal auch aufzuhängen scheint, bzw. das Programm nicht von Beginn an
startet sondern von irgendwo mittendrin anfängt zu laufen. Aber wie kann
das passieren?
Hannes Lux schrieb:> Langsam kommt der Verdacht auf, dass es an fehlenden> Abblock-Kondensatoren liegen könnte...
Abblockkondensatoren sind eigentlich vorhanden. Wie groß sollten den
"Rippel" auf der Versorgungsspannung maximal sein? Oder denkst du an
andere Verbraucher auf dem Board. Eigentlich ist da nur noch der RFID
Chip....