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.