Hallo,
nachdem ich schon 2 Tage mit diesem Problem kämpfe, wollte ich fragen ob
mir hier jemand helfen kann.
Ich habe einen ATMEGA1280 und programmiere in in C mit dem AVR Studio
und GCC.
Mein Problem: Nach einem Reset springt der MC an irgendeine Stelle und
tut nichts, anstatt an den Programmanfang zu springen. Ich verwende
keinen Bootloader.
Wie müssen hier die Fuse Bits richtig gesetzt werden? Boot vector, Boot
flash section??
Wie bringe ich dem MC bei dass er nach dem Reset das Programm frisch
startet?
mfg
Stefan
Stefan,
benutzt du avrstudio um die fuses zu setzen ?
ist immer gut, du gibst deine verwendete toolchain mit an...
Wenn alle fuses richtig gesetzt sind, könnte auch ein "unsauberes" power
on der versorgungsspannung dafür sorgen das der ProgramCounter irgendwo
steht.
Ergo, einen spannungsmonitor verwenden (z.B. etwas wie ZSM560, oder
maxim, oder TI, oder von Atmel...), der die *Reset leitung erst
freigibt, wenn Vcc sicher in einem vernünftigen Bereich steht.
Ist generell bei jedem uC-Design zu empfehlen.
Gruss, tom.
Naja, bei halbwegs vernünftigem Anstieg der Betriebsspannung
funktioniert der Power-On-Reset eines AVR absolut brauchbar.
Außer der Toolchain wäre der Hardwareaufbau noch interessant.
,,Vergessene'' Stützkondensatoren können seltensame Effekte
hervor rufen.
Ja ich verwende das AVR Studio zusammen mit dem JTAGICE mkII um die FUSE
Bits zu setzen.
Die Reset Leitung hängt an einem externen Watchdog(MAX708), der VCC
überwacht.
mfg
Stefan
Einen Sprung auf einen nicht initialisierten Bootloader würde man
im praktischen Leben gar nicht bemerken. Die CPU kann nämlich gar
nicht einfach ,,nichts tun'', sondern sie wird sofort beginnen, den
Flash zu lesen und die entsprechenden Befehle abzuarbeiten. Die
0xFFFF des nicht initialisierten ROMs wirken dabei wie NOPs, sodass
der PC nach kurzer Zeit bei 0 angekommen sein wird und ganz normal
mit der Abarbeitung des Programms beginnt.
@Andreas: Um ehrlich zu sein keine Ahnung, ich vermute die FUSE Bits
sind nicht richtig gesetzt, habe BOOTSZ=00 (default), wenn ich den Boot
Reset Vector an oder ausschalte bewirkt es keine Änderung.
Muss ich im C ähnlich wie in Assembler einen Jump nach dem Rest an den
Anfang des Programmcodes setzten?
Tut mir leid bin noch ziemlicher MC Neuling
Reset wird über einen Taster ausgelöst, der am WD angeschlossen ist,
beobachtet man die Spannung der Reset Leitung funktioniert das auch
korrekt, geht auf GND und dann wieder stabil auf 3,3V.
Kann mir jemand kurz die korrekte Einstellung der Fuse Bits erläutern,
die nötig sind, damit der MC normalerweise nach dem Reset ins Programm
einsteigt?
Vielen Dank
Stefan wrote:
> Kann mir jemand kurz die korrekte Einstellung der Fuse Bits erläutern,> die nötig sind, damit der MC normalerweise nach dem Reset ins Programm> einsteigt?
Jede beliebige, sofern sie in der Lage ist, dass der Controller auch
taktet.
Was soll der Sinn eines Resets sein, wenn danach nicht das Programm
abgearbeitet wird?
Du musst den Fehler schon woanders suchen, sehr wahrscheinlich in
deiner Hardware. Du lässt dir aber jedes Stückchen an Information
über deine Umgebung aus der Nase ziehen, so wird das nichst, so kann
dir keiner helfen.
Stefan wrote:
> Bei normalem Start (dh VCC an/aus) schalte ich 2 LEDs an, nach einem> Reset gehen diese nicht an...
Hängt dieses Anschalten von irgendwelchen Bedingungen ab?
Nicht initialisierte Variablen wären dann eine Möglichkeit.
So, habe jetzt meine komplette externe Beschaltung des Reset Pins
entfernt und den Reset Pin mit 10k an VCC gezogen, auch so funktioniert
der Reset nicht.
Hi Stefan,
testest du den Reset mit angeschlossenem ISP oder JTAG Programmer?
Versuch doch mal dein Programm zu flashen, den Programmer trennen und
dann den Reset. Nur so ne Idee...
Gruss Nico