Forum: Mikrocontroller und Digitale Elektronik Clock setzen mit einem ATxMega128A1


von Luca B. (lucabert)


Lesenswert?

Hallo, Leute!

Ich habe eine Schaltung mit einer ATxMega128A1. An diesem µC ist einen 
32MHz-Quarz angeschloßen.
Nun versuche ich den Clock zu setzen:
1
  OSC.CTRL = OSC_RC32MEN_bm; //enable 32MHz oscillator
2
  while(!(OSC.STATUS & OSC_RC32MRDY_bm));   //wait for stability
3
  CCP = CCP_IOREG_gc; //secured access
4
  CLK.CTRL = 0x01; //choose this osc source as clk

Nun, wenn ich flashe wird das Programm erstmal nichts machen. Auch ein 
Reset hilft nicht. Ich muss Strom rausnehmen und wieder einschalten, und 
dann geht es...

Nun, das ist definitiv nicht normal. Es ist aber für mich das erste Mal, 
daß ich einen XMega nutze.
Kann jemand mir sagen, was ich falsches mache?

Danke
Luca Bertoncello

von spovi1 (Gast)


Lesenswert?

wenn das ein angeschlossener Quarz ist, musst du das dem noch sagen. ich 
mach das mit meinem 16MHz Quarz so:
1
// Crystaloszillator (16MHz) auswählen
2
OSC.XOSCCTRL = 0xCB;
3
OSC.CTRL = OSC_XOSCEN_bm;
4
 // Warten bis Oszillator stabil ist
5
while ((OSC.STATUS & OSC_XOSCRDY_bm) == 0);
6
// I/O Protection
7
CCP = CCP_IOREG_gc;
8
// System Clock selection
9
CLK.CTRL = CLK_SCLKSEL_XOSC_gc;

von Luca B. (lucabert)


Lesenswert?

spovi1 schrieb:
> wenn das ein angeschlossener Quarz ist, musst du das dem noch sagen. ich
> mach das mit meinem 16MHz Quarz so:
>
1
> // Crystaloszillator (16MHz) auswählen
2
> OSC.XOSCCTRL = 0xCB;
3
> OSC.CTRL = OSC_XOSCEN_bm;
4
>  // Warten bis Oszillator stabil ist
5
> while ((OSC.STATUS & OSC_XOSCRDY_bm) == 0);
6
> // I/O Protection
7
> CCP = CCP_IOREG_gc;
8
> // System Clock selection
9
> CLK.CTRL = CLK_SCLKSEL_XOSC_gc;
10
>

Aha, danke!

Ich werde probieren, allerdings jetzt haben wir viele andere 
Hardwareprobleme...
'ne Frage hätte ich noch: habe ich von der Datenblatt richtig 
verstanden, daß ich maximal einen 16MHz-Quarz anschließen kann?
Weil die Idioten, die die Platine gemacht haben, einen 32MHz-Quarz 
benutzt haben...

Ansonsten, Ersatzfrage: wie kann ich die interne 32MHz-Oszillator 
nutzen?

Danke
Luca Bertoncello

von Sven F. (mr_sven)


Lesenswert?


von Carsten W. (eagle38106)


Lesenswert?

Hi,

man kann extern nur maximal einen 16MHz Quarz anschließen (siehe 
Datenblatt)!

1
//! \brief CCP write helper function written in assembly.
2
//!
3
//! This function is written in assembly because of the time critical operation of writing to
4
//! the registers. (From clksys_driver.c of the Atmel application note AVR1003)
5
//!
6
//! \param address A pointer to the address to write to.
7
//! \param value   The value to put in to the register.
8
9
void CCPWrite (tVUINT8* address, tUINT8 value)
10
{
11
  tVUINT8* tmpAddr = address;
12
13
#ifdef RAMPZ
14
  RAMPZ = 0;
15
#endif
16
  asm volatile
17
  (
18
    "movw r30,  %0"      "\n\t"
19
    "ldi  r16,  %2"      "\n\t"
20
    "out   %3, r16"      "\n\t"
21
    "st     Z,  %1"      "\n\t"
22
    :
23
    : "r" (tmpAddr), "r" (value), "M" (CCP_IOREG_gc), "i" (&CCP)
24
    : "r16", "r30", "r31"
25
  );
26
}
27
28
29
//! Configure the oscillator from internal 2MHz clock to external 8MHz crystal and internal
30
//! PLL quadruplication.
31
32
void SwitchOscFromInternal_2M_to_ext8M_w_PLLx4 (void)
33
{
34
35
  // Switch to external crystal (8 MHz) and wait for it to become stable.
36
  OSC.XOSCCTRL = OSC_FRQRANGE_2TO9_gc | OSC_XOSCSEL_XTAL_16KCLK_gc;
37
38
  OSC.CTRL = OSC_XOSCEN_bm | OSC_RC2MEN_bm;
39
  while ((OSC.STATUS & OSC_XOSCRDY_bm) != OSC_XOSCRDY_bm);
40
41
  // Set all the prescalers after the PLL to 1
42
  CCPWrite (&CLK.PSCTRL, CLK_PSADIV_1_gc | CLK_PSBCDIV_1_1_gc);
43
44
  // Activate the PLL with a multiplier of four to generate 32 MHz out of 8 MHz.
45
  OSC.PLLCTRL  = 4 << OSC_PLLFAC_gp | OSC_PLLSRC_XOSC_gc;
46
47
  OSC.CTRL = OSC_XOSCEN_bm | OSC_RC2MEN_bm | OSC_PLLEN_bm;
48
  while ((OSC.STATUS & OSC_PLLRDY_bm) != OSC_PLLRDY_bm);
49
50
  // Switch from internal 2 MHz to 32 MHz PLL output.
51
  CCPWrite (&CLK.CTRL, CLK_SCLKSEL_PLL_gc);
52
}

