Forum: Mikrocontroller und Digitale Elektronik Attiny 2313 Schlafmodus - habe ich was vergessen?


von Mike M. (mikeii)


Lesenswert?

Hi,

ich habe (eventuell) ein Problem mit dem Schlafmodus vom Attiny 2313.
Ich bin mir nicht sicher, ob er wirklich im Schlafmodus ist, denn die 
Zielschaltung verbraucht leider eine Knopfzelle innerhalb von 3 Tagen. 
Ich habe kein µAmpermeter um festzustellen, ob der Attiny nun den Strom 
zieht, oder eine andere Komponente (in dem Fall ein Funkmodul, aber das 
sollte auch schlafen).

Zwei Pins, PB3 und PB5 sollen den Controller jeweils wieder kurz 
aufwecken (was auch funktioniert).

Anbei der Code, evtl. kann mir jemand sagen, ob es so geht, oder ob ich 
etwas vergessen habe.
1
#include <avr/interrupt.h>
2
#include <avr/sleep.h>
3
 
4
5
void setup(void) {  
6
    GIMSK |= 1<<INT0 | 1<<INT1;
7
    PCMSK |= (1<<PCINT0);
8
}
9
 
10
11
ISR(INT0_vect)
12
{   
13
   sleep_disable();
14
}
15
16
void go_to_sleep(){  
17
  set_sleep_mode(SLEEP_MODE_PWR_DOWN);
18
  sleep_enable();
19
  sei();
20
  sleep_cpu();
21
  cli();
22
}
23
24
25
26
int main(void) {
27
    setup();
28
    for(;;) {
29
    //Do something
30
    go_to_sleep();   
31
  }
32
}


Danke schonmal

von (prx) A. K. (prx)


Lesenswert?

Brownout-Detector? Watchdog?

Zu Funkmodul und Hardware lässt sich schlecht was sagen, weil Glaskugel 
kaputt.

von Peter D. (peda)


Lesenswert?

Mike Mike schrieb:
> oder ob ich
> etwas vergessen habe.

Den 2. Interrupthandler und die Pullups.

von (prx) A. K. (prx)


Lesenswert?

Analog Comparator abschalten.

von Mike M. (mikeii)


Lesenswert?

Oh, der Handler ist da, hatte ihn nur beim abspecken vom Code gerade 
rausgeschmissen.

Wenn die Pullups für die zwei Pins gemeint sind, die sind auch da.
Aber ja, sorry, hätte ich mit reinpacken sollen, aber wegen 
undefinierten Pinstates wacht er nicht auf.

von (prx) A. K. (prx)


Lesenswert?

Peter Dannegger schrieb:
> Den 2. Interrupthandler und die Pullups.

Viele Input-Pins sind im Sleep abgetrennt und intern gegrounded.

von Mike M. (mikeii)


Lesenswert?

Also meine Vermutung ist, dass er nicht in den Schlafmodus geht.
Fehlt da noch etwas?

von (prx) A. K. (prx)


Lesenswert?

Mike Mike schrieb:
> Fehlt da noch etwas?

Das Amperemeter. Muss kein Fluke sein. In solcher Anwendeng tuts ggf. 
auch eines für 10€.

von Mike M. (mikeii)


Lesenswert?

Achso, ist Brownoutdetection, Watchdog und der ADC standardmäßig an?
Das würde den Stromverbrauch natürlich erklären!

von (prx) A. K. (prx)


Lesenswert?

Mike Mike schrieb:
> Achso, ist Brownoutdetection, Watchdog und der ADC standardmäßig an?

Der AC ist es. Ich sehe aber grad, dass er es im Sleep nicht ist. ADC 
hat der 2313 nicht.

Die anderen können per Fuses an sein, wenn du das so eingestellt hast.

von Mike M. (mikeii)


Lesenswert?

Okay, werde mal die Fuses schnell ansehen.
Und ich habe gerade mal mit dem Amperemeter gemessen -> 3mA

