Hallo,
ich bitte um Nachsicht falls das Thema hier schon erörtert wurde. Über
die Suche habe ich vor meiner Registrierung schon einiges gefunden - das
Entscheidende war offenbar nicht dabei.
Mein Problem:
Mein ATmega644 resettet beim Power-on zweimal, d.h. einmal korrekt wie
ich es erwarten würde und einmal zusätzlich (und unerwünscht) nach ca.
einer halben Sekunde. Das sieht man im u.a. Programm am Binken der LED,
ich habe es aber auch mit dem Scope nachvollzogen: der RESET-Pin geht
definitiv auf LOW.
Der RESET-Pin ist mit 10K Pullup gegen VCC geschaltet. Die
Versorgungsspannung ist stabil, ein BrownOut-Reset dürfte damit
ausschalten.
Einzige "Besonderheit" meiner Hardware ist, dass ich den Wegfall der
Versorgungsspannung frühzeitig erkennen will. Dazu sind AIN0/1 mit
entsprechenden Spannungsabgriffen verdrahtet (einer direkt von +12V
(natürlich auf 5V begrenzt), der andere mit Vcc der Schaltung (5V
gepuffert). Die Erkennung auf Power-Down funktioniert übrigens
einwandfrei - nur beim Hochlaufen habe ich eben ein Problem.
Zum Programm:
Ich habe den Code mal soweit runtergestrippt dass man sich hoffentlich
nicht mehr in Nebensächsichkeiten verläuft:
1 | // ******************************
|
2 | void wdtOff(void) __attribute__ ((naked)) \
|
3 | __attribute__ ((section (".init1")));
|
4 |
|
5 | void wdtOff(void)
|
6 | {
|
7 | MCUSR &= ~(1<<WDRF);
|
8 | wdt_disable();
|
9 | }
|
10 |
|
11 |
|
12 | int main(void)
|
13 | {
|
14 | // theApp.Run();
|
15 |
|
16 | SET_OUTPUT(LED1); // green
|
17 | SET(LED1);
|
18 | while (1)
|
19 | ;
|
20 |
|
21 | return 0;
|
22 | }
|
23 | // ******************************
|
Erläuterungen:
Die Macros SET_OUTPUT und SET setzen die Portrichtung bzw. das Portbit
und steuern auf meinem Board damit ein LED an.
Das Ausschalten des WatchDogTimers beim Start habe ich hier über die
Suche gefunden - das hat aber keine Veränderung gebracht.
Fuses (0xFD, 0x99, 0x77):
BODLEVEL: ist bei mir auf 2.7V eingeschaltet, aber auch bei 1.8V bzw.
4.3V tritt das Problem unverändert auf.
WDTON ist nicht gesetzt (ich will ja keinen WatchDog)
SUT_CKSEL ist auf "FullSwingOsc., 16K CK + 65ms; CrystalOsc., slowly
rising" gesetzt.
Ich hoffe, dass ich alle relevanten Infos abgeliefert habe. Falls nicht
wäre ich für eine kurze Nachfrage dankbar. Dies ist mein erstes
ATmega-Projekt...
Gruß,
Jens