Forum: Mikrocontroller und Digitale Elektronik Idle Mode Tiny461


von Andreas (Gast)


Lesenswert?

Hallo Leute!

Ich möchte den Tiny461 schlafenlegen ;-)
Also und zwar folgendes:

Normalmodus: 8MHz Takt, PLL treibt PWM Ausgang, alle Ein- und Ausgänge 
werden benützt für Mess- und Regelaufgaben.

Wenn die Versorgungsspannung(110VDC über Teiler zugeführt) außerhalb der 
Spec liegt, soll das Ding so wenig wie möglich Strom verbrauchen (ergo 
hochohmig werden, da dann die Versorgung über ohmschen Vorwiderstand aus 
den 110V direkt erfolgt.

Nun aber das Problem: Ich möchte wieder einschalten, ohne die 
Versorgungsspannung trennen zu müssen, wenn die Versorgungsspannung 
wieder im richtigen Bereich liegt. Dazu müsste ich im IDLE Mode den ADC 
auslesen und mit zwei Grenzwerten vergleichen. Geht sowas, da ja der CPU 
Clock angehalten wird?

Danke für Hinweise und Anregungen.

Andreas

von Andreas (Gast)


Lesenswert?

Achso, noch vergessen:

Kann ich dann auch problemlos den Takt der CPU runternehmen und ihn beim 
Aufwachen wieder auf den richtigen Wert setzen (bspw. mit CKSEL?)
Oder kann ich den Clock Prescaler sehr hoch setzen? Verbraucht der µC 
dann weniger Strom?

von (prx) A. K. (prx)


Lesenswert?

Minimum: Watchdog als Wakeup-Timer verwenden. Aufwecken lassen, 
nachmessen, einschlafen. Versorgungspuffer über Kondensator mittelt den 
kurzen Peak weg.

Der Stromverbrauch ist bei eingeschaltetem Takt und konstanter 
Versorgungsspannung ziemlich proportional zum Takt.

von Andreas (Gast)


Lesenswert?

Danke für den Hinweis schonmal, werd ich gleich mal austesten.
Im Datenblatt steht allerdings, man könnte den ADC als Wake-up Source 
benutzen. Gilt das dann wohl nur, wenn die Conversion abgeschlossen ist? 
Oder wie soll der ADC sonst als Wake-up funktionieren?

Danke

Andreas

von (prx) A. K. (prx)


Lesenswert?

In den "Idle" und "ADC Noise Red." Modi wird der Takt nicht 
abgeschaltet. In den wirklich stromsparenden Modi kann der ADC nicht für 
Wakeup verwendet werden.

Dynamische Taktumschaltung über den Clock Prescaler ist durchaus 
möglich. Bei 8MHz R/C-Oszillator und Teiler 256 könnte der Strom auch im 
aktiven Betrieb klein genug sein, wobei man dabei den ADC nur 
zweitweilig einschalten sollte, sonst braucht der mehr Strom als der 
Rest vom Controller. Der AC ist billiger als der ADC, aber auch hier 
zählt die interne Referenz extra.

Die Kernfrage ist also, wie weit runter du mit dem Strom gehen willst. 
Der Stromverbrauch in "Idle" findet sich in Abhängigkeit von Spannung 
und Takt im Grafikbereich des Datasheets, wobei du aber den separat 
aufgeführten ADC nicht vergessen solltest - der Strom der abschaltbaren 
Peripherie zählt extra.

von Andreas (Gast)


Lesenswert?

Die dynamische Taktumschaltung bringt schon erheblich was ein, hab ich 
grade getestet.

Meine Zielgröße wäre so ca. 1mA bei 2V Versorgungsspannnung. Da käm ich 
dann auf eine Gerätestandbyaufnahme von ca. 0,3W.

Ist denn auch eine Taktumschaltung auf den Watchdog Takt möglich oder 
muss ich bei dem RC-Oszillator bleiben?

Ich komme im Moment bei 2V auf ca. 2mA, was immer noch deutlich mehr ist 
als im Datenblatt angegeben.
Einzig treibe ich während dieser Zeit einen Mosfet als Peripherie.

von Marcus K. (marcusk)


Lesenswert?

ich hatte mich auch lange über den hohen Stromverbrauch meines Tiny 
gewundern, bei mir waren es offene Pins die als Eingang definiert waren 
und keinen Pullup hatten. Auch die ADC abschalten hat sich stark 
bemerkbar gemacht. Am ende bin ich auch unter 0.1mA gekommen

von (prx) A. K. (prx)


Lesenswert?

Andreas schrieb:

> Ist denn auch eine Taktumschaltung auf den Watchdog Takt möglich

Nur permanent.

> Ich komme im Moment bei 2V auf ca. 2mA, was immer noch deutlich mehr ist
> als im Datenblatt angegeben.

Alle nicht benötigte Peripherie abschalten. => PRR Register.

Auch ADC abschalten. Alle paar Sekunden (oder was die Anwendung 
verlangt) einschalten, bei Verwendung der internen Referenz 100-200µs 
warten, nachmessen und wieder abschalten.

Extremfall davon: Standby oder Power-Down Mode und zyklisch vom 
Watchdog-Interrupt wecken lassen. Gibt <10µA bei Power-Down. Aber Idle 
würde bei dir wohl ausreichen.

von Michael W. (retikulum)


Lesenswert?

Oder mit dem Analogcomparator arbeiten und nicht mit dem AD-Wandler.
Michael

von Andreas (Gast)


Lesenswert?

Hallo Leute! Danke für die zahlreichen Hinweise.

Ich möchte das jetzt mit dem Sleep Mode und dem Watchdog aufwachen 
realisieren. Gibt es dazu irgenwo mal ein C-Code Beispiel? Verwende 
(Muss) dieses ImageCraft Tool.

Danke nochmals...

Andreas

von Andreas (Gast)


Lesenswert?

Hallo ich bins nochmal.

Entweder steh ich suchtechnisch total auf der Leitung oder es hatte noch 
niemand das Prob vorher:

Ich will also besagten Watchdog nur zum Interrupt auslösen nehmen, im 
Moment wird jedoch der ganze Chip resettet (Watchdog FUse ist nicht 
programmiert):
Hier mal ein kleiner Codeauszug:
1
#define F_CPU 8000000 //CPU Frequenz
2
#include <avr/io.h>      
3
#include <avr/interrupt.h>
4
#include <avr/wdt.h>
5
#include <avr/sleep.h>
6
#include <stdlib.h>
7
#include <util/delay.h>
8
9
10
void CPU_INI(void)// Initialisieren des µCs
11
{
12
 cli();         //Interrupts deaktivieren
13
 
14
 //Port init
15
 PORTB = 0X00;   //PORTB BITS
16
 DDRB  = 0x4F;   //Port B PB0 und PB2 Ausgaenge, Rest Eingaenge
17
 PORTA = 0X00;   //PORTA BITS          
18
 DDRA  = 0x76;   //PORTA alles Eingaenge
19
 MCUCR = 0x00;
20
 OSCCAL = 0x80;
21
 GIMSK = 0x00;
22
 TIMSK = 0x00;
23
 EECR  = 0x00;
24
 //SEI();        //Interrups wieder aktivieren
25
}
26
27
// ****  Main Schleife  ****
28
29
int main(void)
30
CPU_INI();
31
while(1)
32
{          //KOntrollschleife
33
 if(flag_volt_lamp)       //Eingangsspannung fehlerhaft im vorhergehenden Takt
34
  {
35
   while(flag_volt_lamp)
36
   {
37
   set_sleep_mode(SLEEP_MODE_PWR_DOWN);
38
   wdt_enable(6);
39
   sei();
40
   sleep_cpu();
41
   wdt_disable();
42
   cli();
43
   U_V = le_ad(CANAL_OP_VOLTAGE,1);
44
   if((800 > U_V) || (U_V > 380)) break;
45
   }
46
   _delay_ms(400);           //Pause einlegen
47
   _delay_ms(400);
48
  }
49
  
50
    
51
  while(1)                         //Hauptschleife fuer Dauerbetrieb
52
  {
53
  //normaler Programmablauf/Regelalgorithmus
54
  U_V = le_ad(CANAL_OP_VOLTAGE,1);
55
    
56
   if(((750 < U_V) || (U_V < 430)))
57
   {
58
     flag_volt_lamp = 1;
59
  break;
60
   }
61
  }
62
 }
63
}    
64
65
ISR(WDT_vect)
66
{
67
 return;
68
}

Wie bring ich den Watchdog dazu, nicht zu resetten?

Vielleicht ist die Antwort total simpel, ich hab allerdings wirklich 
schon das Forum durchsucht und nichts brauchbares gefunden.

Danke schonmal...

Andi

von (prx) A. K. (prx)


Lesenswert?

Andreas schrieb:

> Vielleicht ist die Antwort total simpel, ich hab allerdings wirklich
> schon das Forum durchsucht und nichts brauchbares gefunden.

Hättest du mal im Datasheet gesucht... Siehe WDTCR, Bit WDIE. Musst eben 
ohne Stützräder fahren, weil die avr-libc nix dazu hat.

von Andreas (Gast)


Lesenswert?

Ahhhh tres bien, jetzt seh ichs auch ;-)

Kommt halt davon wenn man den ganzen Tag davorsitzt...

Dankeschöön

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.