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