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.
:
Bearbeitet durch User
http://start.atmel.com/ Hmm, tolle Sache, gerade selber noch mal rein gesehen wegen dem SAMC21. Und das Start hat keinen CAN-Treiber, doof.
:
Bearbeitet durch User
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.
:
Bearbeitet durch User
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 | #include <asf.h> |
2 | |
3 | int main (void) |
4 | {
|
5 | system_init(); |
6 | delay_init(); |
7 | |
8 | while (1) |
9 | {
|
10 | delay_ms(500); |
11 | port_pin_toggle_output_level(LED_13); |
12 | }
|
13 | }
|
und hier ein Teil der conf_clocks.h:
1 | /* SYSTEM_CLOCK_SOURCE_DFLL configuration - Digital Frequency Locked Loop */
|
2 | # define CONF_CLOCK_DFLL_ENABLE false
|
3 | # define CONF_CLOCK_DFLL_LOOP_MODE SYSTEM_CLOCK_DFLL_LOOP_MODE_OPEN
|
4 | # define CONF_CLOCK_DFLL_ON_DEMAND false
|
5 | |
6 | /* DFLL open loop mode configuration */
|
7 | # define CONF_CLOCK_DFLL_FINE_VALUE (512)
|
8 | /* DFLL closed loop mode configuration */
|
9 | # define CONF_CLOCK_DFLL_SOURCE_GCLK_GENERATOR GCLK_GENERATOR_1
|
10 | # define CONF_CLOCK_DFLL_MULTIPLY_FACTOR (48000000 / 32768)
|
11 | # define CONF_CLOCK_DFLL_QUICK_LOCK true
|
12 | # define CONF_CLOCK_DFLL_TRACK_AFTER_FINE_LOCK true
|
13 | # define CONF_CLOCK_DFLL_KEEP_LOCK_ON_WAKEUP true
|
14 | # define CONF_CLOCK_DFLL_ENABLE_CHILL_CYCLE true
|
15 | # define CONF_CLOCK_DFLL_MAX_COARSE_STEP_SIZE (0x1f / 4)
|
16 | # define CONF_CLOCK_DFLL_MAX_FINE_STEP_SIZE (0xff / 4)
|
17 | |
18 | /* Set this to true to configure the GCLK when running clocks_init. If set to
|
19 | * false, none of the GCLK generators will be configured in clocks_init(). */
|
20 | # define CONF_CLOCK_CONFIGURE_GCLK true
|
21 | |
22 | /* Configure GCLK generator 0 (Main Clock) */
|
23 | # define CONF_CLOCK_GCLK_0_ENABLE true
|
24 | # define CONF_CLOCK_GCLK_0_RUN_IN_STANDBY false
|
25 | # define CONF_CLOCK_GCLK_0_CLOCK_SOURCE SYSTEM_CLOCK_SOURCE_DFLL
|
26 | # define CONF_CLOCK_GCLK_0_PRESCALER 1
|
27 | # define CONF_CLOCK_GCLK_0_OUTPUT_ENABLE false
|
28 | |
29 | /* Configure GCLK generator 1 */
|
30 | # define CONF_CLOCK_GCLK_1_ENABLE true
|
31 | # define CONF_CLOCK_GCLK_1_RUN_IN_STANDBY false
|
32 | # define CONF_CLOCK_GCLK_1_CLOCK_SOURCE SYSTEM_CLOCK_SOURCE_XOSC32K
|
33 | # define CONF_CLOCK_GCLK_1_PRESCALER 1
|
34 | # define CONF_CLOCK_GCLK_1_OUTPUT_ENABLE false
|
35 | |
36 | /* Configure GCLK generator 2 (RTC) */
|
37 | # define CONF_CLOCK_GCLK_2_ENABLE true
|
38 | # define CONF_CLOCK_GCLK_2_RUN_IN_STANDBY false
|
39 | # define CONF_CLOCK_GCLK_2_CLOCK_SOURCE SYSTEM_CLOCK_SOURCE_OSC32K
|
40 | # define CONF_CLOCK_GCLK_2_PRESCALER 32
|
41 | # define CONF_CLOCK_GCLK_2_OUTPUT_ENABLE false
|
42 | |
43 | /* Configure GCLK generator 3 */
|
44 | # define CONF_CLOCK_GCLK_3_ENABLE true
|
45 | # define CONF_CLOCK_GCLK_3_RUN_IN_STANDBY false
|
46 | # define CONF_CLOCK_GCLK_3_CLOCK_SOURCE SYSTEM_CLOCK_SOURCE_OSC8M
|
47 | # define CONF_CLOCK_GCLK_3_PRESCALER 1
|
48 | # define CONF_CLOCK_GCLK_3_OUTPUT_ENABLE false
|
>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.
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
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 | /* System clock bus configuration */
|
2 | # define CONF_CLOCK_CPU_CLOCK_FAILURE_DETECT false
|
3 | # define CONF_CLOCK_FLASH_WAIT_STATES 1
|
4 | # define CONF_CLOCK_CPU_DIVIDER SYSTEM_MAIN_CLOCK_DIV_1
|
5 | # define CONF_CLOCK_APBA_DIVIDER SYSTEM_MAIN_CLOCK_DIV_1
|
6 | # define CONF_CLOCK_APBB_DIVIDER SYSTEM_MAIN_CLOCK_DIV_1
|
7 | # define CONF_CLOCK_APBC_DIVIDER SYSTEM_MAIN_CLOCK_DIV_1
|
8 | |
9 | ...
|
10 | |
11 | /* SYSTEM_CLOCK_SOURCE_DFLL configuration - Digital Frequency Locked Loop */
|
12 | # define CONF_CLOCK_DFLL_ENABLE true
|
13 | # define CONF_CLOCK_DFLL_LOOP_MODE SYSTEM_CLOCK_DFLL_LOOP_MODE_CLOSED
|
14 | # define CONF_CLOCK_DFLL_ON_DEMAND false
|
15 | |
16 | /* DFLL open loop mode configuration */
|
17 | # define CONF_CLOCK_DFLL_FINE_VALUE (0xff / 4)
|
18 | |
19 | /* DFLL closed loop mode configuration */
|
20 | # define CONF_CLOCK_DFLL_SOURCE_GCLK_GENERATOR GCLK_GENERATOR_1
|
21 | # define CONF_CLOCK_DFLL_MULTIPLY_FACTOR (48000000 / 32768)
|
22 | # define CONF_CLOCK_DFLL_QUICK_LOCK true
|
23 | # define CONF_CLOCK_DFLL_TRACK_AFTER_FINE_LOCK true
|
24 | # define CONF_CLOCK_DFLL_KEEP_LOCK_ON_WAKEUP true
|
25 | # define CONF_CLOCK_DFLL_ENABLE_CHILL_CYCLE true
|
26 | # define CONF_CLOCK_DFLL_MAX_COARSE_STEP_SIZE (0x1f / 4)
|
27 | # define CONF_CLOCK_DFLL_MAX_FINE_STEP_SIZE (0xff / 4)
|
28 | |
29 | ...
|
30 | |
31 | /* Configure GCLK generator 0 (Main Clock) */
|
32 | # define CONF_CLOCK_GCLK_0_ENABLE true
|
33 | # define CONF_CLOCK_GCLK_0_RUN_IN_STANDBY false
|
34 | # define CONF_CLOCK_GCLK_0_CLOCK_SOURCE SYSTEM_CLOCK_SOURCE_DFLL
|
35 | # define CONF_CLOCK_GCLK_0_PRESCALER 1
|
36 | # define CONF_CLOCK_GCLK_0_OUTPUT_ENABLE false
|
37 | |
38 | /* Configure GCLK generator 1 */
|
39 | # define CONF_CLOCK_GCLK_1_ENABLE true
|
40 | # define CONF_CLOCK_GCLK_1_RUN_IN_STANDBY false
|
41 | # define CONF_CLOCK_GCLK_1_CLOCK_SOURCE SYSTEM_CLOCK_SOURCE_OSC8M
|
42 | # define CONF_CLOCK_GCLK_1_PRESCALER (8000000 / 32768)
|
43 | # define CONF_CLOCK_GCLK_1_OUTPUT_ENABLE false
|
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.