Forum: Mikrocontroller und Digitale Elektronik 1 Taster + 3 Funktionen


von Micha (Gast)


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

von Karl H. (kbuchegg)


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

von Christopher G. (cbg)


Lesenswert?

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

von Micha (Gast)


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?

von Karl H. (kbuchegg)


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.

von oldmax (Gast)


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
1
int0_handler:
2
   Push R10         ;Register 10 zwischenspeichern
3
   in   R10, SREG   ;Statusregister zwischenspeichern
4
   Push R10         ; weitere verwendete Register zwischenspeichern
5
   Push R11         ; werden in aufgerufenen UP's benutzt
6
   Push R12    
7
   LDS R10, Schritt ; Variable mit den Schrittwerten
8
   CPI R10, 1       ; Schritt 1 ?
9
   BRNE Stp_2       ; wenn nicht, dann schritt 2 testen
10
   RCALL Order_1    ; Aufruf von Unterprogramm 1
11
   RJMP End_Int0    ; beende Interrupt
12
Stp_2:   
13
   CPI R10, 2       ; Schritt 2 ?
14
   BRNE Stp_3       ; wenn nicht, dann schritt 2 testen
15
   RCALL Order_2    ; Aufruf von Unterprogramm 1
16
   RJMP End_Int0    ; beende Interrupt
17
Stp_3:
18
   ;weitere Vergleiche 
19
End_Int0:
20
   Pop R12          ; Register in
21
   POP R11          ; umgekehrter Reihenfolge
22
   POP R10          ; wieder herstellen
23
   Out SReg, R10    ; Statusregister aktualisieren
24
   POP R10          ; und zuletzt R10
25
 reti
Ich hoffe, dir damit ein wenig geholfen zu haben.
Gruß oldmax

von Peter D. (peda)


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

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.