Sleep Mode TINY2313

Gast #3555796
Lesenswert?

Hallo Freunde (:

Ich habe ein kleines Problem... Wenn ich aus dem SleepMode aufwachen 
möchte, muss ich meinen Taster erst 2 x betätigen damit mein µC 
(TINY2313) aufwacht!
Geht das nicht anderst ? Habe ich was falsch gemacht ?!

P.S

Wenn ich den TINY in "PWR_DOWN" Mode setze... wacht er später gar nicht 
mehr auf Schlafmütze...
Ist das auch normal ?!
1
#define F_CPU 4000000 // Frequenz = 8 MHz
2

3
#define Abschaltzeit 600
4

5
#define key_SOS    PD3 // Taste SOS
6
#define key_ON    PD2 // Taste ON
7
#define key_UP    PD1 // Taste UP
8
#define key_DOWN  PD0 // Taste Down
9

10
#define XPE_1_an    PORTB |= (1<<PB0) // HighPowerLED 1 an
11
#define XPE_2_an    PORTB |= (1<<PB1) // HighPowerLED 2 an
12
#define XPE_3_an    PORTB |= (1<<PB2) // HighPowerLED 3 an
13
#define XPE_4_an    PORTB |= (1<<PB3) // HighPowerLED 4 an
14

15
#define XPE_1_aus    PORTB &= ~(1<<PB0) // HighPowerLED 1 aus
16
#define XPE_2_aus    PORTB &= ~(1<<PB1) // HighPowerLED 2 aus 
17
#define XPE_3_aus    PORTB &= ~(1<<PB2) // HighPowerLED 3 aus 
18
#define XPE_4_aus    PORTB &= ~(1<<PB3) // HighPowerLED 4 aus
19

20
#define Alarm_an    PORTB |=  (1<<PB4) // Summer an
21
#define Alarm_aus    PORTB &= ~(1<<PB4) // Summer aus
22

23

24
#include <avr/io.h>         // Library für die I/O (Ports & Pins)
25
#include <avr/wdt.h>        // Library für den Watchdog
26
#include <avr/sleep.h>      // Library für den Schlaf Modus
27
#include <avr/interrupt.h>  // Library für die Interrupts
28
#include <util/delay.h>    // Library für Delay
29
#include <stdint.h>      // Benötigt Library für Uint16_t Werte
30

31

32
volatile char Helligkeit;     // Variable für die Helligkeit aller HighPowerLED´s
33
volatile uint16_t Auto_Off;
34

35

36
void SOS();
37

38
int main(void)
39
{
40

41

42
    OCR0A  = 0x4D;      // Legt den Wert des Überlaufes fest
43
    TCCR0A = 0x02;      // Clear Timer on Compare Match (CTC) Modus
44
    TIFR |= 0x01;       // Clear Interrupt Flag
45
    TIMSK = 0x01;       // TC0 compare match A interrupt enable
46
    TCCR0B = 0x05;      // Prescaler auf 1024 setzen (F_CPU/1024)
47
  GIMSK |= (1<<INT0);  // Interrupt "INT0" aktivieren
48
  MCUCR |= (1<<ISC01);// auf fallende Flanke an "INT0" reagieren
49
    sei();              // Interrupts global aktivieren
50
  
51
while(1)
52
{
53

54

55

56
  if (Auto_Off == Abschaltzeit) // Ist Auto_Off = 60000, dann schlafen!
57
  
58
    {
59
      XPE_1_aus;
60
      XPE_2_aus;
61
      XPE_3_aus;
62
      XPE_4_aus;    
63
      set_sleep_mode(SLEEP_MODE_IDLE);
64
      sleep_mode();
65
    }
66

67

68
    
69
}// Ende While
70
  
71
}// Ende Main
72

73

74
ISR(TIMER0_COMPA_vect) // Sorgt dafür das die Akkus / Batterien geschont werden! (Abschaltung nach ca. 10 min.)
75

76
  {
77
    Auto_Off = Auto_Off+1; // Jede 10ms Auto_Off um 1 erhöhen!
78
  }
79
  
80

81
ISR(INT0_vect)
82

83
{      
84
  Auto_Off =0;
85
  static char LED_Status;     // Wertet den Status der LED´s aus (AN / AUS ?)
86

87

88
if (LED_Status == 1)
89
  {
90
    XPE_1_aus;
91
    XPE_2_aus;
92
    XPE_3_aus;
93
    XPE_4_aus;
94
    LED_Status =0;
95
  }
96
  else
97
  
98
  {
99
    XPE_1_an;
100
    XPE_2_an;
101
    XPE_3_an;
102
    XPE_4_an;
103
    LED_Status =1;
104
  }
105
  
106

107
  
108
}
Gast #3555813
Lesenswert?

Hi,

ich kann dir beim Sleepmode leider nicht helfen, aber:

Thomas H. schrieb:
> #define XPE_1_an    PORTB |= (1<<PB0) // HighPowerLED 1 an
> #define XPE_2_an    PORTB |= (1<<PB1) // HighPowerLED 2 an
> #define XPE_3_an    PORTB |= (1<<PB2) // HighPowerLED 3 an
> #define XPE_4_an    PORTB |= (1<<PB3) // HighPowerLED 4 an

Nimm bitte lieber inline Funktionen statt unnötige Makros. Makros 
sollten so gut wie es geht vermieden werden.

Thomas H. schrieb:
> #define Abschaltzeit 600

Defines werden immer komplett groß geschrieben. So macht das jeder 
(normalerweise).

Thomas H. schrieb:
> volatile char Helligkeit;

Die Variable wird zwar noch nicht benutzt, aber der Datentyp char ist 
hier jedenfalls nicht richtig. Char ist erstens für Zeichen vorbehalten 
und zweitens je nach Architektur/System signed oder unsigned. Also 
lieber uint8_t.
#3555826
Lesenswert?

Thomas H. schrieb:
> Wenn ich den TINY in "PWR_DOWN" Mode setze... wacht er später gar nicht
> mehr auf

> MCUCR |= (1<<ISC01);// auf fallende Flanke an "INT0" reagieren

Dann schau dir mal im Datenblatt das Kapitel "Power Management and Sleep 
Modes" an, und darin besonders die "Wake-up Sources" in der Tabelle 14.

> Wenn ich aus dem SleepMode aufwachen
> möchte, muss ich meinen Taster erst 2 x betätigen damit mein µC
> (TINY2313) aufwacht!

Überleg mal, welchen Zustand die Variable 'LED_Status' in der ISR hat, 
wenn die LEDS in main() ausgeschaltet wurden.

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