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

Eine eigene Frage? Dieser Thread ist über 14 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.