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

OP #7521472

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

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
OP #7521639

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!

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 3 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.