Probleme mit System Clock Prescaler (CLKPR)

Gast #2862882
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
Gast #2862917
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
Moderator Persönliche Seite #2863553
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren