Forum: Mikrocontroller und Digitale Elektronik ATSAME54 bleibt in der startup_same54.c hängen


von Manuel K. (Gast)


Angehängte Dateien:

Lesenswert?

Hallo zusammen,

ich habe Probleme bei der Programmierung eines ATSAME54N20A. Der 
Controller bleibt bereits vor der eigentlichen main-Funktion im 
reset_handler() hängen und springt dann in den dummy_handler. Die 
Funktionen sind in der startup_same54.c hinterlegt, die von Atmel Studio 
automatisch bei einem neuen Projekt hinterlegt sind.

Da ich neu in der Programmierung eines SAM-Controllers bin, habe ich 
erstmal versucht nur eine LED zum Leuchten zu bringen. Dies hat auch 
beim ersten Mal funktioniert. Danach wollte ich das Programm erweitern, 
und bei der Ausführung des neuen Programm funktionierte nichts mehr. 
Also habe ich alles wieder auf das letzte Programm zurückgesetzt, aber 
die LED leuchtete auch nicht mehr. Selbst ein leeres Projekt ohne 
eigenen Code läuft nicht fehlerfrei durch.

Beim Debugging ist mir dann aufgefallen, dass der Controller bereits in 
der von Atmel vorgegebenen Datei “startup_same54.c“ stehen bleibt, und 
zwar im reset_handler() bei Initialize the relocate segment (in der 
Zeile „*pDest++ = *pSrc++“). Von dort aus springt der Controller immer 
in den dummy_handler() in einer Endlos-Schleife und erreicht niemals die 
main-Funktion.
1
void Reset_Handler(void)
2
{
3
        uint32_t *pSrc, *pDest;
4
5
        /* Initialize the relocate segment */
6
        pSrc = &_etext;
7
        pDest = &_srelocate;
8
9
        if (pSrc != pDest) {
10
                for (; pDest < &_erelocate;) {
11
                        *pDest++ = *pSrc++;
12
                }
13
        }

Die Analyse der Register zeigt mir, dass ein Hard Fault vorliegt, und 
zwar  genauer UNDEFINSTR = 1. Allerdings hilft mir das recht wenig 
weiter, weil das in der Startup liegt und ich daran nichts geändert 
habe.
Ich habe schon neue Projekte aufgesetzt, den Mikrocontroller ersetzt, 
verschiedene PCs ausprobiert und das halbe Internet durchforstet. Auch 
den Support von Atmel bzw. Microchip habe ich kontaktiert, allerdings 
haben die noch keine Lösung für mich.

Das einzige, was ich im Internet zu dem Thema gefunden habe, ist unter 
anderem dieser Artikel: 
https://www.avrfreaks.net/forum/code-stuck-resethandler-after-atmel-studio-upgrade-701417
Allerdings geht es in den Artikeln immer um einen ATSAME7x. Die dort 
vorgeschlagenen Lösungen funktionieren bei meinem Controller nicht. Die 
Veränderung in der Startup beschreibt Register, die bei einem ATSAME5x 
nicht existieren. Und zudem steht dort, dass dieser Fehler in der 
aktuellen Version von Atmel Studio (7.0.1931) bereits behoben sei.

Ich verwende ein selbst gestaltetes Board, deswegen würde ich an sich 
auch Hardware-Fehler in betracht ziehen. Allerdings hat die LED ja bei 
beiden Mikrocontrollern am Anfang und sogar noch einmal zwischenzeitig 
geleuchtet.


Hat jemand eine Idee was ich noch machen kann?

von Niklas G. (erlkoenig) Benutzerseite


Lesenswert?

Zeig doch mal den disassemblisierten Code des Reset_Handler. Steppe mal 
jede Instruktion einzeln durch, merke dir bei welcher der Fehler 
auftritt, und starte von vorne bis die Ausführung direkt vor dieser 
Instruktion steht; mache einen Screenshot mit aktuellen 
Register-Inhalten (R0-R15, CPSR) und zeige diesen.
Muss vielleicht der SRAM irgendwie explizit eingeschaltet werden, bevor 
mit "*pDest++ = ..." darauf geschrieben wird? Bei manchen Controllern 
ist das nötig.

von Manuel K. (manuel_k448)


Angehängte Dateien:

Lesenswert?

Danke für die schnelle Antwort. Allerdings bin ich jetzt noch mehr 
verwirrt.
Habe das mal genauso gemacht, bin die Instruktionen einzeln 
durchgegangen, Screenshot von der letzten Instruktion bevor es in den 
dummy_handler ging hab ich angehängt.
Allerdings war es dieses mal an einer anderen Stelle als oben im ersten 
Post angegeben !?
Und noch verrückter: das erste mal danach ist er wieder an der besagten 
Stelle abgestürzt, und danach das mal geht er plötzlich wieder ganz 
normal in die main rein ?!?

von Niklas G. (erlkoenig) Benutzerseite


Lesenswert?

Hmm, dann ist das keins der üblichen Software-Probleme.
Funktioniert das Programm wenn du ohne Debugger, ganz normal ausführst? 
Wie sieht es mit anderen Debuggern, z.B. J-Link aus? Funktioniert es auf 
einem Eval-Board? In dem verlinkten Thread wird ja erwähnt, dass der RAM 
konfiguriert werden muss. Schlag doch mal nach, ob das bei deinem 
Prozessor auch nötig ist.
Was passiert wenn du den Reset_Handler in Assembler mit einer 
Dummy-Schleife umsetzt:
1
.thumb
2
.type Reset_Handler, %function
3
Reset_Handler:
4
  nop
5
  b Reset_Handler
Der tut dann natürlich gar nichts, aber stürzt es auch ab?

von Manuel K. (manuel_k448)


Lesenswert?

Danke für die Vorschläge.
Beim ersten Mal ohne Debugger hat das Programm funktioniert (was ich 
auch schon mehrmals ausprobiert habe und regelmäßig nicht klappte). Beim 
zweiten Mal bricht Atmel Studio ab mit der Fehlermeldung "Error: Timed 
out waiting for the chip erase to complete"

Eval-Board sowie anderen Debugger als den Atmel-ICE habe ich leider 
nicht hier.

Habe jetzt eine Antwort von Microchip Support erhalten. Diese fragen 
aber nur ob ich einen Interrupt freigegeben habe und vergessen habe 
diesen zu implementieren. Imemrhin haben sie mir auch direkt ein 
Beispiel-Programm mitgeliefert, allerdings tritt auch bei diesem ein 
ähnliches Verhalten auf wie vorher. Manchmal läuft es durch, und 
manchmal geht es genauso in den dummy_handler.

Ich versuche mal an einen anderen Programmer zu kommen und überprüfe in 
der Zeit noch einmal meinen Hardware-Aufbau.

von Niklas G. (erlkoenig) Benutzerseite


Lesenswert?

Manuel K. schrieb:
> Beim
> zweiten Mal bricht Atmel Studio ab mit der Fehlermeldung "Error: Timed
> out waiting for the chip erase to complete"

Dann stimmt da hardwareseitig etwas nicht.

Manuel K. schrieb:
> Habe jetzt eine Antwort von Microchip Support erhalten. Diese fragen
> aber nur ob ich einen Interrupt freigegeben habe und vergessen habe
> diesen zu implementieren.

Könnte sein, wenn nicht UNDEFINEDINSTR gesetzt wäre. Im IPSR kannst du 
nachsehen welcher Interrupt tatsächlich ausgelöst wurde; ich vermute mal 
dass alle nicht-implementierten Interrupts einfach Dummy_Handler 
aufrufen (wie weak-Attribut im ISR-Vektor eingetragen).

Manuel K. schrieb:
> Ich versuche mal an einen anderen Programmer zu kommen und überprüfe in
> der Zeit noch einmal meinen Hardware-Aufbau.

Ja, mach das mal. Achte auch mal auf Stützkondensatoren und 
Spannungseinbrüche (Oszilloskop). Wenn man nicht so viel Erfahrung mit 
einem Controller hat sollte man vielleicht nicht direkt mit einem 
eigenen PCB anfangen :-)