So gehts!
Gruß
Carsten

von Luca B. (lucabert)


Lesenswert?

Carsten Wille schrieb:

> man kann extern nur maximal einen 16MHz Quarz anschließen (siehe
> Datenblatt)!

Gut, dann es bestätigt mir, daß die Typen, die die Schaltung gemacht 
haben, tatsächlich Idioten sind...
Und sie haben sogar selber diese Sorte µC (mein originaler Plan war 
mit einem ATMega1280), weil sie es so gut kennen...
Oh, Mann!

Dann ist die Frage, ob diese externe 32MHz-Quarz Probleme verursachen 
kann, auch wenn man nur die interne Oszillator nutzt (was allerdings 
nicht empfehlswert ist, wegen der Genauigkeit)...

Grüße und Danke!
Luca Bertoncello

von Carsten W. (eagle38106)


Lesenswert?

Ein extern angeschlossener Quarz kann immer dranbleiben. Die Taktwahl 
wird intern durch einen Multiplexer umgeschaltet. Die verschiedenen 
Takte stören sich dabei nicht.

Man kann mit einem externen 32MHz Oszillator direkt 32MHz einspeisen. 
Ist aber nur unnötig teuer.

Der interne Oszillator ist für einefache Software-Aufgaben hinreichend 
genau. Aber schon für den Betrieb der seriellen Schnittstelle reicht 
seine Genauigkeit nicht mehr aus.

Carsten

von Luca B. (lucabert)


Lesenswert?

Carsten Wille schrieb:
> Ein extern angeschlossener Quarz kann immer dranbleiben. Die Taktwahl
> wird intern durch einen Multiplexer umgeschaltet. Die verschiedenen
> Takte stören sich dabei nicht.

OK! Und was passiert wenn ich, aus Versehen (wie gestern passiert ist, 
weil ich nicht wusste, daß es 32MHz ist) versuche es zu nutzen?
Einfach läuft der µC nicht (wie hat es gemacht) aber wird nicht 
beschädigt, oder passiert noch was schlimmeres?

> Man kann mit einem externen 32MHz Oszillator direkt 32MHz einspeisen.
> Ist aber nur unnötig teuer.

Das werden wir aber wahrscheinlich brauchen...

> Der interne Oszillator ist für einefache Software-Aufgaben hinreichend
> genau. Aber schon für den Betrieb der seriellen Schnittstelle reicht
> seine Genauigkeit nicht mehr aus.

Wir müssen mehrere Geräten über SPI ansteuern, sowie Daten von DCF77 
empfangen (nötige Genauigkeit: 40mS).

Grüße
Luca Bertoncello

von Carsten W. (eagle38106)


Lesenswert?

Luca Bertoncello schrieb:
> Das werden wir aber wahrscheinlich brauchen...
>
>> Der interne Oszillator ist für einefache Software-Aufgaben hinreichend
>
>> genau. Aber schon für den Betrieb der seriellen Schnittstelle reicht
>
>> seine Genauigkeit nicht mehr aus.
>
> Wir müssen mehrere Geräten über SPI ansteuern, sowie Daten von DCF77
>
> empfangen (nötige Genauigkeit: 40mS).

Na, da wird doch wohl ein 8MHz Quarz plus interne PLL mit Faktor 4 mehr 
als genau genug sein!

von Luca B. (lucabert)


Lesenswert?

Carsten Wille schrieb:
> Na, da wird doch wohl ein 8MHz Quarz plus interne PLL mit Faktor 4 mehr
> als genau genug sein!

Gut, aber die Frage war "ist der interne 32MHz-Oszillator genau 
genug?"...

Grüße
Luca Bertoncello

von Carsten W. (eagle38106)


Lesenswert?

Luca Bertoncello schrieb:
> Carsten Wille schrieb:
>> Na, da wird doch wohl ein 8MHz Quarz plus interne PLL mit Faktor 4 mehr
>> als genau genug sein!
>
> Gut, aber die Frage war "ist der interne 32MHz-Oszillator genau
> genug?"...
>
> Grüße
> Luca Bertoncello

