Forum: Mikrocontroller und Digitale Elektronik SAMD21 Probleme mit den Timern (Interrupt)


von Horst W. (wassolldas)


Lesenswert?

Hallo Freunde der Microcontroller,

ich bin gerade an einem Projekt in welchem ich einen SAMD21 einsetze.
In diesem Projekt benötige ich einen Timerinterrupt der einen Interrupt 
im Takt von 160KHz auslöst. (Zweck Gepollte Manchesterdecodierung)
Alles im Grunde kein Problem mit einem Arduino MoPro und Arduino 
Umgebung flux ausprobiert..läuft.
Dann ein eigenes Board erstellen lassen auf dem der SAM mit dem internen 
Clock laufen soll.

Diesen habe ich dann ohne die Arduino Bibliotheken mit Atmel Studio 
programmiert. Der Timer läuft auch im Interrupt nur ich erreiche die 
160kHz nicht mehr, es gibt eine Schwelle die ich nicht überschreiten 
kann. (unter dieser Schwellenfrequenz entspricht alles den Erwartungen)
Der Prescaler läuft auf 1 und auch der Compare Wert wird ins Compare 
Register übernommen. Nur wird der Interrupt mit einer niedriegeren Rate 
aufgerufen als es nach dem Compare Register sein müßte. Stelle ich den 
Prescaler auf 1/2 so gibt es auch hier eine Schwelle welche ich nicht 
überschreiten kann obwohl auch hier das Compare Register den richtigen 
Wert bekommt. Dasselbe mit Prescaler 1/4.

Der einzige Unterschied zum MoPro ist ja der interne Takt.

Hat irgendjemand eine Idee was das sein kann. Gibt es einen Errata 
Eintrag den ich nicht gefunden habe?

: Bearbeitet durch User
von Stromverdichter (Gast)


Lesenswert?

Wie hoch ist denn nun dein Takt? 8Mhz?
Wie hoch war dein Takt? 48Mhz?
Welche Taktquelle verwendest du?
Ohne Sourcecode ist das jedoch wieder mal Rätselraten.
Hast du gar noch den Timer-Interrupt mit übermäßig viel Code 
vollgepackt?
Etwa auch Delays?
Ich hol mir die nächste Glaskugel, die hier ist kaputt :-(

von Horst W. (wassolldas)


Lesenswert?

Mein Prozessortakt ist 48MHz.
Ich habe aber auch Spaßeshalber den Takt mal auf 1MHz runtergesetzt. Das 
selbe Phänomen. Nur mit eben 1/48 Frequenz. (Taktquelle interne 32kHz)

Nein nein, in meinem Interrupt wird im Moment nur ein Port getoggelt. 
Wie gesagt auf dem MoPro mit Arduino Bibliothek gehts ja. Dieselbe 
Bibliothek habe ich auch schon ohne den ganzen Arduino Plunder in meinen 
Source Code eingebaut. Funzt auch nur eben bis zu dieser Grenze.
Source Code habe ich hier auf dem Rechner nicht, den kann ich erst 
morgen einstellen.
Ich hatte eben die Hoffung, dass jemand so etwas ähnliches schon hatte.

Eventuell muss man etwas Besonderes bei dem internen Takt beachten?

Kann es eventuell sein dass der Interruptcontroller, zu langsam läuft 
und so die auflaufenden Interrupt ab einer gewissen Frequenz nicht mehr 
mitbekommt?

: Bearbeitet durch User
von Marco H. (damarco)


Lesenswert?

Trotzdem könnte die Taktquelle die Ursache sein. Ohne Code kann man nur 
raten... Schau mal in Datenblatt -> Clock

von Horst W. (wassolldas)


Lesenswert?

Danke für die Antwort.

Du weißt gar nicht wie oft ich den Abschnitt Clock und Timer im 
Datenblatt schon gelesen habe.
Ich stell Morgen mal ein wie ich den internen Takt und die Timer 
konfiguriert habe. Irgendwo wird wahrscheinlich der Fehler liegen. Nur 
im Moment habe ich keine Idee mehr.

von Kai P. (n_2)


Lesenswert?

Hi Horst,

Du hast uns relativ wenig Informationen zur Verfügung gestellt....

Über welche Frequenz kommst Du nicht rüber ? Wie stellst Du das fest ?
Gehst Du mit dem Compare Wert runter und irgendwann erhöht sich die 
Frequenz der Interrupt nicht mehr ? Was sind die Werte, die Du 
einstellst ?

Benutzt Du ASF ? Oder programmierst Du bare metal ?

Oder stimmt nur Dein berechneter Compare-Wert nicht ? Wie hoch ist der 
denn ?

Auf die Schnelle 3 Ideen:

1) Der Prozessor braucht zu viel Zeit in den ganzen Interrupts. Das wäre 
der Fall, wenn Du den Compare-Wert immer weiter erniedrigst, und die 
Frequenz bleibt "stehen".
2) Dein Clock-Distribution-System ist nicht i.O. z.B. der Timer läuft 
mit 48MHz aber Deine Main Clock mit 1MHz(was typischerweise zu dem 
Fehler unter 1 führt, weil angenommen wird, die Main Clock ist auch auf 
48MHz)
3) Falls Dein Compare-Wert nur nicht passt: Der D21 hat keine 48MHz. 
Häufig werden die 48MHz über die internen 32kHz erzeugt. Der hat aber 
einen relativ großen Fehler. Die Clock läuft dann mit 47MHz oder auch 
49MHz.
Die 48MHz dann für den UART benutzen führt zu schicken 
Baudsratenfehlern…
Für den UART dann besser die 8MHz Clock nehmen.



