Forum: Mikrocontroller und Digitale Elektronik mal wieder Sleep beim Atmega8


von Adi A. (mateit)


Lesenswert?

Hallo AVR-Begeisterte,

ich bin Anfänger und wollte mich heute den Interrupts und dem Sleep 
Modus zuwenden.
Das ist mein Code:
1
#define F_CPU 8000000L
2
3
#include <stdlib.h>
4
#include <avr/io.h>
5
#include <util/delay.h>
6
#include <avr/interrupt.h>
7
#include <avr/sleep.h>
8
9
ISR(INT0_vect) {
10
  sleep_disable();
11
}
12
13
int main(void)
14
{
15
  //interrupts deaktivieren
16
  cli();
17
18
  //DDRs setzen
19
  DDRB = 0x00; 
20
  DDRD = 0xFF; 
21
22
  //interrupts aktivieren
23
  sei();
24
25
     while(1)
26
  {
27
28
    // binaeres hochzaehlen
29
    PORTD++;
30
    _delay_ms(10);
31
32
    // wenn PB2 low, Sleep Modus aktivieren
33
    if( !(PINB & (1 << PB1)) )
34
    {
35
      set_sleep_mode(SLEEP_MODE_PWR_DOWN);
36
      sleep_mode();
37
    }
38
  }
39
}

Im Normalfall blinken die LEDs am Port D. Sobald ich den Taster an PB1 
drücke, stoppt das Blinken und die CPU fährt in den Power Down Modus.

Solbald ein H-Signal an PD6 (AIN0; Pin 12) anliegt, möchte ich, dass die 
CPU wieder hochfährt und das Blinken an alter Stelle fortsetzt. Und 
genau an dieser Stelle hänge ich fest, die CPU möchte einfach nicht 
weiter zählen.
Weiß jemand Rat? Was mache ich falsch?

(Ich weiß allerdings nicht, ob es auch möglich ist einen x-beliebigen 
Taster als Interrupt zu verwenden (?).)


Vielen Dank schon im Voraus.
Schönen (restlichen) Feiertag noch.


Grüße

mateit

von Uwe .. (uwegw)


Lesenswert?

Du willst laut Code den INT0-Interrupt zum Aufwecken nehmen. Der wird 
aber nirgendwo aktiviert, und auf PD6 liegt er auch nicht...

von Adi A. (mateit)


Lesenswert?

Hallo,

vielen Dank für die wirklich sehr schnelle Antwort.
Gut, dass du es sagst. Ich hatte den AIN0 im Sinn.
Ich müsste also PD2 als Eingang deklarieren, dort ist bloß blöderweise 
eine meiner LEDs angeschlossen.

Aber das ist alles eh nur eine Notlösung. Denn eigentlich möchte ich PB2 
(einen beliebigen Taster) als Interrupt verwenden - ist das möglich?


Gruß

mateit

von Uwe .. (uwegw)


Lesenswert?

RTFDS! Da gibts ne schöne Tabelle, wo die sie möglichen Aufweck-Signale 
für sämtliche Sleepzustände gelistet sind.

von Falk B. (falk)


Lesenswert?

Siehe Sleep Mode

von Adi A. (mateit)


Lesenswert?

Falk Brunner schrieb:
> Siehe Sleep Mode

Ahhh vielen Dank! Das hat mir wirklich geholfen. Schade, dass man im 
Power Down Modus nur INT0 und INT1 zum Aufwachen nutzen kann, aber naja, 
muss ich wohl mit leben.

Danke an alle.


Gruß

von Uwe .. (uwegw)


Lesenswert?

Du könntest auch auf dem Mega48/88/168 wechseln. Die haben nen Interrupt 
an allen Pins.

von Paul (Gast)


Lesenswert?

@Uwe ...

Auch wenn die an allen pins interrupts haben so sind im Power Down nur 
INT0 und INT1 aktiv!

von Falk B. (falk)


Lesenswert?

@Paul (Gast)

>Auch wenn die an allen pins interrupts haben so sind im Power Down nur
>INT0 und INT1 aktiv!

Nöö, die Pin Change Interrupts sind auch im Power Down Mode verfügbar.

MfG
Falk

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.