Moin, ich möchte eine stromsparende Schaltung die mir alle paar Sekunden (zB alle 4) eine Berechnung im AVR ausführt. Ich dachte daran den AVR im Sleep/Idle zu fahren und alle 4 Sekunden kurz aufwachen zu lassen. Der AVR selber kann ja keinen Timer laufen lassen, so dass er sich selber aufweckt (ATmega328). Laut Sleep Mode Tabelle geht es nur über einen Timer2 (unsynchron). Wäre es eine Lösung, einfach einen ICM7555 zu nehmen, der dann über den ext. Interrupt den AVR aus dem Schlaf holt?
Q_M schrieb: > Der AVR selber kann ja keinen Timer laufen > lassen, so dass er sich selber aufweckt (ATmega328). Falsch! Der WDT kann das.
Q_M schrieb: > Laut Sleep Mode Tabelle geht es nur über einen Timer2 (unsynchron). Was ist flasch an TMR2? Sonst kann man ihn auch vom WDT wecken lassen.
OK, aber wie genau ist der? Sollte relativ genau sein. Max. 1/2s Abweichung pro Minute.
µC schrieb: > Q_M schrieb: >> Laut Sleep Mode Tabelle geht es nur über einen Timer2 (unsynchron). > Was ist flasch an TMR2? Sonst kann man ihn auch vom WDT wecken lassen. Einen 8Bit Timer kriege ich nicht genau genug hin. Ich hatte immer mehr als 1s Abweichung pro Minute.
Q_M schrieb: > OK, aber wie genau ist der? Sollte relativ genau sein. Max. 1/2s > Abweichung pro Minute. Dafür genau genug, 1/2 s pro Stunde würde ich nicht wetten aber pro min auf jeden Fall.
Q_M schrieb: > Einen 8Bit Timer kriege ich nicht genau genug hin. Ich hatte immer mehr > als 1s Abweichung pro Minute. Softwarefrage. Wenn der Timer aufgrund unglücklich gewählter Taktfrequenz keine exakte Anzahl Ticks pro Zeiteinheit produzieren kann, dann rechnet man die Abweichung eben per Software weg. Oft arbeitet man bei asynchronem TIM2 jedoch mit Uhrenquarz ebendort und RC-Oszillator als Systemtakt. Und aus diesen 32768Hz eine genaue Sekunde abzuleiten ist kein Hexenwerk.
@Q_M (Gast) >lassen, so dass er sich selber aufweckt (ATmega328). Laut Sleep Mode >Tabelle geht es nur über einen Timer2 (unsynchron). Dann nimm den doch und pack einen 32,768 kHz Uhrenquarz dran. Der ist sehr genau, vielleicht 20ppm und weniger Abweichung. Das sind 1,2ms/min. >Wäre es eine Lösung, einfach einen ICM7555 zu nehmen, NEIN! Du hast einen uC mit mehreren Timern! Und die sind alle besser als ein NE555!
Q_M schrieb: > Wäre es eine Lösung, einfach einen ICM7555 zu nehmen Q_M schrieb: > Max. 1/2s Abweichung pro Minute. Das würde ich einem 555 nicht zutrauen, zumindest nicht langzeitstabil.
Q_M schrieb: > µC schrieb: >> Q_M schrieb: >>> Laut Sleep Mode Tabelle geht es nur über einen Timer2 (unsynchron). >> Was ist flasch an TMR2? Sonst kann man ihn auch vom WDT wecken lassen. > > Einen 8Bit Timer kriege ich nicht genau genug hin. Ich hatte immer mehr > als 1s Abweichung pro Minute. Mit welchem Takt betreibst du ihn denn?
Stone schrieb: > Dafür genau genug, 1/2 s pro Stunde würde ich nicht wetten aber pro min > auf jeden Fall. Muss mir selbst widersprechen, je nach Temperaturschwankungen und Betriebsspannung kann der wd timer sehr stark starken >10% sind schnell Erreicht. Im Datenblatt gibt's da ein schönes Diagramm dazu.
Q_M schrieb: > Wäre es eine Lösung, einfach einen ICM7555 zu nehmen, der dann über den > ext. Interrupt den AVR aus dem Schlaf holt? Warum sollte der besser sein, als irgendeine der im AVR intern verfügbaren Zeitgeber. Erstmal sollte es aber trotzdem gehen. Q_M schrieb: > Sollte relativ genau sein. Max. 1/2s Abweichung pro Minute. Wenn du allerdings zusätzlich mit solchen Spezifikationen rausrückst - never ever.
ich kann nicht unter 1MHz fOSC gehen. Also Uhrenquarz fällt raus. 8bit Timer scheint auch nicht möglich, da die maximale Zeit nur 262,144ms beträgt. Brauche also nen 16 Bit timer, der jedoch nicht weckfähig ist.
Q_M schrieb: > 8bit Timer scheint auch nicht möglich, da die maximale Zeit nur > 262,144ms beträgt. Weck ihn alle z.B. 250ms und mach nur jedes 16. Mal, was anders machen als gleich weiterzuschlafen
Q_M schrieb: > ich kann nicht unter 1MHz fOSC gehen. Also Uhrenquarz fällt raus. Häää.... Du kannst an den ATMega328 einen Uhrenquarz am Xtal1 und Xtal2 anschließen und trotzdem den Prozessor mit 8MHz laufen lassen. Einzig Timer2 nutzt den dann im asynchron Modus
Ulrich F. schrieb: > Q_M schrieb: >> ich kann nicht unter 1MHz fOSC gehen. Also Uhrenquarz fällt raus. > > Häää.... > Du kannst an den ATMega328 einen Uhrenquarz am Xtal1 und Xtal2 > anschließen und trotzdem den Prozessor mit 8MHz laufen lassen. > Einzig Timer2 nutzt den dann im asynchron Modus wie das?
Q_M schrieb: > Ulrich F. schrieb: >> Q_M schrieb: >>> ich kann nicht unter 1MHz fOSC gehen. Also Uhrenquarz fällt raus. >> >> Häää.... >> Du kannst an den ATMega328 einen Uhrenquarz am Xtal1 und Xtal2 >> anschließen und trotzdem den Prozessor mit 8MHz laufen lassen. >> Einzig Timer2 nutzt den dann im asynchron Modus > > wie das? Wie ichs gesagt habe! Wie es im Datenblatt steht! 1. Fuses auf 1MHz oder 8MHz internen Takt 2. Uhrenquarz an die Xtal Pins 3. Timer2 auf asynchron konfigurieren.
@ Q_M (Gast) >> Du kannst an den ATMega328 einen Uhrenquarz am Xtal1 und Xtal2 >> anschließen und trotzdem den Prozessor mit 8MHz laufen lassen. >> Einzig Timer2 nutzt den dann im asynchron Modus >wie das? Vielleicht mal das Datenblatt und den Artikel Sleep Mode lesen?
Q_M schrieb: > Laut Sleep Mode Tabelle geht es nur über einen Timer2 (unsynchron). Was denkst du denn, was hier "unsynchron" bedeutet?
Da ich gerade mit einem ATmega328P arbeite, hier ein Programm ("Aber Kaffee und Kochen gebt es necht", will sagen, kein C, nur Assembler). Leider messe ich bei 5.0 V 1.3 uA statt der 0.75 uA aus dem Datenblatt, vielleicht findet jemand den Fehler.
1 | .include "m328Pdef.inc" |
2 | |
3 | .equ B_pullup = 0b11111111 |
4 | .equ C_pullup = 0b11111111 |
5 | .equ D_pullup = 0b11111111 |
6 | .equ DDR_LED = DDRB |
7 | .equ PIN_LED = PINB |
8 | .equ LED = 0 |
9 | |
10 | .def tmp0 = r16 |
11 | |
12 | .org 0 |
13 | rjmp main |
14 | .org OC2Aaddr |
15 | reti |
16 | |
17 | main: |
18 | ldi tmp0,B_pullup |
19 | out PORTB,tmp0 |
20 | ldi tmp0,C_pullup |
21 | out PORTC,tmp0 |
22 | ldi tmp0,D_pullup |
23 | out PORTD,tmp0 |
24 | sbi DDR_LED,LED |
25 | |
26 | ldi tmp0,(1<<PRTWI)+(1<<PRTIM0)+(1<<PRTIM1)+(1<<PRSPI)+(1<<PRUSART0)+(1<<PRADC) |
27 | sts PRR,tmp0 |
28 | ldi tmp0,(1<<ACD) |
29 | out ACSR,tmp0 |
30 | |
31 | ldi tmp0,(1<<AS2) ; asynchron |
32 | sts ASSR,tmp0 |
33 | ldi tmp0,(1<<WGM21) ; CTC auf OCRA |
34 | sts TCCR2A,tmp0 |
35 | ldi tmp0,128-1 ; 4s* 32768/s / 1024 |
36 | sts OCR2A,tmp0 |
37 | ldi tmp0,(1<<CS22)+(1<<CS21)+(1<<CS20) ; /1024 |
38 | sts TCCR2B,tmp0 |
39 | lds tmp0,ASSR |
40 | andi tmp0,(1<<TCR2AUB)+(1<<TCR2BUB)+(1<<OCR2AUB) |
41 | brne pc-3 |
42 | ldi tmp0,(1<<OCIE2A) |
43 | sts TIMSK2,tmp0 |
44 | |
45 | ldi tmp0,(1<<SE)+(1<<SM1)+(1<<SM0) ; power-save |
46 | out SMCR,tmp0 |
47 | sei |
48 | |
49 | main_loop: |
50 | sleep ; 4s |
51 | sbi PIN_LED,LED |
52 | rjmp main_loop |
Ah, die Datenblattangabe bezieht sich auf 1.8 V. Okay, jetzt sehe ich 0.76 uA.
>alle paar Sekunden AVR aufwachen lassen
Ich weiß nicht so recht...
Es muß doch furchtbar sein, nicht einmal in Ruhe durchschlafen zu können
und immer wieder aus dem Tiefschlaf gerissen zu werden. Gesundheitliche
Beschwerden, wie Gedächtnisverlust im EEPROM oder die sog. "Restless
Legs"
(rastlose Beine) sind nur 2 von etlichen Symptomen, die auftreten
können.
Es empfiehlt sich daher, den Kontroller zu sockeln, so daß man zumindest
merkt, wenn er durch das o.g. Restless Leg Syndrom seine Beine aus der
Fassung schüttelt. Mich würden auch Schüttelfrost-Attacken an den
PWM-Ausgängen nicht erstaunen. Kein Wunder, wenn die Fuses mit ihm
durchgehen. Da sind ihm selbst treue Kondensatoren, die ihm schon sein
Leben lang als Stütze dienen, keine große Hilfe mehr.
Merke: Behandele Deinen Kontroller so, wie Du selbst behandelt werden
möchtest.
MfG Paul
Paul B. schrieb: > Merke: Behandele Deinen Kontroller so, wie Du selbst behandelt werden > möchtest. ...und deshalb löte dir einen Quarz zwischen die Beine :-)))
>> alle paar Sekunden AVR aufwachen lassen > Ich weiß nicht so recht... Ein interessanter Aspekt. Andererseits wissen wir ja seit gut hundert Jahren, dass alles relativ ist; so ein uController ist ja wesentlich schneller getaktet als ein Mensch, da kommen Ersterem die paar Sekunden vielleicht wie ein paar Stunden vor. Wenn ich dann allerdings die Lebensdauern vergleiche...
Ja, ich weiß (auch) nicht.... Den Baumanns sein Paul identifiziert sich recht stark mit unseren Si-Klümpchen. Und dann ist er vielleicht etwas zulange im loop() verharrt. Vollgas im Kreis rum. Das verändert einen ....
Ulrich F. schrieb: > Den Baumanns sein Paul identifiziert sich recht stark mit unseren > Si-Klümpchen. Und dann ist er vielleicht etwas zulange im loop() > verharrt. Vollgas im Kreis rum. Das verändert einen .... Ich glaube, ich muß DICH mal einem Reset aussetzen... ;-) MfG Paul
Hallo, wenn du an stelle des 555ers eine Rtc nimmst hast du kein Quarz Problem und du kannst einen alarm in der Rtc programmiern die deinen Controller aufweckt.
Falk B. schrieb: > @ Q_M (Gast) > >>> Du kannst an den ATMega328 einen Uhrenquarz am Xtal1 und Xtal2 >>> anschließen und trotzdem den Prozessor mit 8MHz laufen lassen. >>> Einzig Timer2 nutzt den dann im asynchron Modus > >>wie das? > > Vielleicht mal das Datenblatt und den Artikel Sleep Mode lesen? Und den hier: http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial/Die_Timer_und_Z%C3%A4hler_des_AVR#Timer2_im_Asynchron_Mode mfg.
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.