Gruß N2

von Horst W. (wassolldas)


Lesenswert?

Kai P. schrieb:
> Über welche Frequenz kommst Du nicht rüber ? Wie stellst Du das fest ?
> Gehst Du mit dem Compare Wert runter und irgendwann erhöht sich die
> Frequenz der Interrupt nicht mehr ? Was sind die Werte, die Du
> einstellst ?

Der Compare Wert stimmt bis zu einer bestimmten Frequenz dann erhöht 
sich die Frequenz nicht mehr obwohl der Compare Wert weiter erniedrigt 
wird.
Ich stelle dies fest indem ich einen Port toggle und mir das Ergebnis 
auf einem Oska anschaue.

> Benutzt Du ASF ? Oder programmierst Du bare metal ?

Nein ich programiere an der Basis

> Oder stimmt nur Dein berechneter Compare-Wert nicht ? Wie hoch ist der
> denn ?

Der berchnete Wert stimmt, wie gesagt bei höheren Frequenzen passt er.

Mehr Details später.

von Horst W. (wassolldas)


Lesenswert?

Ich stelle mal den Source Code ein. Dies ist Code aus Beispielen von 
Microchip entsprechend geändert auf internen Oszi32k.
Hier Clock Init:
1
void ClocksInit(void){
2
  
3
  uint32_t tempDFLL48CalibrationCoarse;  /* used to retrieve DFLL48 coarse calibration value from NVM */
4
5
  /* ----------------------------------------------------------------------------------------------
6
  * 1) Set Flash wait states for 48 MHz (per Table 37-40 in data sheet)
7
  */
8
  
9
  NVMCTRL->CTRLB.bit.RWS = 1;    /* 1 wait state required @ 3.3V & 48MHz */
10
  
11
  /* ----------------------------------------------------------------------------------------------
12
  * 2) Enable XOSC32K clock (External on-board 32.768kHz oscillator), will be used as DFLL48M reference.
13
  */
14
  
15
  // Configure SYSCTRL->XOSC32K settings
16
  SYSCTRL_XOSC32K_Type sysctrl_xosc32k = {
17
    .bit.WRTLOCK = 0,    /* XOSC32K configuration is not locked */
18
    .bit.STARTUP = 0x2,    /* 3 cycle start-up time */
19
    .bit.ONDEMAND = 0,    /* Osc. is always running when enabled */
20
    .bit.RUNSTDBY = 0,    /* Osc. is disabled in standby sleep mode */
21
    .bit.AAMPEN = 0,    /* Disable automatic amplitude control */
22
    .bit.EN32K = 1,      /* 32kHz output is disabled */
23
    .bit.XTALEN = 1      /* Crystal connected to XIN32/XOUT32 */
24
  };
25
  
26
  SYSCTRL_OSC32K_Type sysctrl_osc32k = {
27
    .bit.WRTLOCK = 0,    /* OSC32K configuration is not locked */
28
    .bit.STARTUP = 0x2,    /* 3 cycle start-up time */
29
    .bit.ONDEMAND = 0,    /* Osc. is always running when enabled */
30
    .bit.RUNSTDBY = 0,    /* Osc. is disabled in standby sleep mode */
31
    .bit.EN32K = 1,      /* 32kHz output is disabled */
32
  };
33
  
34
  // Write these settings
35
//  SYSCTRL->XOSC32K.reg = sysctrl_xosc32k.reg;
36
  SYSCTRL->OSC32K.reg = sysctrl_osc32k.reg;
37
  // Enable the Oscillator - Separate step per data sheet recommendation (sec 17.6.3)
38
  SYSCTRL->OSC32K.bit.ENABLE = 1;
39
//  SYSCTRL->XOSC32K.bit.ENABLE = 1;
40
  
41
  // Wait for XOSC32K to stabilize
42
  while(!SYSCTRL->PCLKSR.bit.OSC32KRDY);
43
  
44
  /* ----------------------------------------------------------------------------------------------
45
  * 3) Put XOSC32K as source of Generic Clock Generator 1
46
  */
47
  
48
  // Set the Generic Clock Generator 1 output divider to 1
49
  // Configure GCLK->GENDIV settings
50
  GCLK_GENDIV_Type gclk1_gendiv = {
51
    .bit.DIV = 1,                /* Set output division factor = 1 */
52
//    .bit.ID = GENERIC_CLOCK_GENERATOR_XOSC32K  /* Apply division factor to Generator 1 */
53
    .bit.ID = 0x04  
54
  };
55
  // Write these settings
56
  GCLK->GENDIV.reg = gclk1_gendiv.reg;
57
  
58
  // Configure Generic Clock Generator 1 with XOSC32K as source
59
  GCLK_GENCTRL_Type gclk1_genctrl = {
60
    .bit.RUNSTDBY = 0,    /* Generic Clock Generator is stopped in stdby */
61
    .bit.DIVSEL =  0,    /* Use GENDIV.DIV value to divide the generator */
62
    .bit.OE = 0,      /* Disable generator output to GCLK_IO[1] */
63
    .bit.OOV = 0,      /* GCLK_IO[1] output value when generator is off */
64
    .bit.IDC = 1,      /* Generator duty cycle is 50/50 */
65
    .bit.GENEN = 1,      /* Enable the generator */
66
    .bit.SRC = 0x05,    /* Generator source: XOSC32K output */
67
//    .bit.ID = GENERIC_CLOCK_GENERATOR_XOSC32K      /* Generator ID: 1 */
68
    .bit.ID = 0x04      
69
  };
70
  // Write these settings
71
  GCLK->GENCTRL.reg = gclk1_genctrl.reg;
72
  // GENCTRL is Write-Synchronized...so wait for write to complete
73
  while(GCLK->STATUS.bit.SYNCBUSY);
74
  
75
  /* ----------------------------------------------------------------------------------------------
76
  * 4) Put Generic Clock Generator 1 as source for Generic Clock Multiplexer 0 (DFLL48M reference)
77
  */
78
  
79
  GCLK_CLKCTRL_Type gclk_clkctrl = {
80
    .bit.WRTLOCK = 0,    /* Generic Clock is not locked from subsequent writes */
81
    .bit.CLKEN = 1,      /* Enable the Generic Clock */
82
//    .bit.GEN = GENERIC_CLOCK_GENERATOR_XOSC32K,   /* Generic Clock Generator 1 is the source */
83
    .bit.GEN = 0x04,   /* Generic Clock Generator 1 is the source */
84
    .bit.ID = 0x00    /* Generic Clock Multiplexer 0 (DFLL48M Reference) */
85
  };
86
  // Write these settings
87
  GCLK->CLKCTRL.reg = gclk_clkctrl.reg;
88
  
89
  /* ----------------------------------------------------------------------------------------------
90
  * 5) Enable DFLL48M clock
91
  */
92
  
93
  // DFLL Configuration in Closed Loop mode, cf product data sheet chapter
94
  // 17.6.7.1 - Closed-Loop Operation
95
  
96
  // Enable the DFLL48M in open loop mode. Without this step, attempts to go into closed loop mode at 48 MHz will
97
  // result in Processor Reset (you'll be at the in the Reset_Handler in startup_samd21.c).
98
  // PCLKSR.DFLLRDY must be one before writing to the DFLL Control register
99
  // Note that the DFLLRDY bit represents status of register synchronization - NOT clock stability
100
  // (see Data Sheet 17.6.14 Synchronization for detail)
101
  while(!SYSCTRL->PCLKSR.bit.DFLLRDY);
102
  SYSCTRL->DFLLCTRL.reg = (uint16_t)(SYSCTRL_DFLLCTRL_ENABLE);
103
  while(!SYSCTRL->PCLKSR.bit.DFLLRDY);
104
  
105
  // Set up the Multiplier, Coarse and Fine steps
106
  SYSCTRL_DFLLMUL_Type sysctrl_dfllmul = {
107
    .bit.CSTEP = 31,    /* Coarse step - use half of the max value (63) */
108
    .bit.FSTEP = 511,    /* Fine step - use half of the max value (1023) */
109
    .bit.MUL = 1465      /* Multiplier = MAIN_CLK_FREQ (48MHz) / EXT_32K_CLK_FREQ (32768 Hz) */
110
  };
111
  // Write these settings
112
  SYSCTRL->DFLLMUL.reg = sysctrl_dfllmul.reg;
113
  // Wait for synchronization
114
  while(!SYSCTRL->PCLKSR.bit.DFLLRDY);
115
  
116
  // To reduce lock time, load factory calibrated values into DFLLVAL (cf. Data Sheet 17.6.7.1)
117
  // Location of value is defined in Data Sheet Table 10-5. NVM Software Calibration Area Mapping
118
  
119
  // Get factory calibrated value for "DFLL48M COARSE CAL" from NVM Software Calibration Area
120
  tempDFLL48CalibrationCoarse = *(uint32_t*)FUSES_DFLL48M_COARSE_CAL_ADDR;
121
  tempDFLL48CalibrationCoarse &= FUSES_DFLL48M_COARSE_CAL_Msk;
122
  tempDFLL48CalibrationCoarse = tempDFLL48CalibrationCoarse>>FUSES_DFLL48M_COARSE_CAL_Pos;
123
  // Write the coarse calibration value
124
  SYSCTRL->DFLLVAL.bit.COARSE = tempDFLL48CalibrationCoarse;
125
  // Switch DFLL48M to Closed Loop mode and enable WAITLOCK
126
  while(!SYSCTRL->PCLKSR.bit.DFLLRDY);
127
  SYSCTRL->DFLLCTRL.reg |= (uint16_t) (SYSCTRL_DFLLCTRL_MODE | SYSCTRL_DFLLCTRL_WAITLOCK);
128
  
129
  /* ----------------------------------------------------------------------------------------------
130
  * 6) Switch Generic Clock Generator 0 to DFLL48M. CPU will run at 48MHz.
131
  */
132
  
133
  // Now that DFLL48M is running, switch CLKGEN0 source to it to run the core at 48 MHz.
134
  // Enable output of Generic Clock Generator 0 (GCLK_MAIN) to the GCLK_IO[0] GPIO Pin
135
  GCLK_GENCTRL_Type gclk_genctrl0 = {
136
    .bit.RUNSTDBY = 0,    /* Generic Clock Generator is stopped in stdby */
137
    .bit.DIVSEL =  0,    /* Use GENDIV.DIV value to divide the generator */
138
    .bit.OE = 1,      /* Enable generator output to GCLK_IO[0] */
139
    .bit.OOV = 0,      /* GCLK_IO[0] output value when generator is off */
140
    .bit.IDC = 1,      /* Generator duty cycle is 50/50 */
141
    .bit.GENEN = 1,      /* Enable the generator */
142
    .bit.SRC = 0x07,    /* Generator source: DFLL48M output */
143
    .bit.ID = GENERIC_CLOCK_GENERATOR_MAIN      /* Generator ID: 0 */
144
  };
145
  GCLK->GENCTRL.reg = gclk_genctrl0.reg;
146
  // GENCTRL is Write-Synchronized...so wait for write to complete
147
  while(GCLK->STATUS.bit.SYNCBUSY);
148
  
149
  // Direct the GCLK_IO[0] output to PA28
150
  PORT_WRCONFIG_Type port0_wrconfig = {
151
    .bit.HWSEL = 1,      /* Pin# (28) - falls in the upper half of the 32-pin PORT group */
152
    .bit.WRPINCFG = 1,    /* Update PINCFGy registers for all pins selected */
153
    .bit.WRPMUX = 1,    /* Update PMUXn registers for all pins selected */
154
    .bit.PMUX = 7,      /* Peripheral Function H selected (GCLK_IO[0]) */
155
    .bit.PMUXEN = 1,    /* Enable peripheral Multiplexer */
156
    .bit.PINMASK = (uint16_t)(1 << (28-16)) /* Select the pin(s) to be configured */
157
  };
158
  // Write these settings
159
  PORT->Group[0].WRCONFIG.reg = port0_wrconfig.reg;
160
  
161
  /* ----------------------------------------------------------------------------------------------
162
  * 7) Modify prescaler value of OSC8M to produce 8MHz output
163
  */
164
165
  SYSCTRL->OSC8M.bit.PRESC = 0;    /* Prescale by 1 */
166
  SYSCTRL->OSC8M.bit.ONDEMAND = 0 ;  /* Oscillator is always on if enabled */
167
  
168
  /* ----------------------------------------------------------------------------------------------
169
  * 8) Put OSC8M as source for Generic Clock Generator 3
170
  */
171
  
172
  // Set the Generic Clock Generator 3 output divider to 1
173
  // Configure GCLK->GENDIV settings
174
  GCLK_GENDIV_Type gclk3_gendiv = {
175
    .bit.DIV = 1,                /* Set output division factor = 1 */
176
    .bit.ID = GENERIC_CLOCK_GENERATOR_OSC8M    /* Apply division factor to Generator 3 */
177
  };
178
  // Write these settings
179
  GCLK->GENDIV.reg = gclk3_gendiv.reg;
180
  
181
  // Configure Generic Clock Generator 3 with OSC8M as source
182
  GCLK_GENCTRL_Type gclk3_genctrl = {
183
    .bit.RUNSTDBY = 0,    /* Generic Clock Generator is stopped in stdby */
184
    .bit.DIVSEL =  0,    /* Use GENDIV.DIV value to divide the generator */
185
    .bit.OE = 0,      /* Disable generator output to GCLK_IO[1] */
186
    .bit.OOV = 0,      /* GCLK_IO[2] output value when generator is off */
187
    .bit.IDC = 1,      /* Generator duty cycle is 50/50 */
188
    .bit.GENEN = 1,      /* Enable the generator */
189
    .bit.SRC = 0x06,    /* Generator source: OSC8M output */
190
    .bit.ID = GENERIC_CLOCK_GENERATOR_OSC8M      /* Generator ID: 3 */
191
  };
192
  // Write these settings
193
  GCLK->GENCTRL.reg = gclk3_genctrl.reg;
194
  // GENCTRL is Write-Synchronized...so wait for write to complete
195
  while(GCLK->STATUS.bit.SYNCBUSY);
196
  
197
  /* ----------------------------------------------------------------------------------------------
198
  * 9) Set CPU and APBx BUS Clocks to 48MHz
199
  */
200
  PM->CPUSEL.reg  = PM_CPUSEL_CPUDIV_DIV1 ;
201
  PM->APBASEL.reg = PM_APBASEL_APBADIV_DIV1_Val ;
202
  PM->APBBSEL.reg = PM_APBBSEL_APBBDIV_DIV1_Val ;
203
  PM->APBCSEL.reg = PM_APBCSEL_APBCDIV_DIV1_Val ;
204
  
205
} // ClockSysInit48M()

