Attiny 2313 Schlafmodus - habe ich was vergessen?

#4021925
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
#4022022
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
#4022033
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
}

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