Forum: Compiler & IDEs Sleept Modus startet nicht


von Karl (Gast)


Lesenswert?

Hallo, ich habe folgendes Problem. Ich möchte die Sleep Funktion meines 
Crumb 168 (mit AtMega168) testen. Habe hierzu das Bsp programm aus der 
Sleep.h angepasst.
1
#define F_CPU 8000000ul
2
#include <avr/io.h>
3
#include <util/delay.h>  
4
#include <avr/interrupt.h>
5
#include <avr/sleep.h>
6
7
int main(void)
8
{
9
int i = 0;
10
DDRB = (1 << DDB2);
11
DDRC = (1 << DDD2);
12
PORTD = 0xff;
13
for(;;)
14
  {
15
  PORTB ^= (1<<PB2);  //toggel LED
16
  _delay_ms(1500);
17
  i++;
18
  set_sleep_mode(SLEEP_MODE_PWR_DOWN);
19
    cli();
20
    if (i == 3)
21
      {
22
      sleep_enable();
23
      sei();
24
      sleep_cpu();
25
      sleep_disable();
26
      }
27
      sei();
28
  }
29
return 0;
30
}

Leider hört die LED am Pin B2 nicht auf zu blinken. Oder wird dieser 
Sleep Modus sofort wieder beendet, sodas man dies nicht mitbekommt. Auch 
beim Strom kann man nix davon sehen. Im Datenblatt steht, das der µC 
anhält und dann per INT 0 oder 1 erst wieder gestartet werden kann.
Kann mir jemand nen Tip geben, was ich falsch mache.

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Karl schrieb:
> Habe hierzu das Bsp programm aus der
> Sleep.h angepasst.

Dieses Beispielprogramm soll nur die Funktion der getrennten
Sleep-Makros erläutern.  Die brauchst du für deinen Zweck
gar nicht.

> DDRB = (1 << DDB2);
> DDRC = (1 << DDD2);

DDD2 gehört aber nach DDRD, nicht nach DDRC. ;-)

Ich würde das einfach so schreiben:
1
#define F_CPU 8000000ul
2
#include <avr/io.h>
3
#include <util/delay.h>  
4
#include <avr/interrupt.h>
5
#include <avr/sleep.h>
6
7
int main(void)
8
{
9
  int i = 0;
10
  DDRB = (1 << DDB2);
11
12
  for(;;)
13
  {
14
    PORTB ^= (1<<PB2);  //toggel LED
15
    _delay_ms(1500);
16
    i++;
17
    set_sleep_mode(SLEEP_MODE_PWR_DOWN);
18
    if (i == 3)
19
         sleep_mode();
20
  }
21
  return 0;
22
}

Beachte, dass du derzeit rein gar nichts definiert hast, was den
Prozessor wieder aus dem Schlaf aufweckt.  Außerdem wird die
CPU mit PB2 = low angehalten aber mit aktivem Ausgang.  Falls
deine LED low-aktiv ist, wird sie also weiterhin Strom ziehen.
Die offenen Eingänge der anderen Pins können u. U. auch recht
viel Stromverbrauch verursachen.

von Karl (Gast)


Lesenswert?

Viele dank für die Antwort. Kann man nicht die Eingänge  INT 0 und INT 1 
zum beenden des Sleep Modus nutzen? Dies soll das Programm für einen 
Ladeprozess sein und dann über eine OPV schaltung an den INT 0 oder 1. 
Oder kann man auch intern eien ADC aktiv lassen, der dies dann alle 5 
min überprüft?

Mit dem Power Down Modus möchte ich dann im normalen einsatz die PWM´s 
von PB1 und 2 und 2 ADC´s abschalten. Gibt es eigentlich eine 
Möglichkeit im Sleep Modus die LED und offenen Eingänge abzuschalten?

von Falk B. (falk)


Lesenswert?

@  Karl (Gast)

>Viele dank für die Antwort. Kann man nicht die Eingänge  INT 0 und INT 1
>zum beenden des Sleep Modus nutzen?

Kann man, siehe Sleep Mode.

>von PB1 und 2 und 2 ADC´s abschalten. Gibt es eigentlich eine
>Möglichkeit im Sleep Modus die LED und offenen Eingänge abzuschalten?

Logisch. Einfach auf LOW oder HIgh legen bzw. interne Pull-Ups 
einschalten.

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.