Hier Timer Init:
1
void AppInit(void){
2
  
3
  /*  Clock Initialization (CPU, AHB, APBx)
4
    The System RC Oscillator (OSC8M) provides the source for the main clock
5
    at chip startup. It is set to 1 MHz. Clock Generator 0 is enabled. */
6
    
7
  // Add code here to change the system clock and enable clock generator(s)
8
  
9
  /* Disable all IRQs until all application initialization completed */
10
  __disable_irq();
11
  
12
  /* Digital I/O Initialization */  
13
  
14
  pinMode(IO_PA15,OUTPUT); //this configures the LED pin, you can remove this it's just example code
15
//  PORT->Group[LED0_PORT].DIRSET.reg = LED0_PIN ;                // Assign the LED0 pin as OUTPUT
16
//  PORT->Group[LED0_PORT].OUTSET.reg = LED0_PIN ;                // Set the LED0 pin level, i.e. put to 3.3V -> this turns off the LED
17
18
  /* TC3 Initialization (Generate Compare Interrupts every 100mS) */
19
  
20
  // Configure asynchronous clock source
21
  GCLK->CLKCTRL.reg = GCLK_CLKCTRL_ID_TCC2_TC3_Val;              // select TC3 peripheral channel
22
  GCLK->CLKCTRL.reg |= GCLK_CLKCTRL_GEN_GCLK0;                // select source GCLK_GEN[0]
23
  GCLK->CLKCTRL.bit.CLKEN = 1;                        // enable generic clock
24
  
25
  // Configure synchronous bus clock
26
  PM->APBCSEL.bit.APBCDIV = 0;                        // no prescaler
27
  PM->APBCMASK.bit.TC3_ = 1;                          // enable TC3 interface
28
  
29
  // Configure Count Mode (16-bit)
30
  TC3->COUNT16.CTRLA.bit.MODE = 0x0;
31
  
32
  // Configure Prescaler for divide by 2 (500kHz clock to COUNT)
33
//  TC3->COUNT16.CTRLA.bit.PRESCALER = 0x1;
34
  TC3->COUNT16.CTRLA.bit.PRESCALER = 0x0;
35
  
36
  // Configure TC3 Compare Mode for compare channel 0
37
  TC3->COUNT16.CTRLA.bit.WAVEGEN = 0x1;                    // "Match Frequency" operation
38
  
39
  // Initialize compare value for 
40
//  TC3->COUNT16.CC[0].reg = 10000;            // ergibt -> 398Hz gemessen
41
//  TC3->COUNT16.CC[0].reg = 1000;            // ergibt -> 3,98kHz gemessen
42
  TC3->COUNT16.CC[0].reg = 500;            // ergibt -> 8kHz gemessen
43
//  TC3->COUNT16.CC[0].reg = 100;            // ergibt -> 19,7kHz gemessen  
44
//  TC3->COUNT16.CC[0].reg = 10;            // ergibt -> 38kHz gemessen  
45
//  TC3->COUNT16.CC[0].reg = 1;              // ergibt -> 38kHz gemessen  
46
  
47
  // Enable TC3 compare mode interrupt generation
48
  TC3->COUNT16.INTENSET.bit.MC0 = 0x1;                    // Enable match interrupts on compare channel 0   
49
  
50
  // Enable TC3
51
  TC3->COUNT16.CTRLA.bit.ENABLE = 1;
52
  
53
  // Wait until TC3 is enabled
54
  while(TC3->COUNT16.STATUS.bit.SYNCBUSY == 1);
55
  
56
  /* Configure/Enable Interrupts */
57
  NVIC_SetPriority(TC3_IRQn, 3);                        // Set the interrupt priority to lowest value
58
  NVIC_EnableIRQ(TC3_IRQn);                          // Enable the interrupt
59
  
60
  /* Enable all IRQs */
61
  __enable_irq();
62
  
63
}