Hätte nur gedacht, es wäre im µA Bereich... Hätte wohl lieber gleich 
messen sollen.

Ich schaue mal nach, was sich ändert, muss aber erst ein paar Kabel 
anlöten, um den Controller wieder programmieren zu können.

von Sebastian W. (wangnick)


Lesenswert?

Diese Funkmodule (z.B. nRF) sicher schlafen zu legen ist nicht so 
einfach. Die wachen gerne mal durch einen Brownout auf, und sitzen dann 
wach da, wartend und Elektronen fressend.

Ich kappe denen inzwischen komplett die Stromversorgung um sicher zu 
sein.

LG, Sebastian

von Mike M. (mikeii)


Lesenswert?

Auch gut zu wissen, danke.

Ich sehe gerade, er geht garnicht in den Schlafmodus!

Nach dem Schlafmodus werden dennoch Befehle ausgeführt...
Habe gerade mal eine LED angelötet, und die blinkt fröhlich, obwohl er 
schlafen sollte ...

von Mike M. (mikeii)


Lesenswert?

Ich sehe gerade, wenn ich die im GIMSK Register INT0 und INT1 setze, 
wacht er direkt wieder auf.
Wenn ich das nicht mache, schläft er.

von (prx) A. K. (prx)


Lesenswert?

Vielleicht solltest du doch mal das Unzumutbare auf dich nehmen und 
einen Schaltplan malen.

von Mike M. (mikeii)


Lesenswert?

Toll,

wenn ich GIMSK |= 1<<PCIE setze, schläft er und es klappt auch alles...

Muss natürlich die anderen Masken noch anpassen, aber so schläft er.
Verstehe ich nicht ganz, aber okay? Kann mir das wer erklären?

Setze ich INT0 und INT1, schläft er nicht.

von (prx) A. K. (prx)


Lesenswert?

Schaltplan.

von Sebastian W. (wangnick)


Lesenswert?

Mike Mike schrieb:
> Ich sehe gerade, wenn ich die im GIMSK Register INT0 und INT1 setze,
> wacht er direkt wieder auf.

Welche Art des Triggers konfigurierst du denn für INT0 und INT1 mit 
ISC11, ISC10, ISC01, ISC00 in MCUSR? Der Default scheint ein 
LOW-interrupt zu sein. Hast du externe Pullups an PD2 und PD3?

Ausserdem: Wieso PB3 und PB5?

LG, Sebastian

von Mike M. (mikeii)


Lesenswert?

Sorry, PB3 und PB0

Da ist einiges durcheinander geraten, bin gerade etwas unkonzentriert.
Also ich habe die Interruptmask auf PCIE gestellt, und bei PCMSK war 
auch ein Fehler, habe die Falschen Pins im Kopf gehabt.
Hier gehörten PCINT0 und PCINT3 im PCMSK gesetzt.

So klappt es, und ich habe nun 0mA (habe leider kein µAmperemeter)
Aber viel besser als 3mA.




So sieht der Code aus, der auch funktioniert:
1
#include <avr/interrupt.h>
2
#include <avr/sleep.h>
3
 
4
5
void setup(void) {  
6
    PORTB |= _BV(PB3) | _BV(PB0);  
7
    PCMSK |= (1<<PCINT0) |(1<<PCINT3);
8
    GIMSK |= 1<<PCIE;
9
}
10
 
11
void go_to_sleep(){  
12
  set_sleep_mode(SLEEP_MODE_PWR_DOWN);
13
  sleep_enable();
14
  sei();
15
  sleep_cpu();
16
  cli();
17
}

von Mike M. (mikeii)


Lesenswert?

Sebastian Wangnick schrieb:
> Der Default scheint ein
> LOW-interrupt zu sein

Ja default ist LOW.
Pullups waren schon gesetzt.

von Mike M. (mikeii)


Lesenswert?

Ein Freund hat grad ein Multimeter mit µA vorbeigebracht.
Jetzt braucht das Teil 0.5µA, ich denke das ist okay

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.