Forum: Mikrocontroller und Digitale Elektronik attiny13 aufwecken aus power down modus


von vlad (Gast)


Lesenswert?

Hi, ich hab ein Problem mit dem Power Down Modus.

Ich krieg meinen Tiny da einfach nicht raus.

Meine schaltung:
attiny13 steuert ein paar leds.
An Pin6 (PB1 / INT0) hab ich einen einen Taster, der gegen Masse 
schaltet.
Der interne Pull-Up ist aktiviert.

Das schalter auslesen und ansteuern der LEDs klappt alles Prima.
Auch in den Power Down-Modus versetzen kann ich ihn:
1
  LED_OFF(LED_R);
2
  LED_OFF(LED_G);
3
  LED_OFF(LED_B);
4
  set_sleep_mode( SLEEP_MODE_PWR_DOWN); // aus avr/sleep.h
5
  GIMSK |= (1<<INT0);
6
  sleep_mode();                         // aus avr/sleep.h
7
  GIMSK &= ~(1<<INT0);

Vor dem Schlafen schicken aktiviere ich Int0.
Aber wenn ich dann auf den schalter drücke passiert rein gar nix, er 
bleibt aus.

Hoffe jemand hat ne idee

von Falk B. (falk)


Lesenswert?

@  vlad (Gast)

>  set_sleep_mode( SLEEP_MODE_PWR_DOWN); // aus avr/sleep.h
>  GIMSK |= (1<<INT0);

Prüfe mal, ob du WIRKLICH den INT0 auf LOW LEVEL Interrupt konfiguriert 
hast.
Fallende/Steigende Flanke geht nicht!
Siehe Sleep Mode

MFG
Falk

von vlad (Gast)


Lesenswert?

da ich das MCUCR register nirgends beschreibe, sollte das der Fall 
sein,werds heut abend noch mal explizit probieren.

Mir ist aber nicht ganz klar, was der Unterschied zwischen Low-Level und 
fallende Flanke ist.
Beides ist active-low. LowLevel wird nur immer wieder aufgerufen, 
solange der pin auf masse liegt, oder wie? wie ist da die wiederholrate? 
sobald er aus der ISR raus ist?

Meine schaltung ist aber nicht das Problem?

von ... .. (docean) Benutzerseite


Lesenswert?

Hast du auch ein sei() verbaut?

von vlad (Gast)


Lesenswert?

sa sei() is drin, da ich den timer benutze

von vlad (Gast)


Lesenswert?

>// externer Interrupt INT0
>
>// Die Interruptroutine kann leer sein, ABER sie muss existieren!
>// Sonst springt der AVR nach dem Aufwachen zum Reset, weil kein sinnvoller
>// Interruptvektor eingetragen ist!
>
>ISR(INT0_vect) {
>}

Bei mir ist die ISR leer.
kann es sein, dass der Compiler ne leere Routine wegoptimiert?

von Peter D. (peda)


Lesenswert?

vlad schrieb:
> Aber wenn ich dann auf den schalter drücke passiert rein gar nix, er
> bleibt aus.

Man könnte jetzt versuchen, Dir alle Würmer aus der Nase zu ziehen.
Du könntest aber auch ganz profan nen compilierfähigen Code (*.c) als 
Anhang posten, geht deutlich schneller.


Allgemein kann man nur die sleep.h zitieren:
"the sleep_mode() macro might cause race conditions in some situations"

Oder deutlicher: Das sleep_mode() gehört verboten!


Peter

von vlad (Gast)


Lesenswert?

So habe ein Problem gefunden Hatte tatsächlich vergessen die interupts 
wieder zu aktivieren.

Nu hab ich aber ein neues Problem.

Hab das ganze auf beigefügten Code reduziert (hoffe habe nix vergessen 
reinzukopieren)

wenn ich das cli weglasse, geht alles, außer dass mir hin und wieder der 
Timer dazwischenfunkt und die leds wieder anschaltet.
um das zu verhindern, will ich nach dem Tastendruck bis zum sleep_cpu 
die Interupts sperren.
jedoch wacht der tiny sofort wieder auf.

Weiß da jemand rat?

1
#include <avr/io.h>
2
#include <avr/interrupt.h>
3
#include <avr/sleep.h>
4
#include <util/delay.h>
5
#include "mystdtypes.h"  // uint8, ...
6
7
8
9
#define LED_OFF(i) (PORTB &= ~(1<<(i)))
10
#define LED_ON(i)  (PORTB |=  (1<<(i)))
11
12
/* ========================================================================*/
13
/* ======================   global constants ==============================*/
14
/* ========================================================================*/
15
#define LED_R PIN0
16
#define LED_G PIN4
17
#define LED_B PIN2
18
19
#define COL_R 0
20
#define COL_G 1
21
#define COL_B 2
22
23
#define SWITCH PIN1
24
25
/* ========================================================================*/
26
/* =========================   global data ================================*/
27
/* ========================================================================*/
28
static uint8 g_fpwmCounter = 0;
29
static volatile uint8 g_rgbDutycycles[3] = {0,0,0};
30
31
/* ========================================================================*/
32
/* ========================================================================*/
33
34
//call this routine to initialize all peripherals
35
static inline void init_devices(void)
36
{
37
  DDRB  = (1<<LED_R) | (1<<LED_G) | (1<<LED_B); // BEWARE! writes all BITS
38
  PORTB |= (1<<SWITCH); // activate pullup
39
  TCCR0B |= (0<<CS02) | (0<<CS01) | (1<<CS00); // timer prescaler to 1
40
  TIMSK0 |= (1<<TOIE0); // enable timer interrupt;
41
42
  ACSR |= (1<<ACD);
43
  sei();
44
}
45
46
ISR(INT0_vect){}
47
48
ISR(TIM0_OVF_vect){
49
  ++g_fpwmCounter;
50
51
  if( g_fpwmCounter < g_rgbDutycycles[COL_R]  ) {
52
    LED_ON(LED_R);
53
  }else{
54
    LED_OFF(LED_R);
55
  }
56
  if( g_fpwmCounter < g_rgbDutycycles[COL_G]  ) {
57
    LED_ON(LED_G);
58
  }else{
59
    LED_OFF(LED_G);
60
  }
61
  if( g_fpwmCounter < g_rgbDutycycles[COL_B]  ) {
62
    LED_ON(LED_B);
63
  }else{
64
    LED_OFF(LED_B);
65
  }
66
}
67
68
69
static inline void powerDown(void)
70
{
71
  set_sleep_mode( SLEEP_MODE_PWR_DOWN);
72
  LED_OFF(LED_R);
73
  LED_OFF(LED_G);
74
  LED_OFF(LED_B);
75
  GIMSK |= (1<<INT0);  // enable int0
76
  sleep_enable();
77
  sei();
78
  sleep_cpu();
79
  sleep_disable();
80
  GIMSK &= ~(1<<INT0); // disable int0
81
}
82
83
84
85
/**********************************************************************/
86
int main (void) 
87
{ 
88
  _delay_loop_2(0);
89
  init_devices();
90
  _delay_loop_2(0);
91
92
  while(1)
93
  {
94
    g_rgbDutycycles[COL_R] = 128;
95
    g_rgbDutycycles[COL_G] =   0;
96
    g_rgbDutycycles[COL_B] = 255;
97
98
    while(( PINB & (1<<SWITCH)));
99
100
    //cli(); // <-- wenn das aktiv ist, dann geht er sofort aus dem power down raus
101
102
    _delay_loop_2(0); // nur um sicher zu gehen, das der schalter nicht prellt.
103
    _delay_loop_2(0);
104
    _delay_loop_2(0);
105
    _delay_loop_2(0);
106
    _delay_loop_2(0);
107
    _delay_loop_2(0);
108
    _delay_loop_2(0);
109
    _delay_loop_2(0);
110
111
    powerDown();
112
    
113
    _delay_loop_2(0); // nur um sicher zu gehen, das der schalter nicht prellt.
114
    _delay_loop_2(0);
115
    _delay_loop_2(0);
116
    _delay_loop_2(0);
117
    _delay_loop_2(0);
118
    _delay_loop_2(0);
119
    _delay_loop_2(0);
120
    _delay_loop_2(0);
121
  }
122
}

von Peter D. (peda)


Lesenswert?

vlad schrieb:
>
1
>     while(( PINB & (1<<SWITCH)));
2
> 
3
>     //cli(); // <-- wenn das aktiv ist, dann geht er sofort aus dem
4
> power down raus
5
>

Ist doch richtig, denn der Pin ist ja low, sonst wäre ja das while() 
nicht verlassen worden.

Die Delays kannst Du in der Pfeife rauchen.
Tastendruck entprellen und Flanke erkennen sieht anders aus.


Mach Dir mal nen PAP, wie das Sleep gestartet und wie es wieder 
verlassen werden soll.
Beides mit dem Zustand Pin = low kann nicht gehen. Dann machst Du nur 
beides schnell hintereinander.
Es müssen unterschiedliche Bedingungen sein.


Peter


P.S.:
Wenn Du schon Delays benutzt, was stört Dich daran, es lesbar zu machen, 
d.h. die Zeit direkt in µs oder ms anzugeben?

von (Gast) (Gast)


Lesenswert?


von vlad (Gast)


Lesenswert?

>Ist doch richtig, denn der Pin ist ja low, sonst wäre ja das while()
>nicht verlassen worden.

Was hat das mit dem cli zu tun?
es läuft kein anderer Int als der Timer und der Int0, der später gesetzt 
wird.

die delays sind bloß für des minimalbeispiel da, in meinem Programm sind 
die Tasten "ordentlich" entprellt


> Mach Dir mal nen PAP, wie das Sleep gestartet und wie es wieder
> verlassen werden soll.
Was bitte ist PAP

das sleep soll beginnen, wenn taste lang gedrückt wurde.
dann wird ein blinksignal ausgegeben (da ist genug zeit die Taste 
loszulassen)
dann power down.

bei erneuten tastendruck soll er wieder aufwachen.

das einschläfern und aufwecken funktioniert auch, bis auf das 
Blink-signal , da hier der Timer dazwischen funkt und die LEDs 
verstellt.
deaktiviere ich die Interrupts, dann sehe ich das Blinken aber er läuft 
direkt weiter aus dem PowerDwon raus, obwohl der Taster schon seit ner 
sekunde nicht mehr gedrückt wird.

folgendes kommt dem orignal näher:
1
int main (void) 
2
{ 
3
  _delay_loop_2(0);
4
  init_devices();
5
  _delay_loop_2(0);
6
7
  g_rgbDutycycles[COL_R] = 128;
8
  g_rgbDutycycles[COL_G] =   0;
9
  g_rgbDutycycles[COL_B] = 255;
10
11
  while(1)
12
  { uint8 i=0;
13
    while(( PINB & (1<<SWITCH)));
14
    //cli();   // <- hier ist das komische verhalten
15
    LED_OFF(LED_R);
16
    LED_OFF(LED_G);
17
    LED_OFF(LED_B);
18
    for(;i<100;++i){
19
      PINB |= (1<<LED_R); // TOGGLE
20
      _delay_ms(20);
21
    }
22
23
    powerDown();
24
    _delay_ms(1000);
25
  }
26
}

von Peter D. (peda)


Lesenswert?

vlad schrieb:

> Was bitte ist PAP

Programm-Ablauf-Plan

> das sleep soll beginnen, wenn taste lang gedrückt wurde.

