AVR Prozessortakt halbieren

OP #4622844
Lesenswert?

Sehr geehrte Community,

ich habe mir einen Arduino Uno mit einem ATmega 328Pgekauft und möchte 
gerne den Prozessortakt von 8 MHz auf 4 MHz reduzieren, um den 
Mikrocontroller mit 3V, anstelle von 5V betreiben zu können, was laut 
Datenblatt 
(http://www.atmel.com/images/Atmel-8271-8-bit-AVR-Microcontroller-ATmega48A-48PA-88A-88PA-168A-168PA-328-328P_datasheet_Complete.pdf) 
S. 303 Tabelle 29-8 möglich sein sollte.
Um die Frequenz des internen Oszillators einzustellen, muss das CLKPR 
(Clock-Prescalar-Register) entsprechend gesetzt werden.
Um die Bits des CLKPR-Registers zu verändern, muss wie folgt vorgegangen 
werden (siehe auch S.36 im Datenblatt):
1. Die Interrupt-Funktion muss ausgeschaltet werden, damit der 
Schreibprozess zur Umstellung der Taktteilung nicht unterbrochen wird.
2. Clock Prescalar Change Enable (CLKPCE)-Bit auf 1 setzen und alle 
anderen Bits   des CLKPR-Registers auf 0
3. Nach 4 Taktzyklen, also 0,5 µs, wird der gewünschte Wert im 
CLKPS-Register gesetzt, mit der der Systemtakt geteilt werden soll. 
Gleichzeitig soll das Enable-Bit des CLKPCE-Registers wieder auf  0 
gesetzt werden.

Aus diesen Angaben habe ich dann folgenden Code zusammengestellt:

void setup() {

   cli();
   CLKPR = 0x80;
   CLKPR = 0x01;

   sei();

   pinMode (7,OUTPUT);
}

void loop() {

 digitalWrite(7,HIGH);

}


Mit dem Befehl "cli()" habe ich zunächst alle Interrupts ausgeschalten. 
Dann habe ich das CLKPR-Register so gesetzt, dass das Setzen von Bits in 
diesem Register überhaupt ermöglicht wird. Anschließend habe ich den 
Takt mit 2 geteilt (siehe auch Tabelle Tabelle 9-17 auf S.38). Mit dem 
"sei()"-Befehl habe ich die Interrupts wieder enabled.
Da sich ein HIGH-Signal an einem Output-Pin nach der Betriebsspannung 
richtet, also 4,2V Output bei 5V Betriebsspannung und 2,3V Output bei 3V 
Betriebsspannung (siehe S.314 Tabelle 30-1), hatte ich erwartet, dass 
sich 2,3V am Ausgang des Pins 7 einstellt. Allerdings zeigt der Ausgang 
weiterhin 4,8V an.
Ich habe den Mikrocontroller bei meiner Messung allerdings auf dem 
Arduino-Board gelassen und ihn nicht separat auf einem Steckbrett 
getestet. Könnte es daran liegen, oder sieht jemand eventuell einen 
Fehler in meinem Code?
Für eine Antwort wäre ich sehr dankbar.
Gast #4622856
Lesenswert?

Wann hast du denn die Betriebsspannung umgeschaltet? Schon vorher, als 
der Controller noch auf acht MHz lief oder danach?
Wenn der Controller mit 3 V betrieben wird, kann er am Pin keine 4,8 V 
ausgeben. Da muss also irgendwas falsch sein in deinem Aufbau (außer ein 
Hochsetzsteller gehört zur Ausstattung der neuen ATmegas).
Mit dem Programm hat das nichts zu tun.
OP #4622873
Lesenswert?

Vielen Dank für die schnelle Antwort. Ich habe den Mikrocontroller auf 
dem Arduino-Board belassen und es per USB versorgt. Also die 
Betriebsspannung selbst habe ich nicht umgestellt. Ich bin davon 
ausgegangen, dass der Mikrocontroller durch den verringerten Takt 
weniger Spannung (3V) für sich beansprucht, was wiederum zur 
verringerten Spannung am Ausgangspin (2,3V) hätte führen müssen.
OP #4622879
Lesenswert?

Entschuldigung. Ich habe komplett vergessen zu erwähnen, dass ich den 
internen Oszillator verwenden möchte, also keinen externen Quarz oder 
ähnliches. Das Diagramm auf S.303 habe ich nicht verstanden, da in der 
Tabelle 29-8 auf der selben Seite geschrieben steht, dass der µC bei 4 
MHz mit 3V versorgt werden muss.
#4622882
Lesenswert?

Simon H. schrieb:
> und möchte
> gerne den Prozessortakt von 8 MHz auf 4 MHz reduzieren, um den
> Mikrocontroller mit 3V

du kannst den doch mit 3,3V locker bei 8MHz betreiben, wozu 4MHz?

Simon H. schrieb:
> Ich bin davon
> ausgegangen, dass der Mikrocontroller durch den verringerten Takt

der erste Fehler ist stets eine falsche Annahme

> weniger Spannung (3V) für sich beansprucht, was wiederum zur
> verringerten Spannung am Ausgangspin (2,3V) hätte führen müssen.

dafür fehlt ihm aber die Hardware, er sollte dann auch mit der passenden 
Spannung versorgt werden.
Gast #4622891
Lesenswert?

Der Controller 'beansprucht' nur Strom und der sinkt mit fallender 
Frequenz. Die Ausgangsspannung ist unabhängig vom Takt, aber der 
maximale Takt nicht von der Spannung.
Das Diagramm auf Seite 303 gibt an, mit welchem Takt der Controller bei 
welcher Spannung maximal betrieben werden darf, damit der Hersteller die 
richtige Funktion noch garantiert.
In der Tabelle ist nichts zur benötigten Spannung angegeben, das sind 
nur 'Stromwerte'.
Die in der Tabelle angegebenen Spannungen sind die Spannungen, unter 
denen die Ströme ermittelt wurden, wie 'Condition' aussagt.
#4622931
Lesenswert?

Hi Simon,

wenn Du vorne 5V reingibst, läuft der mc mit 5V und gibt auch fast 5V an 
seinen Ausgängen aus. Das hat nichts mit dem Takt zu tun.

Wenn Du vorne eine niedrigere Spannung einspeist, dann kommt auch nur 
noch knapp 3V hinten raus.
Zusätzlich funktioniert der Chip nur mit einer niedrigeren Frequenz, 
laut Datenblatt maximal 10Mhz bei 3V.

An der Ausgangsspannung kannst Du über die Takteinstellung nichts 
verändern.

gruß, Stefan
Gast #4622938
Lesenswert?

Ja. Dem Diagramm zufolge müsste der Controller bei 3 V mit bis zu grob 
11 MHz funktionieren.
Oft funktioniert er auch noch deutlich darüber, aber das garantiert der 
Hersteller halt nicht mehr für alle Bedingungen.
#4622942
Lesenswert?

Simon H. schrieb:
> Ich bin davon
> ausgegangen, dass der Mikrocontroller durch den verringerten Takt
> weniger Spannung (3V) für sich beansprucht, was wiederum zur
> verringerten Spannung am Ausgangspin (2,3V) hätte führen müssen.

Wie kommst du auf dieses schmale Brett? Ein AVR kann seine Betriebs- 
spannung nicht selber ändern. Die Betriebsspannung mußt du extern 
anlegen. Und du mußt den Mindestwert passend zur eingestellten 
Taktfrequenz einhalten. Und ja, Mindestwert bedeutet, daß du den µC auch 
mit höherer Spannung betreiben darfst als dem Mindestwert.

Durch das Umstellen des Takts von 8MHz auf 4MHz sinkt die Stromaufnahme 
(etwas). Das wars aber auch schon.
OP #4622962
Lesenswert?

Zuerst einmal vielen Dank für die aufschlussreichen Antworten. Jetzt 
habe ich dann noch eine Frage zum Stromverbrauch. Wenn ich nun meinen 
Mikrocontroller mit 3V bei 8 MHz(Werkseinstellungen) betreibe....mit 
welchem Strombedarf kann ich dann rechnen? In Tabelle 29-8 auf S.303 
stehen nämlich bei 3V Betriebsspannung nur die Stromwerte für 4 MHz da.
(Firma: matzetronics) #4622994
Lesenswert?

Simon H. schrieb:
> Du meinst sicherlich Figure 31-336 oder?

Das hängt von der Version des Datenblattes ab, bei mir ist es 
'8271D–AVR–05/11'
Für die P und PA Versionen von Mega48-328.
Das ist aber nicht so wichtig, denn es ging nur darum, dich dazu zu 
bringen, einfach mal im DB weiterzublättern. Ausserdem schrub ich ja die 
Werte aus der Grafik im Posting.
Moderator Persönliche Seite #4623031
Lesenswert?

Jörg W. schrieb:
> Die Werkseinstellung ist 1 MHz, da im Auslieferungszustand die
> CKDVI8-Fuse gesetzt ist, die den Takt-Vorteiler auf 1:8 voreinstellt.

Ja, bei einem ATmega direkt vom Hersteller schon. Bei einem 
Arduino-Board sollte das anders aussehen. Meist werden die dann mit 
einem 16MHz-Quarz betrieben, die CKDIV8-Fuse ist wech und ein Bootloader 
ist drauf. Ich nehme mal an, dass der TO dies hier als 
"Werkseinstellung" versteht.
OP #4623116
Lesenswert?

Jörg W. schrieb:
> Die Werkseinstellung ist 1 MHz, da im Auslieferungszustand die
> CKDVI8-Fuse gesetzt ist, die den Takt-Vorteiler auf 1:8 voreinstellt.

Das mit der Vorteilung habe ich auch gelesen, aber auf der selben Seite 
steht, dass das Gerät auf 8 MHz standardmäßig eingestellt ist. Diese 
Aussage ist im angehängten Bild dargestellt.
Angehängte Dateien:
Moderator Persönliche Seite #4623124
Lesenswert?

Simon H. schrieb:
> Das mit der Vorteilung habe ich auch gelesen, aber auf der selben Seite
> steht, dass das Gerät auf 8 MHz standardmäßig eingestellt ist.

Nochmal:

Der werksmäßig voreingestellte Oszillator ist bei den meisten AVRs
(so auch bei deinem) der interne RC-Oszillator mit 8 MHz.

Aber: werksmäßig ist die CKDIV8-Fuse gesetzt, die bewirkt, dass der
Taktvorteiler (clock prescaler) auf 1:8 voreingestellt wird.  Das
ergibt einen Prozessortakt von 1 MHz ab Werk.

Der Grund dafür ist einfach, dass nur mit diesem Takt garantiert werden
kann, dass der Prozessor in der Voreinstellung mit jeder beliebigen
Betriebsspannung arbeiten kann, denn bei kleinen Spannungen ist der
Betrieb mit vollen 8 MHz nicht garantiert.

Man kann die CKDIV8-Fuse aber natürlich löschen (könnte bei deinem
Board der Fall sein, siehe Arduino-Diskussion zwei Beiträge zuvor),
oder man kann (das war dein ursprünglicher Versuch, wenn auch mit einer
völlig anderen, falschen Annahme) den Taktteiler zur Laufzeit ändern.

Man kann aber auch (hier wiederum siehe Arduino-Diskussion drüber)
per Fuse einen anderen Oszillator wählen, beispielsweise einen Quarz
mit 16 MHz.  Auch das könnte möglicherweise bei deinem Board der
Fall sein.
OP #4623128
Lesenswert?

Frank M. schrieb:
> Aber das lässt sich ja durch Umschalten auf den internen Oszillator ja
> ändern. Dann wären wir tatsächlich bei 8MHz.

Also ich habe mal versucht den Mikrocontroller auf einem Steckbrett, 
also unabhängig vom Arduino-Board zu betreiben....schaltet der µC dann 
automatisch auf seinen internen Oszillator um? Wenn nicht, könnte mir 
bitte jemand helfen auf den internen Oszillator umzuschalten?
#4623133
Lesenswert?

Simon H. schrieb:
> schaltet der µC dann
> automatisch auf seinen internen Oszillator um? Wenn nicht, könnte mir
> bitte jemand helfen auf den internen Oszillator umzuschalten?

Der µC schaltet nie selber um, erst Recht nicht automatisch und wenn du 
auf dem Steckbrett keinen Takt lieferst den er lt. Fusesetzung von 
extern erwartet wird den niemand zum Laufen bringen.
#4623180
Lesenswert?

Hallo,

auf einem Arduino Uno ist genügend drauf,w as Strom verbraucht. 
USB/Seriell-Converter, Spannungsregler mit relativ hohem Eigenverbrauch 
usw.
Außerdem wird der ATMega mit einem 16MHz Resonator extern getaktet.

Nichts davon läßt sich wirklich sinnvoll per Software beeinflussen.
Wenn Strom sparen angesagt ist (warum?) dann einen 3,3V ProMini nehmen 
und externen USB-seriell-Wandler zum Programmieren.

Oder einen ATMega328 nehmen, die 3 Teile drum löten und den Arduino UNO 
als ISP-Programmer nehmen.

Gruß aus Berlin
Michael
OP #4623203
Lesenswert?

So ich habe noch etwas in anderen Foren herumgesucht und bin auf ein 
relativ ähnliches Problem bzgl. Taktung gestoßen: 
http://forum.arduino.cc/index.php?topic=134051.0

Ich denke in meinem Fall wäre es das einfachste einen externen 
Quarzoszillator zu kaufen und auf dem Steckbrett an den ATmega328P 
anzuschließen. Da die Versorgung durch einen externen Quarz bereits in 
den Fuses vorprogrammiert ist, sollte das ja eigentlich funktionieren.
#4623212
Lesenswert?

Simon H. schrieb:
> Ich denke in meinem Fall wäre es das einfachste einen externen
> Quarzoszillator zu kaufen und auf dem Steckbrett an den ATmega328P
> anzuschließen. Da die Versorgung durch einen externen Quarz bereits in
> den Fuses vorprogrammiert ist, sollte das ja eigentlich funktionieren.

nö,
1. muss die Frequenz passen sonst stimmt alles was auf F_CPU basiert 
nicht!
2. muss man unterscheiden zwischen TTL Taktgeber und Quarz und dann wohl 
noch auf full swing oder nicht + Kondensatoren am Quarz.
#4623394
Lesenswert?

Simon H. schrieb:
> Eine Alternative, die ich noch gefunden habe ist folgende:

du hast absolut nix verstanden, also sinnlos hier weiterzumachen.....

Simon H. schrieb:
> und möchte
> gerne den Prozessortakt von 8 MHz auf 4 MHz reduzieren, um den
> Mikrocontroller mit 3V

das konntest du schon immer wenn du den passend programmierst, mit 8MHz 
und mit 4MHz (wobei ich 4MHz unsinnig finde)

Simon H. schrieb:
> https://learn.adafruit.com/arduino-tips-tricks-and-techniques/3-3v-conversion
> Zum Zwecke der geringeren Spannungsversorgung, ohne Fuses aufwendig zu
> programmieren.

Das geht nicht mit Bootloader und wenn der schon geflasht ist!

16 MHz Arduino braucht 5V da hilft umlöten nix
Wenn die Fuses so programmiert sind und er 16 MHz bekommt hilft auf 3,3V 
löten auch nix!

Hier ist von einem Arduino die Rede!

Simon H. schrieb:
> ich habe mir einen Arduino Uno mit einem ATmega 328Pgekauft

Du kannst dir aber einen Arduino mini 328p kaufen der schon für 3,3V auf 
8 MHz geflasht wurde, den kannst du dann mit 5V und 3,3V wahlweise, 
entweder oder versorgen und programmieren mit einem Adapter FTDI oder 
CH340/341 letztere würde ich vorziehen

http://www.ebay.de/itm/CH340-CH340G-USB-TTL-Serial-Adapter-Arduino-Pro-Mini-like-FTDI-CP2102-PL2303-UK-/251742353968

http://www.ebay.de/itm/Arduino-pro-mini-kompatibles-Development-Board-Atmel-ATmega328-8MHz-3-3V-358-/221997430811?hash=item33b013f81b:g:cv8AAOSwyjBW2KyB
Gast #4623435
Lesenswert?

Soweit mir bekannt haben die Atmels nur einen Teiler 1:1 oder 1:8 
zwischen internem Oszillator und der sonstigen Interna.
Wenn der interne Oszillator 8 MHz hat, kommen nur 8 oder 1 MHz infrage.

Wenn ich den TO richtig verstanden habe, soll der µP mit 4 MHz laufen. 
Zumindest mit dem internen Oszillator geht das nicht. Also ent- oder 
weder.

Ich unterstelle mal, dass der TO weiß, dass der µP mit 4 MHz und seiner 
Lieblingsspannung funktionieren würde. Nur ist "sein" Weg nicht gangbar.

Er will ja nur Strom sparen.

Je nach Genauigkeit kämen, falls das noch unterstützt wird, ein externer 
Quarz (Strom = --), ein fertiger Oszillator oder ein Resonator infrage. 
Die müssten sich auch mit 4 MHz besorgen lassen. Ist die absolute 
Frequenz unwichtig, so könnte auch jeder andere Taktgeber z.B. 
3-Komma-irgendwas MHz infrage kommen. Fast alle Zeiten werden sowieso 
durch Teiler festgelegt. Diese müssten natürlich an die aktuellen 
Gegebenheiten angepasst werden.
#4623451
Lesenswert?

Amateur schrieb:
> Er will ja nur Strom sparen.

kann er auch mit 8MHz die rechnen schneller und die gesparte Zeit wird 
der Atmel in den idle geschickt und spart auch Strom, aber sein Atmel 
läuft mit 16MHz und ohne umflashen der Fuses und Bootloader kommt er da 
nie wieder ran.

In der Arduino IDE nur wenn er dort seinen 4 MHz bekannt macht, den 
Bootloader anpasst usw.
Gast #4623510
Lesenswert?

Per Fuse kann man einen Teiler von 1:1 oder 1:8 wählen.

Man kann aber auch andere Teiler mit dem CLKPR Register einstellen - das 
zwar nicht alle AVR µC haben, aber der um den es hier geht, hat dieses 
Register.

Nur muss der µC natürlich zumindest zuverlässig starten und den 
Schreibzugriff auf das CLKPR Register durchführen können. Bei der 
Kombination 16Mhz @ 3,3V ist das nicht sicher gestellt.
Persönliche Seite #4623514
Lesenswert?

Wenn es wirklich ums Stromsparen geht empfehle ich den internen 
RC-Oszillator, wenn die Genauigkeit reicht.

Zu den unterschiedlichen Taktgebern habe ich mal ein paar Messungen 
gemacht und hier ins Forum gepostet:
Beitrag "Re: Stromverbrauch RC-Oszillator vs Quarz vs Resonator (AVR)"

Du hast zwar einen anderen MC, aber prinzipiell solten die 
Größenverhältnisse ähnlich sein.
Gast #4623523
Lesenswert?

Paul B. schrieb:
> Kannst Du den auch berichtigen? Ich meine nur...
> Schließlich nützen 2 hingeworfene Worte dem TO nicht.

Könnte ich....
Selbst als Arduinojünger habe ich das Datenblatt des Prozessors 
gefunden. Das hat der TO auch gefunden. Er kennt schon die Schräubchen, 
welche man drehen muss. An der Stelle ist ihm nicht zu helfen.

Und "Amateur" wird das Datenblatt sicherlich auch noch finden und 
vielleicht sogar lesen.

Ich mache mir da keine Sorgen um die beiden....
;-)

Außerdem hat "Stefan Us" es schon schön genug Übersetzt.

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