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
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?
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.
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
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.
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.
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
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.
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
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
voidCPU_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
intmain(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
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.
Eine eigene Frage?
Dieser Thread ist über 17 Jahre alt.
Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.