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


von Markus (Gast)


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)


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)


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)


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)


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)


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)


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)


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"

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.