mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Idle Mode Tiny461


Autor: Andreas (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Andreas (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: A. K. (prx)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Andreas (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: A. K. (prx)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Andreas (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Marcus Kunze (marcusk)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: A. K. (prx)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Michael W. (retikulum)
Datum:

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

Autor: Andreas (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Andreas (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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:
#define F_CPU 8000000 //CPU Frequenz
#include <avr/io.h>      
#include <avr/interrupt.h>
#include <avr/wdt.h>
#include <avr/sleep.h>
#include <stdlib.h>
#include <util/delay.h>


void CPU_INI(void)// Initialisieren des µCs
{
 cli();         //Interrupts deaktivieren
 
 //Port init
 PORTB = 0X00;   //PORTB BITS
 DDRB  = 0x4F;   //Port B PB0 und PB2 Ausgaenge, Rest Eingaenge
 PORTA = 0X00;   //PORTA BITS          
 DDRA  = 0x76;   //PORTA alles Eingaenge
 MCUCR = 0x00;
 OSCCAL = 0x80;
 GIMSK = 0x00;
 TIMSK = 0x00;
 EECR  = 0x00;
 //SEI();        //Interrups wieder aktivieren
}

// ****  Main Schleife  ****

int main(void)
CPU_INI();
while(1)
{          //KOntrollschleife
 if(flag_volt_lamp)       //Eingangsspannung fehlerhaft im vorhergehenden Takt
  {
   while(flag_volt_lamp)
   {
   set_sleep_mode(SLEEP_MODE_PWR_DOWN);
   wdt_enable(6);
   sei();
   sleep_cpu();
   wdt_disable();
   cli();
   U_V = le_ad(CANAL_OP_VOLTAGE,1);
   if((800 > U_V) || (U_V > 380)) break;
   }
   _delay_ms(400);           //Pause einlegen
   _delay_ms(400);
  }
  
    
  while(1)                         //Hauptschleife fuer Dauerbetrieb
  {
  //normaler Programmablauf/Regelalgorithmus
  U_V = le_ad(CANAL_OP_VOLTAGE,1);
    
   if(((750 < U_V) || (U_V < 430)))
   {
     flag_volt_lamp = 1;
  break;
   }
  }
 }
}    

ISR(WDT_vect)
{
 return;
}


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

Autor: A. K. (prx)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Andreas (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ahhhh tres bien, jetzt seh ichs auch ;-)

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

Dankeschöön

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.