ATTiny 45 - Sleep Mode und toggle!

Gast #5468691
Lesenswert?
• ▲
▼
Sehr geehrte Damen und Herren dieses Forums,

leider stehe ich vor einem kleinem Problem, ich bekomme nicht hin das 
der ATTiny 45 in Sleepmode geht. Ich hab versucht es nach bessten wissen 
und meinem Verständniss hinzubekommen aber es will nicht gehen. Ich bin 
gerade dabei mich einzuarbeiten in das Programmieren eines Controllers 
aber das mit dem Sleep mode verstehe ich nicht auch nicht was das 
datenblatt mir sagen will :( Ich habe hinbekommen eine LED mit einem 
Knopf an und auszuschalten, wie ein Schalter. nun habe ich das Problem 
wenn ich die LED einschalte und den taster gedrückt halte, die LED 
anfängt zu blinken. Kann man das auch abstellen, so dass es egal ist wie 
lange ich drücke einfach an ist und nicht nach net zeit anfängt zu 
blinken.

Programmieren tu ich es in Atmel Studio 7 und C++
1
#define F_CPU 1000000UL
2
#include <avr/io.h>
3
#include <util/delay.h>
4
#include <avr/sleep.h>
5
#include <avr/interrupt.h>
6

7
#define LED1 3
8
#define BUT1 2
9

10
typedef int bool TOP;
11

12

13
int main(void)
14
{
15
  DDRB = 0b00001000;
16
  PORTB = 0b00000100;
17
  
18
  bool TOP;
19
  
20
  TOP = 0;
21
  
22
  while(1)
23
  {
24
    if ((!(PINB & (1<<BUT1))) & TOP == 0)
25
    {
26
      PORTB |= (1<<LED1);
27
      TOP = 1;
28
      _delay_ms(250);
29
    }
30
    else if (!(PINB & (1<<BUT1)) & TOP == 1)
31
    {
32
      PORTB &= ~(1<<LED1);
33
      TOP = 0;
34
      _delay_ms(250);
35
    }
36
  }
37
}
38
void sleep() {
39

40
  GIMSK |= _BV(PCIE);                     
41
  PCMSK |= _BV(PCINT3);                   
42
  ADCSRA &= ~_BV(ADEN);                   
43
  set_sleep_mode(SLEEP_MODE_PWR_DOWN);    
44
{
45
  sleep_enable();                         
46
  sei();                           
47
  sleep_cpu();                      
48
}
49
  cli();
50
  PCMSK &= ~_BV(PCINT3);
51
  sleep_disable();                     
52
  ADCSRA |= _BV(ADEN);                  
53

54
  sei();                               
55
} // sleep
#5468703
Lesenswert?
• ▲
▼
Markus schrieb:
> nun habe ich das Problem
> wenn ich die LED einschalte und den taster gedrückt halte, die LED
> anfängt zu blinken

du guckst in deiner main, ob ein taster gedrückt wurde, wechselst den 
zustand der led und wartest, um dann wieder zu gucken, ob der taster 
gedrückt wurde, was er ja noch immer ist... du musst einfach nur 
überprüfen, ob der taster zwischendurch mal losgelassen wurde. zudem 
kann man sich die abfrage nach dem status auch schenken - schau mal im 
datenblatt nach, wie man einen ausgang togglen kann (pin-register)
Gast #5468718
Lesenswert?
• ▲
▼
Du solltest die Funktion "sleep()" auch irgendwo im main aufrufen ...

Ich verwende normalerweise statt sleep_cpu(); den Befehl sleep_mode();
Ein sleep_disable() ist wohl auch nicht notwendig. Nach dem Aufruf von 
sleep() geht er schlafen, bis ihn ein z.B. INT0 wieder weckt. Erneut 
schlafen geht er erst, wenn wieder sleep() aufgerufen wird.
Gast #5468864
Lesenswert?
• ▲
▼
Ich danke euch für die Antworten leider stehe ich mit den Beispielen 
etwas auf dem Schlauch. Hat da jemand nen link in dem man das mit dem 
Entprellen für dummis nachvollziehen kann oder wäre es möglich das mir 
einer freundlichweise den Code abändern köönbt :)

Markus
Gast #5468879
Lesenswert?
• ▲
▼
Peter D. schrieb:
> Hoffentlich hast Du dann auch den Kommentar in der sleep.h dazu
> verstanden:
> "As the sleep_mode() macro might cause race conditions in some
> situations ..."

Zugegeben, den habe ich nicht wirklich verstanden. "may cause ... in 
some situations" ist halt sehr vage.
Und bisher konnte ich nichts negatives feststellen.

Aber beim TO sollte zumindest der Aufruf seiner Routine sleep() im 
main() vorhanden sein, oder nicht?

Sieht bei mir typischerweise so aus:
1
int main(); 
2
{
3
.
4
.
5
// Power-Down Sleep Mode einstellen
6
  set_sleep_mode(SLEEP_MODE_PWR_DOWN); 
7
  sleep_enable();                      
8
  sei();
9
.
10
.
11
  while(1)
12
  {
13
    .
14
    .
15
    sleep_mode();
16
    .
17
    .
18
  }
19
}
Geweckt wird je nach Anwendung über INT0 oder WD-Interrupt (oder mit 
beidem).

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

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.