Forum: Mikrocontroller und Digitale Elektronik ATTiny 45 - Sleep Mode und toggle!


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Markus (Gast)


Bewertung
0 lesenswert
nicht 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

von Sven K. (quotschmacher)


Bewertung
0 lesenswert
nicht 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)

von HildeK (Gast)


Bewertung
0 lesenswert
nicht 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.

von Peter D. (peda)


Bewertung
1 lesenswert
nicht lesenswert
Markus schrieb:
> _delay_ms(250);

Schmeiß diese Delays raus und nimm eine ordentliche Entprellung + 
Flankenerkennung.

Hier ein Beispiel für Entprellung mit Sleep:
Beitrag "Re: AVR Sleep Mode / Knight Rider"

von Peter D. (peda)


Bewertung
0 lesenswert
nicht lesenswert
HildeK schrieb:
> Ich verwende normalerweise statt sleep_cpu(); den Befehl sleep_mode();

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 ..."

HildeK schrieb:
> Ein sleep_disable() ist wohl auch nicht notwendig.

So ist es, das sleep_mode() macht unnötige Dinge.

von Markus (Gast)


Bewertung
0 lesenswert
nicht 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

von HildeK (Gast)


Bewertung
0 lesenswert
nicht 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).

von Eric B. (beric)


Bewertung
0 lesenswert
nicht lesenswert
Markus schrieb:
> Hat da jemand nen link in dem man das mit dem
> Entprellen für dummis nachvollziehen kann

Hat PeDa dir doch schon gegeben:

Peter D. schrieb:
> Hier ein Beispiel für Entprellung mit Sleep:
> Beitrag "AVR Sleep Mode / Knight Rider"

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
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.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.