Forum: Mikrocontroller und Digitale Elektronik SAMD21 "startet" nicht mehr


von Noob A. (strippenzieher)


Lesenswert?

Guten Tag,

ich habe eine über RS485 ansteuerbare LED-Matrix mit dem SAMD21 
aufgebaut.
4 Felder mit RGB-LEDS, jedes Feld kann mit einer von 8 voreingestellten 
Farben individuell angesteuert werden. LEDs sind über PWM angesteuert, 
das alles läuft auf 3,3V
Nun funktioniert das nicht mehr richtig, die LED-Felder sind entweder 
dauerhaft aus oder glimmen mehr oder weniger intensiv in einer Farbe.
Erst dachte ich der µC hat den Geist aufgegeben, aber der lässt sich 
einwandfrei ansprechen, programmieren und debuggen...

Naja, also debuggen nicht unbedingt einwandfrei, das kann ich so nicht 
sagen.
Wenn ich das Programm durchsteppe kommt früher oder später der Punkt wo 
anstatt einen Schritt weiter zu gehen das Programm normal weiterläuft 
und ich erst mit "Break all (Ctrl-F5)" in den Step-Modus komme.
Das passiert beim System-init (ich habe die Atmel-Framework-Libraries 
verwendet), präziser beim clock-init in der Funktion 
switch_peripheral_gclk();

Ausserdem wird der µC merklich warm, mehr als ich für normal halte.

Was kann da passiert sein und wieso hängt der µC in so etwas wie einer 
Endlosschleife?

Was kann ich tun um dem Problem weiter auf die Schliche zu kommen?
Mein Wissen mit µC hält sich in Grenzen, leider...

Grüßle,
Bob

von S. R. (svenska)


Lesenswert?

Mit wieviel Strom treibst du die LEDs, und woher kommt dieser Strom? 
Wenn du da einige zig mA durch den uC fließen lässt, könnte das die hohe 
Temperatur erklären. Oder du hast ihn schon überlastet und jetzt ist er 
(bzw. sind die Pins) ein bisschen kaputt, was die Wärmeentwicklung 
definitiv erklären kann.

von Kaj (Gast)


Lesenswert?

Bob A. schrieb:
> Das passiert beim System-init (ich habe die Atmel-Framework-Libraries
> verwendet), präziser beim clock-init in der Funktion
> switch_peripheral_gclk();
Das ASF hat ein riesen Problem:
Es arbeitet mit Rekursion und es werden Fehlerfälle nicht behandelt. 
Gerade bei den Clocksettings kannst du folgendes Problem bekommen:
Das ASF versucht per Rekursion den Clock zu ermitteln. Wenn die 
Clocksettings ungünstig/falsch gewählt sind, kann es zu einer endlosen 
Rekursion kommen -> Stacküberlauf.
Da könntest du mal mit der Suche anfangen.

von Noob A. (strippenzieher)


Lesenswert?

S. R. schrieb:
> Mit wieviel Strom treibst du die LEDs, und woher kommt dieser Strom?
> Wenn du da einige zig mA durch den uC fließen lässt, könnte das die hohe
> Temperatur erklären. Oder du hast ihn schon überlastet und jetzt ist er
> (bzw. sind die Pins) ein bisschen kaputt, was die Wärmeentwicklung
> definitiv erklären kann.

die LEDs werden über FETs angesteuert, sonst wären die IOs schon längst 
gegrillt :)

von Noob A. (strippenzieher)


Lesenswert?

Kaj schrieb:
> Bob A. schrieb:
>> Das passiert beim System-init (ich habe die Atmel-Framework-Libraries
>> verwendet), präziser beim clock-init in der Funktion
>> switch_peripheral_gclk();
> Das ASF hat ein riesen Problem:
> Es arbeitet mit Rekursion und es werden Fehlerfälle nicht behandelt.
> Gerade bei den Clocksettings kannst du folgendes Problem bekommen:
> Das ASF versucht per Rekursion den Clock zu ermitteln. Wenn die
> Clocksettings ungünstig/falsch gewählt sind, kann es zu einer endlosen
> Rekursion kommen -> Stacküberlauf.
> Da könntest du mal mit der Suche anfangen.

OK, aber wie kann sowas im laufenden Betrieb passieren?
Ich habe 8 solcher Leuchten, und nun fallen die nach und nach aus...
An der Programmierung wurde nix geändert, die ersten Wochen lief alles 
problemlos.
Das ist mir alles etwas schleierhaft.
Ich kram mal in der Bauteilkiste ob ich eine µC zum tauschen finde

von S. R. (svenska)


