Attiny 2313 Schlafmodus - habe ich was vergessen?

OP #4021925
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
OP
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.
OP
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.
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
OP
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 ...
OP
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.
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
OP
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
}

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 11 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.