-         

Ergebnis 1 bis 7 von 7

Thema: Frequenz vom Xmega geht nicht umzustellen

  1. #1
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    17.11.2005
    Beiträge
    272

    Frequenz vom Xmega geht nicht umzustellen

    Anzeige

    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:
    Code:
        //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 151. 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.
    Code:
    #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
    Unser Wissen ist ein Tropfen, unser Unwissen ist wie ein Ozean.
    Sir Isaac Newton

  2. #2
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    21.06.2011
    Ort
    Dresden
    Beiträge
    170
    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

  3. #3
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    17.11.2005
    Beiträge
    272
    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
    Unser Wissen ist ein Tropfen, unser Unwissen ist wie ein Ozean.
    Sir Isaac Newton

  4. #4
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    11.12.2007
    Ort
    weit weg von nahe Bonn
    Alter
    33
    Beiträge
    2.378
    ä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!
    Es gibt 10 Sorten von Menschen: Die einen können binär zählen, die anderen
    nicht.

  5. #5
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    21.06.2011
    Ort
    Dresden
    Beiträge
    170
    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

  6. #6
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    17.11.2005
    Beiträge
    272
    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
    Unser Wissen ist ein Tropfen, unser Unwissen ist wie ein Ozean.
    Sir Isaac Newton

  7. #7
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    17.11.2005
    Beiträge
    272

    Cool Frequenz vom Xmega geht nicht umzustellen (gelöst)

    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?n...wtopic&t=79486

    So, weiter gehts mit c lernen

    cu Arno
    Unser Wissen ist ein Tropfen, unser Unwissen ist wie ein Ozean.
    Sir Isaac Newton

Ähnliche Themen

  1. problem mit K6 (geht, geht nicht...)
    Von ijjiij im Forum Asuro
    Antworten: 3
    Letzter Beitrag: 17.12.2010, 18:19
  2. ISP-Frequenz mit AVRLab ändern funktioniert nicht [gelöst]
    Von 021aet04 im Forum AVR Hardwarethemen
    Antworten: 3
    Letzter Beitrag: 11.05.2010, 14:21
  3. Nicht-invertierender OpAmp, Rechnung geht nicht
    Von Crock im Forum Elektronik
    Antworten: 6
    Letzter Beitrag: 26.06.2008, 14:51
  4. USB-ISP geht nicht und Bascom 2.0.14.0 auch nicht
    Von enterprise30 im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 4
    Letzter Beitrag: 10.03.2008, 12:32
  5. Programm wird bei geänderter Frequenz nicht mehr ausgeführt
    Von cesupa im Forum AVR Hardwarethemen
    Antworten: 3
    Letzter Beitrag: 19.08.2007, 01:50

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •