Forum: Mikrocontroller und Digitale Elektronik Problem bei Inbetriebnahme eines AtxMega128


von asdf (Gast)


Lesenswert?

Hallo,

Mein Atxmega128 macht mich schön langsam fertig...

Ich habe ein selbst gebauts Board, das einen Atxmega128 besitzt. Als 
Taktquelle benutze ich einen externen Quarz 16MHz.

Nun möchte ich einfach an einem Port 0x00 ausgeben. Aber ich messe 
ständig am PIN0 high (3.2V) -> also 0x01

Wenn ich mich mit dem Debugger dranhänge sehe ich, dass im OUT Register 
0x00 steht und im IN Register 0x01. wenn ich dann über den Debugger das 
IN Register auf 0x00 stelle, dann messe ich am PIN auch logisch 0.
So nun verstehe ich aber nicht warum ständig im IN Register des Ports 
0x01 steht. Ich mache ja gar nichts mit dem IN Register.

Meine Vermutung ist jetzt folgende...
Ich denke, dass es mit der Config für den externen Quarz zu tun hat.
Weil wenn ich dieses Programm mit dem AVR Simulator laufen lasse 
funktioniert es. Im OUT steht klarerweise 0x00 und im IN auch.

Hier kurz mein Code:
1
#define F_CPU 16000000UL  /* 16 MHz CPU clock */
2
3
#include <util/delay.h>
4
#include <avr/io.h>
5
//#include "ethernet.h"
6
7
int main(void) {
8
9
   OSC.XOSCCTRL |= (1<<OSC_FRQRANGE0_bp) | (1<<OSC_FRQRANGE1_bp); //Frequency Range 12-16 MHz
10
   OSC.XOSCCTRL |= (1<<OSC_XOSCSEL0_bp)| (1<<OSC_XOSCSEL1_bp); //0,4 - 16Mhz XTAL 256CLK
11
12
   OSC.CTRL |= (1<<OSC_XOSCEN_bp); //extern Oszillator enable
13
   for(;(OSC_STATUS & (1<<OSC_XOSCRDY_bp)) == 0;); //warten bis Quarz ready
14
   OSC.PLLCTRL |= (1<<OSC_PLLSRC0_bp) | (1<<OSC_PLLSRC1_bp); //Clock Source
15
   CCP = 0xD8;
16
   CLK.CTRL = 0x03;
17
   OSC.CTRL &= ~(1<<OSC_RC2MEN_bp); //Disable 2MHz internal RC
18
19
   PORTJ.DIR = 0xFF;
20
   PORTJ.OUT = 0x00;
21
22
   while(1) {
23
   }
24
25
   return (0);
26
}

Weiß vielleicht jemand wo hier das Problem liegt??

Vielen Dank!

von Gerhard G. (g_g)


Lesenswert?

Hallo,

in deinem Code finde ich das Quarz nicht: OSC_FRQRANGE_12TO16_gc


Mein Code:

16 Mhz Quarz mit 2*PLL
16 Mhz * 2 = 32Mhz
kann im mittleren Teil auf 16 Mhz eingestellt werden!


void system_clocks_init(void)
{
unsigned char n,s;
s=SREG;
cli();
OSC.XOSCCTRL=OSC_FRQRANGE_12TO16_gc | OSC_XOSCSEL_XTAL_16KCLK_gc;
OSC.CTRL|=OSC_XOSCEN_bm;
while ((OSC.STATUS & OSC_XOSCRDY_bm)==0);
n=(OSC.PLLCTRL & (~(OSC_PLLSRC_gm | OSC_PLLFAC_gm))) |
OSC_PLLSRC_XOSC_gc | 2;
CCP=CCP_IOREG_gc;
OSC.PLLCTRL=n;
OSC.CTRL|=OSC_PLLEN_bm;
// System Clock prescaler A division factor: 1
// System Clock prescalers B & C division factors: B:1, C:1
// ClkPer4: 32000,000 kHz
// ClkPer2: 32000,000 kHz
// ClkPer:  32000,000 kHz
// ClkCPU:  32000,000 kHz
n=(CLK.PSCTRL & (~(CLK_PSADIV_gm|CLK_PSBCDIV1_bm|CLK_PSBCDIV0_bm)))|
CLK_PSADIV_1_gc | CLK_PSBCDIV_1_1_gc;    // 32Mhz
//CLK_PSADIV_2_gc | CLK_PSBCDIV_1_1_gc;  // 16Mhz
CCP=CCP_IOREG_gc;
CLK.PSCTRL=n;
while ((OSC.STATUS & OSC_PLLRDY_bm)==0);
n=(CLK.CTRL & (~CLK_SCLKSEL_gm)) | CLK_SCLKSEL_PLL_gc;
CCP=CCP_IOREG_gc;
CLK.CTRL=n;
OSC.CTRL&= ~(OSC_RC2MEN_bm | OSC_RC32MEN_bm | OSC_RC32KEN_bm);
PORTCFG.CLKEVOUT=(PORTCFG.CLKEVOUT & (~PORTCFG_CLKOUT_gm)) | 
PORTCFG_CLKOUT_OFF_gc;
SREG=s;
}

von asdf (Gast)


Lesenswert?

Hallo,

Danke für deine Antwort!

In meinem Code sollte die Configuration für ein externen 16Mhz Quarz mit 
folgender Zeile implementiert sein:
1
OSC.XOSCCTRL |= (1<<OSC_FRQRANGE0_bp) | (1<<OSC_FRQRANGE1_bp); //Frequency Range 12-16 MHz

Sollte ja nach meinem Verständis her selbe Auswirkung haben wie folgende 
Zeile in deinem Code:
1
OSC.XOSCCTRL=OSC_FRQRANGE_12TO16_gc;

Oder verstehe ich jetzt was falsch?

Vielen Dank!!

von asdf (Gast)


Lesenswert?

Hallo,

Das Problem ist gelöst!!
Es war ein Hardwarefehler...
eine Minimale Brücke von dem PIN auf die Versorgungsspannung!!

Vielen Dank!!

von Gerhard G. (g_g)


Lesenswert?

Hallo,

da hast du Recht, du verwendest direkt die Registernamen.

Du verwendest, so wie ich das auf die Schnelle gesehen habe, einen 
Ceramik-Schwinger.

Im Datenblatt findest du eine Randnotiz (with ceramic resonators)



OSC.XOSCCTRL |= (1<<OSC_XOSCSEL0_bp)| (1<<OSC_XOSCSEL1_bp); //0,4 - 
16Mhz XTAL 256CLK

0011 XTAL_256CLK(1) 0.4MHz - 16MHz XTAL 256 CLK //Ceramik-Schwinger



1011 XTAL_16KCLK 0.4MHz - 16MHz XTAL 16K CLK // Quarz


Gruß G.G.

von asdf (Gast)


Lesenswert?

Hallo,

Sorry das ich erst jetzt antworte.

Ok das heißt ich habe aber trotzdem etwas falsch konfiguriert.
Ich benutze einen externen Quarz und keinen Ceramik Schwinger.

Interessant ist das es jetzt trotzdem funktioniert.

Vielen dank auf jedenfall nochmal!

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.