Forum: Mikrocontroller und Digitale Elektronik PIC: Main Loop Stromverbrauch


von Peter W. (peterw)


Lesenswert?

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.

von xfr (Gast)


Lesenswert?

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.

von Peter D. (peda)


Lesenswert?

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

von Peter W. (peterw)


Lesenswert?

Danke euch für die Erklärungen :)

von Scotty (Gast)


Lesenswert?

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
}

von Meister E. (edson)


Lesenswert?

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.

von Bronco (Gast)


Lesenswert?

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.

von Bernd W. (berndwiebus) Benutzerseite


Lesenswert?

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

von Peter W. (peterw)


Lesenswert?

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?

von Peter D. (peda)


Lesenswert?

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
Noch kein Account? Hier anmelden.