Lesenswert?

Bob A. schrieb:
> die LEDs werden über FETs angesteuert

Und du bist dir sicher, dass du die I/Os trotzdem nicht, also auch nicht 
"ein bisschen" überlastest? Langsam sterbende Bauteile können nämlich 
auch durch beschleunigte Alterung entstehen.

Bist du dir sicher, dass deine LEDs noch fehlerfrei sind? Nicht, dass 
der Fehler ursprünglich von dort kam und der sterbende Controller nur 
ein Folgefehler ist.

Bob A. schrieb:
> Ich kram mal in der Bauteilkiste ob ich eine µC zum tauschen finde

Wenn du den Fehler nicht gefunden hast und einfach den Controller 
tauchst, stehen die Chancen gut, dass der gleiche Fehler mit der Zeit 
wieder auftritt.

Gibt es irgendwas interessantes zur Umgebung zu sagen?
Feuchtigkeit, hohe Temperaturen, etc.?

Im Augenblick ist es jedenfalls nur ein Ratespiel.

von Kai P. (n_2)


Lesenswert?

Hi Bob,

Wie ist der Optimierungslevel des Compilers eingestellt ? Debuggen 
klappt nur sinnvoll ohne Optimierung: -O0
Wenn Dein Code dann zu groß ist, hast Du Pech und musst den Fehler 
anders finden oder eine größere Ausbaustufe des uC nehmen.
Mit Optimierung gibt es immer komisches verhalten.

Hast Du and den Clocks geschraubt und hast mehr als 24MHz ? Im 
Datenblatt gibt es eine Tabelle 36-39, welche Wait States Du bei 
bestimmten Spannungen / Frequenzen einstellen musst. Beliebter Fehler. 
Und der bleibt häufig genau in der Routine hängen.

Ich teile im Übrigen die Auffassung von Kaj nicht, weil ich "riesen 
Problem, Rekursion, Fehlerfälle nicht behandelt" pauschal auf das ASF 
bezogen verstehe...es mag genau hier an der Stelle ein Problem sein, 
aber außer das ASF etwas...sagen wir "aufgeblasen" ist, seh ich keine 
Probleme, gerade bezüglich Fehlerfälle...man muss sich natürlich die 
Mühe machen, alle Rückgabeparameter zu verifizieren und nicht blind 
annehmen, "dieser API Call kann eh nicht schief gehen, pfeifen wir auf 
den Return Wert..."

Wenn Du einen alten funktionierenden Code hast und der auf einmal nicht 
mehr funktioniert, nur weil Du eine Zeile hinzugefügt hast oder gelöscht 
hast -> Stack oder Pointer.

Bitte ALLE Warnungen korrigieren, meist liegt der Compiler mit seinen 
Warnungen richtig.

Das scheint aber nach Deiner Beschreibung nicht Dein Problem zu sein. 
Das Ding hat ja mal funktioniert.

PS: Die IOs sind gegen Überlastung geschützt. Wenn Du den Prozessor also 
nicht künstlich arg gealtert hast, solltest Du damit auch kein Problem 
haben.

PPS: Welche Spannung sehen Deine LEDs an der Anode ? 3V3 reicht 
normalerweise nicht aus für blau und weiss.


Und jetzt bitte nochmal auf die Schulbank und das kleinstmögliche 
Program zum Testen erstellen:
* richtige GPIOs als Output konfigurieren
* Im Abstand von 1s (hier gerne delay_ms, delay_init nicht vergessen) 
und Output toggeln
* Mit Multimeter am Gate messen

Sonst kannst Du lange Raten...

cu
N2

von Jim M. (turboj)


Lesenswert?

Kai P. schrieb:
> Debuggen
> klappt nur sinnvoll ohne Optimierung: -O0

Moderne Compiler kennen -Og (Optimierung für Debugging). Bei -O3 oder 
-Os würde ich mir vorher den Assembler Output anschauen (-save-temps=obj 
-fverbose-asm) - ansonsten kann man den oft wilden Sprüngen schlecht 
folgen. Debugging ist dann immer noch möglich (aber unbequem und 
verwirrend).

von Noob A. (strippenzieher)


Lesenswert?

S. R. schrieb:
> Gibt es irgendwas interessantes zur Umgebung zu sagen?
> Feuchtigkeit, hohe Temperaturen, etc.?

Hmm... Temperaturen sollten im spezifizierten Bereich liegen, ich 
schätze nicht über 60°C
Vibrationen gibt es jede Menge
Elektromagnetische Verseuchung auch, in der Nähe werden Motoren mit 
Frequenzumrichtern betrieben