Schön das endlich zu wissen.
Jedoch sehe ich nirgends Code für Langerkennung.

> folgendes kommt dem orignal näher:

Das ist nicht schön, daß Du uns so verscheißerst.
Mit nur "näher kommen" ist keinem gedient.
Schreibe einen Code, lasse ihn laufen und erst dann poste Fragen, die 
auch auf diesen getesteten Code passen!

Wenn Du immer nur irgendwas ausgedachtes hinschreibst, brauchst Du Dich 
nicht zu wundern, daß die Antworten nicht auf Deinen unbekannten Code 
passen.


Peter

von vlad (Gast)


Lesenswert?

>Jedoch sehe ich nirgends Code für Langerkennung.
die Langerkennung funktioniert und ist nicht teil des Problems deswegen 
ist sie in der Kurzvariante nicht drin.

>Schreibe einen Code, lasse ihn laufen und erst dann poste Fragen, die
>auch auf diesen getesteten Code passen!

der Code, den ich gepostet habe ist der, an dem ich grad rumprobiere.
Bei ihm tritt das selbe Problem auf, wie in meiner eigendlichen 
Anwendung.
Warum also willst du den gesammten Code (der Tiny13 ist bei 95%), wenns 
in dieser Minimalvariante genauso ersichtlich ist?


Die neue Variante habe ich nur gepostet, damit ersichtlihc ist, dass es 
kein Problem des Tasters ist, der noch gedrückt ist, wenn in den 
sleep-mode gegangen wird, ansonsten ist die Problematik die selbe, wie 
bei der ersten Code-Variante.
Wenn du dir den Code angeschaut oder gar ausprobiert hättest (mehr als 
ne LED und ein Taster ist dafür ja nicht nötig), wüstest du das

Ich habe alles was ich poste getestet.
Das einzige was an meinem Code anders ist, ist, dass ich nicht 
angesprungene Funktionen entfernt habe.

von Peter D. (peda)


Lesenswert?

vlad schrieb:
> Die neue Variante habe ich nur gepostet, damit ersichtlihc ist, dass es
> kein Problem des Tasters ist, der noch gedrückt ist, wenn in den
> sleep-mode gegangen wird

Du mußt ihn nach dem Drücken innerhalb von 2s loslassen (100*20ms 
Warteschleife), dann sollte es funktionieren. Es ist also höchstens ne 
Kurzdruckerkennung.

> Wenn du dir den Code angeschaut

Das habe ich, sonst hätte ich ja nicht erkannt, daß da garkeine 
Langerkennung drin ist.
Das Du eine Routine postest, die nicht das macht, was Du erklärst, ist 
zumindest verwirrend, auch wenn da nicht der Fehler ist.


Wenn Dich der Timerinterrupt stört, dann deaktiviere ihn einfach vor dem 
Sleep.
Deaktiviere alle Interrupts, die nicht zum Aufwachen benötigt werden.
Dem Sleep ist es nämlich wurscht, welcher Interrupt es beendet.


Peter

von vlad (Gast)


Lesenswert?

> Du mußt ihn nach dem Drücken innerhalb von 2s loslassen (100*20ms
> Warteschleife), dann sollte es funktionieren.
es funktioniert ebend nicht, bzw nur, wenn ich die Interupts NICHT 
deaktiviere.

Wenn das cli() weg ist, gehts, aber der timer fummelt halt bei dem 
Blink-signal dazwischen, dafür bleibt der tiny aber im power down.
wenn das cli() da ist, mag er nicht schlafen.

>Dem Sleep ist es nämlich wurscht, welcher Interrupt es beendet.

nur der int0 (und der wachhund, den ich nicht hab) kann den aufwecken

von Peter D. (peda)


Lesenswert?

So, ich habs mal selber ausprobiert.
Es funktioniert alles bestens, wenn man ne ordentliche Entprellroutine 
nimmt.

