ATtiny15 - schlafen + aufwachen + 2 Funktionen - alles mit einer Taste

OP #1044483
Lesenswert?

Hallo zusammen,

mache gerade meine ersten Gehversuche mit einem tiny15 und Assembler mit 
AVR Studio4. Dieser soll sich mit einer Taste aus dem Power down 
einschalten und sofort eine LED leuchten lassen. Mit einem weiteren 
Tastendruck der gleichen Taste soll die LED blinken. Beim nächsten 
Tastendruck soll der tiny wieder in den Power down Modus.

als absoluter Neuling habe ich die Einzelfunktionen so leidlich 
hinbekommen, jedoch nicht auf einer Taste!

also: LED an - ok / Led blinken - mit PWM, aber noch zu schnell / 
schlafen - klappt auch / aufwecken noch mit der Reset Taste vom STK500

Ich wäre um jeden Denkanstoß aber gerne auch etwas weitergehende Hilfe 
dankbar.

Die eigentliche Frage ist wohl, wie ich es hinbekomme, dass eine Taste 
zum Aufwecken einen Interrupt auslöst und dann im Programm nicht.

Grüße aus dem Ruhrpott

Klaus
Gast #1044512
Lesenswert?

Ich hoffe, du hast die Taste an PB2/INT0 ngeschlossen
(schliesser auf gnd).

Wenn du am blinken bist und die Taste gedrückt wird:

- Externen Interrupt auf "Lowlevel" und "enablen" (ext. und global)

- Sleep starten


Bei einem langen Tastendruck (PB2 auf gnd) erfolgt ein Interrupt.

In den Start springen, ext.Int. nicht freigeben.

für mehr Assemblerunterstützung:

http://www.avr-asm-tutorial.net/avr_de/index.html

PS: der tiny15 ist abgelaufen, nur noch zum basteln gut wenn er
sonst rumliegt!

gruß hans
OP #1044528
Lesenswert?

Hallo Hans,

danke für die schnelle Antwort!

> Ich hoffe, du hast die Taste an PB2/INT0 ngeschlossen

noch nicht, aber in ein paar Minuten ;-)

Das weitere zeigt mir die Richtung - ich weiß auf jeden Fall, worüber du 
sprichst. Gestern wäre das noch anders gewesen.....

> PS: der tiny15 ist abgelaufen....

oha, den habe ich die Tage erst bei R angeschafft. Oder hätte ich jetzt 
tiny15L schreiben sollen? Ist der auch abgelaufen?
Gibt es was vergleichbares mit 3,3V Betriebsspannung und auch nicht 
größer?

Werde erst einmal versuchen, deine Vorschläge umzusetzen.

viele Grüße
Klaus
#1044762
Lesenswert?

Die Standardlösung:

- Pin-Change-Interrupt weckt AVR auf, schaltet Sleepmode aus.
- standard Entprell- und Tastendruckerkennungsroutine im Timerinterrupt.
- Mainloop wertet Tastendruck-Flag aus und macht Aktion.
- passiert etwa 500ms keine Aktion, setzt der Timerinterrupt den 
Sleepmode.
- Mainloop führt Sleep aus.

Optional:
- PCI disabled sich selbst
- Timerinterrupt enabled PCI wieder beim Sleepmode setzen


Peter


P.S.:
Da man beim ATtiny15 den PCI nicht maskieren kann, müssen alle 
unbenutzten Pins auf festes Potential gesetzt werden!
OP #1045001
Lesenswert?

Also, mal eins nach dem anderen, ich verliere jetzt schon fast den 
Überblick.

Ich bin keinesfalls an den tiny 15L gebunden, jeder andere AVR wäre mir 
genauso recht, einzigste Vorausetzung: er muß mit 3,3 Volt laufen und 
klein sein. Vielleicht gibt es da ja einen, für den es schon ein 
fertiges prg gibt.

Das Programm von Hanneslux ist - wie ich es beurteilen kann - 
erstklassig!

Ich würde nach Rücksprache mit Hannes auch gerne Teile davon benutzen, 
jedoch startet das Prg bei drücken der (für mich einen) Aufwachtaste das 
Prg jedesmal neu. Man kann mit der Taste also in dem Zustand weder 
andere Dinge auslösen, noch den Tiny schlafen schicken.

Den Vorschlag von Jörg habe ich mit einer ellenlangen warteschleife 
ausprobiert - erfolglos, vielleicht habe ich ja was falsch gemacht.

Die Sachen von Fabian und Peter werde ich jetzt mal angehen. in dem Zuge 
werde ich auch den Code mal aufräumen, so dass man ihn zeigen kann. ;-)

Danke an alle
Klaus
#1045965
Lesenswert?

Hier mal die Statemaschine in C (AVR-GCC) für nen ATtiny13:
1
int main( void )
2
{
3
  u8 state = 0;
4

5
  PORTB = 0xFF;                         // all IOs high (LEDs off, Pullups on)
6
  LED0_DDR = 1;
7
  LED1_DDR = 1;
8
  PCMSK = 1<<KEY0;                      // PCINT on Key0
9
  get_key_init();
10
  sei();
11

12
  for(;;){
13

14
    if( get_key_press( 1<<KEY0 ) )
15
      state++;                          // next state on every key press
16

17
    switch( state ){
18
      case 2:                           // LED flashing
19
        sleep_timer = 0;                                // no sleep on flashing
20
        if( flash_timer != FLASH_ON ){                  // on time
21
          if( flash_timer < FLASH_ON + FLASH_OFF )      // off time
22
            break;
23

24
      case 1:
25
          flash_timer = 0;
26
          LED0 = 0;                     // LED on
27
          break;
28

29
      case 0:
30
      default:
31
          state = 0;
32
        }
33
        LED0 = 1;                       // LED off
34
        break;
35
    }
36

37
    LED1 = 1;                           // for debug only
38
                                        // LED1 = off: power down
39
    sleep_cpu();
40
    LED1 = 0;
41
  }
42
}
Ist aber noch nicht getestet.
Im Anhang das komplette Programm.


Peter
Angehängte Dateien:
OP #1046652
Lesenswert?

Hallo,

so, spät war es gestern abend, da hatte ich mein kleines micro - beast 
soweit, dass es macht, was es soll!
-stolz-

Ist zwar mit der Keule programmiert, es ging aber erst einmal um die 
Funktion.....

so wie ich das jetzt sehe, war noch jemand sehr produktiv.

Obwohl ich von "C" nur weiß, das es der dritte Buchstabe im Alphabet ist 
;-) , lässt sich doch erahnen, dass es das gleiche tut, wie mein 
"Keulenprg" auch -- was, aber zum Himmel ist eine Statemaschine???
Oder liege ich falsch?
Riesig! Danke an Peter.

So wie ich gerade gesehen habe, läuft das Tiny13 Ding auch unter 3,3V 
und hat auch nur 8 Beine.

werde vermutlich erstmal meine paar tiny15 verbauen und mich bei 
weiterem Bedarf noch mit C befassen und dann auf die "Peter-Version" 
umsteigen.

Ich habe mal angehängt,was das überhaupt werden soll:

Bin aber gestern wohl auf den Geschmack gekommen und habe schon ein 
neues Projekt im Auge, wo gottlob kein Termin hintersteht.
Grüße
Klaus
Angehängte Dateien:

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