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