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.
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.
Moment mal, wofür das ganze? Du kannst den Controller bei 2,7 V mit 10 MHz betreiben, wie man auf Seite 303 unten sieht. Also, was willst du erreichen?
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.
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.
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.
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.
Bei 3V ist ein Runterschalten in der Applikation zu spät. Daher setzt man die 1:8 Fuse, d.h. läßt ihn mit 1Mhz starten und setzt dann in der Applikation auf 4Mhz hoch.
Peter D. schrieb: > Daher setzt man die 1:8 Fuse, d.h. läßt ihn mit 1Mhz starten und setzt > dann in der Applikation auf 4Mhz hoch. Bei 3V kann der doch mit 8MHz arbeiten, wozu 4MHz? Dann doch lieber idlen lassen, senkt den Strom auch
Dussel schrieb: > Die in der Tabelle angegebenen Spannungen sind die Spannungen, unter > denen die Ströme ermittelt wurden, wie 'Condition' aussagt. Das bedeutet ich kann meinen Mikrocontroller mit 3V versorgen bei einem Takt mit 8 MHz und er holt sich dann den entsprechenden Strom...sehe ich das richtig?
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
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.
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.
:
Bearbeitet durch User
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.
Simon H. schrieb: > In Tabelle 29-8 auf S.303 > stehen nämlich bei 3V Betriebsspannung nur die Stromwerte für 4 MHz da. Aber in Figure 30-334 gibts eine Grafik für genau deinen Fall (internal RC - 8MHz). Bei 3,3V sinds also etwa 3,bisschen mA und bei 3V ziemlich genau 3mA.
:
Bearbeitet durch User
Matthias S. schrieb: > Aber in Figure 30-334 gibts eine Grafik für genau deinen Fall Du meinst sicherlich Figure 31-336 oder?
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.
:
Bearbeitet durch User
Simon H. schrieb: > 8 MHz(Werkseinstellungen) Die Werkseinstellung ist 1 MHz, da im Auslieferungszustand die CKDVI8-Fuse gesetzt ist, die den Takt-Vorteiler auf 1:8 voreinstellt.
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.
:
Bearbeitet durch Moderator
Jörg W. schrieb: > Auch dann wären es aber keine 8 MHz … Korrekt :-) Der Hersteller sagt fürs Uno 16MHz: https://www.arduino.cc/en/Main/ArduinoBoardUno Aber das lässt sich ja durch Umschalten auf den internen Oszillator ja ändern. Dann wären wir tatsächlich bei 8MHz.
:
Bearbeitet durch Moderator
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.
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.
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?
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.
Joachim B. schrieb: > Der µC schaltet nie selber um, erst Recht nicht automatisch Aus diesem Grund habe ich ja die zweite Frage gestellt, ob mir jmd helfen könnte auf den inneren Oszillator umzuschalten.
Dazu musst Du die entsprechende Fuse ändern. Lies Dir das mal durch: https://www.mikrocontroller.net/articles/AVR_Fuses Mit Arduino-Boardmitteln kannst Du meines Wissens aber keine Fuses ändern - dazu brauchst Du einen Programmer. Gruß, Stefan
Stefan K. schrieb: > Mit Arduino-Boardmitteln kannst Du meines Wissens aber keine Fuses > ändern - dazu brauchst Du einen Programmer. So? AVRDude kann keine Fuses programmieren?
Nichtdurchblicker schrieb: > AVRDude kann keine Fuses programmieren? Kann es, aber nur, wenn es nicht nur gegen einen Bootloader spricht, sondern gegen einen extern an den AVR via ISP angeschlossenen Programmer. Meines Wissens gibt's bei Arduinos beide Varianten.
Jörg W. schrieb: > Meines Wissens gibt's bei Arduinos beide Varianten. Sind afaik alle mit Bootloader. Gibt aber welche ohne eingebauten USB-UART Umsetzer.
Ein zweiter Arduino kann als ICSP Programmiergerät benutzt werden. Dann kann AVRDude auch die Fuses ändern.
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
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.
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.
Eine Alternative, die ich noch gefunden habe ist folgende: https://learn.adafruit.com/arduino-tips-tricks-and-techniques/3-3v-conversion Zum Zwecke der geringeren Spannungsversorgung, ohne Fuses aufwendig zu programmieren.
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
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.
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.
U. F. schrieb: > Ein Irrtum. Werch ein Illtum... Kannst Du den auch berichtigen? Ich meine nur... Schließlich nützen 2 hingeworfene Worte dem TO nicht. MfG Paul
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.
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.
Stefan U. schrieb: > Per Fuse kann man einen Teiler von 1:1 oder 1:8 wählen. Tilo R. schrieb: > Wenn es wirklich ums Stromsparen geht empfehle ich den internen > RC-Oszillator, wenn die Genauigkeit reicht. egal wie, dann ist aus mit der Arduino IDE wenn er den Bootlader nicht anpasst und der IDE das nicht mitteilt!
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.