Sleept Modus startet nicht

Gast #1370036
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.
Moderator Persönliche Seite
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.
Gast
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?
@  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

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 17 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.