mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik 1 Taster + 3 Funktionen


Autor: Micha (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hey

Ich habe mir ein kleines RGB Licht mit einem Tiny13 gebastelt. Der 
Farbferlauf funktioniert auch ganz gut. Jetzt hab ich noch einen 
Schalten an PB1 gehangen über den ich die Funktionen "RGB Licht", "Alle 
LED's an" und Schlafmodus nacheinander durchklicken will.

Ist das überhaupt möglich? Wie kann ich werend des RGB Modus 
gleichzeitig auf Interupts "horchen"

Grüsse Micha

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Micha schrieb:

> Ist das überhaupt möglich?

Wenn du es programmieren kannst, dann ist es möglich :-)

> Wie kann ich werend des RGB Modus
> gleichzeitig auf Interupts "horchen"

Das brauchst du nicht. Der Interrupt unterbricht ganz einfach dein 
Hauptprogramm.

(Aber häng den Taster nicht an einen Interrupt-Pin. Es gibt bessere 
Möglichkeiten. http://www.mikrocontroller.net/articles/Entprellung

Autor: Christopher G. (cbg)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Stichwort endlicher deterministischer Automat (engl. finite state 
machine).
Suchmaschine deiner Wahl oder hier die SuFu. Kommt sicher was nützliches 
heraus.

Autor: Micha (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wenn du es programmieren kannst, dann ist es möglich :-)

klar da hängts ja


wie kann ich an die stelle

int0_handler:
....
reti

Mehrere Funktionen schreiben?

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Micha schrieb:
> Wenn du es programmieren kannst, dann ist es möglich :-)
>
> klar da hängts ja
>
>
> wie kann ich an die stelle
>
> int0_handler:
> ....
> reti
>
> Mehrere Funktionen schreiben?

Indem du zb deine 3 Funktions-Möglichkeiten als 3 'Blöcke' im 
Interrupthandler hast. Je nach Inhalt eines Registers (oder einer 
Variablen im SRAM) entscheidest du, welcher Block zum Zug kommt. Enthält 
das Steuerregister zb 0, dann wird der Teil der für den RGB-Modus (was 
auch immer das sein mag) abgearbeitet und alle anderen nicht. Hat dein 
Steuerregister den Wert 1, dann wird 'Alle Led an' abgearbeitet und bei 
einem Wert von 2 wird der Schlafmodus bearbeitet.

Rein durch zuweisen von 0, 1 oder 2 an das Steuerregister entscheidest 
du dann, welche Funktion in der ISR tatsächlich abgearbeitet werden 
soll.

(Und du ahnst es schon: Ein Tastendruck bewirkt dann ganz einfach ein 
Weiterschalten des Steuerregisters von 0 auf 1, auf 2, auf 0, auf 1 etc 
...)

Und damit ist die von dir gewünschte Funktionalität möglich geworden :-)
Wie das jetzt im Detail funktionieren könnte, kann hier keiner genau 
sagen, weil wir dein Programm nicht kennen. Vielleicht wäre auch eine 
andere Strategie besser. Könnte ja sein. Aber Dreh und Angelpunkt wird 
wahrscheinlich sein, dass es da ein Register (oder SRAM Variable) gibt, 
welches nacheinander die Werte 0, 1, 2 annimmt. Jeder Wert steht für 
eine Funktion.

Autor: oldmax (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi
> wie kann ich an die stelle
>
> int0_handler:
> ....
> reti
>
> Mehrere Funktionen schreiben?

Da wo du die Pünktchen hast, kannst du deine Unterprogramme aufrufen, 
aber bedenke, das ein Interrupt zu jeder Zeit und von jeder Stelle im 
Programm aufgerufen wird. Daher ist es wichtig, innerhalb einer ISR die 
verwendeten Register zwischenzuspeichern. Stichwort Push und Pop. Auch 
die Register, die in den aufgerufenen Unterprogrammen verwendet werden. 
Es könnt sonst zu unerwünschten und sehr schwer auffindbaren Fehlern 
führen, weil ein Register plötzlich innerhalb einer beliebigen 
Programmstelle seinen Wert ändert, unabhängig davon, welcher berechnete 
Zustand vorher enthalten war. Den Verteiler kannst du u. a. 
folgendermaßen aufbauen
int0_handler:
   Push R10         ;Register 10 zwischenspeichern
   in   R10, SREG   ;Statusregister zwischenspeichern
   Push R10         ; weitere verwendete Register zwischenspeichern
   Push R11         ; werden in aufgerufenen UP's benutzt
   Push R12    
   LDS R10, Schritt ; Variable mit den Schrittwerten
   CPI R10, 1       ; Schritt 1 ?
   BRNE Stp_2       ; wenn nicht, dann schritt 2 testen
   RCALL Order_1    ; Aufruf von Unterprogramm 1
   RJMP End_Int0    ; beende Interrupt
Stp_2:   
   CPI R10, 2       ; Schritt 2 ?
   BRNE Stp_3       ; wenn nicht, dann schritt 2 testen
   RCALL Order_2    ; Aufruf von Unterprogramm 1
   RJMP End_Int0    ; beende Interrupt
Stp_3:
   ;weitere Vergleiche 
End_Int0:
   Pop R12          ; Register in
   POP R11          ; umgekehrter Reihenfolge
   POP R10          ; wieder herstellen
   Out SReg, R10    ; Statusregister aktualisieren
   POP R10          ; und zuletzt R10
 reti
Ich hoffe, dir damit ein wenig geholfen zu haben.
Gruß oldmax

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Micha schrieb:
> wie kann ich an die stelle
>
> int0_handler:
> ....
> reti
>
> Mehrere Funktionen schreiben?

Erstmal nicht in diesem Interrupt und besser überhaupt nicht in einem 
Interrupt.

Das Tastenentprellen und Flankenerkennen macht man nebenbei in einem 
Timerinterrupt.

Und das Main zählt bei ner Flanke den State hoch (0, 1, 2, 0 usw.) und 
verzweigt dann in die entsprechende Routine.

Und wenn alles funktioniert wird bei State 2 noch das Enablen des 
Pin-Change-Interrupt und das Sleep (Power-Down) eingefügt.


Peter

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.