Hallo, ich habe mir einen Arduino M0 Pro besorgt und versuche diesen in Atmel Studio 7 zu programmieren. Da es leider kein ASF-Projekt dazu gibt, habe ich ein Userboardprojekt mit dem ATSAMD21G18A erstellt und etwas experimentiert. Die Takterzeugung ist aber für mich nicht überschaubar, da ich auch kein Programmierprofi bin, den AvR-Mega habe ich noch verstanden, nur den SAMD21 nicht. Ich möchte mit einem TC einen definierte Takt erzeugen, um z.B. eine Debug-LED blinken zu lassen. Wie konfiguriere ich aber die conf_clocks.h, um den propagierten 48 MHz Clock zu erzeugen? Danke im Voraus
Hat sich hier echt noch Niemand mit diesem Board beschäftigt und versucht es über Atmel Studio zu programmieren?
Bei Deinem Beitrag ist die erkennbare Eigenleistung gleich Null. Da gibt es dann auch keine Antworten. Soo unüberschaubar ist der Clock Baum in einem µC normalerweise auch nicht.
Ein Buch über meine Versuche wollte ich natürlich nicht schreiben und Du kannst mir schon glauben, dass ich über Beispielprojekte versucht habe, zu verstehen, wie die Taktkette funktioniert, aber es ist mir nicht gelungen. Bei einem "normalen" µC habe ich irgendwo einen Baseclock, welcher dann über einen Prescaler geteilt wird und somit den Takt bereitstellt, mit welchem dann z.B. ein TC arbeitet. Nur begreife ich diese Form der Taktkette beim SAMD21 einfach nicht, weil es da um OPEN und CLOSED LOOP usw. geht. Aber o.K. wenn ich mir sowieso selbst helfen soll, muss ich ja nicht hier im Forum darüber diskutieren und um Rat bitten. Danke
Schau mal hier mit rein, ich hatte und habe da auch einige Schwierigkeiten mit der Takterzeugung. Beitrag "Erste Schritte mit ARM SAMD20" Jim M. schrieb: > Soo unüberschaubar ist der Clock Baum in einem µC normalerweise auch > nicht. Schau Dir mal das Datenblatt an, beim SAMD20 ist die Takterzeugung auf über 70 Seiten verteilt. Was dann noch "helfen" könnte ist das Atmel Start. Ist zwar eher Beta und es gibt keine Erklärungen, aber mit kreativem rumgeklicke kommt vielleicht zufällig passender Code bei raus.
Ok, danke, das werde ich mir mal ansehen. Du hast natürlich den Vorteil, dass es für das explained fertige Boardprojekte gibt. Leider unterscheiden sich die ASF-Funktionen grundlegend selbst von den Funktionen für den SAM3X (Arduino Due) und es gibt auch keine Interrupt-Vektoren, sondern Callbacks. Das ist für mich ziemlich fremd.
http://start.atmel.com/ Hmm, tolle Sache, gerade selber noch mal rein gesehen wegen dem SAMC21. Und das Start hat keinen CAN-Treiber, doof.
Hey ist ja echt ne coole Sache, vor Allem die grafische Verknüpfung der Takterzeugung. Allerdings läuft das Alles ohne ASF. Wenn ich aber damit schneller zu meinem Ziel komme, egal. Hm, ich bekomme es aber auch dort nicht hin, den CPU-Clock auf 48 MHz zu bringen. Verstanden habe ich es so, dass die DFLL die 8 MHz vom internen Oszillator bekommt und mit dem externen 32,768 MHz Oszillator getriggert wird, im Closed Loop Mode. Ich kann in der Konfiguration aber nur einen Takt anlegen. Soviel also zur nicht sooo schweren Überschaubarkeit der Takterzeugung.
Ergebnis nach mehreren Neuversuchen: Irgendwie läuft es nicht mit der DFFL. Sobald ich sie in der conf_clocks.h enable, stürzt der Debugger mit nem IRQ-Fehler ab. Hier meine sehr kurze main.c:
1 | |
2 | |
3 | |
4 | |
5 | |
6 | |
7 | |
8 | |
9 | |
10 | |
11 | |
12 | |
13 | |
und hier ein Teil der conf_clocks.h:
1 | |
2 | |
3 | |
4 | |
5 | |
6 | |
7 | |
8 | |
9 | |
10 | |
11 | |
12 | |
13 | |
14 | |
15 | |
16 | |
17 | |
18 | |
19 | |
20 | |
21 | |
22 | |
23 | |
24 | |
25 | |
26 | |
27 | |
28 | |
29 | |
30 | |
31 | |
32 | |
33 | |
34 | |
35 | |
36 | |
37 | |
38 | |
39 | |
40 | |
41 | |
42 | |
43 | |
44 | |
45 | |
46 | |
47 | |
48 | |
Gast
#4404754
>stürzt der Debugger mit nem IRQ-Fehler ab.
Was heisst "stürzt ab"?
Was heisst "IRQ Fehler"?
Es hilft mehr, wenn Du nicht Deine eigenen Interpretationen
zum Besten gibst, sondern die konkreten Fehlermeldungen, die
die Tools ausgeben.
"stürzt der Debugger ab" ist ziemlich unwahrscheinlich.
Leider kann ich hier keine Videos posten :( O.k. Also ich lasse das Programm über den SAM-ICE laufen, also über einen Debugger und habe auf der system_init() einen Haltepunkt. Lasse ich die DFFL disabled, läuft die gesamte system_init()durch, wenn ich mit F10 die Funktion durchlaufen lasse und bei enabled springt der Debugger in einer IRQ-Funktion raus, siehe Screenshot.
Also, im Open Loop Mode läuft der Controller nun mit 48 MHz, diese Atmel Start Seite hat mir sehr geholfen das Taktsystem zu verstehen. Nun tut sich aber ein weiteres Problem auf, die Kommunikation mit dem PC. Zwischen dem so genannten Programming Port und dem SAM sitzt ja dieser Debugger-Chip (EDBG). Konfiguriere ich den dazugehörenden USART (SERCOM5), kann ich am TX die Datenimpulse sehen, nur am USB kommt Nichts raus. Wie wird denn der EDBG konfiguriert oder wie bekommt der mit, mit welcher Baudrate ich arbeite?
Der EDBG Chip ist nichts anderes als ein Atmel ICE direkt auf der Platine.
Dann verstehe ich nicht, warum auf meiner Konsole Nichts ankommt, ich habe den COM-Port des Chips und die gleiche Baudrate eingestellt. Könnte höchstens sein, dass die USART-Baudratenkonfiguration falsch ist, obwohl ich die Funktionen aus einem Beispiel genommen habe. Dieses Board gibt mir so langsam zu viele Rätsel auf, dass ich den Kauf schon fast bereue.
Nochmal, das ist quasi ein Atmel ICE. Das ist KEIN UART<->USB Wandler Chip wie auf dem Arduino Uno.
Die Kommunikation am USB-Programmingport geht aber über diesen Chip: USB-Buchse<->EDBG<->SAM21 Im ASF-Beispielprojekt mit dem Atmel SAM21explained Board ist das genauso realisiert. Sieh Dir doch mal die Schaltung an http://download.arduino.org/products/M0PRO/arduino-M0-pro-schematic.pdf. Arduino Sketches funktionieren ja auch irgendwie, kann ich mir die Quelle dazu eigentlich ansehen? Ich will aber im richtigen C programmieren und nicht in dieser C++ Fremdsprache.
Gast
#4438583
Jürgen M. schrieb: > Ergebnis nach mehreren Neuversuchen: > > Irgendwie läuft es nicht mit der DFFL. > Sobald ich sie in der conf_clocks.h enable, stürzt der Debugger mit nem > IRQ-Fehler ab. ... > und hier ein Teil der conf_clocks.h:/* SYSTEM_CLOCK_SOURCE_DFLL > configuration - Digital Frequency Locked Loop */ > # define CONF_CLOCK_DFLL_ENABLE false > # define CONF_CLOCK_DFLL_LOOP_MODE > SYSTEM_CLOCK_DFLL_LOOP_MODE_OPEN > # define CONF_CLOCK_DFLL_ON_DEMAND false > Hast du die Waitstates Einstellung für das Flash angepasst? Siehe den letzten Abschnitt hinter diesem Link: http://atmel.force.com/support/articles/en_US/FAQ/How-to-configure-DFLL48M-oscillator-as-main-clock-in-ASF-project-for-SAMR21-SAMD21-SAMD20-SAMD10-SAMD11
Gast
#4438618
Bei mir läuft's mit diesen Einstellungen: 1) Taktquelle aktivieren: Bei mir der interne Ozillator mit 8MHz 2) Diese 8MHz in GCLK_1 füttern, Prescaler: (8000000 / 32768) Das resultiert in einem Takt von 32,768 kHz 3) GCLK_1 als Taktquelle für die DFLL verwenden Multiplikator-Einstellung: (48000000 / 32768) 4) Die mit der DFLL erzeugten 48MHz in GCLK_0 füttern (Wird dann als Taktquelle für die CPU verwendet) 5) Flash Waitstates auf 1 setzen Da ich kein Oszi habe, kann ich leider keine Untersuchungen zur Genauigkeit machen. Hier die relevanten Passagen der conf_clocks.h:
1 | |
2 | |
3 | |
4 | |
5 | |
6 | |
7 | |
8 | |
9 | |
10 | |
11 | |
12 | |
13 | |
14 | |
15 | |
16 | |
17 | |
18 | |
19 | |
20 | |
21 | |
22 | |
23 | |
24 | |
25 | |
26 | |
27 | |
28 | |
29 | |
30 | |
31 | |
32 | |
33 | |
34 | |
35 | |
36 | |
37 | |
38 | |
39 | |
40 | |
41 | |
42 | |
43 | |
44 | |
45 | |
Scheint so zu funktionieren. Im ASF Beispiel werden für 48 MHz CPU Takt sogar 2 Waitstates empfohlen. Allerdings gibt mir die Funktion system_gclk_gen_get_hz() 47998704 Hz anstatt 48000000 Hz zurück, womit dann auch die Delayfunktionen arbeiten müssen. Diese krummen Multiplikatoren und Prescaler sind wohl der Grund dafür. Sind die Beispiele von Dir von einem Atmel Explained Board oder auch vom Arduino Zero? Ich frage, weil ich ja immer noch das USART Problem über den EDBG Chip habe und da unbedingt Hilfe benötige. Auf jeden Fall vielen Dank für die Hinweise.
Antwort schreiben
Bitte melde dich an, um einen Beitrag zu schreiben.