S. R. schrieb:
> Wenn du den Fehler nicht gefunden hast und einfach den Controller
> tauchst, stehen die Chancen gut, dass der gleiche Fehler mit der Zeit
> wieder auftritt.

Das stimmt allerdings, war 'ne blöde Idee!

Kai P. schrieb:
> Wenn Du einen alten funktionierenden Code hast und der auf einmal nicht
> mehr funktioniert, nur weil Du eine Zeile hinzugefügt hast oder gelöscht
> hast -> Stack oder Pointer.
>
> Bitte ALLE Warnungen korrigieren, meist liegt der Compiler mit seinen
> Warnungen richtig.
>
> Das scheint aber nach Deiner Beschreibung nicht Dein Problem zu sein.
> Das Ding hat ja mal funktioniert.

Jupp, die Leuchten haben "einfach so" im laufenden Betrieb versagt.
Die clocks habe ich nicht angefasst, alles ist auf einem Beispiel der 
ASF aufgebaut... Ist schon watt her und ich mach das nicht jeden Tag, 
muss mich auch wieder einarbeiten.
Von daher ist dein Tipp mit einem minimalistischen Beispiel ranzugehen 
genau das was ich versuchen werde, Danke!

Aber erst probiere ich das Debuggen ohne Optimierung aus :)

Ich merke mal wieder wie wenig ich von der Materie verstehe ... :/

Grüßle,
Bob

von Kai P. (n_2)


Lesenswert?

Hey Jim,

Danke für den Hinweis auf "-Og". Der GCC unterstützt das ab Version 4.8, 
also 2013. So lange hab ich schon nicht mehr ins GCC Manual geschaut...

Fragt sich, warum Atmel Studio in der Konfiguration Debug den Default 
immer noch auf -O1 hat, wo es immer noch bei Step by Step Probleme gibt.

Aber gut, würde man sich die DropDown-Liste der Optimierungslevel noch 
durchlesen und nicht in gewohntes Verhalten zurückfallen, hätte man den 
Schalter "-Og - Optimize Debugging Experience" (den es vermutlich schon 
in Atmel Studio 6 gibt) finden können :)

Gruß N2

von Noob A. (strippenzieher)


Lesenswert?

hmmm... auch mit -O0 kommt der debugger aus dem Tritt

von Noob A. (strippenzieher)


Lesenswert?

Kai P. schrieb:
> PPS: Welche Spannung sehen Deine LEDs an der Anode ? 3V3 reicht
> normalerweise nicht aus für blau und weiss.

3,3V reichen, die leuchten ganz schön hell :)

von Noob A. (strippenzieher)


Lesenswert?

Na toll...

da ich di -Og option nicht hatte dachte ich mir, och machste mal ein 
update vom Atmel Studio.

GROßER FEHLER!!

jetzt geht gar nix mehr, ich kann den µC nicht mehr programmieren:
1
Could not activate interface, but found DAP with ID 0xbc11477..
2
3
This usually indicates that the device is locked or in deep sleep. Try to do a chip erase to restore connectivity to the device.
4
5
Unable to enter programming mode. Verify device selection, interface settings, target power, security bit, and connections to the target device.

Fuses kann ich lesen & schreiben, Speicher auslesen geht auch, Chip 
löschen auch, nur programieren nicht.

Danke Atmel, bzw. Microchip :/

von Noob A. (strippenzieher)


Lesenswert?

Uff, mit Hilfe vom Support ist jetzt alles wieder lauffähig!

Was'n Krampf!

Und weiter geht die Suche!!

von Noob A. (strippenzieher)


Lesenswert?

Ich habe jetzt noch 2 weitere defekte Leuchten angeschaut, die schmieren 
beim debuggen an unterschiedlichen Stellen ab...

Spaßeshalber habe ich mal einen Segger J-Link drangehängt, der meldet 
schon nach dem download der Firmware Fehler! "Lost connection to 
target", oder ich sehe gleich die disaasembly Ansciht mit lauter 0xFF 
drin...

Programmieren lässt sich der µC auch nicht, Verifiy schlägt fehl und es 
stehen lauter 0xFF drin.
Mit dem Atmel ICE ist program, verify und debug kein Problem...

Sehr dubios!

Hat jemand noch eine Idee was ich noch versuchen kann um dem Problem auf 
die Schliche zu kommen?
Irgendwas in dem µC stimmt doch nicht aber was? Und wieso?

Grüße,
Bob

P.S.: ein funktionierender µC lässt sich auch mit dem J-Link problemlos 
programmieren und debuggen

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.