Nein! Der interne 2MHz Osc. ist schon nicht genau genug, der 32er erst 
recht nicht.

von Luca B. (lucabert)


Lesenswert?

Carsten Wille schrieb:
> Luca Bertoncello schrieb:
>> Carsten Wille schrieb:
>>> Na, da wird doch wohl ein 8MHz Quarz plus interne PLL mit Faktor 4 mehr
>>> als genau genug sein!
>>
>> Gut, aber die Frage war "ist der interne 32MHz-Oszillator genau
>> genug?"...
>>
>> Grüße
>> Luca Bertoncello
>
> Nein! Der interne 2MHz Osc. ist schon nicht genau genug, der 32er erst
> recht nicht.

Das dachte ich mir...
Also, die ganze Platine, die $bigbucks gekostet hat, ist wegzuschmeißen 
und neu zu entwickeln.
Und mein Chef wird wahrscheinlich mit den Idioten darüber sprechen. Mit 
einem großen Hammer...

Ich danke euch!
Luca Bertoncello

von Carsten W. (eagle38106)


Lesenswert?

Luca!

Tausche auf Deinem Board einfach den 32MHz Quarz gegen einen 8MHz aus 
und verwende die Software, die ich oben gepostet habe. Die macht aus den 
externen 8 MHz stabile interne 32 MHz.

Carsten

von Luca B. (lucabert)


Lesenswert?

Carsten Wille schrieb:

> Tausche auf Deinem Board einfach den 32MHz Quarz gegen einen 8MHz aus
> und verwende die Software, die ich oben gepostet habe. Die macht aus den
> externen 8 MHz stabile interne 32 MHz.

Erstmal spreche ich mit meinem Chef... Letzten Endes, muss er 
entscheiden, was mit der Platine passiert.
Dann, wenn er doch entscheidet den Quarz einfach zu tauschen, habe ich 
sicher keinerlei Problem damit...

Aber, wie schon gesagt, auf der Platine sind derzeit eine Menge andere 
HW-Probleme dabei, und man muss vorher entscheiden, ob man noch Zeit 
verlieren will, sie zu beheben oder einfach von der Firma, die das Ding 
gemacht hat, verlangen, daß sie selber alles neubauen.

Grüße und besten Dank!
Luca Bertoncello

von Luca B. (lucabert)


Lesenswert?

Carsten Wille schrieb:

> Tausche auf Deinem Board einfach den 32MHz Quarz gegen einen 8MHz aus
> und verwende die Software, die ich oben gepostet habe. Die macht aus den
> externen 8 MHz stabile interne 32 MHz.

Eine Sache, die ich gerade gedacht habe: wäre es nicht besser, einen 
externen 16MHz-Quarz mit internen PLL mit Faktor 2?
Als Programmierer (kein Elektroniker!) würde ich sagen, daß es sogar 
stabiler sein sollte...

Denke ich falsch?

Danke
Luca Bertoncello

von Simon K. (simon) Benutzerseite


Lesenswert?

Wenn das doch gar keine Hardware von dir ist, kann dir das doch egal 
sein. Du hast doch dann keinen Mist verzapft, sondern jemand anders ;-).

Was für einen Quarz du nimmst ist (in dem erlaubten Rahmen) eigentlich 
egal.

von Luca B. (lucabert)


Lesenswert?

Simon K. schrieb:

> Was für einen Quarz du nimmst ist (in dem erlaubten Rahmen) eigentlich
> egal.

Ja, aber meine Frage war: ist es besser ein 8MHz-Quarz mit PLL *4 oder 
ein 16MHz-Quarz mit PLL *2? Warum?

Danke
Luca Bertoncello

von Carsten W. (eagle38106)


Lesenswert?

Die Langzeitstabilität ist die gleiche.
Aber der Jitter bei einem PLL-Faktor von 4 dürfte eine klitzkleines 
bischen größer sein als beim Faktor 2. Aber auf jeden Fall 
vernachlässigbar.

von Simon K. (simon) Benutzerseite


Lesenswert?

Luca Bertoncello schrieb:
> Simon K. schrieb:
>
>> Was für einen Quarz du nimmst ist (in dem erlaubten Rahmen) eigentlich
>> egal.
>
> Ja, aber meine Frage war: ist es besser ein 8MHz-Quarz mit PLL *4 oder
> ein 16MHz-Quarz mit PLL *2? Warum?

Und meine Antwort war: "Es ist egal".

von Luca B. (lucabert)


Lesenswert?

Carsten Wille schrieb:
> Die Langzeitstabilität ist die gleiche.
> Aber der Jitter bei einem PLL-Faktor von 4 dürfte eine klitzkleines
> bischen größer sein als beim Faktor 2. Aber auf jeden Fall
> vernachlässigbar.

OK, verstanden!

Besten Dank!
Luca Bertoncello

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.