Die Taste wechselt zwischen Schlafen und Wachen hin und her. Das 
Schlafen darf natürlich erst nach Loslassen erfolgen.
Und hier der komplette Code:
1
#include <avr\io.h>
2
#include <avr\interrupt.h>
3
#include <avr\sleep.h>
4
5
//           Access bits like variables:
6
struct bits {
7
  uint8_t b0:1;
8
  uint8_t b1:1;
9
  uint8_t b2:1;
10
  uint8_t b3:1;
11
  uint8_t b4:1;
12
  uint8_t b5:1;
13
  uint8_t b6:1;
14
  uint8_t b7:1;
15
} __attribute__((__packed__));
16
17
#define SBIT_(port,pin) ((*(volatile struct bits*)&port).b##pin)
18
#define SBIT(x,y)  SBIT_(x,y)
19
20
int main( void ) __attribute__((OS_main));  // avoid push in main
21
22
23
#define RED          SBIT( PORTB, 2 )
24
#define RED_DDR      SBIT( DDRB,  2 )
25
#define GREEN        SBIT( PORTB, 3 )
26
#define GREEN_DDR    SBIT( DDRB,  3 )
27
#define BLUE         SBIT( PORTB, 4 )
28
#define BLUE_DDR     SBIT( DDRB,  4 )
29
#define KEY0_PULLUP  SBIT( PORTB, 1 )
30
31
#define KEY_PIN    PINB
32
#define KEY0       PB1
33
34
#define LED_OFF    1
35
#define LED_ON    0
36
37
38
uint8_t key_state;        // debounced and inverted key state:
39
                          // bit = 1: key pressed
40
uint8_t key_press;        // key press detect
41
42
uint8_t pwm_red, pwm_green, pwm_blue, pwm_cycle;
43
uint8_t t_flag;
44
45
46
ISR( INT0_vect )
47
{
48
}
49
50
51
ISR( TIM0_OVF_vect )          // 9.6MHz / 256 = 37.5kHz
52
{
53
  if( --pwm_cycle == 0 )
54
    t_flag = 1;               // / 256 = 146Hz (7ms)
55
  if( pwm_red > pwm_cycle )
56
    RED = LED_ON;
57
  else
58
    RED = LED_OFF;
59
  if( pwm_green > pwm_cycle )
60
    GREEN = LED_ON;
61
  else
62
    GREEN = LED_OFF;
63
  if( pwm_blue > pwm_cycle )
64
    BLUE = LED_ON;
65
  else
66
    BLUE = LED_OFF;
67
}
68
69
70
void init( void )
71
{
72
  RED_DDR = 1;
73
  GREEN_DDR = 1;
74
  BLUE_DDR = 1;
75
  KEY0_PULLUP = 1;
76
77
  TCCR0A = 0;
78
  TCCR0B = 1<<CS00;          // XTAL / 1
79
  TIMSK0 = 1<<TOIE0;
80
81
  ACSR = 1<<ACD;             // disable analog comparator
82
83
  set_sleep_mode( SLEEP_MODE_PWR_DOWN);    // prepare sleep
84
  sleep_enable();
85
}
86
87
88
void go_asleep( void )
89
{
90
  TIMSK0 = 0;               // other interrupts off
91
  RED = LED_OFF;
92
  GREEN = LED_OFF;
93
  BLUE = LED_OFF;
94
  GIMSK = 1<<INT0;          // awake interrupt on
95
  sleep_cpu();
96
  GIMSK = 0;
97
  TIMSK0 = 1<<TOIE0;
98
}
99
100
101
void key_debounce( void )        // called every 7ms from main
102
{
103
  static uint8_t ct0, ct1;
104
  uint8_t i;
105
106
  i = key_state ^ ~KEY_PIN;      // key changed ?
107
  ct0 = ~( ct0 & i );            // reset or count ct0
108
  ct1 = ct0 ^ (ct1 & i);         // reset or count ct1
109
  i &= ct0 & ct1;                // count until roll over ?
110
  key_state ^= i;                // then toggle debounced state
111
  key_press |= key_state & i;    // 0->1: key press detect
112
}
113
114
115
uint8_t get_key_press( uint8_t key_mask )
116
{
117
  key_mask &= key_press;                        // read key(s)
118
  key_press ^= key_mask;                        // clear key(s)
119
  return key_mask;
120
}
121
122
123
int main( void )
124
{
125
  uint8_t sleep_on = 0;
126
127
  init();
128
  sei();
129
130
  pwm_red = 255;
131
  pwm_green = 64;
132
  pwm_blue = 16;
133
134
  for(;;){
135
    if( t_flag ){
136
      t_flag = 0;
137
      key_debounce();
138
    }
139
    if( get_key_press( 1<<KEY0 )){
140
      sleep_on = !sleep_on;        // toggle sleep/awake
141
    }
142
    if( sleep_on &&                // sleep on
143
      !(key_state & 1<<KEY0) &&    // and key state released
144
      (KEY_PIN & 1<<KEY0)){        // and key released
145
      go_asleep();
146
    }
147
  }
148
}


