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

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren