Ich habe ein kleines Problem bezüglich dem xmega128A1. Laut Datenblatt zieht der µC im "Active Mode" bei 32MHz Takt und einer Versorgungsspannung von 3,3V einen Strom von 21-22mA [im Datenblatt des XMEGA A1: S.76 (34. Typical Characteristics --> 34.1 Active Supply Current)]. Wie hoch muss dann einen Strom bei 2MHz sein? Nun verwende ich das Entwicklungsboard XMEGA-A1 Xplained mit den xmega128A1. Bei diesem kann man über einen Jumper den µC und die Peripherie separat versorgen. Somit bin ich in der Lage den benötigen Strom für den xmega einzeln zu messen. Mit meinem aktuellen Programm zieht der xmega jedoch einen Strom von 4,35mA!? Woran kann das liegen, dass ich so hohen Stromverbrauch messe, als im Datenblatt angegeben? Das ist mein Programm: #include <avr/io.h> #include <util/delay.h> int main(void) { PORTF.DIR |= (1<<PIN7); // PIN7-PIN1 sind als Ausgang beschlossen PORTF.DIR |= (1<<PIN6); PORTF.DIR |= (1<<PIN5); PORTF.DIR |= (1<<PIN4); PORTF.DIR |= (1<<PIN3); PORTF.DIR |= (1<<PIN2); PORTF.DIR |= (1<<PIN1); PORTF.DIR &= ~(1<<PIN0); // Pin0 als Eingang beschlossen PORTA.DIR = 0xFF; PORTD.DIR = 0xFF; PORTR.DIR = 0xFF; PORTC.DIR = 0xFF; PORTE.DIR = 0x00; }
Alex schrieb: > Mit meinem aktuellen Programm zieht der xmega jedoch einen Strom von > 4,35mA!? Wieviel erwartest du denn? Ist doch nicht so viel? Du kannst nicht annehmen dass der Stromverbrauch proportional zu Taktfrequenz zu- oder abnimmt. Dein Programm hat übrigens keinen Einfluss auf den Stromverbrauch da es zu Ende ist bevor du auch nur zum Strom Messen kommst.
Es gibt so viele Wege auf denen dein Stromverbrauch verfälscht weerden kann. Ich hab dir hier mal die häufigsten gelistet: - I/O-Pin hängt Vcc/2 und die CMOS-Transis schließen kurz - Externe Hardware (LEDs z.B.) brauchen zusätzlich Strom - Die Taktfrequenz ist falsch eingestellt - Du hast ein paar Eingänge die extern auf high/low getrieben werden als Ausgänge definiert und treibst in die andere Richtung - Pegelwandler usw...
Die Stromaufnahme des Mikrocontrollers ist ungefähr linear im Verhältnis zur Frequenz. Also bei 3,2Mhz ein Zehntel verglichen mit 32Mhz. Einige Komponenten (z.B. Watchdog und R/C Oszillator) haben eine weitgehend konstante Stromaufnahme, die noch dazu kommt. Bei Taktfrequenzen unter 1Mhz dominieren die Komponenten mit konstanter Stromaufnahme. Offene Eingänge (mit undefiniertem Pegel) können durchaus mehr Strom aufnehmen, als der ganze Rest des Mikrocontrollers. Darum soll man sie auf GND oder VCC legen oder als Ausgang schalten, oder einen Pullup oder Pulldown einschalten. Dein Meßwert ist jedenfalls im Bereich dessen, was ich erwartet hätte. Schau mal ins Datenblatt des Mikrocontrollers. Du kannst viele Features deaktivieren, um die Stromaufnahme zu senken.
Eberhard F. schrieb: > Dein Programm hat übrigens keinen Einfluss auf den Stromverbrauch > da es zu Ende ist bevor du auch nur zum Strom Messen kommst. Es sei denn die Ports die du auf Output gesetzt hast werden von aussen mit "Stromverbrauchern" belastet.
Entschuldigung habe ich vieleicht falsch Ausgedrückt. Ich habe ein kleines Problem bezüglich dem xmega128A1. Nun verwende ich das Entwicklungsboard XMEGA-A1 Xplained mit den xmega128A1. Bei diesem kann man über einen Jumper den µC und die Peripherie separat versorgen. Somit bin ich in der Lage den benötigen Strom für den xmega einzeln zu messen. Mit meinem aktuellen Programm zieht der xmega jedoch einen Strom von 4,00mA!? Denke ich mir muss Strom bei µc in µA bereich ligen soll.Woran kann das liegen, dass ich so hohen Stromverbrauch messe? Das ist mein Programm: #include <avr/io.h> #include <util/delay.h> #include <avr/interrupt.h> int main(void) { PORTF.DIR |= (1<<PIN7); // PIN7-PIN1 sind als Ausgang beschlossen PORTF.DIR |= (1<<PIN6); PORTF.DIR |= (1<<PIN5); PORTF.DIR |= (1<<PIN4); PORTF.DIR |= (1<<PIN3); PORTF.DIR |= (1<<PIN2); PORTF.DIR |= (1<<PIN1); PORTF.DIR &= ~(1<<PIN0); // Pin0 als Eingang beschlossen PORTA.DIR = 0xFF; PORTB.DIR = 0xFF; PORTC.DIR = 0xFF; PORTE.DIR = 0x00; PORTD.DIR = 0xFF; PORTR.DIR = 0xFF; PORTK.DIR = 0xFF; PORTJ.DIR = 0xFF; PORTQ.DIR = 0xFF; PORTH.DIR = 0xFF; }
Alex schrieb: > Entschuldigung habe ich vieleicht falsch Ausgedrückt. Irgendwie bekomme ich das Gefühl du hast die bisherigen Beiträge nicht gelesen oder nicht verstanden .....
> Denke ich mir muss Strom bei µc in µA bereich ligen soll
Wiesom das denn, etwa weil das Programm zuende ist? Am Ende des
Programms fügt der Compiler automatisch eine Endlosschleife ein.
1 | while (1) {}; |
Darum führt der Prozessor ständig Befehle aus. Wenn Du ihn wirklich anhlaten willst, musst Du dich mit sleep Modi beschäftigen.
stefanus schrieb: >> Denke ich mir muss Strom bei µc in µA bereich ligen soll > > Wiesom das denn, etwa weil das Programm zuende ist? Am Ende des > Programms fügt der Compiler automatisch eine Endlosschleife ein. > while (1) {}; > > Darum führt der Prozessor ständig Befehle aus. Wenn Du ihn wirklich > anhlaten willst, musst Du dich mit sleep Modi beschäftigen. Danke habe ich gerade gemach bleibt immer noch 4mA Code:#include <avr/sleep.h> #include <avr/io.h> #include <util/delay.h> #include <avr/interrupt.h> int main(void) { PORTF.DIR |= (1<<PIN7); // PIN7-PIN1 sind als Ausgang beschlossen PORTF.DIR |= (1<<PIN6); PORTF.DIR |= (1<<PIN5); PORTF.DIR |= (1<<PIN4); PORTF.DIR |= (1<<PIN3); PORTF.DIR |= (1<<PIN2); PORTF.DIR |= (1<<PIN1); PORTF.DIR |= (1<<PIN0); // Pin0 als Eingang beschlossen PORTA.DIR = 0xFF; PORTB.DIR = 0xFF; PORTC.DIR = 0xFF; PORTE.DIR = 0x00; PORTD.DIR = 0xFF; PORTR.DIR = 0xFF; PORTK.DIR = 0xFF; PORTJ.DIR = 0xFF; PORTQ.DIR = 0xFF; PORTH.DIR = 0xFF; for (;;) { } }
> > Nun verwende ich das Entwicklungsboard XMEGA-A1 Xplained mit den > xmega128A1. Bei diesem kann man über einen Jumper den µC und die > Peripherie separat versorgen. Somit bin ich in der Lage den benötigen > Strom für den xmega einzeln zu messen. Hier.
Nochmal: Wenn Du ihn wirklich anhalten willst, musst Du dich mit sleep Modi beschäftigen. Das hast du nicht getan. Stattdessen hast Du eine nutzlose leere Endlosschleife eingefügt.
stefanus schrieb: > Nochmal: Wenn Du ihn wirklich anhalten willst, musst Du dich mit > sleep > Modi beschäftigen. > > Das hast du nicht getan. > Stattdessen hast Du eine nutzlose leere Endlosschleife eingefügt. So was habe ich auch schon versucht da messe ich stadt 4mA 3.5mA. Muss aber so weit ich weis µa bereich sein oder?
Hi >Genau gesagt bei Power jumper. Falsch. Da trennst du nur den Controller vom Rest des Boards. Zum Sleep-Mode sieh dir mal hier http://www.atmel.com/Images/doc8077.pdf ab S.99 an. MfG Spess
spess53 schrieb: > Hi > >>Genau gesagt bei Power jumper. > > Falsch. Da trennst du nur den Controller vom Rest des Boards. > > Zum Sleep-Mode sieh dir mal hier > > http://www.atmel.com/Images/doc8077.pdf > > ab S.99 an. > > MfG Spess Über Power jumper steht hier klar und deutlich: http://www.atmel.com/Images/doc8370.pdf s.3 an.
Hi >Über Power jumper steht hier klar und deutlich: >http://www.atmel.com/Images/doc8370.pdf >s.3 an. Ist mir bekannt. Aber was hat das mit deinen µA zu tun? MfG Spess
>> Nochmal: Wenn Du ihn wirklich anhalten willst, musst Du dich mit >> sleep Modi beschäftigen. Das hast du nicht getan. >So was habe ich auch schon versucht Und was ist dabei heraus gekommen? Wie sieht der Quelltext mit sleep Modus aus? Lesestoff dazu: http://www.mikrocontroller.net/articles/Sleep_Mode Aund natürlich auch nicht die Informationen aus den Datenblättern ignorieren. Ich vermisse nämlich auch Code-zeilen, die die ganzen unbenutzten Peripherie-Komponenten abschaltet.
> Und was ist dabei heraus gekommen? Wie sieht der Quelltext mit sleep > Modus aus? #include <avr/sleep.h> #include <avr/io.h> #include <util/delay.h> #include <avr/interrupt.h> int main(void) { PORTF.DIR |= (1<<PIN7); // PIN7-PIN1 sind als Ausgang beschlossen PORTF.DIR |= (1<<PIN6); PORTF.DIR |= (1<<PIN5); PORTF.DIR |= (1<<PIN4); PORTF.DIR |= (1<<PIN3); PORTF.DIR |= (1<<PIN2); PORTF.DIR |= (1<<PIN1); PORTF.DIR |= (1<<PIN0); // Pin0 als Eingang beschlossen PORTA.DIR = 0xFF; PORTB.DIR = 0xFF; PORTC.DIR = 0xFF; PORTE.DIR = 0x00; PORTD.DIR = 0xFF; PORTR.DIR = 0xFF; PORTK.DIR = 0xFF; PORTJ.DIR = 0xFF; PORTQ.DIR = 0xFF; PORTH.DIR = 0xFF; sleep_mode(); } > > Lesestoff dazu: http://www.mikrocontroller.net/articles/Sleep_Mode > Aund natürlich auch nicht die Informationen aus den Datenblättern > ignorieren. Ich vermisse nämlich auch Code-zeilen, die die ganzen > unbenutzten Peripherie-Komponenten abschaltet. Meinst du dass man mit sleep_mode() Peripherie-Komponenten abschalten kann?
Hi >Meinst du dass man mit sleep_mode() Peripherie-Komponenten abschalten >kann? Nein. Oder meinst du ATMEL hätte 6 Seiten im Manual dazu geschrieben, wenn es so einfach wäre? MfG Spess
Doku lesen ist nicht so deine Stärke, was? Dann helf ich Dir mal. Schau hier: http://www.nongnu.org/avr-libc/user-manual/group__avr__sleep.html Da steht gleich im ersten Anwendungsbeispiel, dass man vor sleep_mode() erstmal den Modu einstellen soll, mit set_sleep_mode(<mode>); Da steht auch, dass der Modus standardmäßig IDLE ist, so dass die gesamte peripherie weiter getaktet wird. Im Idle Modus wird nur wenig Strom eingespart. Da steht außerdem der wichtige Hinweis, dass man den Brown-Out Detektor deaktivieren soll, wenn man nicht will, dass er den Schlafzustand stört. Außerdem verbraucht er einiges an Strom. Hast du das gemacht? Was hast du an die Port Pins angeschlossen? Nichts? Was ist mit Port E und F, haben alle Eingänge einen sauberen Logikpegel (0V oder 3,3V, durch äußere Beschaltung oder interne Pull-Up Widerstände)? Bedenke, dass der Taktgeber viel Strom verbraucht, vor allem mit Kristall. Den kann man auch abschalten.
> Bedenke, dass der Taktgeber viel Strom verbraucht, vor allem mit > Kristall. Den kann man auch abschalten. Wie kann man Taktgeber abschalten?
Instruktion SLEEP!!! Vorher natürlich die entsprechenden Register so beschreiben, dass der Controller in einen tiefen Schlaf fällt und nicht nur in den Idle-Mode.
habe ich auf 2.15mA gesetzt-habe ich PORTA.DIR = 0x00 als Eingang gemacht. Komisch! #include <avr/sleep.h> #include <avr/io.h> #include <util/delay.h> #include <avr/interrupt.h> int main(void) { PORTF.DIR |= (1<<PIN7); // PIN7-PIN1 sind als Ausgang beschlossen PORTF.DIR |= (1<<PIN6); PORTF.DIR |= (1<<PIN5); PORTF.DIR |= (1<<PIN4); PORTF.DIR |= (1<<PIN3); PORTF.DIR |= (1<<PIN2); PORTF.DIR |= (1<<PIN1); PORTF.DIR |= (1<<PIN0); // Pin0 als Eingang beschlossen PORTA.DIR = 0x00; PORTB.DIR = 0xFF; PORTC.DIR = 0xFF; PORTE.DIR = 0x00; PORTD.DIR = 0xFF; PORTR.DIR = 0xFF; PORTK.DIR = 0xFF; PORTJ.DIR = 0xFF; PORTQ.DIR = 0xFF; PORTH.DIR = 0xFF; sleep_mode(); }
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.