Mit dem Microchip Support hab ich aber leider auch keine guten 
Erfahrungen gemacht. Kaufen ist erlaubt, aber wehe es soll auch 
funktionieren :-)

von Rudolph (Gast)


Lesenswert?

Ein anderer Debugger wird nicht viel nützen, weil der gar nicht 
unterstützt wird, zumindest kein J-Link.
Aber ein SAME54-Xplained könnte helfen.

Hast Du den Test mit der LED mal frisch als Projekt aufgesetzt?

Und das AS7 Studio für den E54 ist auf dem neuesten Stand?
Die Dinger sind ja noch ganz frisch.

von Manuel K. (manuel_k448)


Lesenswert?

@Niklas G.
mit den Interrupts vermutest du richtig, wird pauschal der dummy_handler 
aufgerufen, hat deswegen auch am Anfang gedauert zu finden wo das 
ungefähr herkommt.
Eigenes PCB war leider mehr oder weniger Pflicht. Schreibe gerade meine 
Bachelorarbeit Elektrotechnik, und ohne das eigene Design wäre das zu 
sehr Informatik und zu wenig E-Technik gewesen :/
Beim Design habe ich mich eigentlich an die Angaben im Datenblatt und 
zusätzlich an der Dokumentation zum Eval-Board gehalten. Hat wohl nicht 
gereicht :D

@Rudolph
Ok dann kann ich mir den anderen Debugger auf jeden Fall sparen.
Das Projekt mit den LEDs funktioniert manchmal, und dann auch wieder 
nicht. Egal ob im existieren Projekt oder als ganz neues Projekt.
AS7 ist die aktuellste Version. Erst gestern Abend noch auf einen 
anderen PC frisch installiert und auch dort probiert, produziert 
dieselben Fehler.
Aber vielleicht hätte ich mir wirklich einen älteren Controller 
aussuchen sollen, zu dem es schon mehr im Internet zu finden gibt... :D

von Niklas G. (erlkoenig) Benutzerseite


Lesenswert?

Rudolph schrieb:
> Ein anderer Debugger wird nicht viel nützen, weil der gar nicht
> unterstützt wird, zumindest kein J-Link.

Also laut Segger schon:
https://www.segger.com/downloads/supported-devices.php
https://www.segger.com/products/debug-probes/j-link/technology/ides/atmel-studio/

Manuel K. schrieb:
> Eigenes PCB war leider mehr oder weniger Pflicht.
Klar, aber dann ist es taktisch klug einen Controller zu nehmen, von dem 
es ein Eval Board gibt, und selbiges parat zu haben :-)

Prüfe auch mal ob das Programm auch wirklich korrekt im Flash ist. 
Starte den Debugger mal so, dass er die .elf Datei des Programms nicht 
kennt; dann muss er den tatsächlichen disassemblisierten Code aus dem 
Flash anzeigen, statt einfach nur die Daten aus der .elf-Datei. Wenn der 
Code aus irgendwelchen Gründen nicht richtig auf dem Controller ist und 
dieser bei der Ausführung im Debugger sich scheinbar völlig falsch 
verhält, kann es eine böse Falle sein wenn der Debugger was anderes 
anzeigt als tatsächlich auf dem Gerät ist...

von Rudolph (Gast)


Lesenswert?

Niklas G. schrieb:
>> Ein anderer Debugger wird nicht viel nützen, weil der gar nicht
>> unterstützt wird, zumindest kein J-Link.
>
> Also laut Segger schon:

Okay, danke für den Hinweis.


Manuel K. schrieb:
> Das Projekt mit den LEDs funktioniert manchmal, und dann auch wieder
> nicht.

Stell doch mal ein komplettes Test-Projekt ein, einfach das /debug 
Verzeichnis löschen und zippen.
So zum LED wackeln.


Was mir gerade noch einfällt ist die Takt-Erzeugung.
Ich habe gerade einen SAMC21 am Wickel und hatte mit dem das Problem, 
dass der CAN nicht wollte.
War nur alles richtig was ich mit dem CAN veranstaltet hatte, aber ich 
habe mich mit der PLL vertan und einen zu hohen Multiplikator 
eingestellt.
Und da ich für CAN und Core 48MHz brauche kommen die aus dem gleich 
GCLK.
Hat etwas gedauert das zu finden, weil ich an der falschen Stelle 
gesucht habe...

Und die Wait-States muss man auch passend einstellen wenn das aus dem 
Flash laufen soll.

>AS7 ist die aktuellste Version.

Nicht AS7, das E54 Pack dazu: http://packs.download.atmel.com/

Die x5x sind doch noch sehr neu, das kann sehr gut sein das da noch dran 
rumgepatcht wird.
Dafür wird dann auch nicht extra ein neues AS7 Release veröffentlicht.
Das Pack für den SAMC21 habe ich zum Beispiel Anfang Oktober 
aktualisiert und AS7.0.1931 ist ja von Juni.

von Manuel K. (manuel_k448)


Angehängte Dateien:

Lesenswert?

Niklas G. schrieb:
> Klar, aber dann ist es taktisch klug einen Controller zu nehmen, von dem
> es ein Eval Board gibt, und selbiges parat zu haben :-)

Aus Fehlern wird man klug. Vielleicht denke ich bei der nächsten 
Bachelorarbeit daran... :D

Niklas G. schrieb:
> Starte den Debugger mal so, dass er die .elf Datei des Programms nicht
> kennt;

Also ich habe aus dem Projektverzeichnis die .elf Datei gelöscht und 
danach das Programm neu debuggt, meintest du das so? Wenn ja, dann ist 
nichts passiert, immer noch Fehler.

Rudolph schrieb:
> Stell doch mal ein komplettes Test-Projekt ein, einfach das /debug
> Verzeichnis löschen und zippen.

Ist passiert. Allerdsings noch eine Stufe einfacher als LED wackeln, da 
geht lediglich eine LED an. Selbst über sowas freue ich mich schon, da 
das nur ab und zu funktioniert :D

Rudolph schrieb:
> Was mir gerade noch einfällt ist die Takt-Erzeugung.

In wieweit brauche ich denn überhaupt schon einen Takt? Mein Ziel ist 
doch erstmal ein nacktes Programm ohne Probleme zum Laufen zu bringen. 
Und für eine simple LED brauche ich doch auch keinen (explizit 
eingestellten) Takt oder nicht? Also das Programm oben läuft ja auch das 
ein oder andere Mal, und dann pllötzlich wieder nicht.

Rudolph schrieb:
> Und die Wait-States muss man auch passend einstellen wenn das aus dem
> Flash laufen soll.

Das sagt mir jetzt ehrlich gesagt gar nichts :/ Da merke ich dann doch 
wie sehr ich ein Anfänger bin :( Aber selbe Frage wie gerade, in wieweit 
benötige ich das schon für meine LED?
Vielleicht bin ich da etwas naiv, aber ich bin davon ausgegangen dass 
ein neu erstelltes Projekt unter Atmel Studio bei einem Atmel Controller 
mit den dazugehörigen Packages an sich lauffähig ist ohne noch weitere 
Einstellungen treffen zu müssen. Also zumindest solange man keinen 
eigenen Code hinzufügt, nur das nackte Programm, auch wenn es dann 
natürlich nichts kann.

Rudolph schrieb:
> Nicht AS7, das E54 Pack dazu

Achso Entschuldigung, da habe ich dich falsch verstanden. Hatte das aber 
schonmal überprüft, jetzt nochmal einmal nachgeschaut, ist definitiv die 
aktuelle Version 1.0.87 wie auf der Microchip Website.

von Adam P. (adamap)


Lesenswert?

Manuel K. schrieb:
> Niklas G. schrieb:
>> Klar, aber dann ist es taktisch klug einen Controller zu nehmen, von dem
>> es ein Eval Board gibt, und selbiges parat zu haben :-)
>
> Aus Fehlern wird man klug. Vielleicht denke ich bei der nächsten
> Bachelorarbeit daran... :D

