Forum: Mikrocontroller und Digitale Elektronik Attiny412 Ultra-Low-Power Sleep Mode funktioniert nicht so recht


von Maximlian S. (maduino)


Lesenswert?

Hallöchen,

wie der Titel schon sagt versuche ich einen Attiny412 (tinyAVR-1-Serie) 
schlafen zu legen und mit einem möglichst geringen Stromverbrauch 
schlafen zu lassen und per Pin-Interrupt (Taster) wieder aufzuwecken.

Ich habe dazu die 32 KHz Clock gewählt und BOD abgeschaltet, den Taster 
als Input gesetzt, mit Interrupt ausgestattet, den Sleep-Mode auf 
`SLPCTRL_SMODE_PDOWN_gc` gesetzt und dann `sleep_cpu()` aufgerufen, um 
die CPU schlafen zu legen.

Das Ergebnis ist in Stromverbrauch von ca. 60-65 uA (manchmal springt er 
auf ~120 uA hoch und ich weiß nicht warum), was den angepriesenen 5,4 uA 
(Datenblatt Seite 478, CLK_CPU=32 KHz (OSCULP32K) 5V) nichtmal annähernd 
nahe kommt.

Gerade komme ich nicht dahinter, ob ich was falsch mache oder die 5,4 uA 
nur aus "Laborbedingungen" stammen und "gar nicht erreichbar sind".

Hat jemand da vielleicht eine Idee für mich?
Beste Grüße!
1
#include <avr/io.h>
2
#include <util/delay.h>
3
#include <avr/interrupt.h>
4
#include <avr/sleep.h>
5
6
uint8_t i = 0;
7
8
ISR(PORTA_PORT_vect)
9
{
10
    PORTA.INTFLAGS = PIN2_bm; // clear interrupt
11
12
    if (!i)
13
    {
14
        PORTA.OUTSET = PIN1_bm; // Power on
15
        i = 1;
16
    }
17
    else
18
    {
19
        PORTA.OUTCLR = PIN1_bm; // Power off
20
        i = 0;
21
    }
22
23
    _delay_ms(1000);
24
}
25
26
int main()
27
{
28
29
    _PROTECTED_WRITE(CLKCTRL.MCLKCTRLA, 1);
30
31
    PORTA.OUTCLR = PIN1_bm;
32
    PORTA.DIRSET = PIN1_bm; // PA1 = SHDWN --> OUTPUT ===> LED
33
34
    PORTA.DIRCLR = PIN2_bm;                                  // PA2 = SW1 --> INPUT ===> SWITCH
35
    PORTA.PIN2CTRL = PORT_PULLUPEN_bm | PORT_ISC_FALLING_gc; // PA2 pullup
36
37
    _PROTECTED_WRITE(BOD.CTRLA, 0);
38
39
    SLPCTRL.CTRLA = SLPCTRL_SMODE_PDOWN_gc | SLPCTRL_SEN_bm;
40
41
    sei();
42
    while (1)
43
    {
44
        sleep_cpu();
45
    }
46
}

von Georg M. (g_m)


Lesenswert?

PORT - I/O Pin Configuration
16.3.1 Initialization
Important: For lowest power consumption, disable the digital input 
buffer of unused pins and pins that
are used as analog inputs or outputs.
1
  PORTA.PIN1CTRL = PORT_ISC_INPUT_DISABLE_gc;    // disable PA1 digital input buffer
2
//  PORTA.PIN2CTRL = PORT_ISC_INPUT_DISABLE_gc;    // disable PA2 digital input buffer
3
  PORTA.PIN3CTRL = PORT_ISC_INPUT_DISABLE_gc;    // disable PA3 digital input buffer
4
  PORTA.PIN6CTRL = PORT_ISC_INPUT_DISABLE_gc;    // disable PA6 digital input buffer
5
  PORTA.PIN7CTRL = PORT_ISC_INPUT_DISABLE_gc;    // disable PA7 digital input buffer

von Maximlian S. (maduino)


Lesenswert?

Georg M. schrieb:
> Important: For lowest power consumption, disable the digital input
> buffer of unused pins and pins that

Vielen Dank: habe ich tatsächlich komplett überlesen beim Durchschauen 
des Datenblatts.

Mit dieser "kleinen" Anpassung bin ich bei ca. 0,5uA (modulo 
Messungenauigkeit) im Power Down.

Danke nochmal für den Hinweis!

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.