1 Taster + 3 Funktionen

Gast #1469738
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
#1469750
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
#1469788
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.
Gast #1470116
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
#1470279
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

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