Die Initialisierung vom Clock ist extrem kompliziert und schlecht im 
Datenblatt beschrieben.

ICh habe in den Kommentaren für den Compare Wert die resultierenden 
Frequenzen angegeben. Das ist irgendwie nicht linear.

: Bearbeitet durch User
von Horst W. (wassolldas)


Lesenswert?

!! Ich habe nun die Fehler in der CLK Initialisierung gefunden!!!

Hatte doch einiges vermurkst beim Umschreiben des Microchip Beispielcode 
auf internen Clock. Jetzt scheint es zu funktionieren.
Allerdings ist mir aufgefallen dass der interne Clock absolut ja 
ziemlich daneben liegt. Wenn ich das vom Timer hochrechne läuft der 
jetzt mit 56MHz.

Kann das sein?

Auf jeden Fall Danke, die Antworten haben mich auf den richtigen Pfad 
gebracht.

: Bearbeitet durch User
von Kai P. (n_2)


Lesenswert?

Hi,

Datenblatt 36.11.5:
Wenn Du den ULP nutzt, kann das theoretisch vom Internen kommen: 
38011*1500 ~ 57MHz

Aber: Du nutzt das Ding sicher bei Raumtemperatur und 3V3, dann dürfen 
es maximal knapp 52MHz sein. Der normale Interne ist ein bissle besser.

Da ich mich mit PLL nicht so gut auskenne, kann ich über den 
zusätzlichen Fehler, der über eine PLL reinkommt, leider nix sagen. Vom 
Prinzip her würde ich eine Erhöhung des Jitters erwarten aber keine 
weitere Frequenzverschiebung (da die Teiler ja ganzzahlig fest 
vorgegeben sind).

Daher würde ich bei 56MHz versuchen, herauszufinden, woran das liegt.

Gibt Dir den internen 32kHz Clock mal auf einem GPIO aus und messe erst 
mal diese Frequenz. Wenn die nach Spec ist, nochmal schauen, ob die 
Teiler der PLL alle wirklich richtig sind. Auch mal überlegen, ob der 
Messaufbau  das Messgerät  die Messmethode hinreichend genau sind. 
Kann der SAM schon "misshandelt" worden sein (ESD) ? Sich die Theorie 
einer PLL anschauen, ob dort noch Fehler entstehen können.


Dann an Microchip wenden :-)

Gruß N2

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.