mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Frage : Vorteiler CLKPR


Autor: M. B. (freiberger77)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,
ich habe bisher den System-Takt nur über FUSE-Bit (CKDIV8) eingestellt.
Jetzt möchte ich aber den Takt per Software steuern.

Der AVR (ATTiny2313) soll die ganze Zeit mit sehr niedriger Frequenz 
laufen, aber bei Bedarf Daten senden (mit Quarztakt - CKDIV8=0).

Ich habe gelesen, dass sowas mit CLKPR gehen soll, aber leider läuft 
mein Beispielprogramm nur mit vollem Takt, egal welchen Wert ich für 
CLKPR angebe...
#include <avr/io.h>
#include <util/delay.h>

void main()
{
    CLKPR = 16; // Systemtakt-Teiler  

    DDRB  = 0b11111111;             // Alle auf OUTPUT
    while(1) 
    {                
     PORTB = 0b00000000;            // LEDs ON
     _delay_ms(500);
     PORTB = 0b11111111;            // LEDs OFF
     _delay_ms(500);
    }
    return 0;
}

Woran kann das liegen ?

Autor: Benedikt K. (benedikt) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Lies dir mal den Abschnitt rund um CLKPR im Datenblatt genau durch. Zum 
Umschalten musst du nämlich auch das CLKPCE Bit setzen.
Du stellst das Register auch auf einen ungültigen Wert ein.

Autor: M. B. (freiberger77)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Sorry, im Datenblatt habe ich noch nicht geschaut, da es im AVR-Studio 
auch keinen Fehler angezeigt hat.
Habe im Forum aber nix passendes zu diesem Thema gefunden.
Habe es auch mit 0,4,16,32 probiert, aber ohne Änderung.
Werde gleich mal schauen, Danke

Autor: M. B. (freiberger77)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
OK, ds CLKPCE ist Bit 7 im CLKPR.
Leider ist mein englisch nicht soooo gut, um die ganzen Kleinigkeiten zu 
verstehen.
Ich habe es jetzt mit
CLKPR = 0x10000100;
versucht, aber es klappt auch nicht...

Autor: Benedikt K. (benedikt) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Schritt 1:
Nur CLKPCE setzen, alle anderen Bits auf 0.
Schritt 2 (muss innerhalb von 4 Takten nach Schritt 1 ausgeführt 
werden): Den gewünschten Prescaler setzen.

Autor: M. B. (freiberger77)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
also so ?
CLKPR = 0x10000000;
CLKPR = 0x10000100;

Geht aber auch nicht. Bin scheinbar doch zu blöd für sowas... ;-)

Autor: Benedikt K. (benedikt) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Im zweiten Schritt CLKPCE nicht mehr setzen. Das sollte funktionieren.

Autor: M. B. (freiberger77)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
nee, leider nicht.
Habe ich im Frust auch schon versucht...

Ist es dann eigentlich egal, ob CKDIV8 gesetzt ist, oder wird immer erst 
der CKDIV8 genommen und dazu der CLKPCE ?

Autor: Benedikt K. (benedikt) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Es sollte gehen. So stehts zumindest im Datenblatt und so funktioniert 
es auch bei mir.

Die CKDIV Fuse beeinflusst nur den Standardwert den das CLKPR nach dem 
Reset hat.

Autor: M. B. (freiberger77)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
kann es sein, dass der Optimizer den ersten Wert einfach ignoriert ?
Keine Ahnung, was das Ding alles löscht ?!

Autor: Benedikt K. (benedikt) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nein, die Register sind alle als volatile definiert, somit darf er dort 
nichts wegoptimieren.
Interrupts sollten auch nicht an sein (wegen den max. 4 Takten zwischen 
den beiden Schreibvorgängen).

Autor: M. B. (freiberger77)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ja, Interupts habe ich auch nicht aktiviert...
Bin total ratlos... Gibt es noch mehr FUSE-Bits, die ich beachten muß ?

Autor: Benedikt K. (benedikt) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Versuch das Umschalten mal über die vom gcc gelieferten Funktionen:
http://www.nongnu.org/avr-libc/user-manual/group__...

Autor: M. B. (freiberger77)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
das schein ganz gut zu klappen.
Allerdings kommt ab Wert 5 oder 6 ein SPI-Mode-Error (habe aber mal die 
SPI-Frequenz auf MIN gesetzt).

Danke, scheint so zu funktionieren..

Autor: Simon K. (simon) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Marco B. schrieb:
> also so ?
> CLKPR = 0x10000000;
> CLKPR = 0x10000100;
>
> Geht aber auch nicht. Bin scheinbar doch zu blöd für sowas... ;-)

Das hat bis jetzt echt niemand gemerkt oder? 0x ist das Prefix für 
Hexadezimal... Und nicht für Binär.

CLKPR = 0x80;
CLKPR = 0x04;

Autor: M. B. (freiberger77)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
manchmal ist es echt wie verhext...
jetzt klappt es auch so... Vielen Dank ...

CLKPR = 0b10000000;
CLKPR = 0b00000100;

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.