alle paar Sekunden AVR aufwachen lassen

Gast #4194853
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?
Gast #4194862
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.
#4194866
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.
#4194868
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!
#4194871
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?
Gast #4194876
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.
Gast #4194886
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.
Gast #4194987
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.
Gast #4194994
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
Gast #4195012
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?
Gast #4195014
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.
Gast #4195160
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
#4195233
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
Gast #4195243
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...
Gast #4195244
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 ....
#4196017
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren