Forum: Mikrocontroller und Digitale Elektronik Sleep Mode TINY2313


von Thomas H. (Gast)


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
}

von TriHexagon (Gast)


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.

von Leo C. (rapid)


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.

: Bearbeitet durch User
von Falk B. (falk)


Lesenswert?

Siehe Sleep Mode

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.