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
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
Stichwort endlicher deterministischer Automat (engl. finite state machine). Suchmaschine deiner Wahl oder hier die SuFu. Kommt sicher was nützliches heraus.
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?
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.
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.