Forum: Mikrocontroller und Digitale Elektronik alle paar Sekunden AVR aufwachen lassen


von Q_M (Gast)


Lesenswert?

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?

von Ulrich F. (Gast)


Lesenswert?

Q_M schrieb:
> Der AVR selber kann ja keinen Timer laufen
> lassen, so dass er sich selber aufweckt (ATmega328).

Falsch!
Der WDT kann das.

von µC (Gast)


Lesenswert?

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.

von Q_M (Gast)


Lesenswert?

OK, aber wie genau ist der? Sollte relativ genau sein. Max. 1/2s 
Abweichung pro Minute.

von Q_M (Gast)


Lesenswert?

µ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.

von (prx) A. K. (prx)


Lesenswert?

Q_M schrieb:
> OK, aber wie genau ist der?

Sehr ungenau.

von Stone (Gast)


Lesenswert?

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.

von (prx) A. K. (prx)


Lesenswert?

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.

von Falk B. (falk)


Lesenswert?

@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!

von µC (Gast)


Lesenswert?

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.

von Rolf M. (rmagnus)


Lesenswert?

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?

von Stone (Gast)


Lesenswert?

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.

von Wolfgang (Gast)


Lesenswert?

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.

von Q_M (Gast)


Lesenswert?

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.

von µC (Gast)


Lesenswert?

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

von Ulrich F. (Gast)


Lesenswert?

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

von Q_M (Gast)


Lesenswert?

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?

von Ulrich F. (Gast)


Lesenswert?

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.

von Falk B. (falk)


Lesenswert?

@ 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?

von Rolf M. (rmagnus)


Lesenswert?

Q_M schrieb:
> Laut Sleep Mode Tabelle geht es nur über einen Timer2 (unsynchron).

Was denkst du denn, was hier "unsynchron" bedeutet?

von S. Landolt (Gast)


Lesenswert?

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

von S. Landolt (Gast)


Lesenswert?

Ah, die Datenblattangabe bezieht sich auf 1.8 V. Okay, jetzt sehe ich 
0.76 uA.

von Paul B. (paul_baumann)


Lesenswert?

>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

von npn (Gast)


Lesenswert?

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 :-)))

von S. Landolt (Gast)


Lesenswert?

>> 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...

von Ulrich F. (Gast)


Lesenswert?

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 ....

von Paul B. (paul_baumann)


Lesenswert?

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

von Peter (Gast)


Lesenswert?

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.

von Thomas E. (thomase)


Lesenswert?

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.

von Q_M (Gast)


Lesenswert?

ja, danke. Genau das ist es. ich sollte mal lesen.. :-/

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.