Aber da gibt es doch ein Board:
https://www.microchip.com/developmenttools/ProductDetails/ATSAME54-XPRO

Könntest du nochmal das mit dem Debuger aus deinem ersten Beitrag 
starten und sagen auf welche Adresse
1
uint32_t *pSrc, *pDest;
zeigen, in dem Moment wo er aussteigt.

Das würde evtl. einer Zugriffsverletzung entsprechen, was dazu jedoch 
nicht passt, ist...der Reset_Handler ist bei den CortexM4 mit FPU so gut 
wie identisch, und du hast ja auch nur lediglich ein leeres Projekt.

Dies würde bedeuten, dass in den linker-Files falsche Werte bzgl. der 
Adressen hinterlegt sind. Daher kommen die "Grenzwerte" und Größen.

Kann mir grad auch nichts zusammendichten, was dieses sporadische 
funktionieren erklären könnte.

Hast du mal versucht ein leeres Prohjekt mit der ASF zu erstellen (Diese 
hat damit gar nix zu tun, aber vllt. ist intern eine falsche Konfig 
hinterlegt, bzgl. der RAM Adressen. Das ist in den Dateien hinterlegt 
dir mit *.ld enden.
Müsste man mal mit dem Datenblatt vergleichen.

: Bearbeitet durch User
von Rudolph (Gast)


Lesenswert?

Ist richtig, das braucht soweit keine Takt-Einstellung.
Der E54 läuft per Default mit 12MHz Core-Clock.

Ich habe jetzt auch nicht damit gerechnet, dass das Projekt so einfach 
ist, das ist ja wirklich nur ein leeres Projekt plus zwei Zeilen Code.

von Adam P. (adamap)


Lesenswert?

Adam P. schrieb:
> vllt. ist intern eine falsche Konfig
> hinterlegt, bzgl. der RAM Adressen. Das ist in den Dateien hinterlegt
> dir mit *.ld enden.
> Müsste man mal mit dem Datenblatt vergleichen.

Also ich hab es dir mal mit dem Datenblatt verglichen,
das stimmt alles soweit...

von Darth Moan (Gast)


Lesenswert?

Moin,

ich kenne die SAMs nicht, aber koennte es vielleicht sein, dass das
Ding einen WDT hat? Der dann irgendwann dazwischen haut?
Es wird ja keine Clock und keine Waitstates eingestellt, soweit ich
das interpretiere. Da dürfte der Core mit angezogener Handbremse durch
die Init-Funktionen gehen, oder?
Ist nur so ein Bauchgefuehl, ich kenne die SAMs nicht.

von Manuel K. (manuel_k448)


Lesenswert?

Adam P. schrieb:
> Aber da gibt es doch ein Board:

Ja ich weiß, aber hab es halt nicht parat. Muss mal schauen und mit 
meiner Firma klären ob ich das auch noch bestellen kann. Ich weiß dann 
aber jetzt für zukünftige Projekte bescheid dass man sich um sowas auch 
schon früher kümmern sollte, die Zeit in der BA Phase ist ja doch 
ziemlich beschränkt.

Adam P. schrieb:
> Hast du mal versucht ein leeres Prohjekt mit der ASF zu erstellen

Hab ich auch schon probiert. Also mit ASF, über Atmel Start, als 
"normales" C/C++ Projekt, als komplett leeres Projekt und Dateien 
händisch hinzufügen... Hat leider alles keinen Unterschied gemacht.

Adam P. schrieb:
> Könntest du nochmal das mit dem Debuger aus deinem ersten Beitrag
> starten und sagen auf welche Adresseuint32_t *pSrc, *pDest;
> zeigen, in dem Moment wo er aussteigt.

Ich muss die Optimierung ausschalten damit ich die Werte überhaupt sehen 
kann. Und dann stehen beide Pointer meist auf den Wert 0x0 (die 
for-Schleife wird einige Male durchlaufen bevor irgendwann der Fehler 
zuschlägt). Beim Starten zeigen beide Pointer als erstes auf 0x20010478. 
Dann wird *pSrc = 0x02DC6C00 und *pDest = 0x0 zugewiesen. Wenn er 
durchläuft zeigt *pSrc wiedr auf 0x20010478 wie beim starten und *pDest 
auf 0x0. Welcher Wert beim Rausschmiss kommt prüfe ich nochmal

Rudolph schrieb:
> Ich habe jetzt auch nicht damit gerechnet, dass das Projekt so einfach
> ist, das ist ja wirklich nur ein leeres Projekt plus zwei Zeilen Code.

Genau das ist das was mich so fertig macht. Wenn ich wenigstens etwas 
Code geschrieben hätte dann könnte ich den Fehler ja irgendwie noch 
begründen, aber so ist es echt einfach nur Verwirrung pur

von Manuel K. (manuel_k448)


Lesenswert?

Darth Moan schrieb:
> koennte es vielleicht sein, dass das
> Ding einen WDT hat

Ja hat er. Hatte aber gedacht dass der nicht ins gewicht fällt bei 
meiner Anwenung wo nichts drin steht. Hab aber auch schon mal probiert 
den über die Fuses zu deaktivieren, hat nichts gebracht.
Bin aber gerne offen an der Stelle noch was zu probieren, weiß nur nicht 
genau wie. In der Main den zu deaktivieren bringt ja nichts wenn das 
Programm nicht bis zur Main läuft, und für mehr reichen meine Kentnisse 
leider nicht.
Aber sollte so ein WDT nicht auch erst anschlagen wenn nach der 
Initialisierung ab dem eigentlichen Programmstart etwas schief läuft?

von Darth Moan (Gast)


Lesenswert?

Moin,

Manuel K. schrieb:
> Aber sollte so ein WDT nicht auch erst anschlagen wenn nach der
> Initialisierung ab dem eigentlichen Programmstart etwas schief läuft?

Das kommt halt drauf an, was der Hersteller da so eingebaut hat.
Ich bin ja kein SAM Kenner, aber folgendes lass sich auf die Schnelle
so:
Configurable Reset Values
After a Power-on Reset, some registers will be loaded with initial 
values from the NVM User Row.
This includes the following bits and bit groups:
•   Enable bit in the Control A register, CTRLA.ENABLE
•   Always-On bit in the Control A register, CTRLA.ALWAYSON
•   Watchdog Timer Windows Mode Enable bit in the Control A register, 
CTRLA.WEN
•   Watchdog Timer Windows Mode Time-Out Period bits in the 
Configuration register,
CONFIG.WINDOW
•   Time-Out Period bits in the Configuration register, CONFIG.PER
•   Early Warning Interrupt Time Offset bits in the Early Warning 
Interrupt Control register,
EWCTRL.EWOFFSET

Ich kenne das halt von anderen Plattformen, dass die nach POR immer
erstmal laufen, bis man sie abschlatet. Aber was da mit den Fuses
gemacht werden kann und was nicht, weiss ich nicht.
Da muesste eher ein SAM Experte was zu sagen.

von Manuel K. (manuel_k448)


Lesenswert?

Darth Moan schrieb:
> Ich kenne das halt von anderen Plattformen, dass die nach POR immer
> erstmal laufen, bis man sie abschlatet. Aber was da mit den Fuses
> gemacht werden kann und was nicht, weiss ich nicht.
> Da muesste eher ein SAM Experte was zu sagen.

Danke erstmal für die Idee, werde mal abwarten ob sich noch jemand dazu 
meldet und dann morgen weiter in der Richtung schauen. Hab jetzt erst 
noch ne Nachtschicht vor mir um zu schauen ob der Hardware-Aufbau soweit 
in Ordnung ist... :D

von S. R. (svenska)


Lesenswert?

Darth Moan schrieb:
> Da muesste eher ein SAM Experte was zu sagen.

Bei einem SAM3X ist das der Fall: Der WDT muss im Startup-Code 
abgeschaltet werden, sonst schießt der den Controller nach ein paar ms 
ab (so schnell ist der Debugger nicht). Zu deinem SAME54 kann ich nichts 
sagen.

: Bearbeitet durch User
von Adam P. (adamap)


Lesenswert?

Grob überflogen würde ich sagen, dass der WDT beim SAME54 erstmal 
deaktiviert ist.

Der würde aber (z.B. beim SAM4E) auch erst aus der main() in der 
board_init() deaktivert werden.

Was du noch in Erfahrungen bringen könntest, da du sagtest 1x 
funktionierts und dann wieder nicht.

Gibt es evtl. diesen Unterschied, wenn du im Debug Mode mit dem Debugger 
drauf bist oder ob du die Firwmare im Release aufspielst?

von Adam P. (adamap)


Lesenswert?

Manuel K. schrieb:
> Dann wird *pSrc = 0x02DC6C00 und *pDest = 0x0 zugewiesen

Irgendwie passt das nicht,
Dein Flash ist definiert als:
1
rom      (rx)  : ORIGIN = 0x00000000, LENGTH = 0x00100000
danach folgt reservierter Bereich bis:
0x03000000

Mit *pSrc = 0x02DC6C00 würde er ja auf Speicher zugreifen, den es nicht 
gibt...

Sollte ich da etwas übersehen, bitte ich um Entschuldigung, auf den 
ersten Blick sieht es jedoch komisch aus.

(Außer du hast dich beim Abschreiben vertan)

von Manuel K. (manuel_k448)


Lesenswert?

Darth Moan schrieb:
> ch kenne das halt von anderen Plattformen, dass die nach POR immer
> erstmal laufen, bis man sie abschlatet. Aber was da mit den Fuses
> gemacht werden kann und was nicht, weiss ich nicht.
> Da muesste eher ein SAM Experte was zu sagen.

Mit den Fuses werde ich mich jetzt sofort weiter auseinander setzen. 
Wenn man diese im Device Programming Menu ausliest stehen der WDT 
standardmäßig auf Enable. Dort deaktivieren und Programmieren scheint 
aber keinen Unterschied zu machen, auch wenn sie nach einem erneuten 
Auslesen jetzt als deaktiviert eingetragen sind. Aber vielleicht muss 
man da auch noch mehr setzen. Melde mich nochmal dazu wenn ich mehr in 
Erfahrung gebracht habe.

Adam P. schrieb:
> Gibt es evtl. diesen Unterschied, wenn du im Debug Mode mit dem Debugger
> drauf bist oder ob du die Firwmare im Release aufspielst?

Auch schon probiert. Funktionierte sogar auf Anhieb beim ersten Mal 
nachdem ich es auf Release umgestellt habe. War aber anscheinend nur 
Glück, danach ging es wieder nicht.

Niklas G. schrieb:
> Achte auch mal auf Stützkondensatoren und
> Spannungseinbrüche (Oszilloskop)

Bin jetzt nochmal das komplette Layout durchgegangen, mir ist nichts 
weiter aufgefallen. Stüzukondensatoren sind auch außreichend vorhanden, 
da hatte auch schon eine zweite Person aus der Firma mit mer Erfahrung 
drauf geachtet.
Lediglich meine Spannungsversorgung für 3.3V liegt nur bei 3.15V, der 
Spannungsregler liefert zu wenig. Diese sind aber recht konstant und 
brechen nicht zusammen, auch nicht beim Programmieren. Laut Datenblatt 
kommt der Chip auch mit Spannungen bis zu 1.7V runter noch klar, sollte 
also eigentlich kein Problem darstellen. Ich schaue trotzdem mal dass 
ich das noch was anderes finde mit den gefordeten 3.3V, kann ja nicht 
schaden.

von Adam P. (adamap)


Lesenswert?

Nochmal zu deinem Wert: 0x02DC6C00

In deiner *.lss Datei ist der Wert in der
void SystemInit(void)
hinterlegt... dort wo du die Clock konfigurierst, aber ich dachte bis 
dahin kommst du erst gar nicht?

Schau mal selbst in der *.lss (im Debug Ordner) Zeile: 208-217

von Manuel K. (manuel_k448)


Angehängte Dateien:

Lesenswert?

Adam P. schrieb:
> Irgendwie passt das nicht,
> Dein Flash ist definiert als:rom      (rx)  : ORIGIN = 0x00000000,
> LENGTH = 0x00100000
> danach folgt reservierter Bereich bis:
> 0x03000000
>
> Mit *pSrc = 0x02DC6C00 würde er ja auf Speicher zugreifen, den es nicht
> gibt...
>
> Sollte ich da etwas übersehen, bitte ich um Entschuldigung, auf den
> ersten Blick sieht es jedoch komisch aus.
>
> (Außer du hast dich beim Abschreiben vertan)

Habs nochmal überprüft, und Scrennshot gemacht. Der steht in dem Moment 
wieder in der for-Schleife und hat *pSrc = 0x02DC6C00. Hab mich also 
nicht verschrieben.

von Adam P. (adamap)


Lesenswert?

AHHHH OK :-)

ergibt Sinn. 0x02DC6C00 = 48.000.000
Da wird deine Konfig übernommen, da pDest auf deine SystemCoreClock 
zeigt, stimmt mit deiner *.map überein.

Aber da bleibt er nicht hängen, oder?

von Adam P. (adamap)


Lesenswert?

Aber das kann nicht das Problem sein, ist bei dir ja wirlich nur ein 
Standard-GCC-Projekt,
da ist ja von dir gar nichts verändert...

Versuch mal das hier:

: Bearbeitet durch User
von Adam P. (adamap)


Angehängte Dateien:

Lesenswert?

Leeres Projekt aus dem neusten Atmel Start.

von Florian H. (florianh80)


Lesenswert?

Hallo,

Ich hatte neulich ein sehr ähnliches Problem beim samd21. Vielleicht ist 
es hier das gleiche Problem... Löschen mal sämtliche breakpoints im avr 
Studio.
Bei mir lief es danach wieder. Und es hängte sich an exakt der selben 
Stelle auf.


Gruß
Flo

von Rudolph (Gast)


Lesenswert?

Das quasi leere Programm muss so funktionieren.

Entweder ist die Hardware defekt, oder das vom AS7 generierte Projekt 
ist fehlerhaft.

Das SystemInit() macht doch erst mal gar nichts weiter als eine Variable 
zu setzen, das hat doch weiter keine Auswirkung und man kann das auch 
löschen.

Und was vor der Main alles passiert ist ja erstmal nichts an dem man 
rumdoktern müssen sollte damit der Controller los läuft, wenn auch nur 
mit 12MHz Core-Takt.
Und auch ohne irgendwas mit den Fuses machen zu müssen.


>Lediglich meine Spannungsversorgung für 3.3V liegt nur bei 3.15V, der
>Spannungsregler liefert zu wenig.

Wenn das kein einstellbarer ist, würde mir das Sorgen machen.
Und wenn das ein einstellbarer ist, würde ich mal den Feedback-Teiler 
überprüfen und nachrechnen.

von Rudolph (Gast)


Lesenswert?

Adam P. schrieb:
> Leeres Projekt aus dem neusten Atmel Start.

Start ist so eine Sache.
Ich habe vor zwei Wochen ein Start-Projekt für den SAMC21 generiert das 
sich bei der Takt-Einstellung aufgehängt hat - ohne vorher einen Fehler 
im Start anzuzeigen.
Nicht, dass man im Start die Takt-Erzeugung überhaupt so konfigurieren 
könnte wie der Controller das unterstützt, zum Beispiel kann man den 
Vor-Teiler der PLL nicht einstellen.

von Adam P. (adamap)


Lesenswert?

Rudolph schrieb:
> Start ist so eine Sache.

