Hallo zusammen,
ich versuche gerade die Core-Lib's vom XMEGA Arduino unter Atmel Studio
6 zu compilieren. Soweit so gut, Blink läuft.
Nun habe ich den Code für die interne 32Mhz Clock
durch folgenden
1 | // config external crystal, frequency between 12 and 16 Mhz
|
2 | OSC.XOSCCTRL |= ( OSC_FRQRANGE_12TO16_gc | OSC_XOSCSEL_XTAL_256CLK_gc ) ;
|
3 | // Enable external Crystal
|
4 | OSC.CTRL |= OSC_XOSCEN_bm;
|
5 | // Wait for it to stabilize
|
6 | while ( !(OSC.STATUS & OSC_XOSCRDY_bm) ) ;
|
7 | // Set external Clock activ
|
8 | CCP = CCP_IOREG_gc; // Secret handshake so we can change clock
|
9 | //CLK.CTRL = (CLK.CTRL & ~CLK_SCLKSEL_gm ) | CLK_SCLKSEL_XOSC_gc;
|
10 | // Config PLL external osc. 16MHz and set PLL factor 8 to get 128MHz
|
11 | OSC.PLLCTRL |= ( OSC_PLLSRC_XOSC_gc | OSC_PLLFAC3_bm );
|
12 | // enable PLL
|
13 | OSC.CTRL |= OSC_PLLEN_bm;
|
14 | // Set prescaler, div 1-2-2 -> 32MHz
|
15 | CCP = CCP_IOREG_gc; // Secret handshake so we can change clock
|
16 | CLK.PSCTRL = CLK.PSCTRL & (CLK_PSADIV_1_gc| CLK_PSBCDIV_2_2_gc);
|
17 | // Wait for it to stabilize
|
18 | while ( !(OSC.STATUS & OSC_PLLEN_bm) ) ;
|
19 | // Set main system clock to 32Mhz external clock
|
20 | CCP = CCP_IOREG_gc; // Secret handshake so we can change clock
|
21 | -> CLK.CTRL = (CLK.CTRL & ~CLK_SCLKSEL_gm ) | CLK_SCLKSEL_PLL_gc;
|
22 | // Disable unused osc
|
23 | // OSC.CTRL&= ~(OSC_RC2MEN_bm | OSC_RC32MEN_bm );
|
ersetzt.Zum testen habe ich noch folgendes Schnippsel eingebaut
1 | PORTK.DIR = 0xff; // all OUTPUT
|
2 | for(;;) {
|
3 | PORTK.OUTSET = PIN7_bm;
|
4 | _delay_ms(10);
|
5 | PORTK.OUTCLR = PIN7_bm;
|
6 | _delay_ms(10);
|
7 | }
|
Seitdem läuft die CPU völlig unrund. Ich hab mal mit Dragon nachgesehen
was sich da so tut. Der letzte Befehl der noch "richtig" ausgeführt wird
ist der mit Pfeil markierte. Danach PORTK.DIR... steht im Disass-code
ein SER R24. Register wird aber nicht mehr verändert. Der nächste Befehl
ist STS 0x0720, R24. Nach diesem Befehle verändert sich das Listing.
vorher:
PORTK.DIR = 0xff; // all OUTPUT
1 | ->000006E5 SER R24 Set Register
|
2 | 000006E6 STS 0x0720,R24 Store direct to data space
|
3 | PORTK.OUTSET = PIN7_bm;
|
4 | 000006E8 LDI R30,0x20 Load immediate
|
5 | 000006E9 LDI R31,0x07 Load immediate
|
6 | 000006EA LDI R24,0x80 Load immediate
|
nachher:
PORTK.DIR = 0xff; // all OUTPUT
1 | 000006E5 SER R24 Set Register
|
2 | 000006E6 ??? Could not decode instruction
|
3 | ->000006E7 CPC R18,R16 Compare with carry
|
4 | PORTK.OUTSET = PIN7_bm;
|
5 | 000006E8 LDI R30,0x20 Load immediate
|
6 | 000006E9 LDI R31,0x07 Load immediate
|
7 | 000006EA LDI R24,0x80 Load immediate
|
Mittlerweile bin ich scheinbar voll betriebsblind. Ich find
den Fehler einfach nicht.
Wenn jemande ne gute Idee hat???!!! Ich bin für jeden Vorschlag
offen.
Grüße
Bernie