Forum: Mikrocontroller und Digitale Elektronik Arduino M0 (Pro) Takterzeugung


von Jürgen M. (mheimer)


Lesenswert?

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

von Jürgen M. (mheimer)


Lesenswert?

Hat sich hier echt noch Niemand mit diesem Board beschäftigt und 
versucht es über Atmel Studio zu programmieren?

von Jim M. (turboj)


Lesenswert?

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.

von Jürgen M. (mheimer)


Lesenswert?

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

von Rudolph R. (rudolph)


Lesenswert?

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.

von Jürgen M. (mheimer)


Lesenswert?

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
von Rudolph R. (rudolph)


Lesenswert?

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
von Jürgen M. (mheimer)


Lesenswert?

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
von Jürgen M. (mheimer)


Lesenswert?

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

von hinkebein (Gast)


Lesenswert?

>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.

von Jürgen M. (mheimer)


Angehängte Dateien:

Lesenswert?

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.

von Jürgen M. (mheimer)


Lesenswert?

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?

von Rudolph R. (rudolph)


Lesenswert?

Der EDBG Chip ist nichts anderes als ein Atmel ICE direkt auf der 
Platine.

von Jürgen M. (mheimer)


Lesenswert?

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.

von Rudolph R. (rudolph)


Lesenswert?

Nochmal, das ist quasi ein Atmel ICE.
Das ist KEIN UART<->USB Wandler Chip wie auf dem Arduino Uno.

von Jürgen M. (mheimer)


Lesenswert?

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.

von Steffen (Gast)


Lesenswert?

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

von Steffen (Gast)


Lesenswert?

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
...

von Jürgen M. (mheimer)


Lesenswert?

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
Noch kein Account? Hier anmelden.