Peter

von vlad (Gast)


Lesenswert?

es liegt nicht an der Entprellung!
wenn ich anstatt des cli() auch nur den timer deactiviere dann gehts bei 
mir auch. Das ist zwar ein Workaround, aber mich interessiert dennoch wo 
das Problem seinen Ursprung hat.



Mach mal nach der Erkennung des Tastendrucks ein
cli() anstatt den Timer-Int abzustellen.
direkt vor dem sleep muss ein sei()

von vlad (Gast)


Lesenswert?

>wenn ich anstatt des cli() auch nur den timer deactiviere dann gehts bei
>mir auch
wobei das nicht am timer liegt.
Es wird damit ja nur verhindert, dass der Timer die LEDs verstellt.
Es geht ja auch mit aktiviertem timer und er bleibt im sleep, nur sieht 
man das Blinken nicht


die cli/sei müssen irgendwelche seiteneffecte haben, die ich übersehe.

von Peter D. (peda)


Lesenswert?

vlad schrieb:
> es liegt nicht an der Entprellung!

Aber die Entprellung macht das Ganze erst richtig testbar.

Außerdem bewirkt sie, daß die Schaltung nicht gleich durch Störimpulse 
wieder aufwacht (z.B. Einschalten einer Leuchtstofflampe in der Nähe).
Der AVR wacht kurz auf, macht die Entprellung, merkt, es ist nur ne 
Störung und geht sofort wieder schlafen.


> Mach mal nach der Erkennung des Tastendrucks ein
> cli() anstatt den Timer-Int abzustellen.
> direkt vor dem sleep muss ein sei()

Warum sollte ich, es ist falsch.
Wie schon gesagt, jeder freigegebene Interrupt verläßt das Sleep.

Das Power-Down verhindert nur, daß der Timer weiterzählt und einen 
weiteren Interrupt erzeugt.
Aber das interessiert nicht, da Du durch das cli() den Timerinterrupt am 
Ausführen gehindert hast.
Das Interrupt-Pending-Bit des Timers ist also schon längst gesetzt und 
reißt Dich natürlich nach dem sei() sofort wieder aus dem Sleep raus.


Peter

von vlad (Gast)


Lesenswert?

>Wie schon gesagt, jeder freigegebene Interrupt verläßt das Sleep.
Das ist falsch!
Der Timer kann den AVR nicht aus dem Schlaf holen!
Das kann nur der INT0 und der Watchdog.
Datenblatt Tabelle 7-1 Seite 30

von Peter D. (peda)


Lesenswert?

vlad schrieb:
>>Wie schon gesagt, jeder freigegebene Interrupt verläßt das Sleep.
> Das ist falsch!

[Goldwaagemodus an]
Wie schon gesagt, jeder freigegebene pending Interrupt verläßt das 
Sleep.
[Goldwaagemodus aus]

