Hallo zusammen, ich habe eine Frage zu der ich bis jetzt leider noch nicht den richtigen Google Suchbegriff gefunden habe :) Normalerweise bin ich bei der Software Programmierung eine Umgebung mit Betriebssystem gewohnt. Und wenn ich dort einen Main Loop baue der wie folgt aussieht: while (true) { } dann geht die CPU Auslastung auf 100% (wenn wir mal bei single core bleiben) und der PC macht nichts mehr anderes. Natürlich steigt die Temperatur der CPU auch ganz nett an. Ich brauche also ein sleep/delay um dem OS die Chance zu geben auch noch was anderes zu machen. Nun habe ich auf meinem 8bit PIC natürlich kein OS und ein solcher Loop hat erstmal keine sichtbaren negativen Auswirkungen. Aber was macht die CPU im Controller denn nun während eines solchen leeren Loops? NOPs? Oder lauter Jump Anweisungen? Würde das einbauen eines Delay Befehls in einen leeren Loop auf einem PIC überhaupt einen Unterschied machen? Es gibt ja nicht wirklich andere Threads die er bearbeiten könnte in der Zeit.
Wenns es nichts zu tun gibt, kannst Du den uC in den Sleepmode setzen. Dann wacht er erst wieder bei einem Ereignis (externer Interrupt, Timer, I/O empfangen usw.) wieder auf und rechnet weiter. Ohne Sleepmode macht er tatsächlich nur Sprungbefehle und verbrät Strom. Allerdings natürlich wesentlich weniger als ein PC, so dass es bei nicht-batteriebetriebenen Schaltungen nicht so schlimm ist. Eine Delayfunktion ändert daran nicht viel, denn die besteht halt aus NOPs in einer Schleife.
Ein MC arbeitet typisch immer unter Volldampf. Allerding sind das andere Größenordnungen, als beim PC. 100% CPU-Last verbrauchen etwa 5mA. Im Idle-Mode sinkt er etwa auf die Hälfte. Dann gibt es noch Sleepmode, wo alles anhält und nur ein externer Interrupt aufwecken kann oder nur ein Timer als RTC läuft. Dann werden unter 1..10µA verbaucht. Peter
Bei den PICs, die keinen Interrupt unterstützen (z.B. 12F510, 16F505), kann man das elegant per Watchdog erledigen. In dem Beispiel wird die Mainloop etwa alle 150ms durchlaufen:
1 | void main(void) |
2 | { OPTION = 0b10001011; // Timer0 no prescaler, WDT prescaler 1:8 -> 8 * 18 ~ 150 ms |
3 | |
4 | if(TO) // power on |
5 | { // ........ |
6 | // Setup of HW, variables, etc.
|
7 | // .......
|
8 | }
|
9 | // .........
|
10 | // Mainloop
|
11 | // .........
|
12 | sleep(); // wait for Reset by watchdog |
13 | }
|
Peter Dannegger schrieb: > Ein MC arbeitet typisch immer unter Volldampf. Allerding sind das andere > Größenordnungen, als beim PC. 100% CPU-Last verbrauchen etwa 5mA. > Im Idle-Mode sinkt er etwa auf die Hälfte. Ich verstehe nicht warum du den absolut typ-spezifischen und auch frequenzabhängigen Verbrauch hier mit einer "magic number" 5mA angibst. Deine Pauschal-Aussagen sind bestenfalls für eine Handvoll veralteter AVR gültig.
Die Leistungsaufnahme des µC hängt von verschiedenen Faktoren ab: 1. µC-Familie/Typ 2. Taktfrequenz 3. Versorungsspannung 4. Umgebungstemperatur 5. Ein/ausgeschaltete Peripheriemodule (Timer, ADC, UART usw.) 6. Normal/Idle/Sleep-Zustände Beispielsweise ist der MSP430 darauf gezüchtet, daß man mit ihm eine sehr geringe Leistungsaufnahme erreichen kann. Damit eignet er sich gut für Batteriegeräte oder Anwendungen, die sich aus einer 4-20mA-Schnittstelle versorgen. Allerdings muß man hier tief ins Datenblatt schauen, die werbewirksamen Werte wie "typisch 260µA" gelten nur sehr bedingt. Bei einer Anwendung, die nicht auf den Energiebedarf achten muß, kann der Sleep-Mode trotzdem Vorteile haben, z.B. bessere ADC-Ergebnisse.
Hallo Peter Dannegger. > Ein MC arbeitet typisch immer unter Volldampf. Richtig. Darum steht man bei der MC Programmierung ja auch so oft mit allem was man hat auf der Bremse. Ganz im Gegensatz zur PC Programmierung. > Allerding sind das andere > Größenordnungen, als beim PC. 100% CPU-Last verbrauchen etwa 5mA. > Im Idle-Mode sinkt er etwa auf die Hälfte. Das ist also in etwa soviel wie die Betriebsanzeige LED. > Dann gibt es noch Sleepmode, wo alles anhält und nur ein externer > Interrupt aufwecken kann oder nur ein Timer als RTC läuft. Dann werden > unter 1..10µA verbaucht. Ja. Dummerweise habe ich jetzt nicht mehr in Erinnerung, wie das mit dem Aufwachen aus dem Koma war. Läuft da der Takt nicht erstmal etwas unrund, weil der Quarz erst einschwingen muss, im Gegensatz zum RC Oszillator, der nur einen Zyklus zum richtig aufwachen braucht? Mit freundlichem Gruß: Bernd Wiebus alias dl1eic http://www.dl0dg.de
Bernd Wiebus schrieb: > Richtig. Darum steht man bei der MC Programmierung ja auch so oft mit > allem was man hat auf der Bremse. Ganz im Gegensatz zur PC > Programmierung. Wie meinst du das? Mein Main Loop besteht eigentlich nicht aus vielen Dingen, eigentlich sogar nur aus einem Processing der USB Daten. Laut API (und wohl USB Spec) muss das mindestens alle x ms geschehen. Aktuell bin ich aber um ein vielfaches schneller. Würdest du den Controller nun jedesmal in den idle mode (oder sogar sleep) befördern und damit künstlich verlangsamen? Kennt jemand Literatur mit "Best Practices" zu diesem Thema?
Zuerst implementiert man nur die Funktion des Gerätes. Und erst, wenn alles fehlerfrei läuft, kann man anfangen, Stromsparen hinzuzufügen. D.h. wenn man der Meinung ist, daß es sich auch bemerkbar macht. Peter
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.