Attiny412 Ultra-Low-Power Sleep Mode funktioniert nicht so recht

OP #7521472
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
}
#7521506
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

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