mikrocontroller.net

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


Autor: Klaus W. (overheater)
Datum:

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

Autor: hans (Gast)
Datum:

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

Autor: Klaus W. (overheater)
Datum:

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

Autor: Klaus W. (overheater)
Datum:

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

Autor: Kachel - Heinz (Gast)
Datum:

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

Autor: Jean Player (fubu1000)
Datum:

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

Autor: Joerg Wolfram (joergwolfram)
Datum:

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

Autor: Peter Dannegger (peda)
Datum:

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

Autor: Klaus W. (overheater)
Datum:

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

Autor: Peter Dannegger (peda)
Datum:

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

Autor: Jean Player (fubu1000)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Peter wrote: >Außerdem kann man sie in C programmieren.<

Faulpelz^^.

Gruß

Autor: Kachel - Heinz (Gast)
Datum:

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

Autor: Peter Dannegger (peda)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hier mal die Statemaschine in C (AVR-GCC) für nen ATtiny13:

int main( void )
{
  u8 state = 0;

  PORTB = 0xFF;                         // all IOs high (LEDs off, Pullups on)
  LED0_DDR = 1;
  LED1_DDR = 1;
  PCMSK = 1<<KEY0;                      // PCINT on Key0
  get_key_init();
  sei();

  for(;;){

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

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

      case 1:
          flash_timer = 0;
          LED0 = 0;                     // LED on
          break;

      case 0:
      default:
          state = 0;
        }
        LED0 = 1;                       // LED off
        break;
    }

    LED1 = 1;                           // for debug only
                                        // LED1 = off: power down
    sleep_cpu();
    LED1 = 0;
  }
}

Ist aber noch nicht getestet.
Im Anhang das komplette Programm.


Peter

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
So, aufm STK500 läuft es.

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


Peter

Autor: Klaus W. (overheater)
Datum:
Angehängte Dateien:

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

Autor: hust (Gast)
Datum:

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

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]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [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.