Forum: Mikrocontroller und Digitale Elektronik Sleep mit Attiny13V


von P. F. (pfuhsy)


Lesenswert?

Hallo zusammen,

ich weiß es gibt schon ein paar Theards bezüglich Attiny und 
Sleep-Funktionen. Aber ich stehe bisschen auf dem Schlauch und weiß mit 
meinen Code nicht weiter.

Ich will mein µC einfach in Sleep versetzen und aufwecken wenn INT0 auf 
Low geht, Led kurz aufblinken und wieder in Sleep gehen. Nichts davon 
funktioniert, weder das aufblinken, noch der Stromspareffekt, da ich 
ständig ca. 0,7 mA messe. Wo ist mein Fehler, ein einfacher Interrupt 
ohne sleep funktionerte ?

Das MIC in "DDRB &=~(1<<MIC);" ist PB1
1
void initPorts(void)    //Port initialisieren
2
{
3
  //Outputs
4
  DDRB |= (1<<LED1);  //LED1
5
  DDRB |= (1<<LED2);  //LED2
6
  DDRB |= (1<<RES0);  //Reserve
7
  DDRB |= (1<<RES1);  //Reserve
8
  
9
  //Inputs
10
  DDRB &=~(1<<MIC);  //externer Interrupt
11
12
  //interne Pull-Up-Widerstände einschalten
13
  //PORTB |= (1<<MIC); //externer Interrupt
14
15
  //Ports initialisieren, auf low setzten
16
  LED1_OFF();
17
  LED2_OFF();
18
19
}
20
21
void initSleep()
22
{  
23
  MCUCR |= (1<<SE) | (1<<SM1);      //Sleep enable, Power Down
24
}
25
26
27
void initInterrupt()    //Port Interrupt initialisieren
28
{
29
  MCUCR |= (1<<ISC01) | (1<<ISC00);   //steigene Flanke von INT0 als Auslöser
30
  GIMSK |= (1<<INT0);          //externen Interrupt einschalten
31
  sei();        //alle Intterupts erlauben
32
}
33
34
35
  
36
//----------------------------------------------------------------------
37
int main (void)
38
{
39
  initPorts();    //Ports initalisieren
40
  initSleep();    //Sleep-Einstellungen  
41
  initInterrupt();  //Interrupts einschalten
42
43
  //int t_aus = 5;    //Ausschalten in Minuten
44
45
  //Hauptschleife
46
  while(true)
47
  {   
48
    GIMSK |= (1 << INT0);  //externen Interrupt freigeben
49
    sleep_mode();         //in den Schlafmodus wechseln
50
    GIMSK &= ~(1 << INT0);  //externen Interrupt vorerst sperren
51
                                   
52
    _delay_ms(100);
53
    LED1_ON();
54
    LED2_ON();
55
    _delay_ms(100);
56
     LED1_OFF();
57
   LED2_OFF();
58
59
  }
60
}
61
62
ISR (INT0_vect)      //Port-Interruptvektor
63
{
64
65
}

von Uwe K. (ukhl)


Lesenswert?

Versuche mal:
1
#include <avr/sleep.h>
2
3
uint8_t Sleep(void) {
4
  sei();
5
  set_sleep_mode(SLEEP_MODE_PWR_DOWN);
6
  sleep_mode();
7
}

Und hier gibt es was zu lesen dazu:
http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial#Sleep_Modi

von P. F. (pfuhsy)


Lesenswert?

Uwe K. schrieb:
> Versuche mal:
>
1
> #include <avr/sleep.h>
2
> 
3
> uint8_t Sleep(void) {
4
>   sei();
5
>   set_sleep_mode(SLEEP_MODE_PWR_DOWN);
6
>   sleep_mode();
7
> }
8
>
Funktioniert auch nicht.


> Und hier gibt es was zu lesen dazu:
> http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial#Sleep_Modi
Das hab ich schon durch. Ich verwende das Beispiel was dort gezeitg 
wird, nur etwas modifiziert.

Das kann doch nicht so schwer sein......WAS LÄUFT DENN SCHIEF ????

von HildeK (Gast)


Lesenswert?

Ich kenne den Tiny13 nicht, habe aber ähnliches mit dem Tiny25 schon 
gemacht. Ich verwende dort zur Initialisierung:
1
 sei();
2
// Power-Down Sleep Mode initialisieren
3
  set_sleep_mode(SLEEP_MODE_PWR_DOWN);  // stromsparend, aufwecken über WD oder INT0
4
  sleep_enable();           // Schlafmodus vorbereiten
danach an gewünschter Stelle
1
 sleep_mode();
Das hat jedenfalls prima funktioniert.

Deine diskrete Initialisierung im initSleep() hat ev. das Problem, das 
beim Tiny25 im Manual so beschrieben ist:

Bit 5 – SE: Sleep Enable
The SE bit must be written to logic one to make the MCU enter the sleep 
mode when the SLEEP instruction is executed. To avoid the MCU entering 
the sleep mode unless it is the programmer’s purpose, it is recommended 
to write the Sleep Enable (SE) bit to one just before the execution of 
the SLEEP instruction and to clear it immediately after waking up.

Das dürfte beim Tiny13 nicht anders sein. Es müsste also das 
Sleep-Kommando direkt nach dem SE kommen.

von P. F. (pfuhsy)


Lesenswert?

Hallo zusammen,

ich hab den Fehler gefunden. Das war die restliche Schaltung und nich 
der Controller. *Strinklatsch

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.