Forum: Mikrocontroller und Digitale Elektronik ATtiny15 - schlafen + aufwachen + 2 Funktionen - alles mit einer Taste


von Klaus W. (overheater)


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

von hans (Gast)


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

von Klaus W. (overheater)


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

von Klaus W. (overheater)


Lesenswert?

zwischenbilanz:
sobald der externe Interrupt enabled wird, läuft er über sleep hinweg 
und fängt wieder am Programmanfang - besser gesagt - mit dem zweiten 
Befehl wieder an.

was das???

wird der Interrupt nicht enabled, hält er brav an, lässt sich jedoch 
nicht starten.

von Kachel - Heinz (Gast)


Lesenswert?

Schau mal bei Hannes, da habe ich mal Spielereien mit Tiny15 und Sleep 
gesehen:
http://www.hanneslux.de/avr/divers/melody/melody01.html
http://www.hanneslux.de/avr/divers/melody/index.html

KH

von Jean P. (fubu1000)


Lesenswert?

Du musst in der Interrupt Addresse ein rjmp auf deine Interrupt-Funktion 
setzen. Am besten zeig mal Code her von Dir.

.org INT0addr
         rjmp int0_handler    ; IRQ0 Handler


int0_handler:
    //Tu was oder auch nit
    reti


Gruß

von Joerg W. (joergwolfram)


Lesenswert?

Du musst in Deinem Programm warten, bis die Taste wieder losgelassen 
wird, bevor Du den Controller in den Sleep schickst. Ansonsten wacht er 
gleich wieder auf.


Gruß Jörg

von Peter D. (peda)


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!

von Klaus W. (overheater)


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

von Peter D. (peda)


Lesenswert?

Klaus W. wrote:
> Ich bin keinesfalls an den tiny 15L gebunden

Dann würde ich zum ATtiny13 oder 25 raten.
Diese Typen sind derzeit in Produktion und gut erhältlich.
Außerdem kann man sie in C programmieren.


Peter

von Jean P. (fubu1000)


Lesenswert?

Peter wrote: >Außerdem kann man sie in C programmieren.<

Faulpelz^^.

Gruß

von Kachel - Heinz (Gast)


Lesenswert?

Peter wrote: >Außerdem kann man sie in C programmieren.<

Das kann man auch in BASCOM (wenn man es denn kann), muss man aber 
nicht.

;-)

KH

von Peter D. (peda)


Angehängte Dateien:

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

von Peter D. (peda)


Lesenswert?

So, aufm STK500 läuft es.

Ein kleiner Fehler ist noch in der Pindefinition für die LED drin 
gewesen.


Peter

von Klaus W. (overheater)


Angehängte Dateien:

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

von hust (Gast)


Lesenswert?

http://de.wikipedia.org/wiki/Endlicher_Automat

Wenn ich deine Aufgabe hätte machen müssen wäre das erste was mir 
eingefallen wäre ein Zustandsautomat gewesen ;-)

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.