Clock setzen mit einem ATxMega128A1

OP #2310693
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
Gast #2311607
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;
OP #2311625
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
#2311777
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
OP #2311785
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
#2311803
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
OP #2311817
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
#2311827
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!
OP #2311848
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
OP #2311878
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
OP #2311927
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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren