Forum: Compiler & IDEs Probleme mit System Clock Prescaler (CLKPR)


von Simon Reiser (Gast)


Lesenswert?

Hallo liebe Gemeinde,

ich habe folgendes Problem das ich mit Hilfe des „clock_prescale_set(x)“ 
den CPU Takt reduzieren kann und meine Anwendung damit abarbeiten. Nach 
dem Abarbeiten möchte ich die CPU wieder in ausgangs Frequenz setzten 
das ich die Daten senden kann. Leider Taktet aber die CPU weiter in 
reduzierter Geschwindigkeit. Mit Oszi gemessen.

Bei mir Handelt es sich um einen ATmega644 der ohne Takt Reduzierung mit 
20MHz läuft.
Den Quellcode habe ich auch ohne Optimierung generiert aber das leider 
keinen Einfluss.
Ich bin inzwischen verzweifelt, kann bitte mir einer von euch helfen?

int main( void )
{

  //Alle Unterprogrammen initialisieren
  init_prog();

    //Alle Variablen in den Unterprogrammen initialisieren
  init_var();


    /* loop forever */
    for( ; ; ){
    if (timer2_get_ISR_flag(1) == TRUE){

      //CPU Takt reduzieren

      while(clock_div_8 != clock_prescale_get()){
        cli();
        clock_prescale_set(clock_div_8);
        sei();
      }

      //Programm Abarbeitung
      ftaste1();
      ftaste2();
      ftaste5();

      //CPU Takt zurücksetzten
      while(clock_div_8 != clock_prescale_get()){
        cli();
        clock_prescale_set(clock_div_8);
        sei();
      }

      if (timer2_get_ISR_flag(2) == TRUE){
        Custom_1bis8_Standard();
      }
    }
}

Vielen Dank schon im Voraus

von Stefan E. (sternst)


Lesenswert?

Simon Reiser schrieb:
> Leider Taktet aber die CPU weiter in
> reduzierter Geschwindigkeit.

Nicht weiter verwunderlich, wenn du bei "CPU Takt zurücksetzten" den 
gleichen Teiler benutzt, wie bei "CPU Takt reduzieren".

von Simon Reiser (Gast)


Lesenswert?

Vielen Dank Herr Ernst,

Entschuldigung das habe ich leider gerade falsch zusammen kopiert.


int main( void )
{

  //Alle Unterprogrammen initialisieren
  init_prog();

    //Alle Variablen in den Unterprogrammen initialisieren
  init_var();


    /* loop forever */
    for( ; ; ){
    if (timer2_get_ISR_flag(1) == TRUE){

      //CPU Takt reduzieren

      while(clock_div_8 != clock_prescale_get()){
        cli();
        clock_prescale_set(clock_div_8);
        sei();
      }

      //Programm Abarbeitung
      ftaste1();
      ftaste2();
      ftaste5();

      //CPU Takt zurücksetzten
      while(clock_div_1 != clock_prescale_get()){
        cli();
        clock_prescale_set(clock_div_1);
        sei();
      }
    }
    if (timer2_get_ISR_flag(2) == TRUE){
      Custom_1bis8_Standard();
    }
  }
}

Vielen Dank

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Simon Reiser schrieb:
> Entschuldigung das habe ich leider gerade falsch zusammen kopiert.

Dann kopier' nichts zusammen, sondern gib uns genau den Code, der
nicht läuft.

Die Schleifen um den Clock Prescaler sind auch nicht gerade sinnvoll.
Entweder lässt sich das Register setzen, dann musst du den Wert nicht
noch abfragen, oder sie lassen sich nicht setzen, dann kannst du auch
gleich "while (1)" da hin schreiben.

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.