Ja ich nutze das selbst gar nicht, mal davon abgesehen, dass es für den 
SAM4E gar keine Start-Projekte gibt.

Aber um sich Ideen zu holen und etwas nachzusehen... Ist bestimmt genau 
so wie mit den ASF Beispielen (bzw. auch dem ASF ansich) aus dem 
Standard-Menü, wenns funktioniert ist ok, wenn nicht, tja...Lesen & 
Suchen.

Mich wundert es nämlich auch, dass dieses leere Projekt bereits im 
Reset_Handler hängen bliebt.

von Manuel K. (manuel_k448)


Angehängte Dateien:

Lesenswert?

Adam P. schrieb:
> Leeres Projekt aus dem neusten Atmel Start.

Das frisst Atmel Studio bei mir gar nicht, haut nur einige Fehler raus, 
siehe Bild.


Florian H. schrieb:
> Ich hatte neulich ein sehr ähnliches Problem beim samd21. Vielleicht ist
> es hier das gleiche Problem... Löschen mal sämtliche breakpoints im avr
> Studio.
> Bei mir lief es danach wieder.

Bei mir leider nicht. Alle Breakpoints gelöscht. Zusätzlich noch Projekt 
und Atmel Studio geschlossen und neu gestartet. Drei mal lief es, dann 
war wieder vorbei.
Ich verstehe vor allem diese Unbeständigkeit nicht. Nach meiner Logik 
müsste es Laufen oder halt nicht, aber das ist sehr merkwürdig.


Rudolph schrieb:
> Und auch ohne irgendwas mit den Fuses machen zu müssen.

Hab ich auch gedacht. Aber ich habe mir das gerade nochmal genauer 
angeschaut und die gesetzten Fuses sind komplett anders als im 
Datenblatt als Default angegeben. Allerdings sind zwei Sachen sehr 
merkwürdig:

1. Beim Auslesen bekomme ich immer ein failed bei den Registern 
SW0_WORD_0 und SWO_WORD_1 sowie bei den TEMP_LOG_WORD-Registern. Die 
TEMP-Register sind mir dabei noch relativ egal, da sie auch im 
Datenblatt nicht weiter spezifiziert sind. Aber die anderen Register 
setzen BIAS Werte für AC und ADC

2. Wenn ich die Fuses auf die Default Werte stellen und anschließend 
Programmieren will, bricht Atmel Studio mit einer Fehlermeldung ab:
"WriteRegister() failed to write at 800080", siehe Bild.

von Adam P. (adamap)


Lesenswert?

Manuel K. schrieb:
> Das frisst Atmel Studio bei mir gar nicht, haut nur einige Fehler raus,
> siehe Bild.

Das ist verständlich, da in deinem oben genannten Projekt die Einträge 
anders heißen, vergleich das mal...dabei habe ich das Projekt extra für 
den
ATSAME54N20A erstellt, warum kennt er das bei dir nicht?

Bei mir läuft die Erstellung ohne Fehler durch...

Da gibt es z.B. den Unterschied:
-> .pfnNMI_Handler = (void*) NMI_Handler   (bei dir im GCC Projekt)
-> .pfnNonMaskableInt_Handler = (void*) NonMaskableInt_Handler

usw.

Irgendwie hört sich das an, als würde da Grundsätzlich etwas falsch 
laufen.

: Bearbeitet durch User
von Manuel K. (manuel_k448)


Lesenswert?

Adam P. schrieb:
> Das ist verständlich, da in deinem oben genannten Projekt die Einträge
> anders heißen, vergleich das mal...dabei habe ich das Projekt extra für
> den
> ATSAME54N20A erstellt, warum kennt er das bei dir nicht?

Hab es angepasst, lässt sich dann auch ohne Probleme erstellen. Beim 
Debuggen ist dann aber genauso Schluss wie vorher.

Hab auch nochmal eine Atmel Start Datei erstellt, da muss ich komischer 
Weise nichts anpassen, hat direkt die Bezeichnungen der Handler drin. 
Läuft aber nach wie vor nicht. Allerdings ist das Programm dieses Mal 
bei der __libc_init_array() hängen geblieben bevor es in den dummy ging.

von Adam P. (adamap)


Lesenswert?

Würde es gerne auch testen, aber so ohne Hardware ist das kaum 
nachvollziehbar, was da passiert :-(

von Manuel K. (manuel_k448)


Lesenswert?

Hab da noch so eine Idee.

Die Fuses sind momentan so eingestellt, dass die Threshold Werte für die 
BOD der 3.3V Versorgungsspannung bei 2.964V - 3.112V liegen. Da meine 
Spannung vom Regler nur bei 3.15V liegen, bin ich ja schon nah an der 
Grenze dazu. Kann es sein, dass ich in dem Bereich mir vielleicht einen 
Fehler reinziehe der zu den ganzen beschriebenen Fehlern führt? Oder 
macht das wegen dem dummy_handler und so überhaupt keinen Sinn?

Als BOD33_Action ist "0x3; BKUP-; The BOD33 puts the device in battery 
backup sleep mode.". Den µC betreibe ich aber in Switching bzw Linear 
Mode.

von Adam P. (adamap)


Lesenswert?

Habt ihr bei euch kein Labortisch-Netzteil. Das wäre am einfachsten,
2 Adern anlöten oder sogar nur verbinden, 3.3V einstellen und 
ausprobieren.

oder kannst du die Fuses für BOD nicht deaktiveren oder auf 1.7V oder 
sowas runterschrauben?


Würde dann aber die andere Spannungsversorgung abziehen und die 3.3V zu 
Testzwecken direkt in die Schaltung einfließen lassen.

So hab ich z.B. auch ein Fehler im Spannungsregler gefunden, vor ihm war 
alles OK und danach mal so mal so, bis er gar nichts mehr geliefert 
hatte.

: Bearbeitet durch User
von Manuel K. (manuel_k448)


Lesenswert?

Adam P. schrieb:
> Habt ihr bei euch kein Labortisch-Netzteil.

Das probiere ich gleich noch aus. War nur erst mit den Fuses 
beschäftigt, ob ich die nicht doch irgendwie noch konfiguriert bekomme. 
Das ging bis jetzt ja auch noch nicht.

von W.S. (Gast)


Lesenswert?

Manuel K. schrieb:
> Rudolph schrieb:
>> Was mir gerade noch einfällt ist die Takt-Erzeugung.
>
> In wieweit brauche ich denn überhaupt schon einen Takt? Mein Ziel ist
> doch erstmal ein nacktes Programm ohne Probleme zum Laufen zu bringen.

Das sollte man sich einrahmen und an die Wand hängen.


Eigentlich wäre es das Allererste, sich einen Startupcode in Assembler 
selbst zu schreiben, wenn derartige Abstürze vorkommen. Dabei lernt man 
zugleich auch etwas über das Pferd, was man zu reiten beabsichtigt.

In einem Assembler-Startup hast du Gewißheit, daß die Vektoren stimmen, 
sofern du selbige erstmal richtig hingeschrieben hast. Bei so einem 
Startup in C bist du drauf angewiesen, daß der Compiler beim Optimieren 
und auflösen der C-Ausdrücke es passend tut und nichts weg-optimiert.

Ansonsten würde ich zu allererst nach den Beschreibungen des 
Startupverhaltens von Folgendem schauen:

- Watchdog. Ich hatte schon µC, wo man den WD als Allererstes 
abschalten mußte, weil per Default nach Reset die Zeit bis zum ersten 
erforderlichen WD-Reset zu kurz war, um überhaupt aus dem Startup 
herauszukommen, da der Controller ja zuerst mit einem recht niedrigen 
internen Takt anlief.

- Cache. Guck nach, ob dein Controller Cache eingebaut hat und wie 
dieser nach Reset konfiguriert ist.

- Brownout-Detektor. Dessen Einstellung ist z.B. bei einigen Chips von 
Nuvoton Angelegenheit eines Konfigurations-Wortes im Flash. Wenn das in 
deinem Falle auch so ähnlich ist und dieses Wort im gewöhnlichen 
Flash-Bereich liegt, dann ist wieder mal ein Stück auf absolute Adresse 
fixierter Assemblercode nötig

- Security-Zeugs. Hier gilt das Gleiche wie für den Brownout. Beliebte 
Sache bei einigen NXP Controllern.

W.S.

von Manuel K. (manuel_k448)


Lesenswert?

Ich hab den Fehler endlich gefunden. Lag doch an der Hardware.

Ich hatte beim Layouten zwei Pins vertauscht. Anstatt VSW über eine 
Induktivität mit VDDCORE zu verbinden, war es an einen andere PIO 
angeschlossen. Und VDDCORE hing in der Luft. Dummer Fehler der viel Zeit 
gekostet hat.


Vielen vielen Dank für die zahlreichen Antworten! Einige Kommentare 
werde ich im weiteren Projektverlauf oder für die nächsten Projekte 
definitiv berücksichtigen. (Ein Eval-Board ist mittlerweile auch 
bestellt :D)

von Adam P. (adamap)


Lesenswert?

Manuel K. schrieb:
> (Ein Eval-Board ist mittlerweile auch
> bestellt :D)

Na damit bekommst in der Zukunft zumindest Gewissheit, dass der Fehler 
evtl. in deiner Hardware liegt :)

Softwarefehler wirken sich dann halt auf beide Boards aus.

Aber man lernt ja zum Glück nie aus ;-)

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.