PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : [ERLEDIGT] Frequenz vom Xmega geht nicht umzustellen



Olle_Filzlaus
10.09.2011, 23:06
Hallo Leute,

bastel zur Zeit gerade mit nem Xmega rum. Komme da auch langsam rein in die Programmierung. Nur ein was will nicht gehen. Und zwar bietet der Xmega die Möglichkeit im Betrieb die Taktfrequenz umzustellen. Standard läuft der erstmal auf 2MHz. Jetzt habe ich mir vom Stromflo Xmega Tut den Code dafür genommen, aber es passiert nichts. Zur Kontrolle habe ich ein kleines Programm geschrieben was mit einem Counter einfach bis 2000 Zählt und dann eine LED toggled. Also ändet sich ja mit der Taktfrequenz auch die Blinkfrequenz. Aber das tut es nicht.

Hier mal der Programmteil vom Stromflo Tut:


//32MHZ
/*OSC.CTRL |= OSC_RC32MEN_bm;
Warten bis der Oszillator bereit ist
while(!(OSC.STATUS & OSC_RC32MRDY_bm));
CCP = CCP_IOREG_gc;
CLK.CTRL = (CLK.CTRL & ~CLK_SCLKSEL_gm) | CLK_SCLKSEL_RC32M_gc;
*/


Ich habe daraufhin mal per JTAG im Chip nachgeschaut was der so alles macht und habe festgestellt, dass er garnichts macht. Die Adresse vom OSC Controll Register bleibt immer auf 0x00 stehen. Das sind 2MHz. Auch wenn die Routine zum Umstellen durchlaufen wird, ändert sich nichts. Die Freigabe für das schreiben auf das Register wird auch gesetzt. Habe auch andere Codeschnippsel ausprobiert, aber immer mit dem selben Erfolg.

Das einzige was funzt um den Takt umzustellen ist das Beispielprogramm von Atmel. (Program 1518). DA mussman aber viele Header und C-Files eibinden. Muss doch auch einfacher gehen :-)

Ich benutze ein Atxmega 128A1 Testboard und ein AVR Dragon als JTAG Interface. Programmieren in AVR Studio 5.

Hier mal das ganze Testprogramm.


#include <avr/io.h>

//Test mit Pin Definieren
#define LED_OUT PORTE.OUT // legt den Namen für das Ausgangsregister von PORTE fest
#define LED_DDR PORTE.DIR // legt den Namen für das Datenrichtungsregister von PORTE fest
#define LED_PIN PIN3 // definiert einen Namen für einen bestimmten Ausgang in dem Fall 0

//Define der Buttons
#define Button_In PORTF.in //Legt den Port für die Button fest
#define Button_DDR PORTF.DIR //Definiert das DAtenrcithugns´register fest
#define Button_01 PIN0 // Taster 0 als Button der Wahl

void clock_init(void);

void setClockTo2MHz(void);
void setClockTo32MHz(void);

int main (void)
{
setClockTo32MHz(); //Oszillator einstellen

Button_DDR = 0x00; //Eingang
LED_DDR = 0xff; // Alle Pins von PORTE werden auf Ausgang gesetzt -> andere Variante :-)

PORTE.OUTSET = 0xff;

unsigned int counter = 0;

while(1)
{
//// um ein Gefühl für die CPU Frequenz zu bekommen
counter++;
if (counter > 20000 )
{
LED_OUT ^= (1<<LED_PIN);
counter=0;
}
}
}

//2MHZ
void setClockTo2MHz(void)
{
OSC.CTRL |= OSC_RC2MEN_bm;
// Warten bis der Oszillator bereit ist
while(!(OSC.STATUS & OSC_RC2MRDY_bm));
CCP = CCP_IOREG_gc;
CLK.CTRL = (CLK.CTRL & ~CLK_SCLKSEL_gm) | CLK_SCLKSEL_RC2M_gc;
}

void setClockTo32MHz(void)
{
OSC.CTRL |= OSC_RC32MEN_bm;
//Warten bis der Oszillator bereit ist
while(!(OSC.STATUS & OSC_RC32MRDY_bm));
CCP = CCP_IOREG_gc;
CLK.CTRL = (CLK.CTRL & ~CLK_SCLKSEL_gm) | CLK_SCLKSEL_RC32M_gc;
}


Falls jemand ein Tipp hat, immer her damit.

Danke Arno

seite5
11.09.2011, 10:42
hallo,
bei mir geht's so:

// TAKT
OSC.XOSCCTRL=0b01100011; // frange 2...9 MHz, XTAL-256CLK
OSC.PLLCTRL=0b11000100; // xtern Source, faktor 4
OSC.CTRL=0b00011000; // PLL_ENABLE, XOSC_ENABLE
while((OSC.STATUS & 0b00011000) != 0b00011000) {}
CLK.PSCTRL=0; // No division (@ all)
CCP=0xD8;
CLK.CTRL=0b00000100; // clk-source: PLL

mfg
Achim

Olle_Filzlaus
12.09.2011, 08:22
Hi,

danke für den Beispielcode, aber leider geht der auch nicht. Ich habe gestern mal bissel mitten simulator gespielt und festgestellt, dass ich die Registerschreibfreigabe setze. Dann bleibt die ja genau 4Zyklen freigeschalten und ich kann die Frequenz umschalten. Das macht er aber nicht. Habe den eindruck das er am Ende das Bit für 2MHz und das für 32MHz drin stehen hat. Aber das war gestern Abend dann spät geworden, deswegen muss ich das nochmal genau checken.

Was ich nur immer noch total verwirrend finde ist das mit Bits setzten und löschen. Ich komme aus der µC Bascom Programmierung, da ist das total einfach. Auf Arbeit arbeite ich ab und zu mit C# und c++. Also bin ich in c/c++ noch bissel drin. Aber setzten in AvrGcc finde ich total verwirrend :-( Naja, mal schauen. Hoffe ich raff das bald mal. Und mit der Frequenz auch noch dazu :-)

Danke für die Hilfe, wenn noch jemand nen Tipp hat oder einfach mal ein kleines Beispielprogramm. Vielleicht vergesse ich ja irgendwas zu Initialisieren oder so.

cu Arno

Ceos
12.09.2011, 10:57
ähm ... das ist bei dem xmega auch nicht gerade komfortabel gelöst mit den ganzen structs ... ich wünscht sie wären bei einfachen register defines geblieben, auch wenn die zahl der register enorm gestiegen ist!

seite5
12.09.2011, 12:42
Hallo,
- hatte vergessen: vor diese Code-Beispiel (das bei mir auf ALVIDI-Board / Codevision läuft) steht natürlich ein CLI.
- bit setzen / löschen find ich beim Xmega recht komfortabel:
#define bit5 5
// setzen
PORTC.OUTSET=(1<<bit5);
// löschen
PORTC.OUTCLR=(1<<bit5);
mfg
Achim

Olle_Filzlaus
14.09.2011, 09:27
Hallo,

ich habe das it dem CLI mal probiert. Funktioniert auch nicht. Was eigentlich klar ist. CLI schaltet ja die Interrupts aus. Dadurch das man aber die Register die Schreibfreigabe erteilt, werden die globalen Interrupts abgeschaltet. Für genau 4 Zyklen. Habs jetzt aber hinbekommen im Debugmodus die Register per Hand so zu ändern, dass ich ihn auf 32MHz umstellen konnte. Komme zur Zeit nur leider nicht wirklich zum basteln. Deswegen wird das noch ne Weile dauern. Halte euch aber auffen laufenden. Muss ja gehen :-)

thx Arno

Olle_Filzlaus
28.09.2011, 21:35
Hallo Leute,

habs hinbekommen. War ja klar das der Fehler bei mir liegt. Der Beispielcode geht ja bei anderen :-)

Der Fehler war die Codeoptimierung. Die muss man unbedingt auf -0s einstellen. Sonst wird der Programmcode nicht effektiv genug umgewandelt und er braucht mehr als 4 Zyklen um das umzustellen. Deswegen ging es nicht.

http://www.avrfreaks.net/index.php?name=PNphpBB2&file=viewtopic&t=79486

So, weiter gehts mit c lernen :-)

cu Arno