Nun zufrieden?

> Der Timer kann den AVR nicht aus dem Schlaf holen!

Er kann nur keinen neuen Interrupt auslösen, da er nicht weiter zählt.

Die Interruptlogik ist im Power-Down voll aktiv und damit verläßt jeder 
freigegebene pending Interrupt das Sleep. Das Sleep dauert dann genau 
einen CPU-Zyklus.
Man könnte auch sagen, es wird ja kein Sleep ausgeführt, es wird wie ein 
NOP ausgeführt.

Stelle Dir das einfach mal in Hardware vor:
Das Signal zum Interrupteinsprung liegt parallel auch an der 
Aufwachschaltung an.
Es gibt keine extra Schaltung mit ANDs und ORs von jeder Interruptquelle 
und jedem Freigabebit speziell für die Sleep-Schaltung.


> Das kann nur der INT0 und der Watchdog.
> Datenblatt Tabelle 7-1 Seite 30

Darum geht es überhaupt nicht.
Es geht um beim Sleep-Befehl bereits anhängige Interrupts.


Peter

von vlad (Gast)


Lesenswert?

>[Goldwaagemodus an]
>Wie schon gesagt, jeder freigegebene pending Interrupt verläßt das
>Sleep.
>[Goldwaagemodus aus]

Du hast scheinbar Recht. Steht aber nicht im Datenblatt.
Ist jetzt auch egal, es funktioniert jetzt alles.

Ich danke für eure Hilfe,
Gruß,
Vlad

von Peter D. (peda)


Lesenswert?

vlad schrieb:
> Du hast scheinbar Recht. Steht aber nicht im Datenblatt.

Das Datenblatt schreiben auch nur Menschen, muß also nicht immer 100% 
verständlich sein.

Indirekt steht es doch drin:
Table 7-1 Seite 30 sagt, daß die "Clock Domain" CLK_IO abgeschaltet 
wird, d.h. der Timer zählt nicht weiter.
Daß damit auch sein Interrupt Pending Flag gelöscht wird, steht aber 
nirgends.


Peter

von vlad (Gast)


Lesenswert?

>Das Datenblatt schreiben auch nur Menschen, muß also nicht immer 100%
>verständlich sein.

Hab auch schon deutlich schlimmere Datenblätter gesehen ;)

von Lokus P. (derschatten)


Lesenswert?

Ich habe dieses Beispiel hier ausgegraben weil es ganu das machen soll 
was ich benötigen würde.
Mit einer Taste den Sleep-Modus EIN/AUS zu schalten.

Was mir jedoch hier fehlt ist, wo wird denn der Interrupt-PIN zum 
aufwecken definiert?
Also der PCMSK0?

von Lokus P. (derschatten)


Angehängte Dateien:

Lesenswert?

Also ich habe mein program damit jetzt fast so zum laufen bekommen wie 
ich es gern haben möchte.
Jedoch sind noch 2 seltsame Verhalten:

.) Ich kann den AVR in den Schlafmodus schicken aber mit der gleichen 
taste nicht mehr aufwecken
.) Bei jedem Tastendruck des Encoders (#define TASTER  (1 << PB2)) wird 
der AVR aufgeweckt (und nur dann) und beginnt den main-Vorgang 
abzuarbeiten.

von Lokus P. (derschatten)


Lesenswert?

HELP PLEASE!
Verzweifel!

von Lokus P. (derschatten)


Angehängte Dateien:

Lesenswert?

Es läuft fast.
Das einzige Problem das ich noch habe ist das "schlafen()" beim 
Tastendruck 2 mal durchlaufen wird.

Jemand eine Idee?

von Lokus P. (derschatten)


Angehängte Dateien:

Lesenswert?

Nochmal nur auf das notwendigste beschränkt, damits übersichtlicher ist.
Jedoch selber Effekt.

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.