Forum: Mikrocontroller und Digitale Elektronik Xmega und externer Quarz läuft nicht


von Johannes (Gast)


Angehängte Dateien:

Lesenswert?

Liebe Comunity,

ich habe (wie auch andere hier schon vor mir) Probleme einen externen 
Quarz am ATXmega zum laufen zu kriegen. Zur Umgebung:
Selbstentwickelte Platine mit ATXmega32A4U. Daran Angeschlossen ein 
16MHz Quarz mit 10pF Lastkapazität. Verbindungen sind alle geprüft. Also 
schliese ich erstmal die Hardware aus.

Ich habe ein kleines Testprogramm geschrieben das per Interrupt im 
Sekundentakt 2 Ausgänge toggelt. Es läuft auch aber mit einer Zeit von 
ca. 8sec. Daraus schließe ich das der Xmega anstatt auf 16MHz extern auf 
den 2MHz intern läuft.
1
/*
2
 * Mainteil_example.c
3
 *
4
 * Created: 18.07.2012 19:42:08
5
 *  Author: Johannes
6
 */ 
7
8
9
#include <avr/io.h>
10
#include <util/delay.h>
11
#include <avr/interrupt.h>
12
13
void Clock_init(void)
14
{
15
  OSC_XOSCCTRL = OSC_FRQRANGE_12TO16_gc | OSC_XOSCSEL_XTAL_256CLK_gc;    //Set 12-16MHz Crystal with 16k Clk-Cycles Startuptime
16
  OSC.CTRL |= OSC_XOSCEN_bm;                        //Select XTAL as Oscilator Input
17
  while(!(OSC.STATUS & OSC_XOSCRDY_bm));                  //wait for Stable Clock
18
  CCP = CCP_IOREG_gc;                            //Set write protectin
19
  CLK.CTRL = CLK_SCLKSEL_XOSC_gc;                      //Route Osc on Clock-tree
20
21
}
22
23
int main(void)
24
{
25
  
26
PORTE.DIR |= (1 << PIN2) | (1 << PIN3); //Set Pin 2 & 3 on Port E as OUT
27
PORTE.OUT |= (1 << PIN2);        //Pin 2 High treiben
28
PORTE.OUT &= ~(1 << PIN3);        //Pin 3 Low treiben
29
30
TCE0.CTRLA = TC_CLKSEL_DIV1024_gc;    //Aktiviere 16-Bit Timer 0 auf Port E mit Preescaler 1024
31
TCE0.CTRLB = 0x00;            //Mode = Normal Operation
32
TCE0.INTCTRLA = 0x03;          //Set Overflow Interrupt
33
TCE0.PER = 0xC2F6;            //Set Overflowpoint according to one second : 65536-Clk/Prescaler
34
35
36
sei();                  //Enable Interrupts
37
PMIC.CTRL |= PMIC_LOLVLEN_bm | PMIC_MEDLVLEN_bm | PMIC_HILVLEN_bm;        //Accept all Interruptlevels
38
39
    while(1)
40
    {
41
        //TODO:: Please write your application code 
42
    }
43
}
44
45
ISR(TCE0_OVF_vect)            //Interrupt Routine for Overflow on TCE0
46
{
47
  PORTE.OUTTGL = (1 << PIN2);      //Toggle Pin2
48
  PORTE.OUTTGL = (1 << PIN3);      //Toggle Pin3
49
}

Kann bitte sich mal jemand den angefügten Code anschauen, ins besondere 
die Initialisierung von CLK und OSC.

von Mike R. (thesealion)


Lesenswert?

Wenn das dein Programm ist, dann rufst du
1
void Clock_init(void);

niemals auf. Also bleibt dem µC nichts anderes übrig als mit dem 
internen Takt zu laufen.

von Johannes (Gast)


Lesenswert?

Hust

Thread kann zu uns am besten gleich verstecken :D
Vielen Dank an Mike! Hab soo lange im Inhalt gesucht und hab das 
garnicht bemerkt...

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.