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
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